From 710b968cd88bbd50d39fe08b3abfe48554b21519 Mon Sep 17 00:00:00 2001 From: Peter Boin Date: Tue, 15 Aug 2017 22:00:13 +1000 Subject: [PATCH 01/14] added change-log update to deployment checklist --- deployment/README.md | 214 +++++++++++++++++++++---------------------- 1 file changed, 107 insertions(+), 107 deletions(-) diff --git a/deployment/README.md b/deployment/README.md index b424a64..f6ddd99 100644 --- a/deployment/README.md +++ b/deployment/README.md @@ -9,54 +9,52 @@ this can help. Method based on the articles: - * http://peterdowns.com/posts/first-time-with-pypi.html and - * https://hynek.me/articles/sharing-your-labor-of-love-pypi-quick-and-dirty/ +* http://peterdowns.com/posts/first-time-with-pypi.html and +* https://hynek.me/articles/sharing-your-labor-of-love-pypi-quick-and-dirty/ Deployment also heavily uses the `./deploy.sh` script in this folder. At this time, running `./deploy.sh --help` displays: -``` -Usage: ./deploy.sh {build|test|and so on ...} + Usage: ./deploy.sh {build|test|and so on ...} -This script is to maintain a consistent method of deployment and testing. + This script is to maintain a consistent method of deployment and testing. -Deployment target: pygcode 0.1.1.dev0 + Deployment target: pygcode 0.1.1.dev0 -Arguments: - Setup: - setup: Installs packages & sets up environment (requires sudo) + Arguments: + Setup: + setup: Installs packages & sets up environment (requires sudo) - Compiling: - build: Execute setup to build packages (populates ../dist/) - creates both 'sdist' and 'wheel' distrobutions. + Compiling: + build: Execute setup to build packages (populates ../dist/) + creates both 'sdist' and 'wheel' distrobutions. - Virtual Environments: - rmenv py# Remove virtual environment - remkenv py# Remove, then create re-create virtual environment - envprereq py# install environment prerequisites (official PyPi) + Virtual Environments: + rmenv py# Remove virtual environment + remkenv py# Remove, then create re-create virtual environment + envprereq py# install environment prerequisites (official PyPi) - Deploy: - deploy test Upload to PyPi test server - deploy prod Upload to PyPi (official) + Deploy: + deploy test Upload to PyPi test server + deploy prod Upload to PyPi (official) - Install: - install sdist py# Install from local sdist - install wheel py# Install from local wheel - install pypitest py# Install from PyPi test server - install pypi py# Install from PyPi (official) + Install: + install sdist py# Install from local sdist + install wheel py# Install from local wheel + install pypitest py# Install from PyPi test server + install pypi py# Install from PyPi (official) - Testing: - test dev py# Run tests on local dev in a virtual env - test installed py# Run tests on installed library in virtual env + Testing: + test dev py# Run tests on local dev in a virtual env + test installed py# Run tests on installed library in virtual env - Help: - -h | --help display this help message + Help: + -h | --help display this help message - py#: when referenced above means - 'py2' for Python 2.7.12 - 'py3' for Python 3.5.2 -``` + py#: when referenced above means + 'py2' for Python 2.7.12 + 'py3' for Python 3.5.2 # PyPi deployment @@ -68,22 +66,20 @@ Arguments: `cat ~/.pypirc` -``` -[distutils] -index-servers = - prod - test + [distutils] + index-servers = + prod + test -[prod] -repository = https://upload.pypi.org/legacy/ -username=FraggaMuffin -password=secret + [prod] + repository = https://upload.pypi.org/legacy/ + username=FraggaMuffin + password=secret -[test] -repository=https://test.pypi.org/legacy/ -username=FraggaMuffin -password=secret -``` + [test] + repository=https://test.pypi.org/legacy/ + username=FraggaMuffin + password=secret `chmod 600 ~/.pypirc` @@ -91,59 +87,56 @@ password=secret ## Build and Test `sdist` and `wheel` **Build** -``` -./deploy.sh build -``` + + ./deploy.sh build **Test `sdist`** -``` -# Python 2.x -./deploy.sh remkenv py2 -./deploy.sh envprereq py2 -./deploy.sh install sdist py2 -./deploy.sh test installed py2 -# Python 3.x -./deploy.sh remkenv py3 -./deploy.sh envprereq py3 -./deploy.sh install sdist py3 -./deploy.sh test installed py3 -``` + # Python 2.x + ./deploy.sh remkenv py2 + ./deploy.sh envprereq py2 + ./deploy.sh install sdist py2 + ./deploy.sh test installed py2 + + # Python 3.x + ./deploy.sh remkenv py3 + ./deploy.sh envprereq py3 + ./deploy.sh install sdist py3 + ./deploy.sh test installed py3 **Test `wheel`** -``` -# Python 2.x -./deploy.sh remkenv py2 -./deploy.sh install wheel py2 -./deploy.sh test installed py2 -# Python 3.x -./deploy.sh remkenv py3 -./deploy.sh install wheel py3 -./deploy.sh test installed py3 -``` + # Python 2.x + ./deploy.sh remkenv py2 + ./deploy.sh install wheel py2 + ./deploy.sh test installed py2 + + # Python 3.x + ./deploy.sh remkenv py3 + ./deploy.sh install wheel py3 + ./deploy.sh test installed py3 + ## Upload to PyPi Test server -``` -./deploy.sh deploy test -``` + + ./deploy.sh deploy test + **Test** -``` -# Python 2.x -./deploy.sh remkenv py2 -./deploy.sh envprereq py2 -./deploy.sh install pypitest py2 -./deploy.sh test installed py2 -# Python 3.x -./deploy.sh remkenv py3 -./deploy.sh envprereq py3 -./deploy.sh install pypitest py3 -./deploy.sh test installed py3 -``` + # Python 2.x + ./deploy.sh remkenv py2 + ./deploy.sh envprereq py2 + ./deploy.sh install pypitest py2 + ./deploy.sh test installed py2 + + # Python 3.x + ./deploy.sh remkenv py3 + ./deploy.sh envprereq py3 + ./deploy.sh install pypitest py3 + ./deploy.sh test installed py3 have a look at: https://testpypi.python.org/pypi/pygcode @@ -154,22 +147,19 @@ to make sure it's sane all good!? sweet :+1: time to upload to 'production' -``` -./deploy.sh deploy prod -``` + ./deploy.sh deploy prod **Test** -``` -# Python 2.x -./deploy.sh remkenv py2 -./deploy.sh install pypi py2 -./deploy.sh test installed py2 -# Python 3.x -./deploy.sh remkenv py3 -./deploy.sh install pypi py3 -./deploy.sh test installed py3 -``` + # Python 2.x + ./deploy.sh remkenv py2 + ./deploy.sh install pypi py2 + ./deploy.sh test installed py2 + + # Python 3.x + ./deploy.sh remkenv py3 + ./deploy.sh install pypi py3 + ./deploy.sh test installed py3 have a look at: https://pypi.python.org/pypi/pygcode @@ -178,15 +168,25 @@ to make sure it's sane # Deployment in Git -merge deployed branch to `master`, then... +create pull request `develop` -> `master` -``` -git checkout master -git pull -git tag ${version} -m "" -git push --tags origin master -``` +## Update change log + +update [change log](../dist/README.md) + +## Push Release to Git (aka `tag`) + +merge `develop` branch to `master`, then... + +Switch local to `master` and tag with relevant version + + git checkout master + git pull + git tag ${version} -m "" + git push --tags origin master have a look at the [releases page](https://github.com/fragmuffin/pygcode/releases) and it should be there. +edit release and copy relevant content from [change log](../dist/README.md) + tadaaaaaa!... go to sleep; it's probably late From d9b143a2fa9be3424c27f77a55696434394fbb85 Mon Sep 17 00:00:00 2001 From: Peter Boin Date: Tue, 15 Aug 2017 22:05:05 +1000 Subject: [PATCH 02/14] cleanup --- deployment/README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/deployment/README.md b/deployment/README.md index f6ddd99..f5b33fc 100644 --- a/deployment/README.md +++ b/deployment/README.md @@ -185,8 +185,15 @@ Switch local to `master` and tag with relevant version git tag ${version} -m "" git push --tags origin master -have a look at the [releases page](https://github.com/fragmuffin/pygcode/releases) and it should be there. +have a look at the +[releases page](https://github.com/fragmuffin/pygcode/releases) +and it should be there. edit release and copy relevant content from [change log](../dist/README.md) tadaaaaaa!... go to sleep; it's probably late + +# Cleanup + + ./deploy.sh rmenv py2 + ./deploy.sh rmenv py3 From f64b7f850e1dc52ec0c8f2b85df499e0242c95b7 Mon Sep 17 00:00:00 2001 From: Peter Boin Date: Tue, 15 Aug 2017 22:07:45 +1000 Subject: [PATCH 03/14] added lsenv --- deployment/deploy.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/deployment/deploy.sh b/deployment/deploy.sh index 008bbee..7c63f0d 100755 --- a/deployment/deploy.sh +++ b/deployment/deploy.sh @@ -42,6 +42,7 @@ Arguments: creates both 'sdist' and 'wheel' distrobutions. Virtual Environments: + lsenv List created virtual environments for this lib rmenv py# Remove virtual environment remkenv py# Remove, then create re-create virtual environment envprereq py# install environment prerequisites (official PyPi) @@ -83,6 +84,10 @@ function build() { popd } +function lsenv() { + lsvirtualenv -b | grep ^${LIB_NAME}_ +} + function rmenv() { # Remove virtual environment set_venv_variables $1 @@ -210,6 +215,7 @@ case "$1" in # Valid Commands setup) setup ;; build) build ;; + lsenv) lsenv ;; rmenv) rmenv $2 ;; remkenv) remkenv $2 ;; envprereq) envprereq $2 ;; @@ -224,4 +230,4 @@ case "$1" in ;; esac -echo ./${0##*/} completed successfully +#echo ./${0##*/} completed successfully From f73bd3bd4d52cfd5cf10925e2ecf3d23c854e9f8 Mon Sep 17 00:00:00 2001 From: Peter Boin Date: Tue, 22 Aug 2017 13:06:04 +1000 Subject: [PATCH 04/14] added test files --- tests/test-files/Alien.tap | 100 ++++ .../test-files/Chucks Deer (V-Carve) {3}.tap | 492 ++++++++++++++++++ tests/test-files/Circular Pocket.tap | 43 ++ tests/test-files/Clamp.nc | 177 +++++++ tests/test-files/Colt.tap | 437 ++++++++++++++++ tests/test-files/Cross2.tap | 141 +++++ tests/test-files/DB25.tap | 95 ++++ tests/test-files/Disc3.tap | 121 +++++ tests/test-files/Heart.tap | 482 +++++++++++++++++ tests/test-files/Horse.tap | 354 +++++++++++++ tests/test-files/Horse2.tap | 157 ++++++ tests/test-files/Letter A (V-Carve).tap | 183 +++++++ tests/test-files/Mach3 write.tap | 75 +++ tests/test-files/Mach4 write.tap | 68 +++ tests/test-files/Scorpion.tap | 276 ++++++++++ tests/test-files/Skull2.tap | 397 ++++++++++++++ tests/test-files/Smiley face.tap | 68 +++ tests/test-files/Smiley001.nc | 59 +++ tests/test-files/Smiley002.nc | 142 +++++ tests/test-files/Snow White.tap | 170 ++++++ tests/test-files/Star Trek.tap | 411 +++++++++++++++ tests/test-files/Trispokedovetiles(laser).tap | 64 +++ tests/test-files/Tweakie's CNC Cube.nc | 196 +++++++ tests/test-files/Tweakie's CNC Cube2.nc | 30 ++ tests/test-files/plug6a.tap | 130 +++++ tests/test-files/random-sample-1.gcode | 11 + 26 files changed, 4879 insertions(+) create mode 100644 tests/test-files/Alien.tap create mode 100644 tests/test-files/Chucks Deer (V-Carve) {3}.tap create mode 100644 tests/test-files/Circular Pocket.tap create mode 100644 tests/test-files/Clamp.nc create mode 100644 tests/test-files/Colt.tap create mode 100644 tests/test-files/Cross2.tap create mode 100644 tests/test-files/DB25.tap create mode 100644 tests/test-files/Disc3.tap create mode 100644 tests/test-files/Heart.tap create mode 100644 tests/test-files/Horse.tap create mode 100644 tests/test-files/Horse2.tap create mode 100644 tests/test-files/Letter A (V-Carve).tap create mode 100644 tests/test-files/Mach3 write.tap create mode 100644 tests/test-files/Mach4 write.tap create mode 100644 tests/test-files/Scorpion.tap create mode 100644 tests/test-files/Skull2.tap create mode 100644 tests/test-files/Smiley face.tap create mode 100644 tests/test-files/Smiley001.nc create mode 100644 tests/test-files/Smiley002.nc create mode 100644 tests/test-files/Snow White.tap create mode 100644 tests/test-files/Star Trek.tap create mode 100644 tests/test-files/Trispokedovetiles(laser).tap create mode 100644 tests/test-files/Tweakie's CNC Cube.nc create mode 100644 tests/test-files/Tweakie's CNC Cube2.nc create mode 100644 tests/test-files/plug6a.tap create mode 100644 tests/test-files/random-sample-1.gcode diff --git a/tests/test-files/Alien.tap b/tests/test-files/Alien.tap new file mode 100644 index 0000000..229a05b --- /dev/null +++ b/tests/test-files/Alien.tap @@ -0,0 +1,100 @@ +(for 1/8"dia cutter or 'V' cutter) +G20 +G90 G91.1 +G64 +G00 Z0.125 +M06 T0 +M03 +G00 X-0.299635 Y-2.672109 +G01 F15 Z-0.050 +G01 F30 X0.242283 +G00 Z0.125 +G00 X0.281184 Y-0.761984 +G01 F15 Z-0.050 +G03 F30 X0.090095 Y-0.953059 I-0.022534 J-0.168553 +G00 Z0.125 +G00 X-0.324529 Y-0.753181 +G01 F15 Z-0.050 +G02 F30 X-0.132317 Y-0.945379 I0.022666 J-0.169545 +G00 Z0.125 +G00 X-0.475024 Y0.265282 +G01 F15 Z-0.050 +G02 F30 X-0.600539 Y0.198916 I-0.145025 J0.122407 +G02 X-0.83879 Y0.218446 I-0.069565 J0.614393 +G01 X-0.8388 Y0.218448 +G02 X-1.17323 Y0.343422 I0.452748 J1.721514 +G02 X-1.479371 Y0.527113 I0.95037 J1.93085 +G02 X-1.768868 Y0.851146 I0.606555 J0.833245 +G02 X-1.839332 Y1.06599 I0.491952 J0.280324 +G03 X-1.839333 Y1.066 I-0.000497 J-0.000058 +G02 X-1.78474 Y1.285138 I0.301344 J0.041296 +G02 X-1.587205 Y1.397775 I0.243525 J-0.197547 +G03 X-1.587193 Y1.397777 I-0.000073 J0.000495 +G02 X-1.419527 Y1.40102 I0.094434 J-0.54653 +G02 X-1.17848 Y1.332849 I-0.115339 J-0.868079 +G02 X-0.962004 Y1.206631 I-0.44674 J-1.014955 +G02 X-0.760908 Y1.019047 I-0.766042 J-1.022801 +G02 X-0.525644 Y0.676937 I-1.265297 J-1.122075 +G02 X-0.450756 Y0.477071 I-0.79209 J-0.410751 +G02 X-0.440417 Y0.368565 I-0.342239 J-0.087354 +G03 X-0.440418 Y0.368546 I0.000499 J-0.00003 +G02 X-0.475024 Y0.265282 I-0.183129 J0.00394 +G00 Z0.125 +G00 X0.457507 Y0.266706 +G01 F15 Z-0.050 +G02 F30 X0.422901 Y0.36997 I0.148522 J0.107204 +G03 X0.4229 Y0.369989 I-0.0005 J-0.000011 +G02 X0.433238 Y0.478489 I0.352559 J0.021153 +G02 X0.508127 Y0.678362 I0.867003 J-0.210888 +G02 X0.743386 Y1.020466 I1.500537 J-0.77995 +G02 X0.944487 Y1.208056 I0.967165 J-0.835237 +G02 X1.160961 Y1.334272 I0.663209 J-0.888726 +G02 X1.40201 Y1.402444 I0.356389 J-0.799915 +G02 X1.569676 Y1.399201 I0.073232 J-0.549773 +G03 X1.569688 Y1.399199 I0.000085 J0.000493 +G02 X1.767223 Y1.286562 I-0.04599 J-0.310184 +G02 X1.821816 Y1.067424 I-0.246751 J-0.177841 +G03 X1.821814 Y1.067414 I0.000495 J-0.000068 +G02 X1.751352 Y0.852571 I-0.562414 J0.06548 +G02 X1.461851 Y0.528535 I-0.896059 J0.509216 +G02 X1.155713 Y0.344846 I-1.256498 J1.747145 +G02 X0.821283 Y0.219872 I-0.78718 J1.596542 +G01 X0.821273 Y0.21987 +G02 X0.583027 Y0.20034 I-0.168685 J0.594851 +G02 X0.457507 Y0.266706 I0.019508 J0.188779 +G00 Z0.125 +G00 X2.460439 Y0.585937 +G01 F15 Z-0.050 +G02 F30 X2.446297 Y0.275659 I-3.294169 J-0.005312 +G02 X2.353243 Y-0.298841 I-4.012489 J0.35513 +G02 X2.027545 Y-1.264386 I-5.219711 J1.223007 +G02 X1.226249 Y-2.57332 I-5.185175 J2.2745 +G02 X0.961742 Y-2.861901 I-2.578692 J2.098069 +G01 X0.961736 Y-2.861906 +G02 X0.742197 Y-3.058791 I-1.898965 J1.896629 +G01 X0.74219 Y-3.058796 +G02 X0.371109 Y-3.30128 I-1.243094 J1.497168 +G02 X0.16307 Y-3.38167 I-0.54818 J1.109229 +G02 X-0.057563 Y-3.413565 I-0.231363 J0.821398 +G02 X-0.369146 Y-3.351629 I0.011233 J0.871233 +G02 X-0.629013 Y-3.218586 I0.486391 J1.270358 +G02 X-1.047155 Y-2.872594 I1.371483 J2.083143 +G02 X-1.626308 Y-2.125388 I3.153785 J3.042526 +G02 X-2.222722 Y-0.841132 I4.913442 J3.062441 +G02 X-2.395533 Y-0.152417 I4.918815 J1.600253 +G02 X-2.460446 Y0.554692 I4.223296 J0.744236 +G02 X-2.297429 Y1.565427 I3.14925 J0.010585 +G02 X-1.438033 Y2.831134 I2.723838 J-0.924834 +G02 X-0.78046 Y3.243225 I1.730883 J-2.031278 +G02 X-0.410567 Y3.366616 I0.959272 J-2.259514 +G02 X-0.023439 Y3.413565 I0.383777 J-1.54498 +G02 X0.490695 Y3.335659 I-0.020852 J-1.873067 +G02 X1.297896 Y2.930895 I-0.75152 J-2.505977 +G02 X2.163515 Y1.899368 I-1.681057 J-2.289642 +G02 X2.460439 Y0.585937 I-2.662859 J-1.292264 +G00 Z0.125 +G00 X0 Y0 +M05 +M30 +% + diff --git a/tests/test-files/Chucks Deer (V-Carve) {3}.tap b/tests/test-files/Chucks Deer (V-Carve) {3}.tap new file mode 100644 index 0000000..124d4ec --- /dev/null +++ b/tests/test-files/Chucks Deer (V-Carve) {3}.tap @@ -0,0 +1,492 @@ +( CHUCKS DEER{3} 7 X 5 ) +N100G00G20G17G90G40G49G80 +N110G70G91.1 +N120T1M06 +N130(TOOL: V-BIT {90 DEG 0.5"}) +N140G00G43Z0.8H1 +N150G94S16000M03 +N190X0Y0F25 +N200G00X1.6219Y-1.847Z0.2 +N210G1X1.6219Y-1.847Z-0.0744F8 +N220G1X1.7075Y-1.9046Z-0.0558F25 +N230G1X1.8135Y-1.9567Z0 +N240G1X1.7056Y-1.9046Z-0.0558 +N250G1X1.6015Y-1.8302Z-0.0725 +N260G1X1.4936Y-1.7317Z-0.0428 +N270G1X1.3783Y-1.6814Z0 +N280G1X1.5066Y-1.741Z-0.0484 +N290G1X1.6219Y-1.847Z-0.0744 +N300G00Z0.2 +N310G00X-.0167Y-.7012Z0.2 +N320G1X-.0167Y-.7012Z-0.0558F8 +N330G1X-.1525Y-.6454Z-0.0502F25 +N340G1X-.1767Y-.6212Z-0.0298 +N350G1X-.1321Y-.6566Z-0.0539 +N360G1X.0837Y-.7477Z-0.0521 +N370G1X.2697Y-.8649Z-0.0484 +N380G1X.2716Y-.8649Z-0.0465 +N390G1X.2697Y-.8649Z-0.0484 +N400G1X.0763Y-.7459Z-0.0521 +N410G1X-.0167Y-.7012Z-0.0558 +N420G00Z0.2 +N430G00X-.186Y-.9914Z0.2 +N440G1X-.186Y-.9914Z-0.0986F8 +N450G1X-.1079Y-.9244Z-0.0502F25 +N460G1X-.0242Y-.904Z-0.0353 +N470G1X.0595Y-.93Z-0.0465 +N480G1X.1153Y-.9988Z-0.0725 +N490G1X.1265Y-1.0546Z-0.0893 +N500G1X.0837Y-1.1011Z-0.0744 +N510G1X0Y-1.1216Z-0.0651 +N520G1X-.0949Y-1.103Z-0.0651 +N530G1X-.1655Y-1.0379Z-0.0837 +N540G1X-.186Y-.9914Z-0.0986 +N550G00Z0.2 +N560G1X-.186Y-.9914Z-0.0986F8 +N570G1X-.3125Y-.9579Z-0.0186F25 +N580G1X-.186Y-.9914Z-0.0986 +N590G1X-.1358Y-1.0751Z-0.0707 +N600G1X-.0558Y-1.1179Z-0.0632 +N610G1X.0484Y-1.116Z-0.0688 +N620G1X.119Y-1.0714Z-0.0874 +N630G1X.1246Y-1.023Z-0.0818 +N640G1X.0763Y-.943Z-0.0521 +N650G1X.0019Y-.9077Z-0.0372 +N660G1X-.0874Y-.9151Z-0.0446 +N670G1X-.1693Y-.9709Z-0.0856 +N680G1X-.186Y-.9914Z-0.0986 +N690G00Z0.2 +N700G00X-.452Y-.2046Z0.2 +N710G1X-.452Y-.2046Z-0.2176F8 +N720G1X-.6417Y0Z-0.0502F25 +N730G1X-.452Y-.2046Z-0.2176 +N740G1X-.5264Y-.3776Z-0.0967 +N750G1X-.452Y-.2046Z-0.2176 +N760G1X-.2362Y-.2195Z-0.1414 +N770G1X-.0874Y-.2846Z-0.0744 +N780G1X-.0391Y-.3199Z-0.0502 +N790G1X-.1804Y-.2381Z-0.1172 +N800G1X-.3553Y-.2046Z-0.1841 +N810G1X-.452Y-.2046Z-0.2176 +N820G00Z0.2 +N830G00X-1.0732Y-.0967Z0.2 +N840G1X-1.0732Y-.0967Z-0.1525F8 +N850G1X-1.0435Y.0056Z-0.1339F25 +N860G1X-.9914Y.0893Z-0.0911 +N870G1X-1.0546Y-.0205Z-0.1414 +N880G1X-1.0751Y-.1209Z-0.1525 +N890G1X-1.0528Y-.7254Z-0.0818 +N900G1X-1.0583Y-.9802Z-0.026 +N910G1X-1.0676Y-.9877Z-0.0167 +N920G1X-1.0546Y-.9635Z-0.0353 +N930G1X-1.0528Y-.7254Z-0.0818 +N940G1X-1.0732Y-.0967Z-0.1525 +N950G00Z0.2 +N960G00X-1.7763Y-1.5252Z0.2 +N970G1X-1.7763Y-1.5252Z-0.0911F8 +N980G1X-1.7726Y-1.8767Z-0.0632F25 +N990G1X-1.78Y-2.0683Z-0.0595 +N1000G1X-1.8154Y-2.3101Z-0.0707 +N1010G1X-1.8767Y-2.4868Z-0.0725 +N1020G1X-1.9735Y-2.6486Z-0.0595 +N1030G1X-2.0869Y-2.7826Z-0.0316 +N1040G1X-2.0962Y-2.8012Z-0.0223 +N1050G1X-2.0665Y-2.7547Z-0.0409 +N1060G1X-1.9456Y-2.6096Z-0.0632 +N1070G1X-1.8544Y-2.4385Z-0.0725 +N1080G1X-1.8023Y-2.2506Z-0.067 +N1090G1X-1.78Y-2.059Z-0.0595 +N1100G1X-1.7726Y-1.8674Z-0.0651 +N1110G1X-1.7763Y-1.5252Z-0.0911 +N1120G1X-1.7224Y-1.2295Z-0.0707 +N1130G1X-1.6275Y-.9895Z-0.0688 +N1140G1X-1.5568Y-.8742Z-0.0707 +N1150G1X-1.4954Y-.8091Z-0.0279 +N1160G1X-1.4806Y-.7961Z-0.013 +N1170G1X-1.5457Y-.863Z-0.0688 +N1180G1X-1.5884Y-.9151Z-0.0744 +N1190G1X-1.6814Y-1.1123Z-0.067 +N1200G1X-1.7521Y-1.3671Z-0.08 +N1210G1X-1.7763Y-1.5252Z-0.0911 +N1220G00Z0.2 +N1230G00X-1.421Y.6752Z0.2 +N1240G1X-1.421Y.6752Z-0.1637F8 +N1250G1X-1.4768Y.7961Z-0.1451F25 +N1260G1X-1.5587Y1.0249Z-0.1097 +N1270G1X-1.5922Y1.0565Z-0.0893 +N1280G1X-1.555Y1.0156Z-0.1116 +N1290G1X-1.4768Y.7961Z-0.1451 +N1300G1X-1.421Y.6752Z-0.1637 +N1310G1X-1.3373Y.5822Z-0.1469 +N1320G1X-1.2462Y.5152Z-0.1004 +N1330G1X-1.2369Y.5022Z-0.0856 +N1340G1X-1.2778Y.5394Z-0.1209 +N1350G1X-1.3838Y.6268Z-0.16 +N1360G1X-1.421Y.6752Z-0.1637 +N1370G00Z0.2 +N1380G00X-2.3938Y1.4545Z0.2 +N1390G1X-2.3938Y1.4545Z-0.1637F8 +N1400G1X-2.4236Y1.8619Z-0.1562F25 +N1410G1X-2.4013Y2.2339Z-0.1525 +N1420G1X-2.325Y2.5947Z-0.1451 +N1430G1X-2.1985Y2.9462Z-0.1376 +N1440G1X-1.9865Y3.3387Z-0.1246 +N1450G1X-1.9065Y3.5117Z-0.0911 +N1460G1X-1.873Y3.6084Z-0.0651 +N1470G1X-1.9437Y3.4224Z-0.1116 +N1480G1X-2.0497Y3.2308Z-0.1321 +N1490G1X-2.206Y2.9295Z-0.1395 +N1500G1X-2.325Y2.5947Z-0.1451 +N1510G1X-2.4013Y2.232Z-0.1525 +N1520G1X-2.4217Y1.78Z-0.1618 +N1530G1X-2.392Y1.4248Z-0.1618 +N1540G1X-2.4199Y1.196Z-0.0911 +N1550G1X-2.4329Y1.0193Z-0.0409 +N1560G1X-2.4366Y.9505Z-0.0223 +N1570G1X-2.4422Y.9449Z-0.0149 +N1580G1X-2.431Y.9691Z-0.0316 +N1590G1X-2.4273Y1.1439Z-0.0725 +N1600G1X-2.3938Y1.395Z-0.1581 +N1610G1X-2.3938Y1.4545Z-0.1637 +N1620G00Z0.2 +N1630G00X-.9319Y.4464Z0.2 +N1640G1X-.9319Y.4464Z-0.0967F8 +N1650G1X-.8482Y.4148Z-0.0893F25 +N1660G1X-.7868Y.3385Z-0.0688 +N1670G1X-.7477Y.2102Z-0.0539 +N1680G1X-.7273Y-.1321Z-0.0632 +N1690G1X-.757Y-.465Z-0.0632 +N1700G1X-.837Y-.718Z-0.0539 +N1710G1X-.9337Y-.9728Z-0.0632 +N1720G1X-.9598Y-1.0993Z-0.0428 +N1730G1X-.9598Y-1.0993Z-0.0446 +N1740G1X-.9337Y-.9728Z-0.0632 +N1750G1X-.8351Y-.7124Z-0.0539 +N1760G1X-.757Y-.465Z-0.0632 +N1770G1X-.7273Y-.1004Z-0.0614 +N1780G1X-.7533Y.2381Z-0.0521 +N1790G1X-.7998Y.3627Z-0.0744 +N1800G1X-.8723Y.4297Z-0.093 +N1810G1X-.9579Y.4483Z-0.0949 +N1820G1X-1.0379Y.4259Z-0.0856 +N1830G1X-1.1327Y.3367Z-0.0614 +N1840G1X-1.2257Y.199Z-0.0521 +N1850G1X-1.315Y.0298Z-0.0465 +N1860G1X-1.3913Y-.1804Z-0.0446 +N1870G1X-1.4303Y-.4036Z-0.0465 +N1880G1X-1.4322Y-.5673Z-0.0539 +N1890G1X-1.4043Y-.7607Z-0.0632 +N1900G1X-1.3466Y-.943Z-0.0744 +N1910G1X-1.2797Y-1.0807Z-0.0763 +N1920G1X-1.2183Y-1.222Z-0.0446 +N1930G1X-1.2109Y-1.2667Z-0.0205 +N1940G1X-1.2257Y-1.2016Z-0.0521 +N1950G1X-1.3001Y-1.0453Z-0.0781 +N1960G1X-1.3708Y-.8723Z-0.067 +N1970G1X-1.4117Y-.718Z-0.0595 +N1980G1X-1.4322Y-.558Z-0.0521 +N1990G1X-1.4266Y-.372Z-0.0484 +N2000G1X-1.3913Y-.1804Z-0.0446 +N2010G1X-1.3001Y.0595Z-0.0465 +N2020G1X-1.2071Y.2288Z-0.0558 +N2030G1X-1.0862Y.3887Z-0.0725 +N2040G1X-.9988Y.4427Z-0.093 +N2050G1X-.9319Y.4464Z-0.0967 +N2060G00Z0.2 +N2070G00X.4892Y1.2443Z0.2 +N2080G1X.4892Y1.2443Z-0.2809F8 +N2090G1X.6919Y1.2834Z-0.2102F25 +N2100G1X.904Y1.3448Z-0.173 +N2110G1X1.1606Y1.4434Z-0.1767 +N2120G1X1.3969Y1.5661Z-0.2251 +N2130G1X1.5178Y1.6442Z-0.266 +N2140G1X1.6982Y1.607Z-0.1804 +N2150G1X1.8488Y1.6126Z-0.1414 +N2160G1X2.0776Y1.6721Z-0.1321 +N2170G1X2.2339Y1.7484Z-0.1358 +N2180G1X2.3641Y1.8674Z-0.1339 +N2190G1X2.4589Y2.0181Z-0.1228 +N2200G1X2.5054Y2.1855Z-0.1097 +N2210G1X2.5073Y2.3622Z-0.0967 +N2220G1X2.4719Y2.5556Z-0.0856 +N2230G1X2.4515Y2.671Z-0.0651 +N2240G1X2.4515Y2.671Z-0.0632 +N2250G1X2.4515Y2.671Z-0.0651 +N2260G1X2.4831Y2.5073Z-0.0911 +N2270G1X2.5091Y2.3473Z-0.0986 +N2280G1X2.4998Y2.1557Z-0.1116 +N2290G1X2.444Y1.9883Z-0.1246 +N2300G1X2.3641Y1.8674Z-0.1339 +N2310G1X2.2339Y1.7484Z-0.1358 +N2320G1X2.0776Y1.6721Z-0.1321 +N2330G1X1.8488Y1.6126Z-0.1414 +N2340G1X1.6982Y1.607Z-0.1804 +N2350G1X1.5178Y1.6442Z-0.266 +N2360G1X1.5271Y1.8377Z-0.1693 +N2370G1X1.5661Y2.0925Z-0.119 +N2380G1X1.5996Y2.5147Z-0.0911 +N2390G1X1.5996Y2.9704Z-0.0893 +N2400G1X1.5736Y3.1099Z-0.0763 +N2410G1X1.5736Y3.1118Z-0.0763 +N2420G1X1.5736Y3.1099Z-0.0781 +N2430G1X1.5736Y3.1099Z-0.0763 +N2440G1X1.6033Y2.9109Z-0.0893 +N2450G1X1.5977Y2.5036Z-0.093 +N2460G1X1.5661Y2.0925Z-0.119 +N2470G1X1.5289Y1.8544Z-0.1618 +N2480G1X1.5178Y1.6591Z-0.2567 +N2490G1X1.5178Y1.6442Z-0.266 +N2500G1X1.2667Y1.4936Z-0.1953 +N2510G1X1.0323Y1.3894Z-0.1693 +N2520G1X.8816Y1.3373Z-0.1748 +N2530G1X.664Y1.276Z-0.2176 +N2540G1X.4892Y1.2443Z-0.2809 +N2550G1X.4092Y1.3745Z-0.2027 +N2560G1X.3515Y1.501Z-0.1804 +N2570G1X.3218Y1.6759Z-0.1804 +N2580G1X.4576Y1.9381Z0 +N2590G1X.3218Y1.6759Z-0.1804 +N2600G1X.3069Y1.6833Z-0.1674 +N2610G1X.3218Y1.6759Z-0.1804 +N2620G1X.3571Y1.4861Z-0.1804 +N2630G1X.4166Y1.3615Z-0.2083 +N2640G1X.4892Y1.2443Z-0.2809 +N2650G1X.372Y1.0825Z-0.2102 +N2660G1X.2418Y.9319Z-0.1934 +N2670G1X.0986Y.7645Z-0.2288 +N2680G1X.0818Y.7477Z-0.2362 +N2690G1X-.0521Y.8147Z-0.1414 +N2700G1X-.1451Y.8872Z-0.1135 +N2710G1X-.2753Y1.0918Z-0.1209 +N2720G1X-.3441Y1.2313Z-0.1153 +N2730G1X-.4445Y1.488Z-0.0986 +N2740G1X-.3832Y1.5903Z0 +N2750G1X-.4445Y1.488Z-0.0986 +N2760G1X-.5785Y1.581Z0 +N2770G1X-.4445Y1.488Z-0.0986 +N2780G1X-.3181Y1.1755Z-0.1153 +N2790G1X-.1972Y.9579Z-0.1172 +N2800G1X-.1172Y.8593Z-0.119 +N2810G1X-.013Y.7942Z-0.1637 +N2820G1X.0818Y.7477Z-0.2362 +N2830G1X.0651Y.5003Z-0.1897 +N2840G1X.0744Y.2995Z-0.1823 +N2850G1X.119Y.1432Z-0.2176 +N2860G1X-.0112Y.0558Z-0.1135 +N2870G1X-.0911Y.0112Z-0.0725 +N2880G1X-.1097Y-.0056Z-0.0725 +N2890G1X-.0521Y.0353Z-0.0874 +N2900G1X.0874Y.1172Z-0.1897 +N2910G1X.119Y.1432Z-0.2176 +N2920G1X.2585Y.1135Z-0.1562 +N2930G1X.3925Y.1358Z-0.1023 +N2940G1X.5022Y.2046Z-0.0688 +N2950G1X.6603Y.3497Z-0.0409 +N2960G1X.8072Y.5041Z-0.0298 +N2970G1X.9505Y.664Z-0.0353 +N2980G1X1.1011Y.85Z-0.0614 +N2990G1X1.1699Y.8649Z-0.0688 +N3000G1X1.2332Y.8296Z-0.0614 +N3010G1X1.2667Y.744Z-0.0558 +N3020G1X1.2815Y.5561Z-0.0707 +N3030G1X1.2555Y.3367Z-0.0781 +N3040G1X1.2109Y.1841Z-0.0744 +N3050G1X1.116Y-.013Z-0.0688 +N3060G1X.9133Y-.3274Z-0.0316 +N3070G1X.904Y-.4222Z-0.0391 +N3080G1X.9281Y-.558Z-0.0391 +N3090G1X.9635Y-.6659Z-0.0353 +N3100G1X.9579Y-.7328Z-0.0632 +N3110G1X.9095Y-.7087Z-0.0372 +N3120G1X.7626Y-.5729Z0 +N3130G1X.9095Y-.7087Z-0.0372 +N3140G1X.9579Y-.7347Z-0.0632 +N3150G1X1.0769Y-.9114Z-0.0521 +N3160G1X1.1997Y-1.0304Z-0.0446 +N3170G1X1.4024Y-1.1644Z-0.0484 +N3180G1X1.5624Y-1.2574Z-0.0558 +N3190G1X1.7875Y-1.4192Z-0.0484 +N3200G1X1.8898Y-1.5289Z-0.0539 +N3210G1X2.0665Y-1.7893Z-0.0707 +N3220G1X2.1204Y-1.9251Z-0.0707 +N3230G1X2.126Y-2.0702Z-0.0614 +N3240G1X2.0869Y-2.1948Z-0.0335 +N3250G1X2.0627Y-2.2469Z-0.0167 +N3260G1X1.9567Y-2.2897Z-0.0632 +N3270G1X1.886Y-2.2618Z-0.0409 +N3280G1X1.7298Y-2.2227Z-0.0409 +N3290G1X1.4992Y-2.1427Z-0.0577 +N3300G1X1.3299Y-2.113Z-0.0577 +N3310G1X1.0751Y-2.1185Z-0.026 +N3320G1X.997Y-2.1092Z0 +N3330G1X1.1272Y-2.1185Z-0.0353 +N3340G1X1.3299Y-2.113Z-0.0577 +N3350G1X1.4992Y-2.1427Z-0.0577 +N3360G1X1.8098Y-2.245Z-0.0428 +N3370G1X1.9046Y-2.2636Z-0.0409 +N3380G1X1.9567Y-2.2897Z-0.0632 +N3390G1X1.9307Y-2.338Z-0.0484 +N3400G1X1.7986Y-2.4087Z-0.0725 +N3410G1X1.6889Y-2.4236Z-0.0725 +N3420G1X1.5215Y-2.405Z-0.0539 +N3430G1X1.2871Y-2.3473Z-0.0409 +N3440G1X1.1792Y-2.3529Z-0.0595 +N3450G1X.9653Y-2.3845Z-0.0949 +N3460G1X.7793Y-2.3752Z-0.08 +N3470G1X.4185Y-2.3008Z-0.0353 +N3480G1X.3348Y-2.3269Z-0.0577 +N3490G1X.3162Y-2.3362Z-0.067 +N3500G1X.2437Y-2.3194Z-0.0446 +N3510G1X-.0428Y-2.3789Z-0.0446 +N3520G1X-.2213Y-2.3901Z-0.0465 +N3530G1X-.3013Y-2.392Z0 +N3540G1X-.2083Y-2.3901Z-0.0502 +N3550G1X.0242Y-2.3678Z-0.0484 +N3560G1X.2511Y-2.3194Z-0.0446 +N3570G1X.3162Y-2.3362Z-0.067 +N3580G1X.3199Y-2.418Z-0.0539 +N3590G1X.359Y-2.6803Z-0.0595 +N3600G1X.3608Y-2.8495Z-0.0725 +N3610G1X.3329Y-3.1806Z-0.1283 +N3620G1X.3274Y-3.2978Z-0.1432 +N3630G1X.346Y-3.4057Z-0.1339 +N3640G1X.3925Y-3.5433Z-0.0818 +N3650G1X.3999Y-3.5824Z-0.0595 +N3660G1X.3571Y-3.441Z-0.1246 +N3670G1X.3311Y-3.3331Z-0.1432 +N3680G1X.3274Y-3.2252Z-0.1358 +N3690G1X.3534Y-3.0095Z-0.093 +N3700G1X.3608Y-2.7733Z-0.067 +N3710G1X.3385Y-2.5073Z-0.0521 +N3720G1X.3143Y-2.3585Z-0.0595 +N3730G1X.3162Y-2.3362Z-0.067 +N3740G1X.4036Y-2.3008Z-0.0372 +N3750G1X.4594Y-2.3045Z-0.0372 +N3760G1X.8444Y-2.3827Z-0.0893 +N3770G1X1.0249Y-2.3771Z-0.0893 +N3780G1X1.2518Y-2.3455Z-0.0465 +N3790G1X1.382Y-2.3678Z-0.0428 +N3800G1X1.5364Y-2.4087Z-0.0577 +N3810G1X1.7224Y-2.4217Z-0.0763 +N3820G1X1.8191Y-2.4013Z-0.0725 +N3830G1X1.9307Y-2.338Z-0.0484 +N3840G1X1.9567Y-2.2897Z-0.0632 +N3850G1X2.0627Y-2.2469Z-0.0167 +N3860G1X2.1148Y-2.1204Z-0.0539 +N3870G1X2.1297Y-1.9883Z-0.0688 +N3880G1X2.0944Y-1.8451Z-0.0707 +N3890G1X1.9623Y-1.6256Z-0.0651 +N3900G1X1.8377Y-1.4675Z-0.0502 +N3910G1X1.7131Y-1.3578Z-0.0521 +N3920G1X1.5624Y-1.2574Z-0.0558 +N3930G1X1.2388Y-1.0602Z-0.0446 +N3940G1X1.1011Y-.9374Z-0.0502 +N3950G1X.9579Y-.7328Z-0.0632 +N3960G1X.9635Y-.6659Z-0.0353 +N3970G1X.9077Y-.4687Z-0.0409 +N3980G1X.9095Y-.3348Z-0.0298 +N3990G1X1.1365Y.0223Z-0.0707 +N4000G1X1.222Y.2158Z-0.0763 +N4010G1X1.2629Y.3776Z-0.0744 +N4020G1X1.2815Y.5803Z-0.0707 +N4030G1X1.2574Y.7812Z-0.0539 +N4040G1X1.2164Y.8444Z-0.0651 +N4050G1X1.1569Y.8668Z-0.067 +N4060G1X1.0937Y.8444Z-0.0595 +N4070G1X.9467Y.6603Z-0.0353 +N4080G1X.7868Y.4817Z-0.0298 +N4090G1X.6566Y.346Z-0.0428 +N4100G1X.4557Y.1693Z-0.08 +N4110G1X.3329Y.119Z-0.1246 +N4120G1X.2027Y.119Z-0.1786 +N4130G1X.119Y.1432Z-0.2176 +N4140G1X.0744Y.2995Z-0.1823 +N4150G1X.0651Y.5003Z-0.1897 +N4160G1X.0818Y.7477Z-0.2362 +N4170G1X.2288Y.917Z-0.1953 +N4180G1X.3534Y1.0602Z-0.2046 +N4190G1X.4687Y1.2127Z-0.2641 +N4200G1X.4892Y1.2443Z-0.2809 +N4210G00X.4892Y1.2443Z0.2 +N4220G00X.1451Y2.5147Z0.2 +N4230G1X.1451Y2.5147Z-0.1544F8 +N4240G1X.0316Y2.3064Z0F25 +N4250G1X.1451Y2.5147Z-0.1544 +N4260G1X.3329Y2.4217Z0 +N4270G1X.1451Y2.5147Z-0.1544 +N4280G1X.0763Y2.7156Z-0.1395 +N4290G1X-.1042Y3.0913Z-0.1023 +N4300G1X-.2399Y3.361Z-0.0949 +N4310G1X-.2418Y3.4094Z-0.0725 +N4320G1X-.2306Y3.3331Z-0.1004 +N4330G1X-.0986Y3.082Z-0.1023 +N4340G1X.0763Y2.7156Z-0.1395 +N4350G1X.1451Y2.5147Z-0.1544 +N4360G00Z0.2 +N4370G00X-1.0137Y1.9065Z0.2 +N4380G1X-1.0137Y1.9065Z-0.3255F8 +N4390G1X-.7924Y1.8749Z-0.2288F25 +N4400G1X-.6026Y1.8712Z-0.1786 +N4410G1X-.3832Y1.9065Z-0.1581 +N4420G1X-.1283Y1.9865Z-0.1748 +N4430G1X.212Y2.1185Z-0.173 +N4440G1X.5524Y2.2636Z-0.1395 +N4450G1X.8928Y2.4273Z-0.0725 +N4460G1X.4724Y2.232Z-0.1488 +N4470G1X.212Y2.1185Z-0.173 +N4480G1X-.1283Y1.9865Z-0.1748 +N4490G1X-.4408Y1.8916Z-0.16 +N4500G1X-.6305Y1.8693Z-0.1841 +N4510G1X-.8314Y1.8786Z-0.2418 +N4520G1X-1.0137Y1.9065Z-0.3255 +N4530G1X-1.0546Y2.0851Z-0.2381 +N4540G1X-1.0862Y2.2673Z-0.1879 +N4550G1X-1.0862Y2.4738Z-0.1618 +N4560G1X-1.0304Y2.7156Z-0.1562 +N4570G1X-.9393Y2.9295Z-0.1562 +N4580G1X-.7849Y3.1639Z-0.1562 +N4590G1X-.7105Y3.335Z-0.1172 +N4600G1X-.677Y3.4745Z-0.0614 +N4610G1X-.7328Y3.2736Z-0.1339 +N4620G1X-.8147Y3.1155Z-0.16 +N4630G1X-.9412Y2.9258Z-0.1562 +N4640G1X-1.0304Y2.7156Z-0.1562 +N4650G1X-1.09Y2.4459Z-0.1655 +N4660G1X-1.0825Y2.2394Z-0.1934 +N4670G1X-1.0453Y2.0423Z-0.2567 +N4680G1X-1.0137Y1.9065Z-0.3255 +N4690G1X-1.1904Y1.7521Z-0.2455 +N4700G1X-1.3671Y1.6294Z-0.2102 +N4710G1X-1.6573Y1.4787Z-0.2176 +N4720G1X-1.8916Y1.3113Z-0.2158 +N4730G1X-2.0181Y1.1885Z-0.2009 +N4740G1X-2.113Y1.036Z-0.2009 +N4750G1X-2.1576Y.8891Z-0.2139 +N4760G1X-2.1539Y.7626Z-0.2195 +N4770G1X-2.0962Y.6194Z-0.2139 +N4780G1X-1.9995Y.5134Z-0.199 +N4790G1X-1.8284Y.3999Z-0.199 +N4800G1X-1.5996Y.2976Z-0.2009 +N4810G1X-1.5047Y.2623Z-0.1953 +N4820G1X-1.4024Y.0298Z0 +N4830G1X-1.5047Y.2623Z-0.1953 +N4840G1X-1.2369Y.3553Z0 +N4850G1X-1.5047Y.2623Z-0.1953 +N4860G1X-1.5996Y.2976Z-0.2009 +N4870G1X-1.8916Y.4371Z-0.1953 +N4880G1X-2.033Y.5431Z-0.2046 +N4890G1X-2.1204Y.664Z-0.2176 +N4900G1X-2.1595Y.8147Z-0.2176 +N4910G1X-2.1409Y.9653Z-0.2083 +N4920G1X-2.0572Y1.1346Z-0.199 +N4930G1X-1.9567Y1.2536Z-0.2065 +N4940G1X-1.7763Y1.3987Z-0.2213 +N4950G1X-1.6256Y1.4954Z-0.2139 +N4960G1X-1.3671Y1.6294Z-0.2102 +N4970G1X-1.1904Y1.7521Z-0.2455 +N4980G1X-1.0137Y1.9065Z-0.3255 +N5000G00Z0.8 +N5010G00X0Y0 +N5020M05 +N5030M30 +N5040% diff --git a/tests/test-files/Circular Pocket.tap b/tests/test-files/Circular Pocket.tap new file mode 100644 index 0000000..7f58fe3 --- /dev/null +++ b/tests/test-files/Circular Pocket.tap @@ -0,0 +1,43 @@ +(Code by Newfangled Wizard, 15/01/2017) +(Version 2.86) +(Program Posted for Aluminum ) +G0 G49 G40.1 G17 +G80 G50 G90 G98 +G21 (mm) +(***** Circular Pocket *****) +(Xcen=0 Ycen=0 Dia=10) +(CW-climb mill) +M6 T7(TOOL DIA. 4) +M03 S4000 +M7 (Mist On) +G00 G43 H7 Z2 +X0 Y0 +G01 Z-1 F50 +G2 Y0 X1.60 R0.80 F100 +Y0 X-1.6 R1.6 +Y0 X3 R2.3 +Y0 X-3 R3 +X3 Y0 R3 +Y-1.5 X1.5 R1.5 +G00 Z2 +X0 Y0 +G01 Z-2 F50 +G2 Y0 X1.60 R0.80 F100 +Y0 X-1.6 R1.6 +Y0 X3 R2.3 +Y0 X-3 R3 +X3 Y0 R3 +Y-1.5 X1.5 R1.5 +G00 Z2 +X0 Y0 +G01 Z-3 F50 +G2 Y0 X1.60 R0.80 F100 +Y0 X-1.6 R1.6 +Y0 X3 R2.3 +Y0 X-3 R3 +X3 Y0 R3 +Y-1.5 X1.5 R1.5 +G00 Z2 +M5 M9 +M30 +% \ No newline at end of file diff --git a/tests/test-files/Clamp.nc b/tests/test-files/Clamp.nc new file mode 100644 index 0000000..f1eb3f9 --- /dev/null +++ b/tests/test-files/Clamp.nc @@ -0,0 +1,177 @@ +N005 G91.1 +N015 G90 G17 G94 G49 G40 G80 +N020 G20 (Inch) +N025 M06 T1 (Endmill Dia. 0.250) +N030 M03 S2500 +N035 G00 Z1.0000 +N040 M08 +N045 G43 H1 Z0.250 +N050 G00 X3.5851 Y0.0000 +N055 G01 Z-0.0250 F1.0 +N060 F5.0 +N065 G01 X2.7632 Y0.6910 +N070 G03 X2.2084 Y0.6120 I-0.2421 J-0.2873 +N075 G02 X1.7769 Y0.6373 I-0.2084 J0.1380 +N080 G03 X1.3261 Y0.8253 I-0.3383 J-0.1766 +N085 G01 X-0.1158 Y0.3567 +N090 G03 X0.2251 Y-0.3000 I0.1158 J-0.3567 +N095 G02 X0.3751 Y-0.2500 I0.1499 J-0.2001 +N100 G01 X2.2526 Y-0.2500 +N105 G03 X2.4276 Y-0.2067 I0.0077 J0.3441 +N110 G02 X2.7279 Y-0.2513 I0.1391 J-0.0969 +N115 G03 X3.2421 Y0.2864 I0.2744 J0.2523 +N120 G01 X3.5851 Y0.0000 +N125 G00 Z0.2500 +N130 G00 X3.5851 Y0.0000 +N135 G01 Z-0.0500 F1.0 +N140 F5.0 +N145 G01 X2.7632 Y0.6910 +N150 G03 X2.2084 Y0.6120 I-0.2421 J-0.2873 +N155 G02 X1.7769 Y0.6373 I-0.2084 J0.1380 +N160 G03 X1.3261 Y0.8253 I-0.3383 J-0.1766 +N165 G01 X-0.1158 Y0.3567 +N170 G03 X0.2251 Y-0.3000 I0.1158 J-0.3567 +N175 G02 X0.3751 Y-0.2500 I0.1499 J-0.2001 +N180 G01 X2.2526 Y-0.2500 +N185 G03 X2.4276 Y-0.2067 I0.0077 J0.3441 +N190 G02 X2.7279 Y-0.2513 I0.1391 J-0.0969 +N195 G03 X3.2421 Y0.2864 I0.2744 J0.2523 +N200 G01 X3.5851 Y0.0000 +N205 G00 Z0.2500 +N210 G00 X3.5851 Y0.0000 +N215 G01 Z-0.0750 F1.0 +N220 F5.0 +N225 G01 X2.7632 Y0.6910 +N230 G03 X2.2084 Y0.6120 I-0.2421 J-0.2873 +N235 G02 X1.7769 Y0.6373 I-0.2084 J0.1380 +N240 G03 X1.3261 Y0.8253 I-0.3383 J-0.1766 +N245 G01 X-0.1158 Y0.3567 +N250 G03 X0.2251 Y-0.3000 I0.1158 J-0.3567 +N255 G02 X0.3751 Y-0.2500 I0.1499 J-0.2001 +N260 G01 X2.2526 Y-0.2500 +N265 G03 X2.4276 Y-0.2067 I0.0077 J0.3441 +N270 G02 X2.7279 Y-0.2513 I0.1391 J-0.0969 +N275 G03 X3.2421 Y0.2864 I0.2744 J0.2523 +N280 G01 X3.5851 Y0.0000 +N285 G00 Z0.2500 +N290 G00 X3.5851 Y0.0000 +N295 G01 Z-0.1000 F1.0 +N300 F5.0 +N305 G01 X2.7632 Y0.6910 +N310 G03 X2.2084 Y0.6120 I-0.2421 J-0.2873 +N315 G02 X1.7769 Y0.6373 I-0.2084 J0.1380 +N320 G03 X1.3261 Y0.8253 I-0.3383 J-0.1766 +N325 G01 X-0.1158 Y0.3567 +N330 G03 X0.2251 Y-0.3000 I0.1158 J-0.3567 +N335 G02 X0.3751 Y-0.2500 I0.1499 J-0.2001 +N340 G01 X2.2526 Y-0.2500 +N345 G03 X2.4276 Y-0.2067 I0.0077 J0.3441 +N350 G02 X2.7279 Y-0.2513 I0.1391 J-0.0969 +N355 G03 X3.2421 Y0.2864 I0.2744 J0.2523 +N360 G01 X3.5851 Y0.0000 +N365 G00 Z0.2500 +N370 G00 X3.5851 Y0.0000 +N375 G01 Z-0.1250 F1.0 +N380 F5.0 +N385 G01 X2.7632 Y0.6910 +N390 G03 X2.2084 Y0.6120 I-0.2421 J-0.2873 +N395 G02 X1.7769 Y0.6373 I-0.2084 J0.1380 +N400 G03 X1.3261 Y0.8253 I-0.3383 J-0.1766 +N405 G01 X-0.1158 Y0.3567 +N410 G03 X0.2251 Y-0.3000 I0.1158 J-0.3567 +N415 G02 X0.3751 Y-0.2500 I0.1499 J-0.2001 +N420 G01 X2.2526 Y-0.2500 +N425 G03 X2.4276 Y-0.2067 I0.0077 J0.3441 +N430 G02 X2.7279 Y-0.2513 I0.1391 J-0.0969 +N435 G03 X3.2421 Y0.2864 I0.2744 J0.2523 +N440 G01 X3.5851 Y0.0000 +N445 G00 Z0.2500 +N450 G00 X3.5851 Y0.0000 +N455 G01 Z-0.1500 F1.0 +N460 F5.0 +N465 G01 X2.7632 Y0.6910 +N470 G03 X2.2084 Y0.6120 I-0.2421 J-0.2873 +N475 G02 X1.7769 Y0.6373 I-0.2084 J0.1380 +N480 G03 X1.3261 Y0.8253 I-0.3383 J-0.1766 +N485 G01 X-0.1158 Y0.3567 +N490 G03 X0.2251 Y-0.3000 I0.1158 J-0.3567 +N495 G02 X0.3751 Y-0.2500 I0.1499 J-0.2001 +N500 G01 X2.2526 Y-0.2500 +N505 G03 X2.4276 Y-0.2067 I0.0077 J0.3441 +N510 G02 X2.7279 Y-0.2513 I0.1391 J-0.0969 +N515 G03 X3.2421 Y0.2864 I0.2744 J0.2523 +N520 G01 X3.5851 Y0.0000 +N525 G00 Z0.2500 +N530 G00 X3.5851 Y0.0000 +N535 G01 Z-0.1750 F1.0 +N540 F5.0 +N545 G01 X2.7632 Y0.6910 +N550 G03 X2.2084 Y0.6120 I-0.2421 J-0.2873 +N555 G02 X1.7769 Y0.6373 I-0.2084 J0.1380 +N560 G03 X1.3261 Y0.8253 I-0.3383 J-0.1766 +N565 G01 X-0.1158 Y0.3567 +N570 G03 X0.2251 Y-0.3000 I0.1158 J-0.3567 +N575 G02 X0.3751 Y-0.2500 I0.1499 J-0.2001 +N580 G01 X2.2526 Y-0.2500 +N585 G03 X2.4276 Y-0.2067 I0.0077 J0.3441 +N590 G02 X2.7279 Y-0.2513 I0.1391 J-0.0969 +N595 G03 X3.2421 Y0.2864 I0.2744 J0.2523 +N600 G01 X3.5851 Y0.0000 +N605 G00 Z0.2500 +N610 G00 X3.5851 Y0.0000 +N615 G01 Z-0.2000 F1.0 +N620 F5.0 +N625 G01 X2.7632 Y0.6910 +N630 G03 X2.2084 Y0.6120 I-0.2421 J-0.2873 +N635 G02 X1.7769 Y0.6373 I-0.2084 J0.1380 +N640 G03 X1.3261 Y0.8253 I-0.3383 J-0.1766 +N645 G01 X-0.1158 Y0.3567 +N650 G03 X0.2251 Y-0.3000 I0.1158 J-0.3567 +N655 G02 X0.3751 Y-0.2500 I0.1499 J-0.2001 +N660 G01 X2.2526 Y-0.2500 +N665 G03 X2.4276 Y-0.2067 I0.0077 J0.3441 +N670 G02 X2.7279 Y-0.2513 I0.1391 J-0.0969 +N675 G03 X3.2421 Y0.2864 I0.2744 J0.2523 +N680 G01 X3.5851 Y0.0000 +N685 G00 Z0.2500 +N690 G00 X3.5851 Y0.0000 +N695 G01 Z-0.2250 F1.0 +N700 F5.0 +N705 G01 X2.7632 Y0.6910 +N710 G03 X2.2084 Y0.6120 I-0.2421 J-0.2873 +N715 G02 X1.7769 Y0.6373 I-0.2084 J0.1380 +N720 G03 X1.3261 Y0.8253 I-0.3383 J-0.1766 +N725 G01 X-0.1158 Y0.3567 +N730 G03 X0.2251 Y-0.3000 I0.1158 J-0.3567 +N735 G02 X0.3751 Y-0.2500 I0.1499 J-0.2001 +N740 G01 X2.2526 Y-0.2500 +N745 G03 X2.4276 Y-0.2067 I0.0077 J0.3441 +N750 G02 X2.7279 Y-0.2513 I0.1391 J-0.0969 +N755 G03 X3.2421 Y0.2864 I0.2744 J0.2523 +N760 G01 X3.5851 Y0.0000 +N765 G00 Z0.2500 +N770 G00 X3.5851 Y0.0000 +N775 G01 Z-0.2500 F1.0 +N780 F5.0 +N785 G01 X2.7632 Y0.6910 +N790 G03 X2.2084 Y0.6120 I-0.2421 J-0.2873 +N795 G02 X1.7769 Y0.6373 I-0.2084 J0.1380 +N800 G03 X1.3261 Y0.8253 I-0.3383 J-0.1766 +N805 G01 X-0.1158 Y0.3567 +N810 G03 X0.2251 Y-0.3000 I0.1158 J-0.3567 +N815 G02 X0.3751 Y-0.2500 I0.1499 J-0.2001 +N820 G01 X2.2526 Y-0.2500 +N825 G03 X2.4276 Y-0.2067 I0.0077 J0.3441 +N830 G02 X2.7279 Y-0.2513 I0.1391 J-0.0969 +N835 G03 X3.2421 Y0.2864 I0.2744 J0.2523 +N840 G01 X3.5851 Y0.0000 +N845 G00 Z0.2500 +N850 G00 X0.0000 Y0.0000 +N855 G01 Z1.0000 F1.0 +N860 F5.0 +N865 G01 X0.0000 Y0.0000 +N870 G00 Z0.2500 +N875 M09 +N880 M05 +N885 M30 +N890 % diff --git a/tests/test-files/Colt.tap b/tests/test-files/Colt.tap new file mode 100644 index 0000000..f624bd9 --- /dev/null +++ b/tests/test-files/Colt.tap @@ -0,0 +1,437 @@ +( Colt ) +N100G00G21G17G90G40G49G80 +N110G71G91.1 +N120T1M06 +N130(ENGRAVING - 20 DEG TIP 0.1) +N140G00G43Z6H1 +N150S12000M03 +N160 +N170 +N180G94 +N190X0Y0F600.0 +N200G00X14.9Y18.75 +N210G1Z-0.2 +N220G2X13.15Y22.6I1.15J2.85 +N230G3X14.4Y30.3I-20.25J7.25 +N240G2X15.35Y33.4I5.25J.1 +N250G3X18.05Y46.1I-13.8J9.6 +N260G2X18.2Y50.1I8.8J1.65 +N270G3X18.75Y54.05I-14.65J3.95 +N280G2X19Y55.55I3.85J0 +N290G3X20.5Y61.4I-19.4J8 +N300G3X21.4Y74.95I-177.5J18.5 +N310G2X23.25Y88.4I61.45J-1.7 +N320G3X23.15Y88.9I-.55J.15 +N330G3X22.8Y88.95I-.2J-.15 +N340G3X20.55Y86.4I6.8J-8.3 +N350G1X18.6Y83.65 +N360G1X18.35Y83.5 +N370G1X18.2Y83.65 +N380G3X17.65Y83.75I-.3J0 +N390G2X16.5Y82.15I-4.6J2.05 +N400G2X14.6Y80.7I-7.2J7.7 +N410G2X7.25Y76.75I-65.25J111.8 +N420G1X7.05Y76.55 +N430G1X7.05Y76.4 +N440G2X6.7Y75.75I-.35J-.2 +N450G2X2.65Y76.45I-.85J7.2 +N460G2X1.55Y77.5I1.15J2.35 +N470G3X.3Y78.4I-1.55J-.9 +N480G1X.15Y78.35 +N490G1X.05Y78.4 +N500G1X.1Y78.5 +N510G3X1.7Y79.55I-.35J2.3 +N520G2X4.1Y82.2I9.6J-6.15 +N530G1X5.35Y83.15 +N540G1X5.6Y83.25 +N550G3X6.2Y83.55I-.05J.85 +N560G2X8.45Y85.2I4.45J-3.7 +N570G1X12.2Y86.8 +N580G3X15.65Y89.35I-4.4J9.6 +N590G2X19.05Y91I3.75J-3.4 +N600G3X19.7Y91.65I-.05J.7 +N610G2X20.45Y92.15I.55J0 +N620G3X20.8Y92.5I.1J.25 +N630G3X20.5Y92.55I-.2J-.1 +N640G2X20.25Y92.8I-.1J.15 +N650G2X20.7Y92.85I.25J-.25 +N660G3X22.3Y92.55I1.35J2.7 +N670G3X22.45Y92.8I0J.2 +N680G3X22.25Y92.95I-.2J0 +N690G1X22.1Y93.1 +N700G1X22.25Y93.2 +N710G3X25.5Y92.95I2J5 +N720G2X26.2Y92.5I.15J-.6 +N730G3X26.9Y92.45I.35J.1 +N740G2X28.6Y94.5I5J-2.4 +N750G1X28.7Y94.6 +N760G1X28.75Y94.65 +N770G2X29.75Y95.6I1.05J-.1 +N780G3X35Y96.25I-2.3J40.6 +N790G2X41.85Y96.8I6J-31.7 +N800G2X44.15Y96I-.1J-4.1 +N810G3X45.05Y95.65I1.05J1.45 +N820G2X45.55Y94.9I-.05J-.6 +N830G3X45.9Y94I.8J-.2 +N840G3X50.8Y91.1I18.45J25.55 +N850G3X52Y90.8I1.25J2.6 +N860G3X54.3Y91I.3J11.15 +N870G1X54.4Y91.05 +N880G1X54.4Y91.1 +N890G1X54.35Y91.2 +N900G1X54.3Y91.3 +N910G1X54.05Y91.35 +N920G1X54.1Y91.5 +N930G1X54.35Y91.7 +N940G1X54.55Y91.85 +N950G3X54.55Y92.2I-.05J.2 +N960G2X54.4Y92.4I0J.15 +N970G2X54.7Y92.55I.25J-.1 +N980G1X55.95Y92.35 +N990G3X56.15Y92.6I0J.2 +N1000G3X55.85Y92.7I-.2J-.05 +N1010G2X54.65Y93I-.45J.85 +N1020G2X54.7Y93.25I.1J.1 +N1030G3X55Y93.5I-.15J.45 +N1040G2X55.35Y93.6I.2J-.05 +N1050G3X55.65Y93.65I.15J.15 +N1060G3X55.55Y93.95I-.15J.1 +N1070G2X54.5Y94.9I.4J1.5 +N1080G2X55Y95.4I.35J.15 +N1090G2X55.7Y94.6I-.55J-1.15 +N1100G3X56.15Y94.4I.3J.1 +N1110G3X56.2Y94.9I-.15J.3 +N1120G2X54.85Y96.8I6.3J5.95 +N1130G2X55Y97.2I.25J.15 +N1140G2X55.5Y96.9I.15J-.3 +N1150G3X56.8Y95.1I2.25J.25 +N1160G3X57.05Y95.5I.1J.2 +N1170G1X56Y96.65 +N1180G2X56.05Y96.9I.15J.1 +N1190G2X56.3Y96.85I.1J-.15 +N1200G1X57.05Y96 +N1210G1X57.25Y95.8 +N1220G1X57.85Y95.15 +N1230G3X58.1Y95.1I.15J.15 +N1240G3X58.15Y95.4I-.15J.15 +N1250G2X57.45Y96.5I3.15J2.75 +N1260G1X57Y97.25 +N1270G2X56.75Y98.15I.85J.65 +N1280G1X56.75Y98.55 +N1290G1X56.65Y98.75 +N1300G1X56.5Y99 +N1310G2X56.7Y99.15I.1J0 +N1320G2X57.4Y98.15I-.7J-1.25 +N1330G3X57.75Y98.15I.15J.05 +N1340G3X57.65Y99.25I-1.55J.4 +N1350G1X57.7Y99.45 +N1360G1X57.95Y99.35 +N1370G1X58.3Y98.3 +N1380G3X58.9Y97.35I1.7J.4 +N1390G1X59.5Y96.9 +N1400G3X59.75Y97.15I.1J.15 +N1410G1X59.2Y97.75 +N1420G2X58.9Y98.45I.65J.75 +N1430G2X59.35Y100.25I3.1J.15 +N1440G3X59.75Y102.05I-2.45J1.5 +N1450G1X59.8Y102.1 +N1460G1X59.95Y102.05 +N1470G2X59.8Y100.35I-1.35J-.75 +N1480G3X59.6Y98.65I1.2J-1 +N1490G1X60.05Y98.1 +N1500G3X60.2Y98.15I.05J.05 +N1510G1X60.35Y100.45 +N1520G2X61.05Y101.4I1.2J-.15 +N1530G2X61.2Y101.2I.05J-.1 +N1540G1X60.7Y100.4 +N1550G3X60.55Y98.65I3.4J-1.2 +N1560G3X61Y98.6I.25J.05 +N1570G1X61.05Y99.45 +N1580G2X61.55Y100.85I1.7J.2 +N1590G2X61.7Y100.75I.05J-.05 +N1600G1X61.5Y100.2 +N1610G1X61.35Y99.05 +N1620G3X61.7Y98.95I.2J0 +N1630G1X61.85Y99.85 +N1640G2X62.65Y101.35I1.55J.1 +N1650G1X63.35Y101.65 +N1660G1X63.45Y101.65 +N1670G1X63.5Y101.6 +N1680G1X63.3Y101.45 +N1690G3X62.05Y100.15I1.5J-2.65 +N1700G3X62Y98.85I1.4J-.7 +N1710G1X62.35Y98.45 +N1720G1X62.7Y98 +N1730G1X62.85Y97.75 +N1740G3X63.05Y97.9I.05J.1 +N1750G2X62.9Y99.95I3.7J1.25 +N1760G2X63.9Y101.9I4.15J-.9 +N1770G1X64.25Y102.1 +N1780G3X64.55Y102.7I-.1J.4 +N1790G2X64.3Y104I1.75J.95 +N1800G2X64.9Y105.1I1.9J-.3 +N1810G2X65.05Y105I.05J-.05 +N1820G3X65.4Y104.5I.35J-.15 +N1830G2X65.6Y104.2I0J-.2 +N1840G3X66.9Y103.5I.7J-.25 +N1850G3X67.45Y104.85I-2.95J2 +N1860G3X67.15Y105I-.15J.05 +N1870G2X66.4Y104.7I-.95J1.25 +N1880G2X65.3Y104.75I-.4J2.85 +N1890G2X65.25Y105.05I.05J.15 +N1900G3X65.35Y106.25I-.65J.7 +N1910G1X65.25Y106.5 +N1920G2X65.4Y106.55I.1J0 +N1930G2X65.7Y105.8I-.85J-.8 +N1940G3X66.4Y105.3I.5J0 +N1950G1X67.6Y105.85 +N1960G3X67.6Y106.45I-.15J.3 +N1970G1X65.95Y107.15 +N1980G2X65.45Y108.2I.25J.75 +N1990G2X65.7Y108.15I.1J-.05 +N2000G3X66.35Y107.4I.7J-.05 +N2010G3X66.35Y107.65I0J.15 +N2020G2X66.2Y107.85I.05J.2 +N2030G1X66.3Y107.95 +N2040G1X66.55Y107.75 +N2050G1X66.65Y107.7 +N2060G1X66.7Y107.8 +N2070G1X66.7Y108.05 +N2080G1X66.7Y108.35 +N2090G1X66.65Y108.4 +N2100G1X66.65Y108.45 +N2110G1X66.7Y108.45 +N2120G1X66.7Y108.35 +N2130G1X66.7Y108.3 +N2140G1X67.1Y107.65 +N2150G1X67.2Y107.7 +N2160G1X67.1Y107.8 +N2170G1X67.15Y107.85 +N2180G1X67.3Y107.7 +N2190G1X67.5Y107.6 +N2200G1X67.75Y107.55 +N2210G1X67.8Y107.5 +N2220G1X67.85Y107.4 +N2230G1X68.05Y107.25 +N2240G1X68Y107.15 +N2250G3X68.2Y107.35I.1J.1 +N2260G3X67.5Y107.8I-1J-.8 +N2270G2X67Y108.4I.1J.6 +N2280G2X67.35Y108.7I.3J0 +N2290G2X67.55Y108.3I0J-.25 +N2300G3X67.8Y107.9I.2J-.15 +N2310G1X67.85Y108.1 +N2320G1X67.65Y108.75 +N2330G2X67.85Y108.8I.1J0 +N2340G3X68.1Y108.1I1.15J.05 +N2350G1X68.3Y107.95 +N2360G1X68.35Y107.95 +N2370G1X68.4Y108.45 +N2380G2X68.6Y108.45I.1J0 +N2390G3X68.85Y107.85I.85J.05 +N2400G3X70.5Y106.6I6.35J6.7 +N2410G3X71.1Y107.15I.2J.35 +N2420G3X69.75Y108.1I-1.55J-.8 +N2430G1X69.6Y108.1 +N2440G1X69.2Y107.95 +N2450G1X69.05Y107.9 +N2460G1X69Y107.95 +N2470G1X69.05Y108 +N2480G1X69.35Y108.15 +N2490G2X70Y108.2I.4J-.9 +N2500G3X70.95Y108.9I.15J.75 +N2510G2X71.25Y109.6I1.35J-.15 +N2520G2X71.45Y109.55I.1J-.05 +N2530G1X71.35Y108.85 +N2540G3X71.3Y108.2I1.05J-.4 +N2550G3X71.55Y108.05I.2J.05 +N2560G3X71.7Y108.3I-.05J.2 +N2570G2X71.9Y109.75I1.15J.55 +N2580G2X72.85Y109.85I.55J-.5 +N2590G2X72.95Y109.45I-.15J-.25 +N2600G2X72.55Y109.55I-.2J.1 +N2610G3X72.15Y109.6I-.2J0 +N2620G3X72.2Y108.8I.9J-.35 +N2630G3X73.5Y107.1I6.3J3.4 +N2640G3X73.7Y107.15I.1J.1 +N2650G3X73.65Y108.3I-3.25J.45 +N2660G1X73.55Y108.6 +N2670G2X73.7Y108.75I.1J.05 +N2680G1X73.9Y108.5 +N2690G1X73.85Y106.95 +N2700G3X74.15Y106.6I.3J-.05 +N2710G3X74.45Y106.95I0J.3 +N2720G2X75.3Y108.85I2.05J.2 +N2730G1X75.45Y108.85 +N2740G1X75.6Y108.9 +N2750G1X75.55Y110 +N2760G2X76.05Y110.05I.25J0 +N2770G2X75.9Y109.15I-1.65J-.15 +N2780G3X76.1Y109I.1J-.05 +N2790G1X76.7Y109.6 +N2800G1X76.9Y109.6 +N2810G1X76.9Y109.4 +N2820G3X76.5Y108.6I.8J-.9 +N2830G3X76.85Y108.4I.2J0 +N2840G3X77.3Y109.1I-1J1.25 +N2850G2X77.7Y109.35I.35J-.15 +N2860G1X77.7Y109.25 +N2870G1X77.55Y109 +N2880G3X77.9Y108.95I.15J0 +N2890G2X78.4Y109.9I1.7J-.3 +N2900G2X79.85Y110.7I2.15J-2.3 +N2910G2X80.65Y109.8I.15J-.65 +N2920G3X81Y109.6I.2J-.05 +N2930G2X81.7Y109.9I.65J-.55 +N2940G1X81.85Y109.75 +N2950G1X81.65Y109.6 +N2960G3X81.25Y109.25I-.05J-.4 +N2970G3X81.9Y109.05I.35J-.05 +N2980G2X84.25Y110.4I2.15J-1.1 +N2990G2X84.4Y110.2I0J-.2 +N3000G2X84.15Y110.05I-.2J.05 +N3010G3X83.8Y109.95I-.1J-.35 +N3020G3X84.05Y109.7I.15J-.15 +N3030G1X84.4Y109.8 +N3040G1X84.75Y109.8 +N3050G1X84.4Y109.8 +N3060G3X83.2Y109.2I.15J-1.75 +N3070G3X83.45Y108.7I.25J-.2 +N3080G3X85.15Y109.75I-.2J2.2 +N3090G2X85.65Y109.7I.25J-.15 +N3100G1X85.55Y109.6 +N3110G3X85.45Y109.5I-.05J-.05 +N3120G3X86.35Y109.35I.5J.3 +N3130G2X88.05Y109.5I.95J-1.15 +N3140G1X88.1Y109.45 +N3150G1X88Y109.4 +N3160G3X87.55Y109.4I-.25J-.4 +N3170G3X87.45Y109.1I.1J-.2 +N3180G3X87.75Y109.05I.2J.1 +N3190G2X88.15Y108.9I.15J-.2 +N3200G3X88.85Y108.8I.4J.1 +N3210G2X89.55Y108.75I.35J-.25 +N3220G2X89.2Y108.15I-.35J-.2 +N3230G1X88.95Y108 +N3240G1X89Y107.9 +N3250G1X89.5Y107.75 +N3260G2X89.5Y107.55I-.05J-.1 +N3270G3X89.45Y107.15I.1J-.2 +N3280G1X89.6Y106.75 +N3290G1X89.65Y106.5 +N3300G1X89.75Y106.5 +N3310G2X90.75Y107.45I3.55J-2.7 +N3320G3X94.95Y111.05I-16.15J23.15 +N3330G2X95.25Y110.95I.15J-.15 +N3340G2X95.7Y108.75I-6.25J-2.4 +N3350G2X94.15Y104.6I-5.8J-.15 +N3360G1X90.8Y101.1 +N3370G3X90.55Y100.45I.6J-.6 +N3380G3X90.9Y98.75I5.85J.3 +N3390G1X91.1Y98.45 +N3400G1X91.15Y98.45 +N3410G1X91.15Y98.55 +N3420G2X91.85Y98.15I-.05J-.85 +N3430G2X94.3Y92.3I-23.15J-13.3 +N3440G3X95.35Y90I8.25J2.4 +N3450G2X94.85Y89.5I-.3J-.2 +N3460G1X94.55Y89.9 +N3470G3X94.05Y89.9I-.25J-.1 +N3480G3X93.15Y83.95I11.2J-4.8 +N3490G3X95.8Y71.2I57.55J5.3 +N3500G2X95.8Y66.65I-6.9J-2.3 +N3510G2X93.15Y63.05I-6.65J2.15 +N3520G2X89.25Y62.45I-2.55J3.7 +N3530G2X86.35Y65.15I1.35J4.35 +N3540G1X84.25Y70.55 +N3550G3X81.75Y74.7I-12.75J-4.95 +N3560G1X79.75Y76.95 +N3570G1X77.75Y79.2 +N3580G3X77.15Y79I-.25J-.25 +N3590G2X76.5Y76.65I-8.65J1.1 +N3600G3X75.85Y74.5I9.45J-4 +N3610G3X76Y73.95I.6J-.1 +N3620G1X76Y73.85 +N3630G3X75.9Y73.45I.3J-.3 +N3640G1X76.95Y68.4 +N3650G2X76.15Y63.7I-6.45J-1.3 +N3660G3X74.05Y59.5I23.9J-14.55 +N3670G3X73.3Y55.3I9.85J-3.9 +N3680G2X71.9Y48.65I-14.75J-.4 +N3690G3X70.4Y36.1I18.15J-8.5 +N3700G2X70.35Y32.2I-8.65J-1.8 +N3710G3X69.8Y16.55I36.85J-9.1 +N3720G1X70.75Y9.9 +N3730G3X72.4Y5.8I8.4J.95 +N3740G1X72.7Y5.25 +N3750G1X73.05Y4.7 +N3760G2X74.35Y2.45I-4.85J-4.35 +N3770G2X73.5Y.8I-1.2J-.4 +N3780G3X73.2Y.55I.1J-.4 +N3790G2X72.7Y0I-.75J.2 +N3800G1X72.2Y-.05 +N3810G1X70.85Y.1 +N3820G2X67.35Y3.7I.2J3.7 +N3830G3X65.2Y12.6I-21.4J-.5 +N3840G2X64.8Y15.65I4.35J2.15 +N3850G3X65Y27.9I-35.15J6.75 +N3860G1X64.05Y35.15 +N3870G1X62.4Y52.05 +N3880G3X61.55Y52.35I-.5J-.05 +N3890G3X59.15Y47.7I6.2J-6.1 +N3900G3X59.25Y38.7I24.95J-4.25 +N3910G2X58.05Y29.85I-13.75J-2.65 +N3920G3X57.25Y27.15I6.85J-3.4 +N3930G3X56.5Y12.3I150.65J-15.05 +N3940G3X56.85Y9.2I13.45J0 +N3950G3X57.35Y8.8I.5J.1 +N3960G2X57.95Y8I-.05J-.65 +N3970G3X58.55Y4.15I5.15J-1.15 +N3980G1X58.8Y3.35 +N3990G2X58.15Y2.35I-.95J-.1 +N4000G2X55.7Y1.85I-3J8.45 +N4010G2X53.1Y3.55I-.15J2.65 +N4020G2X52.5Y9.3I10.4J3.95 +N4030G3X51.9Y15.1I-10.5J1.75 +N4040G2X51.9Y18.25I3.8J1.55 +N4050G3X52.6Y30.75I-17.15J7.25 +N4060G2X52.35Y34.9I9.25J2.7 +N4070G3X51.7Y51.6I-43.6J6.65 +N4080G2X51.45Y55.15I10.75J2.5 +N4090G3X49.3Y58I-2.65J.25 +N4100G2X43.5Y60.3I3.15J16.35 +N4110G3X40.45Y61.6I-5.65J-8.9 +N4120G3X39.8Y61.15I-.15J-.5 +N4130G2X38.75Y58.25I-6.95J.75 +N4140G3X34.9Y44.05I21.65J-13.5 +N4150G3X39.6Y26.25I39.9J1.05 +N4160G2X40.7Y23.7I-14.1J-7.55 +N4170G2X40.05Y22.45I-.95J-.3 +N4180G2X35.15Y25.75I-1.1J3.6 +N4190G3X32.55Y31I-8.05J-.7 +N4200G1X31.95Y31.4 +N4210G2X31.65Y32.05I.25J.5 +N4220G3X31.5Y40.05I-16.3J3.7 +N4230G2X29.1Y54.7I72.2J19.4 +N4240G2X29.9Y57.45I4J.25 +N4250G3X32.3Y68.5I-10.35J8 +N4260G3X31.3Y68.45I-.5J-.1 +N4270G2X30.2Y65.3I-9.35J1.5 +N4280G1X29.1Y63.5 +N4290G1X28.05Y61.7 +N4300G1X28.1Y61.7 +N4310G1X28.15Y61.65 +N4320G2X28.15Y60.9I-.25J-.4 +N4330G3X26.15Y58.7I3.35J-5.1 +N4340G3X25.15Y55.85I8.65J-4.75 +N4350G2X21.25Y44.45I-44J8.55 +N4360G3X20.2Y41.05I9.85J-4.9 +N4370G1X18.05Y27.1 +N4380G3X17.75Y20.8I26.55J-4.45 +N4390G2X14.9Y18.75I-2.1J-.15 +N4400G00X14.9Y18.75Z6 +N4410G00Z6 +N4420G00X0Y0 +N4430M05 +N4440M30 +N4450% diff --git a/tests/test-files/Cross2.tap b/tests/test-files/Cross2.tap new file mode 100644 index 0000000..52d862b --- /dev/null +++ b/tests/test-files/Cross2.tap @@ -0,0 +1,141 @@ +( Cross2 ) +( Material Size ) +( X=96 mm, Y=120 mm, Z=6 mm ) +( Tools used in this file: ) +( T1 = End Mill 4 mm ) +() +N100G00G21G17G90G40G49G80 +N110G71G91.1 +N120T1M06 +N130 +N140G00G43Z6.001H1 +N150S12000M03 +N160 +N170 +N180G94 +N190X0.000Y0.000F300.0 +N200G00X19.365Y10.204 +N210G1X19.365Y10.204F100.0Z-6.250 +N220G3X21.516Y8.215I3.342J1.456F300.0 +N230G3X34.429Y4.911I26.451J76.500 +N240G1X39.329Y4.240 +N250G1X40.693Y4.106 +N260G1X41.226Y2.568 +N270G3X45.677Y-1.360I6.769J3.185 +N280G1X46.900Y-1.639 +N290G1X47.924Y-1.727 +N300G1X48.076Y-1.727 +N310G1X49.100Y-1.639 +N320G1X50.323Y-1.360 +N330G3X54.774Y2.568I-2.318J7.113 +N340G1X55.307Y4.106 +N350G1X56.671Y4.240 +N360G1X61.571Y4.911 +N370G3X74.484Y8.215I-13.538J79.804 +N380G3X76.635Y10.204I-1.191J3.445 +N390G3X76.934Y11.837I-3.337J1.454 +N400G3X76.476Y13.433I-3.637J-0.179 +N410G1X76.387Y13.582 +N420G1X76.279Y13.746 +N430G1X75.550Y14.804 +N440G1X72.855Y18.835 +N450G2X60.886Y44.862I91.386J57.794 +N460G2X56.171Y73.119I103.357J31.767 +N470G1X56.124Y74.803 +N480G1X56.123Y74.969 +N490G1X57.117Y74.965 +N500G1X60.431Y74.897 +N510G1X64.581Y74.650 +N520G2X74.700Y72.963I-6.338J-69.199 +N530G2X84.461Y69.804I-16.458J-67.516 +N540G1X85.953Y69.181 +N550G1X86.868Y68.927 +N560G3X89.334Y69.473I0.494J3.607 +N570G3X90.862Y71.480I-2.004J3.111 +N580G1X91.035Y72.102 +N590G1X91.308Y73.289 +N600G1X91.347Y73.474 +N610G3X93.056Y73.960I-1.143J7.266 +N620G3X97.553Y82.081I-2.910J6.917 +N630G3X91.345Y88.286I-7.408J-1.204 +N640G1X91.234Y88.787 +N650G1X90.775Y90.562 +N660G1X90.576Y91.205 +N670G3X89.881Y92.426I-3.393J-1.123 +N680G3X88.118Y93.544I-2.750J-2.389 +N690G3X86.033Y93.514I-0.993J-3.526 +N700G1X85.430Y93.282 +N710G1X84.091Y92.688 +N720G2X58.689Y87.223I-27.064J64.027 +N730G1X56.527Y87.219 +N740G1X56.532Y87.237 +N750G1X56.726Y88.030 +N760G2X66.598Y104.001I30.363J-7.731 +N770G1X67.446Y104.720 +N780G3X68.587Y106.437I-2.308J2.772 +N790G3X68.532Y108.707I-3.443J1.053 +N800G3X67.160Y110.507I-3.529J-1.268 +N810G1X66.617Y110.866 +N820G1X65.603Y111.480 +N830G3X60.338Y113.988I-17.052J-29.028 +N840G3X55.464Y115.399I-11.723J-31.363 +N850G3X53.114Y119.751I-7.439J-1.206 +N860G3X48.560Y121.710I-5.090J-5.558 +N870G1X48.236Y121.724 +N880G1X48.065Y121.728 +N890G1X47.935Y121.728 +N900G1X47.764Y121.724 +N910G1X47.440Y121.710 +N920G3X42.886Y119.751I0.535J-7.517 +N930G3X40.536Y115.399I5.089J-5.557 +N940G3X35.662Y113.988I6.852J-32.786 +N950G3X30.397Y111.480I11.786J-31.535 +N960G1X29.383Y110.866 +N970G1X28.840Y110.507 +N980G3X27.468Y108.707I2.157J-3.067 +N990G3X27.413Y106.437I3.388J-1.218 +N1000G3X28.554Y104.720I3.449J1.055 +N1010G1X29.402Y104.001 +N1020G2X39.274Y88.030I-20.492J-23.702 +N1030G1X39.468Y87.237 +N1040G1X39.473Y87.219 +N1050G1X37.311Y87.223 +N1060G2X11.909Y92.688I1.662J69.492 +N1070G1X10.570Y93.282 +N1080G1X9.967Y93.514 +N1090G3X7.882Y93.544I-1.092J-3.496 +N1100G3X6.119Y92.426I0.988J-3.506 +N1110G3X5.424Y91.205I2.698J-2.344 +N1120G1X5.225Y90.562 +N1130G1X4.766Y88.787 +N1140G1X4.655Y88.286 +N1150G3X-1.553Y82.081I1.201J-7.409 +N1160G3X2.944Y73.960I7.407J-1.204 +N1170G3X4.653Y73.474I2.843J6.748 +N1180G1X4.692Y73.289 +N1190G1X4.965Y72.102 +N1200G1X5.138Y71.480 +N1210G3X6.666Y69.473I3.532J1.104 +N1220G3X9.132Y68.927I1.972J3.061 +N1230G1X10.047Y69.181 +N1240G1X11.539Y69.804 +N1250G2X21.300Y72.963I26.219J-64.357 +N1260G2X31.419Y74.650I16.457J-67.512 +N1270G1X35.569Y74.897 +N1280G1X38.883Y74.965 +N1290G1X39.877Y74.969 +N1300G1X39.876Y74.803 +N1310G1X39.829Y73.119 +N1320G2X35.114Y44.862I-108.072J3.510 +N1330G2X23.145Y18.835I-103.356J31.767 +N1340G1X20.450Y14.804 +N1350G1X19.721Y13.746 +N1360G1X19.613Y13.582 +N1370G1X19.524Y13.433 +N1380G3X19.066Y11.837I3.179J-1.775 +N1390G3X19.365Y10.204I3.636J-0.179 +N1400G00X19.365Y10.204Z6.000 +N1410G00Z6.001M05 +N1420G00X0.000Y0.000 +N1430M30 +% diff --git a/tests/test-files/DB25.tap b/tests/test-files/DB25.tap new file mode 100644 index 0000000..aecac91 --- /dev/null +++ b/tests/test-files/DB25.tap @@ -0,0 +1,95 @@ +(Code by Newfangled Wizard, 15/01/2017) +(Version 2.86) +(Program Posted for Aluminum ) +G0 G49 G40.1 G17 +G80 G50 G90 G98 +G21 (mm) +(****DB 25 Pin****) +M6 T7(TOOL DIA. 3) +G43 H7 +M03 S4000 +M7 (Mist On) +G0 X18.6665 Y-3.1674 +X18.6665 Y-3.1674 Z2 +G1 X18.6665 Y-3.1674 Z-1 F39.6 +G41 P1.5 X20.4013 Y-3.9116 F79.2 +G3 X21.0007 Y-2.3038 R2.46126 +G1 X21.0007 Y-1.6002 +X23.3959 Y-1.6002 +G3 X24.9961 Y0 R1.6002 +X23.3959 Y1.6002 R1.6002 +G1 X21.0007 Y1.6002 +X21.0007 Y2.3241 +G3 X17.8257 Y5.4991 R3.175 +G1 X-17.8257 Y5.4991 +G3 X-21.0007 Y2.3241 R3.175 +G1 X-21.0007 Y1.6002 +X-23.3959 Y1.6002 +G3 X-24.9961 Y0 R1.6002 +X-23.3959 Y-1.6002 R1.6002 +G1 X-21.0007 Y-1.6002 +X-21.0007 Y-2.3241 +G3 X-17.8257 Y-5.4991 R3.175 +G1 X17.8257 Y-5.4991 +G3 X21.0007 Y-2.3241 R3.175 +G1 X21.0007 Y-1.6002 +G3 X21.8491 Y-0.7772 R1.69672 +G1 G40 X20.4241 Y-0.0178 +G0 X20.4241 Y-0.0178 Z2 +G0 X18.6665 Y-3.1674 +X18.6665 Y-3.1674 Z2 +G1 X18.6665 Y-3.1674 Z-2 F39.6 +G41 P1.5 X20.4013 Y-3.9116 F79.2 +G3 X21.0007 Y-2.3038 R2.46126 +G1 X21.0007 Y-1.6002 +X23.3959 Y-1.6002 +G3 X24.9961 Y0 R1.6002 +X23.3959 Y1.6002 R1.6002 +G1 X21.0007 Y1.6002 +X21.0007 Y2.3241 +G3 X17.8257 Y5.4991 R3.175 +G1 X-17.8257 Y5.4991 +G3 X-21.0007 Y2.3241 R3.175 +G1 X-21.0007 Y1.6002 +X-23.3959 Y1.6002 +G3 X-24.9961 Y0 R1.6002 +X-23.3959 Y-1.6002 R1.6002 +G1 X-21.0007 Y-1.6002 +X-21.0007 Y-2.3241 +G3 X-17.8257 Y-5.4991 R3.175 +G1 X17.8257 Y-5.4991 +G3 X21.0007 Y-2.3241 R3.175 +G1 X21.0007 Y-1.6002 +G3 X21.8491 Y-0.7772 R1.69672 +G1 G40 X20.4241 Y-0.0178 +G0 X20.4241 Y-0.0178 Z2 +G0 X18.6665 Y-3.1674 +X18.6665 Y-3.1674 Z2 +G1 X18.6665 Y-3.1674 Z-3 F39.6 +G41 P1.5 X20.4013 Y-3.9116 F79.2 +G3 X21.0007 Y-2.3038 R2.46126 +G1 X21.0007 Y-1.6002 +X23.3959 Y-1.6002 +G3 X24.9961 Y0 R1.6002 +X23.3959 Y1.6002 R1.6002 +G1 X21.0007 Y1.6002 +X21.0007 Y2.3241 +G3 X17.8257 Y5.4991 R3.175 +G1 X-17.8257 Y5.4991 +G3 X-21.0007 Y2.3241 R3.175 +G1 X-21.0007 Y1.6002 +X-23.3959 Y1.6002 +G3 X-24.9961 Y0 R1.6002 +X-23.3959 Y-1.6002 R1.6002 +G1 X-21.0007 Y-1.6002 +X-21.0007 Y-2.3241 +G3 X-17.8257 Y-5.4991 R3.175 +G1 X17.8257 Y-5.4991 +G3 X21.0007 Y-2.3241 R3.175 +G1 X21.0007 Y-1.6002 +G3 X21.8491 Y-0.7772 R1.69672 +G1 G40 X20.4241 Y-0.0178 +G0 X20.4241 Y-0.0178 Z2 +M5 M9 +M30 +% diff --git a/tests/test-files/Disc3.tap b/tests/test-files/Disc3.tap new file mode 100644 index 0000000..70aaa94 --- /dev/null +++ b/tests/test-files/Disc3.tap @@ -0,0 +1,121 @@ +(Tweakie.CNC) +G00G21G17G90G40G49G80 +G71G91.1 +T1M06 +G00G43Z10H1 +S12000M03 +G94 +X0.000Y0.000F300.0 +G00X17.477Y7.782Z6.000 +G1X17.477Y7.782Z-2.000F100.0 +G1X17.510Y7.801Z-2.000F300.0 +G1X17.687Y7.912Z-2.000 +G1X17.802Y7.990Z-2.000 +G3X18.687Y13.577I-2.351J3.236 +G3X13.100Y14.462I-3.236J-2.351 +G1X12.988Y14.374Z-2.000 +G1X12.802Y14.218Z-2.000 +G1X12.827Y14.253Z-2.000 +G1X12.941Y14.424Z-2.000 +G1X13.013Y14.540Z-2.000 +G3X11.549Y20.004I-3.464J2.000 +G3X6.085Y18.540I-2.000J-3.464 +G1X6.020Y18.416Z-2.000 +G1X5.913Y18.198Z-2.000 +G1X5.921Y18.243Z-2.000 +G1X5.956Y18.443Z-2.000 +G1X5.974Y18.576Z-2.000 +G3X2.414Y22.972I-3.978J0.418 +G3X-1.982Y19.412I-0.418J-3.978 +G1X-1.991Y19.275Z-2.000 +G1X-2.000Y19.029Z-2.000 +G1X-2.009Y19.067Z-2.000 +G1X-2.060Y19.268Z-2.000 +G1X-2.098Y19.400Z-2.000 +G3X-7.138Y21.968I-3.804J-1.236 +G3X-9.706Y16.928I1.236J-3.804 +G1X-9.659Y16.799Z-2.000 +G1X-9.567Y16.571Z-2.000 +G1X-9.590Y16.600Z-2.000 +G1X-9.718Y16.764Z-2.000 +G1X-9.807Y16.870Z-2.000 +G3X-15.456Y17.166I-2.973J-2.677 +G3X-15.752Y11.517I2.677J-2.973 +G1X-15.653Y11.414Z-2.000 +G1X-15.478Y11.245Z-2.000 +G1X-15.513Y11.265Z-2.000 +G1X-15.697Y11.362Z-2.000 +G1X-15.820Y11.422Z-2.000 +G3X-21.102Y9.395I-1.627J-3.654 +G3X-19.074Y4.114I3.654J-1.627 +G1X-18.943Y4.061Z-2.000 +G1X-18.715Y3.978Z-2.000 +G1X-18.765Y3.982Z-2.000 +G1X-18.966Y3.996Z-2.000 +G1X-19.099Y4.000Z-2.000 +G3X-23.099Y0.000I0.000J-4.000 +G3X-19.099Y-4.000I4.000J0.000 +G1X-18.962Y-3.995Z-2.000 +G1X-18.717Y-3.979Z-2.000 +G1X-18.754Y-3.992Z-2.000 +G1X-18.948Y-4.063Z-2.000 +G1X-19.074Y-4.114Z-2.000 +G3X-21.102Y-9.395I1.627J-3.654 +G3X-15.820Y-11.422I3.654J1.627 +G1X-15.692Y-11.360Z-2.000 +G1X-15.478Y-11.245Z-2.000 +G1X-15.508Y-11.274Z-2.000 +G1X-15.657Y-11.418Z-2.000 +G1X-15.752Y-11.517Z-2.000 +G3X-15.456Y-17.166I2.973J-2.677 +G3X-9.807Y-16.870I2.677J2.973 +G1X-9.717Y-16.762Z-2.000 +G1X-9.566Y-16.570Z-2.000 +G1X-9.582Y-16.606Z-2.000 +G1X-9.659Y-16.799Z-2.000 +G1X-9.706Y-16.928Z-2.000 +G3X-7.138Y-21.968I3.804J-1.236 +G3X-2.098Y-19.400I1.236J3.804 +G1X-2.059Y-19.265Z-2.000 +G1X-2.000Y-19.029Z-2.000 +G1X-1.999Y-19.071Z-2.000 +G1X-1.991Y-19.277Z-2.000 +G1X-1.982Y-19.412Z-2.000 +G3X2.414Y-22.972I3.978J0.418 +G3X5.974Y-18.576I-0.418J3.978 +G1X5.955Y-18.435Z-2.000 +G1X5.912Y-18.197Z-2.000 +G1X5.933Y-18.241Z-2.000 +G1X6.022Y-18.422Z-2.000 +G1X6.085Y-18.540Z-2.000 +G3X11.549Y-20.004I3.464J2.000 +G3X13.013Y-14.540I-2.000J3.464 +G1X12.939Y-14.421Z-2.000 +G1X12.802Y-14.218Z-2.000 +G1X12.831Y-14.242Z-2.000 +G1X12.990Y-14.376Z-2.000 +G1X13.100Y-14.462Z-2.000 +G3X18.687Y-13.577I2.351J3.236 +G3X17.802Y-7.990I-3.236J2.351 +G1X17.684Y-7.910Z-2.000 +G1X17.478Y-7.782Z-2.000 +G1X17.521Y-7.795Z-2.000 +G1X17.718Y-7.851Z-2.000 +G1X17.850Y-7.883Z-2.000 +G3X22.594Y-4.802I0.832J3.913 +G3X19.513Y-0.058I-3.913J0.832 +G1X19.374Y-0.034Z-2.000 +G1X19.133Y0.000Z-2.000 +G1X19.179Y0.006Z-2.000 +G1X19.380Y0.035Z-2.000 +G1X19.513Y0.058Z-2.000 +G3X22.594Y4.802I-0.832J3.913 +G3X17.850Y7.883I-3.913J-0.832 +G1X17.712Y7.849Z-2.000 +G1X17.477Y7.782Z-2.000 +G00X17.477Y7.782Z6.000 +G00Z10 +G00X0.000Y0.000 +M09 +M30 +% diff --git a/tests/test-files/Heart.tap b/tests/test-files/Heart.tap new file mode 100644 index 0000000..d6f6378 --- /dev/null +++ b/tests/test-files/Heart.tap @@ -0,0 +1,482 @@ +(Created 5:36:41 AM 5/1/2011 from Valsheartredo.dxf) +(Post = Mikes Mach3 Router) +(Tool 8 = .250 Vee bit) +N0001 G90 G91.1 +N0002 G20 M03 +N0003 G00 X0.0387 Y0.5609 Z0.5000 +N0004 G00 X0.0387 Y0.5609 Z0.5000 +N0005 G01 X0.0387 Y0.5609 Z-0.0500 F10.00 +N0006 G01 X0.0405 Y0.5562 Z-0.0500 F40.00 +N0007 G00 X0.0405 Y0.5562 Z0.5000 +N0008 G00 X0.2363 Y0.9069 Z0.5000 +N0009 G01 X0.2363 Y0.9069 Z-0.0500 F10.00 +N0010 G01 X0.2686 Y0.8922 Z-0.0500 F40.00 +N0011 G01 X0.3478 Y0.8751 Z-0.0500 +N0012 G01 X0.6941 Y0.8870 Z-0.0500 +N0013 G01 X0.6941 Y0.8910 Z-0.0500 +N0014 G01 X0.6706 Y0.9037 Z-0.0500 +N0015 G01 X0.4628 Y1.0331 Z-0.0500 +N0016 G01 X0.4158 Y1.0477 Z-0.0500 +N0017 G01 X0.3358 Y1.0622 Z-0.0500 +N0018 G01 X0.3000 Y1.0622 Z-0.0500 +N0019 G01 X0.2724 Y1.0565 Z-0.0500 +N0020 G01 X0.2490 Y1.0493 Z-0.0500 +N0021 G01 X0.2164 Y1.0224 Z-0.0500 +N0022 G01 X0.2093 Y1.0060 Z-0.0500 +N0023 G01 X0.2005 Y0.9826 Z-0.0500 +N0024 G01 X0.2005 Y0.9666 Z-0.0500 +N0025 G01 X0.2116 Y0.9423 Z-0.0500 +N0026 G01 X0.2363 Y0.9069 Z-0.0500 +N0027 G00 X0.2363 Y0.9069 Z0.5000 +N0028 G00 X0.3205 Y0.6344 Z0.5000 +N0029 G01 X0.3205 Y0.6344 Z-0.0500 F10.00 +N0030 G03 X0.3205 Y0.6344 I-0.0717 J0.0000 F40.00 +N0031 G00 X0.3205 Y0.6344 Z0.5000 +N0032 G00 X0.5429 Y0.2899 Z0.5000 +N0033 G01 X0.5429 Y0.2899 Z-0.0500 F10.00 +N0034 G01 X0.5747 Y0.2700 Z-0.0500 F40.00 +N0035 G01 X0.6344 Y0.2700 Z-0.0500 +N0036 G01 X0.6786 Y0.2807 Z-0.0500 +N0037 G01 X0.7015 Y0.2908 Z-0.0500 +N0038 G01 X0.7107 Y0.2969 Z-0.0500 +N0039 G01 X0.7865 Y0.3526 Z-0.0500 +N0040 G01 X0.8502 Y0.4044 Z-0.0500 +N0041 G01 X0.9135 Y0.4443 Z-0.0500 +N0042 G01 X1.0126 Y0.5009 Z-0.0500 +N0043 G01 X0.9927 Y0.5088 Z-0.0500 +N0044 G01 X0.7897 Y0.5088 Z-0.0500 +N0045 G01 X0.7341 Y0.5030 Z-0.0500 +N0046 G01 X0.6864 Y0.4953 Z-0.0500 +N0047 G01 X0.6388 Y0.4842 Z-0.0500 +N0048 G01 X0.5982 Y0.4658 Z-0.0500 +N0049 G01 X0.5715 Y0.4521 Z-0.0500 +N0050 G01 X0.5389 Y0.4252 Z-0.0500 +N0051 G01 X0.5285 Y0.3971 Z-0.0500 +N0052 G01 X0.5253 Y0.3777 Z-0.0500 +N0053 G01 X0.5229 Y0.3377 Z-0.0500 +N0054 G01 X0.5285 Y0.3140 Z-0.0500 +N0055 G01 X0.5429 Y0.2899 Z-0.0500 +N0056 G00 X0.5429 Y0.2899 Z0.5000 +N0057 G00 X1.0639 Y0.2294 Z0.5000 +N0058 G01 X1.0639 Y0.2294 Z-0.0500 F10.00 +N0059 G01 X1.1043 Y0.2120 Z-0.0500 F40.00 +N0060 G01 X1.1838 Y0.2063 Z-0.0500 +N0061 G01 X1.2272 Y0.2158 Z-0.0500 +N0062 G01 X1.3028 Y0.2469 Z-0.0500 +N0063 G01 X1.3187 Y0.2549 Z-0.0500 +N0064 G01 X1.3911 Y0.2845 Z-0.0500 +N0065 G01 X1.4024 Y0.2873 Z-0.0500 +N0066 G01 X1.4587 Y0.3002 Z-0.0500 +N0067 G01 X1.4826 Y0.3042 Z-0.0500 +N0068 G01 X1.5540 Y0.3138 Z-0.0500 +N0069 G01 X1.5580 Y0.3178 Z-0.0500 +N0070 G01 X1.5096 Y0.3487 Z-0.0500 +N0071 G01 X1.3991 Y0.3986 Z-0.0500 +N0072 G01 X1.2870 Y0.4236 Z-0.0500 +N0073 G01 X1.2676 Y0.4268 Z-0.0500 +N0074 G01 X1.2634 Y0.4292 Z-0.0500 +N0075 G01 X1.1758 Y0.4292 Z-0.0500 +N0076 G01 X1.1197 Y0.4101 Z-0.0500 +N0077 G01 X1.1038 Y0.4021 Z-0.0500 +N0078 G01 X1.0763 Y0.3854 Z-0.0500 +N0079 G01 X1.0494 Y0.3529 Z-0.0500 +N0080 G01 X1.0325 Y0.3138 Z-0.0500 +N0081 G01 X1.0348 Y0.2817 Z-0.0500 +N0082 G01 X1.0405 Y0.2501 Z-0.0500 +N0083 G01 X1.0639 Y0.2294 Z-0.0500 +N0084 G00 X1.0639 Y0.2294 Z0.5000 +N0085 G00 X0.8255 Y0.9547 Z0.5000 +N0086 G01 X0.8255 Y0.9547 Z-0.0500 F10.00 +N0087 G01 X0.9095 Y0.8958 Z-0.0500 F40.00 +N0088 G01 X0.9286 Y0.8862 Z-0.0500 +N0089 G01 X0.9731 Y0.8685 Z-0.0500 +N0090 G01 X1.0122 Y0.8577 Z-0.0500 +N0091 G01 X1.1557 Y0.8335 Z-0.0500 +N0092 G01 X1.2196 Y0.8273 Z-0.0500 +N0093 G01 X1.2186 Y0.8345 Z-0.0500 +N0094 G01 X1.1479 Y0.9228 Z-0.0500 +N0095 G01 X1.0723 Y0.9985 Z-0.0500 +N0096 G01 X1.0557 Y1.0095 Z-0.0500 +N0097 G01 X0.9893 Y1.0551 Z-0.0500 +N0098 G01 X0.9644 Y1.0689 Z-0.0500 +N0099 G01 X0.8772 Y1.0940 Z-0.0500 +N0100 G01 X0.8451 Y1.0916 Z-0.0500 +N0101 G01 X0.8096 Y1.0821 Z-0.0500 +N0102 G01 X0.7928 Y1.0626 Z-0.0500 +N0103 G01 X0.7857 Y1.0423 Z-0.0500 +N0104 G01 X0.7857 Y1.0263 Z-0.0500 +N0105 G01 X0.7985 Y0.9911 Z-0.0500 +N0106 G01 X0.8255 Y0.9547 Z-0.0500 +N0107 G00 X0.8255 Y0.9547 Z0.5000 +N0108 G00 X1.1887 Y1.0353 Z0.5000 +N0109 G01 X1.1887 Y1.0353 Z-0.0500 F10.00 +N0110 G01 X1.3987 Y0.8193 Z-0.0500 F40.00 +N0111 G01 X1.6290 Y0.6353 Z-0.0500 +N0112 G01 X1.8207 Y0.5049 Z-0.0500 +N0113 G01 X1.9832 Y0.6133 Z-0.0500 +N0114 G01 X2.0324 Y0.6512 Z-0.0500 +N0115 G01 X2.1679 Y0.7626 Z-0.0500 +N0116 G01 X2.2745 Y0.8591 Z-0.0500 +N0117 G01 X2.4337 Y1.0184 Z-0.0500 +N0118 G01 X2.6080 Y1.2340 Z-0.0500 +N0119 G01 X2.6398 Y1.2779 Z-0.0500 +N0120 G01 X2.7354 Y1.4211 Z-0.0500 +N0121 G01 X2.7912 Y1.5084 Z-0.0500 +N0122 G01 X2.8808 Y1.6947 Z-0.0500 +N0123 G01 X2.9126 Y1.7982 Z-0.0500 +N0124 G01 X2.9217 Y1.8347 Z-0.0500 +N0125 G01 X2.9251 Y1.8581 Z-0.0500 +N0126 G01 X2.9332 Y1.9418 Z-0.0500 +N0127 G01 X2.9353 Y2.0295 Z-0.0500 +N0128 G01 X2.9257 Y2.1169 Z-0.0500 +N0129 G01 X2.9142 Y2.1804 Z-0.0500 +N0130 G01 X2.8923 Y2.2409 Z-0.0500 +N0131 G01 X2.8429 Y2.3434 Z-0.0500 +N0132 G01 X2.8367 Y2.3526 Z-0.0500 +N0133 G01 X2.7801 Y2.4316 Z-0.0500 +N0134 G01 X2.7204 Y2.4913 Z-0.0500 +N0135 G01 X2.7037 Y2.5023 Z-0.0500 +N0136 G01 X2.6878 Y2.5142 Z-0.0500 +N0137 G01 X2.6372 Y2.5438 Z-0.0500 +N0138 G01 X2.5687 Y2.5775 Z-0.0500 +N0139 G01 X2.5416 Y2.5843 Z-0.0500 +N0140 G01 X2.4420 Y2.6044 Z-0.0500 +N0141 G01 X2.3900 Y2.6107 Z-0.0500 +N0142 G01 X2.2626 Y2.6107 Z-0.0500 +N0143 G01 X2.1435 Y2.5775 Z-0.0500 +N0144 G01 X2.0759 Y2.5462 Z-0.0500 +N0145 G01 X2.0233 Y2.5160 Z-0.0500 +N0146 G01 X1.9600 Y2.4714 Z-0.0500 +N0147 G01 X1.8844 Y2.3958 Z-0.0500 +N0148 G01 X1.8256 Y2.3155 Z-0.0500 +N0149 G01 X1.8247 Y2.3122 Z-0.0500 +N0150 G01 X1.8207 Y2.3082 Z-0.0500 +N0151 G01 X1.8016 Y2.3444 Z-0.0500 +N0152 G01 X1.7401 Y2.4347 Z-0.0500 +N0153 G01 X1.6973 Y2.4833 Z-0.0500 +N0154 G01 X1.6688 Y2.5023 Z-0.0500 +N0155 G01 X1.6528 Y2.5142 Z-0.0500 +N0156 G01 X1.5854 Y2.5498 Z-0.0500 +N0157 G01 X1.5186 Y2.5721 Z-0.0500 +N0158 G01 X1.4026 Y2.5890 Z-0.0500 +N0159 G01 X1.3591 Y2.5926 Z-0.0500 +N0160 G01 X1.2236 Y2.5988 Z-0.0500 +N0161 G01 X1.1839 Y2.5930 Z-0.0500 +N0162 G01 X1.1357 Y2.5844 Z-0.0500 +N0163 G01 X1.0328 Y2.5576 Z-0.0500 +N0164 G01 X0.9931 Y2.5383 Z-0.0500 +N0165 G01 X0.9139 Y2.4903 Z-0.0500 +N0166 G01 X0.8534 Y2.4356 Z-0.0500 +N0167 G01 X0.8185 Y2.3871 Z-0.0500 +N0168 G01 X0.7769 Y2.3205 Z-0.0500 +N0169 G01 X0.7552 Y2.2720 Z-0.0500 +N0170 G01 X0.7524 Y2.2608 Z-0.0500 +N0171 G01 X0.7357 Y2.1726 Z-0.0500 +N0172 G01 X0.7220 Y2.0494 Z-0.0500 +N0173 G01 X0.7241 Y1.9737 Z-0.0500 +N0174 G01 X0.7356 Y1.8625 Z-0.0500 +N0175 G01 X0.7592 Y1.7393 Z-0.0500 +N0176 G01 X0.8008 Y1.6231 Z-0.0500 +N0177 G01 X0.8048 Y1.6151 Z-0.0500 +N0178 G01 X0.8583 Y1.5007 Z-0.0500 +N0179 G01 X0.9360 Y1.3721 Z-0.0500 +N0180 G01 X1.0255 Y1.2380 Z-0.0500 +N0181 G01 X1.1111 Y1.1290 Z-0.0500 +N0182 G01 X1.1887 Y1.0353 Z-0.0500 +N0183 G00 X1.1887 Y1.0353 Z0.5000 +N0184 G00 X2.4457 Y0.8313 Z0.5000 +N0185 G01 X2.4457 Y0.8313 Z-0.0500 F10.00 +N0186 G01 X2.4497 Y0.8273 Z-0.0500 F40.00 +N0187 G01 X2.4656 Y0.8273 Z-0.0500 +N0188 G01 X2.4698 Y0.8296 Z-0.0500 +N0189 G01 X2.6012 Y0.8456 Z-0.0500 +N0190 G01 X2.6650 Y0.8619 Z-0.0500 +N0191 G01 X2.7128 Y0.8779 Z-0.0500 +N0192 G01 X2.7436 Y0.8919 Z-0.0500 +N0193 G01 X2.7884 Y0.9181 Z-0.0500 +N0194 G01 X2.8438 Y0.9587 Z-0.0500 +N0195 G01 X2.8447 Y0.9620 Z-0.0500 +N0196 G01 X2.8704 Y1.0029 Z-0.0500 +N0197 G01 X2.8728 Y1.0100 Z-0.0500 +N0198 G01 X2.8796 Y1.0423 Z-0.0500 +N0199 G01 X2.8637 Y1.0741 Z-0.0500 +N0200 G01 X2.8318 Y1.0900 Z-0.0500 +N0201 G01 X2.7602 Y1.0900 Z-0.0500 +N0202 G01 X2.7279 Y1.0793 Z-0.0500 +N0203 G01 X2.6654 Y1.0493 Z-0.0500 +N0204 G01 X2.6520 Y1.0392 Z-0.0500 +N0205 G01 X2.5603 Y0.9636 Z-0.0500 +N0206 G01 X2.5164 Y0.9197 Z-0.0500 +N0207 G01 X2.4865 Y0.8861 Z-0.0500 +N0208 G01 X2.4457 Y0.8313 Z-0.0500 +N0209 G00 X2.4457 Y0.8313 Z0.5000 +N0210 G00 X2.7478 Y0.4483 Z0.5000 +N0211 G01 X2.7478 Y0.4483 Z-0.0500 F10.00 +N0212 G01 X2.8915 Y0.3496 Z-0.0500 F40.00 +N0213 G01 X2.8995 Y0.3416 Z-0.0500 +N0214 G01 X2.8995 Y0.3377 Z-0.0500 +N0215 G01 X2.9186 Y0.3208 Z-0.0500 +N0216 G01 X2.9387 Y0.3049 Z-0.0500 +N0217 G01 X2.9755 Y0.2833 Z-0.0500 +N0218 G01 X2.9867 Y0.2805 Z-0.0500 +N0219 G01 X3.0349 Y0.2700 Z-0.0500 +N0220 G01 X3.0707 Y0.2700 Z-0.0500 +N0221 G01 X3.0943 Y0.2756 Z-0.0500 +N0222 G01 X3.1021 Y0.2787 Z-0.0500 +N0223 G01 X3.1264 Y0.2939 Z-0.0500 +N0224 G01 X3.1312 Y0.3054 Z-0.0500 +N0225 G01 X3.1423 Y0.3416 Z-0.0500 +N0226 G01 X3.1423 Y0.3735 Z-0.0500 +N0227 G01 X3.1367 Y0.3971 Z-0.0500 +N0228 G01 X3.1232 Y0.4217 Z-0.0500 +N0229 G01 X3.1105 Y0.4372 Z-0.0500 +N0230 G01 X3.0432 Y0.4778 Z-0.0500 +N0231 G01 X2.9755 Y0.4944 Z-0.0500 +N0232 G01 X2.7960 Y0.5128 Z-0.0500 +N0233 G01 X2.7283 Y0.5128 Z-0.0500 +N0234 G01 X2.6727 Y0.5070 Z-0.0500 +N0235 G01 X2.6567 Y0.5009 Z-0.0500 +N0236 G01 X2.7478 Y0.4483 Z-0.0500 +N0237 G00 X2.7478 Y0.4483 Z0.5000 +N0238 G00 X2.9751 Y0.8870 Z0.5000 +N0239 G01 X2.9751 Y0.8870 Z-0.0500 F10.00 +N0240 G01 X3.1383 Y0.8851 Z-0.0500 F40.00 +N0241 G01 X3.2339 Y0.8751 Z-0.0500 +N0242 G01 X3.3135 Y0.8751 Z-0.0500 +N0243 G01 X3.3531 Y0.8808 Z-0.0500 +N0244 G01 X3.4015 Y0.8942 Z-0.0500 +N0245 G01 X3.4290 Y0.9069 Z-0.0500 +N0246 G01 X3.4379 Y0.9181 Z-0.0500 +N0247 G01 X3.4596 Y0.9511 Z-0.0500 +N0248 G01 X3.4688 Y0.9746 Z-0.0500 +N0249 G01 X3.4620 Y0.9949 Z-0.0500 +N0250 G01 X3.4489 Y1.0263 Z-0.0500 +N0251 G01 X3.4369 Y1.0383 Z-0.0500 +N0252 G01 X3.3812 Y1.0582 Z-0.0500 +N0253 G01 X3.3056 Y1.0582 Z-0.0500 +N0254 G01 X3.2581 Y1.0448 Z-0.0500 +N0255 G01 X3.2056 Y1.0271 Z-0.0500 +N0256 G01 X3.0116 Y0.9140 Z-0.0500 +N0257 G01 X2.9751 Y0.8910 Z-0.0500 +N0258 G01 X2.9751 Y0.8870 Z-0.0500 +N0259 G00 X2.9751 Y0.8870 Z0.5000 +N0260 G00 X3.5005 Y0.6237 Z0.5000 +N0261 G01 X3.5005 Y0.6237 Z-0.0500 F10.00 +N0262 G03 X3.5005 Y0.6237 I-0.0717 J0.0000 F40.00 +N0263 G00 X3.5005 Y0.6237 Z0.5000 +N0264 G00 X2.1153 Y0.3138 Z0.5000 +N0265 G01 X2.1153 Y0.3138 Z-0.0500 F10.00 +N0266 G01 X2.1354 Y0.3115 Z-0.0500 F40.00 +N0267 G01 X2.2583 Y0.2923 Z-0.0500 +N0268 G01 X2.3784 Y0.2429 Z-0.0500 +N0269 G01 X2.4493 Y0.2091 Z-0.0500 +N0270 G01 X2.5293 Y0.2063 Z-0.0500 +N0271 G01 X2.5529 Y0.2119 Z-0.0500 +N0272 G01 X2.6009 Y0.2262 Z-0.0500 +N0273 G01 X2.6248 Y0.2501 Z-0.0500 +N0274 G01 X2.6260 Y0.2576 Z-0.0500 +N0275 G01 X2.6328 Y0.2779 Z-0.0500 +N0276 G01 X2.6328 Y0.3018 Z-0.0500 +N0277 G01 X2.6129 Y0.3576 Z-0.0500 +N0278 G01 X2.5810 Y0.3894 Z-0.0500 +N0279 G01 X2.5289 Y0.4165 Z-0.0500 +N0280 G01 X2.4974 Y0.4252 Z-0.0500 +N0281 G01 X2.3900 Y0.4252 Z-0.0500 +N0282 G01 X2.3425 Y0.4157 Z-0.0500 +N0283 G01 X2.2829 Y0.4002 Z-0.0500 +N0284 G01 X2.2303 Y0.3826 Z-0.0500 +N0285 G01 X2.1517 Y0.3487 Z-0.0500 +N0286 G01 X2.1073 Y0.3217 Z-0.0500 +N0287 G01 X2.1153 Y0.3138 Z-0.0500 +N0288 G00 X2.1153 Y0.3138 Z0.5000 +N0289 G00 X1.9085 Y0.2974 Z0.5000 +N0290 G01 X1.9085 Y0.2974 Z-0.0500 F10.00 +N0291 G03 X1.9085 Y0.2974 I-0.0717 J0.0000 F40.00 +N0292 G00 X1.9085 Y0.2974 Z0.5000 +N0293 G00 X0.3828 Y0.2298 Z0.5000 +N0294 G01 X0.3828 Y0.2298 Z-0.0500 F10.00 +N0295 G01 X0.4194 Y0.1784 Z-0.0500 F40.00 +N0296 G01 X0.4234 Y0.1784 Z-0.0500 +N0297 G01 X0.4314 Y0.1705 Z-0.0500 +N0298 G01 X0.4314 Y0.1665 Z-0.0500 +N0299 G01 X0.4919 Y0.1243 Z-0.0500 +N0300 G01 X0.5154 Y0.1155 Z-0.0500 +N0301 G01 X0.5667 Y0.1028 Z-0.0500 +N0302 G01 X0.6304 Y0.1028 Z-0.0500 +N0303 G01 X0.7144 Y0.1179 Z-0.0500 +N0304 G01 X0.7296 Y0.1239 Z-0.0500 +N0305 G01 X0.8052 Y0.1593 Z-0.0500 +N0306 G01 X0.8772 Y0.2103 Z-0.0500 +N0307 G01 X0.8864 Y0.1868 Z-0.0500 +N0308 G01 X0.8963 Y0.1661 Z-0.0500 +N0309 G01 X0.9170 Y0.1386 Z-0.0500 +N0310 G01 X0.9608 Y0.0948 Z-0.0500 +N0311 G01 X0.9843 Y0.0821 Z-0.0500 +N0312 G01 X1.0289 Y0.0602 Z-0.0500 +N0313 G01 X1.0639 Y0.0498 Z-0.0500 +N0314 G01 X1.1241 Y0.0391 Z-0.0500 +N0315 G01 X1.1917 Y0.0391 Z-0.0500 +N0316 G01 X1.2512 Y0.0487 Z-0.0500 +N0317 G01 X1.2988 Y0.0642 Z-0.0500 +N0318 G01 X1.3307 Y0.0797 Z-0.0500 +N0319 G01 X1.4230 Y0.1213 Z-0.0500 +N0320 G01 X1.4899 Y0.1394 Z-0.0500 +N0321 G01 X1.6101 Y0.1573 Z-0.0500 +N0322 G01 X1.6296 Y0.1665 Z-0.0500 +N0323 G03 X2.0396 Y0.1665 I0.2050 J0.1310 +N0324 G01 X2.0671 Y0.1573 Z-0.0500 +N0325 G01 X2.2145 Y0.1332 Z-0.0500 +N0326 G01 X2.3896 Y0.0536 Z-0.0500 +N0327 G01 X2.4616 Y0.0391 Z-0.0500 +N0328 G01 X2.5373 Y0.0391 Z-0.0500 +N0329 G01 X2.6007 Y0.0487 Z-0.0500 +N0330 G01 X2.6491 Y0.0658 Z-0.0500 +N0331 G01 X2.6919 Y0.0878 Z-0.0500 +N0332 G01 X2.7037 Y0.0958 Z-0.0500 +N0333 G01 X2.7323 Y0.1187 Z-0.0500 +N0334 G01 X2.7592 Y0.1514 Z-0.0500 +N0335 G01 X2.7841 Y0.2103 Z-0.0500 +N0336 G01 X2.7920 Y0.2143 Z-0.0500 +N0337 G01 X2.8079 Y0.1943 Z-0.0500 +N0338 G01 X2.8842 Y0.1435 Z-0.0500 +N0339 G01 X2.9668 Y0.1139 Z-0.0500 +N0340 G01 X3.0229 Y0.1028 Z-0.0500 +N0341 G01 X3.0786 Y0.1028 Z-0.0500 +N0342 G01 X3.1228 Y0.1096 Z-0.0500 +N0343 G01 X3.1815 Y0.1316 Z-0.0500 +N0344 G01 X3.2299 Y0.1625 Z-0.0500 +N0345 G01 X3.2299 Y0.1665 Z-0.0500 +N0346 G01 X3.2379 Y0.1744 Z-0.0500 +N0347 G01 X3.2419 Y0.1744 Z-0.0500 +N0348 G01 X3.2618 Y0.1943 Z-0.0500 +N0349 G01 X3.2845 Y0.2385 Z-0.0500 +N0350 G01 X3.2944 Y0.2616 Z-0.0500 +N0351 G01 X3.3095 Y0.3257 Z-0.0500 +N0352 G01 X3.3095 Y0.3854 Z-0.0500 +N0353 G01 X3.3016 Y0.4252 Z-0.0500 +N0354 G03 X3.5563 Y0.7994 I0.1220 J0.1908 +N0355 G01 X3.5772 Y0.8227 Z-0.0500 +N0356 G01 X3.6029 Y0.8675 Z-0.0500 +N0357 G01 X3.6151 Y0.8916 Z-0.0500 +N0358 G01 X3.6263 Y0.9231 Z-0.0500 +N0359 G01 X3.6297 Y0.9465 Z-0.0500 +N0360 G01 X3.6320 Y0.9507 Z-0.0500 +N0361 G01 X3.6320 Y1.0104 Z-0.0500 +N0362 G01 X3.6113 Y1.0737 Z-0.0500 +N0363 G01 X3.5912 Y1.1131 Z-0.0500 +N0364 G01 X3.5732 Y1.1346 Z-0.0500 +N0365 G01 X3.5404 Y1.1697 Z-0.0500 +N0366 G01 X3.4962 Y1.1967 Z-0.0500 +N0367 G01 X3.4208 Y1.2197 Z-0.0500 +N0368 G01 X3.3974 Y1.2231 Z-0.0500 +N0369 G01 X3.3931 Y1.2254 Z-0.0500 +N0370 G01 X3.3095 Y1.2254 Z-0.0500 +N0371 G01 X3.2580 Y1.2158 Z-0.0500 +N0372 G01 X3.2375 Y1.2107 Z-0.0500 +N0373 G01 X3.1308 Y1.1768 Z-0.0500 +N0374 G01 X3.0820 Y1.1507 Z-0.0500 +N0375 G01 X3.0309 Y1.1219 Z-0.0500 +N0376 G03 X2.8318 Y1.2612 I-0.1718 J-0.0335 +N0377 G01 X2.8686 Y1.3203 Z-0.0500 +N0378 G01 X2.9185 Y1.3972 Z-0.0500 +N0379 G01 X2.9521 Y1.4559 Z-0.0500 +N0380 G01 X3.0281 Y1.6151 Z-0.0500 +N0381 G01 X3.0810 Y1.7750 Z-0.0500 +N0382 G01 X3.0842 Y1.7944 Z-0.0500 +N0383 G01 X3.1025 Y1.9260 Z-0.0500 +N0384 G01 X3.1025 Y2.0534 Z-0.0500 +N0385 G01 X3.0814 Y2.1923 Z-0.0500 +N0386 G01 X3.0613 Y2.2680 Z-0.0500 +N0387 G01 X3.0221 Y2.3635 Z-0.0500 +N0388 G01 X3.0062 Y2.3914 Z-0.0500 +N0389 G01 X2.9482 Y2.4840 Z-0.0500 +N0390 G01 X2.8836 Y2.5629 Z-0.0500 +N0391 G01 X2.8126 Y2.6276 Z-0.0500 +N0392 G01 X2.7674 Y2.6615 Z-0.0500 +N0393 G01 X2.6810 Y2.7075 Z-0.0500 +N0394 G01 X2.6491 Y2.7194 Z-0.0500 +N0395 G01 X2.5449 Y2.7564 Z-0.0500 +N0396 G01 X2.5256 Y2.7596 Z-0.0500 +N0397 G01 X2.4576 Y2.7739 Z-0.0500 +N0398 G01 X2.2347 Y2.7739 Z-0.0500 +N0399 G01 X2.0758 Y2.7287 Z-0.0500 +N0400 G01 X2.0002 Y2.6935 Z-0.0500 +N0401 G01 X1.9557 Y2.6712 Z-0.0500 +N0402 G01 X1.8353 Y2.5836 Z-0.0500 +N0403 G01 X1.8039 Y2.6057 Z-0.0500 +N0404 G01 X1.7721 Y2.6336 Z-0.0500 +N0405 G01 X1.7447 Y2.6537 Z-0.0500 +N0406 G01 X1.7338 Y2.6594 Z-0.0500 +N0407 G01 X1.6850 Y2.6891 Z-0.0500 +N0408 G01 X1.6181 Y2.7154 Z-0.0500 +N0409 G01 X1.5145 Y2.7435 Z-0.0500 +N0410 G01 X1.4304 Y2.7562 Z-0.0500 +N0411 G01 X1.3790 Y2.7598 Z-0.0500 +N0412 G01 X1.1997 Y2.7620 Z-0.0500 +N0413 G01 X1.1283 Y2.7524 Z-0.0500 +N0414 G01 X1.0606 Y2.7405 Z-0.0500 +N0415 G01 X0.9493 Y2.7015 Z-0.0500 +N0416 G01 X0.9246 Y2.6911 Z-0.0500 +N0417 G01 X0.8342 Y2.6376 Z-0.0500 +N0418 G01 X0.8009 Y2.6117 Z-0.0500 +N0419 G01 X0.7130 Y2.5240 Z-0.0500 +N0420 G01 X0.6831 Y2.4866 Z-0.0500 +N0421 G01 X0.6392 Y2.4153 Z-0.0500 +N0422 G01 X0.6177 Y2.3762 Z-0.0500 +N0423 G01 X0.5960 Y2.3198 Z-0.0500 +N0424 G01 X0.5813 Y2.2647 Z-0.0500 +N0425 G01 X0.5606 Y2.1170 Z-0.0500 +N0426 G01 X0.5569 Y2.0655 Z-0.0500 +N0427 G01 X0.5548 Y1.9618 Z-0.0500 +N0428 G01 X0.5651 Y1.8620 Z-0.0500 +N0429 G01 X0.6041 Y1.6755 Z-0.0500 +N0430 G01 X0.6555 Y1.5363 Z-0.0500 +N0431 G01 X0.7188 Y1.4129 Z-0.0500 +N0432 G01 X0.8096 Y1.2572 Z-0.0500 +N0433 G03 X0.6304 Y1.1259 I-0.0096 J-0.1747 +N0434 G01 X0.5992 Y1.1467 Z-0.0500 +N0435 G01 X0.5464 Y1.1764 Z-0.0500 +N0436 G01 X0.4835 Y1.2027 Z-0.0500 +N0437 G01 X0.3796 Y1.2254 Z-0.0500 +N0438 G01 X0.2602 Y1.2254 Z-0.0500 +N0439 G01 X0.2128 Y1.2126 Z-0.0500 +N0440 G01 X0.1961 Y1.2063 Z-0.0500 +N0441 G01 X0.1368 Y1.1776 Z-0.0500 +N0442 G01 X0.1213 Y1.1609 Z-0.0500 +N0443 G01 X0.1089 Y1.1537 Z-0.0500 +N0444 G01 X0.0701 Y1.1052 Z-0.0500 +N0445 G01 X0.0441 Y1.0466 Z-0.0500 +N0446 G01 X0.0356 Y1.0067 Z-0.0500 +N0447 G01 X0.0333 Y0.9547 Z-0.0500 +N0448 G01 X0.0425 Y0.9153 Z-0.0500 +N0449 G01 X0.0683 Y0.8548 Z-0.0500 +N0450 G01 X0.1089 Y0.7994 Z-0.0500 +N0451 G03 X0.3602 Y0.4257 I0.1455 J-0.1735 +N0452 G01 X0.3558 Y0.3814 Z-0.0500 +N0453 G01 X0.3558 Y0.3297 Z-0.0500 +N0454 G01 X0.3620 Y0.3016 Z-0.0500 +N0455 G01 X0.3689 Y0.2624 Z-0.0500 +N0456 G01 X0.3828 Y0.2298 Z-0.0500 +N0457 G00 X0.3828 Y0.2298 Z0.5000 +N0458 G00 X0.5154 Y0.7008 Z0.5000 +N0459 G01 X0.5154 Y0.7008 Z-0.0500 F10.00 +N0460 G03 X0.5230 Y0.6501 I0.0034 J-0.0254 F40.00 +N0461 G02 X1.6128 Y0.4423 I0.2500 J-1.6504 +N0462 G03 X1.6296 Y0.4969 I0.0011 J0.0295 +N0463 G03 X0.5146 Y0.7007 I-0.8398 J-1.4426 +N0464 G00 X0.5146 Y0.7007 Z0.5000 +N0465 G00 X1.8207 Y1.4486 Z0.5000 +N0466 G01 X1.8207 Y1.4486 Z-0.0500 F10.00 +N0467 G01 X1.8258 Y1.4651 Z-0.0500 F40.00 +N0468 G00 X1.8258 Y1.4651 Z0.5000 +N0469 G00 X1.9991 Y0.4943 Z0.5000 +N0470 G01 X1.9991 Y0.4943 Z-0.0500 F10.00 +N0471 G03 X2.0245 Y0.4498 I0.0123 J-0.0225 F40.00 +N0472 G02 X3.1158 Y0.6500 I0.8298 J-1.4484 +N0473 G03 X3.1117 Y0.7070 I-0.0096 J0.0279 +N0474 G03 X1.9984 Y0.4939 I-0.2614 J-1.6486 +N0475 G00 X1.9984 Y0.4939 Z0.5000 +N0476 M05 +N0477 M02 +N0478 M30 +N0479 % diff --git a/tests/test-files/Horse.tap b/tests/test-files/Horse.tap new file mode 100644 index 0000000..9bd7143 --- /dev/null +++ b/tests/test-files/Horse.tap @@ -0,0 +1,354 @@ +( Horse ) +N100G00G21G17G90G40G49G80 +N110G71G91.1 +N120T1M06 +N130(ENGRAVING - 20 DEG TIP 0.1) +N140G00G43Z6H1 +N150S12000M03 +N160 +N170 +N180G94 +N190X0Y0F600.0 +N200G00X.25Y1.75 +N210G1Z-0.2 +N220G2X.2Y2.5I.3J.4 +N230G3X1.85Y4.5I-9J9 +N240G3X.5Y6.75I-1.25J.8 +N250G2X-.3Y7.6I-.05J.75 +N260G2X1.4Y13.3I19.05J-2.6 +N270G3X2.35Y16.05I-12.45J5.95 +N280G3X4.05Y24.7I-120.15J28.25 +N290G1X4.3Y25.2 +N300G3X4.15Y25.8I-.25J.25 +N310G3X3.65Y25.4I-.1J-.35 +N320G2X3.35Y23.15I-8.95J.05 +N330G1X2.95Y21.6 +N340G2X2.55Y21.4I-.3J.05 +N350G1X3.05Y22.85 +N360G1X2.4Y21.7 +N370G1X2.15Y21.5 +N380G1X1.95Y21.55 +N390G1X2.75Y22.75 +N400G1X2.9Y23.1 +N410G1X2.8Y23.2 +N420G3X2.5Y22.95I-.05J-.25 +N430G2X1.75Y21.65I-2.15J.3 +N440G2X1.45Y21.95I-.15J.15 +N450G3X2.25Y23.2I-1.6J1.85 +N460G2X3.4Y26I9.15J-2.25 +N470G3X3.1Y26.7I-.4J.25 +N480G1X2.95Y26.65 +N490G1X2.9Y26.1 +N500G2X2Y24.25I-5.8J1.6 +N510G2X1.05Y23.5I-1.65J1.15 +N520G1X.95Y23.5 +N530G1X.9Y23.6 +N540G3X1.8Y24.6I-1.65J2.45 +N550G3X3.05Y27.65I-10.35J5.95 +N560G2X3.8Y29.1I3.3J-.8 +N570G3X3.75Y29.45I-.2J.15 +N580G3X3.4Y29.35I-.15J-.2 +N590G3X3.05Y28.15I3.65J-1.7 +N600G1X2.8Y27.5 +N610G1X2.7Y27.55 +N620G1X2.8Y27.9 +N630G1X3.4Y30.3 +N640G3X3.5Y31.6I-2.7J.9 +N650G3X3.35Y31.65I-.1J0 +N660G1X3.2Y31.2 +N670G1X2.9Y30.1 +N680G2X2.6Y30.65I.05J.4 +N690G3X3.15Y32.85I-10.65J3.85 +N700G1X3.75Y35.6 +N710G1X5.1Y39.7 +N720G2X5.5Y40.25I1.1J-.4 +N730G3X5.45Y40.95I-.25J.35 +N740G1X4.65Y39.25 +N750G2X4.45Y40.2I.15J.5 +N760G3X6.2Y43.4I-2.85J3.65 +N770G1X6.4Y44.55 +N780G1X6.55Y45.7 +N790G1X6.55Y45.95 +N800G2X6.75Y45.95I.1J0 +N810G1X6.65Y45.85 +N820G1X6.55Y45.75 +N830G1X6.55Y45.7 +N840G1X6.4Y44.45 +N850G2X6.15Y44.25I-.2J0 +N860G2X6Y44.5I0J.2 +N870G1X6.25Y45.75 +N880G1X6.65Y47 +N890G1X7.3Y48.6 +N900G3X6.8Y48.85I-.25J.1 +N910G1X6.55Y48.05 +N920G1X6.25Y47.25 +N930G1X6Y46.9 +N940G1X5.95Y46.85 +N950G1X5.95Y46.7 +N960G1X5.95Y46.5 +N970G1X5.9Y46.3 +N980G1X5.8Y46.3 +N990G1X5.8Y46.35 +N1000G1X5.85Y46.4 +N1010G1X5.95Y46.75 +N1020G1X5.95Y47.05 +N1030G1X6.25Y48.35 +N1040G1X7Y50.1 +N1050G3X6.9Y50.4I-.2J.1 +N1060G3X6.6Y50.3I-.1J-.2 +N1070G1X5.9Y49.1 +N1080G3X5.85Y48.4I.55J-.4 +N1090G1X5.75Y48.25 +N1100G1X5.65Y48.35 +N1110G2X6.25Y50.6I6.3J-.55 +N1120G3X7.25Y54.8I-8.5J4.2 +N1130G1X7.15Y54.95 +N1140G1X7Y54.8 +N1150G1X6.95Y54.45 +N1160G1X6.85Y53.95 +N1170G2X6.65Y53.8I-.2J0 +N1180G2X6.5Y54I0J.2 +N1190G1X6.6Y54.5 +N1200G3X7.05Y56.35I-4.7J2.05 +N1210G2X7.9Y59.45I7.1J-.3 +N1220G3X7.6Y60.2I-.5J.25 +N1230G1X7.45Y60.15 +N1240G1X7.15Y59.4 +N1250G2X6.9Y59.35I-.15J.1 +N1260G2X6.85Y59.6I.1J.15 +N1270G1X7.45Y60.55 +N1280G3X8.25Y64.85I-7.3J3.6 +N1290G2X12.15Y71.9I7.25J.6 +N1300G2X23.2Y75.55I16.65J-32.2 +N1310G2X36.7Y75.75I7.5J-48.2 +N1320G3X58.4Y74.4I22.25J180.2 +N1330G3X66.05Y75.65I.05J23 +N1340G2X73.8Y76.55I5.9J-17 +N1350G2X78.25Y74.4I-.75J-7.15 +N1360G3X78.5Y74.5I.1J.1 +N1370G3X78.4Y74.95I-.45J.1 +N1380G1X78.1Y75.15 +N1390G1X77.85Y75.4 +N1400G1X77.25Y75.85 +N1410G2X78Y75.95I.4J-.2 +N1420G3X80.05Y73.9I10.6J8.55 +N1430G2X83.6Y70.7I-28.3J-34.85 +N1440G2X90.6Y63.3I-143J-141.9 +N1450G2X92Y61.4I-9.1J-8.15 +N1460G3X93.15Y60.9I.95J.55 +N1470G2X93.55Y60.35I.1J-.35 +N1480G3X93.65Y59.75I.45J-.25 +N1490G1X94.9Y58.5 +N1500G3X95.3Y58.4I.3J.25 +N1510G1X95.3Y58.8 +N1520G2X95.55Y58.6I0J-.2 +N1530G3X95.95Y57.55I1.75J.1 +N1540G2X99.7Y52.6I-38.9J-33.25 +N1550G2X100.9Y50.1I-8.7J-5.75 +N1560G2X101.75Y45.9I-16.3J-5.3 +N1570G3X104.2Y38.45I15.75J1.1 +N1580G2X105Y36.4I-4.5J-2.9 +N1590G3X106.15Y36.05I.7J.1 +N1600G2X107.8Y36.95I2.1J-1.8 +N1610G2X108.15Y36.35I.05J-.35 +N1620G1X107.8Y36 +N1630G3X107.3Y35.25I.85J-1.1 +N1640G1X107.3Y34.75 +N1650G1X107.45Y34.7 +N1660G1X110.25Y37.15 +N1670G2X111.15Y36.4I.4J-.45 +N1680G1X110.75Y35.8 +N1690G3X109.35Y33.3I5.25J-4.5 +N1700G2X108.2Y32.05I-1.85J.55 +N1710G3X107.35Y30.6I.5J-1.3 +N1720G2X109.15Y9.65I-310J-37.3 +N1730G2X108.65Y6.15I-8.85J-.45 +N1740G2X107.3Y5.1I-1.55J.55 +N1750G2X101Y5.15I-2.95J21.8 +N1760G2X100.15Y5.65I.2J1.35 +N1770G2X98.9Y8.15I5.35J4.2 +N1780G2X98.8Y9.7I4.1J1.1 +N1790G3X98.4Y11.25I-2.05J.25 +N1800G2X95.8Y14.85I37.3J29.25 +N1810G3X93.2Y18.5I-34.35J-22.05 +N1820G2X92.65Y23.6I3.65J2.95 +N1830G3X92.3Y33.15I-8.65J4.45 +N1840G1X86.4Y42.65 +N1850G3X83.9Y44.05I-2.5J-1.6 +N1860G3X83.2Y43.55I0J-.7 +N1870G2X81.45Y40.9I-5.35J1.6 +N1880G1X79.55Y39.45 +N1890G3X77.9Y37.75I3J-4.5 +N1900G2X76.9Y36.6I-3.55J2.15 +N1910G3X76.05Y35.4I1.6J-2.1 +N1920G3X75.95Y32.5I4.65J-1.6 +N1930G2X76.7Y20.9I-27.25J-7.55 +N1940G3X77Y12.95I21.6J-3.15 +N1950G3X78.75Y9I10.8J2.4 +N1960G3X80.5Y7.35I4.95J3.55 +N1970G2X82.1Y5.6I-2.5J-3.95 +N1980G1X83Y4.1 +N1990G2X82.45Y2.75I-.75J-.45 +N2000G2X79.9Y2.35I-3.45J13.3 +N2010G2X77.5Y4I-.15J2.35 +N2020G3X77.1Y4.2I-.3J-.1 +N2030G2X76.5Y5.75I-.15J.85 +N2040G3X76.05Y7I-.4J.6 +N2050G2X73.7Y7.4I-.45J4.5 +N2060G2X73.25Y8.05I.3J.7 +N2070G1X73.1Y11.1 +N2080G1X72.45Y17.85 +N2090G1X71.3Y26.75 +N2100G1X71.35Y27.45 +N2110G3X70.95Y28I-.45J.1 +N2120G3X70.35Y27.55I-.05J-.55 +N2130G2X69.5Y24.7I-12.95J2.25 +N2140G1X63.65Y10.85 +N2150G3X64.05Y5.55I5.35J-2.25 +N2160G2X65.9Y2.15I-27.8J-17.15 +N2170G2X64.95Y.55I-1J-.45 +N2180G2X60.45Y1I-.95J14.2 +N2190G2X59.65Y1.95I.25J1 +N2200G3X58.8Y2.8I-.85J0 +N2210G2X58.45Y3.3I0J.4 +N2220G2X59.6Y5.7I9.55J-3 +N2230G3X59.5Y8.35I-1.95J1.25 +N2240G1X59.25Y8.55 +N2250G2X58.55Y9.5I.15J.85 +N2260G2X59.6Y13.1I13J-1.9 +N2270G3X64.75Y27.1I-85.8J39.55 +N2280G2X68.5Y36.9I57.75J-16.2 +N2290G3X67.2Y39.4I-1.6J.75 +N2300G3X62.85Y39.4I-2.05J-12.45 +N2310G2X45.6Y40.2I-6.85J37.85 +N2320G2X39Y42.9I8.25J29.4 +N2330G2X33.85Y46.75I12.1J21.8 +N2340G3X32.05Y46.1I-.75J-.75 +N2350G2X30.7Y42.95I-5.95J.7 +N2360G3X28.7Y39.45I8.85J-7.4 +N2370G3X24.2Y22.45I91.3J-33.1 +N2380G3X24.35Y15.65I17.85J-3 +N2390G3X27.25Y8.25I24.15J5.2 +N2400G3X30.85Y4.75I8.2J4.85 +N2410G2X33.6Y.55I-2.6J-4.65 +N2420G2X32.75Y-.25I-.75J-.05 +N2430G3X28.3Y.05I-4.3J-29.6 +N2440G2X25.85Y.35I-.05J10.15 +N2450G2X25.55Y.75I.1J.4 +N2460G2X25.7Y1.7I2.45J.1 +N2470G3X25.6Y2.7I-1.05J.4 +N2480G1X25.55Y3.1 +N2490G3X24.75Y4.5I-1J.35 +N2500G1X22.55Y4.95 +N2510G2X20.9Y6.45I.55J2.25 +N2520G2X19.75Y13.5I18.15J6.5 +N2530G3X17.15Y26.45I-29.6J.8 +N2540G1X16.8Y26.9 +N2550G2X16.6Y27.45I.35J.45 +N2560G2X17.45Y29.6I6.3J-1.25 +N2570G3X20Y38.6I-14.1J8.8 +N2580G2X20.2Y39.7I3.1J.05 +N2590G3X19.6Y40I-.3J.1 +N2600G1X18.45Y38.7 +N2610G3X17.7Y37.15I1.8J-1.85 +N2620G3X18.25Y36.45I.65J-.05 +N2630G2X18.4Y35.55I-.05J-.45 +N2640G2X17.8Y36.3I-.25J.45 +N2650G3X17.55Y36.75I-.25J.2 +N2660G3X17.05Y36.15I.05J-.5 +N2670G1X17.75Y33.35 +N2680G1X18.15Y32.45 +N2690G2X18.1Y32.2I-.15J-.1 +N2700G1X17.35Y33.45 +N2710G1X17.8Y31.9 +N2720G1X17.75Y30.85 +N2730G2X17.5Y31.05I0J.2 +N2740G1X17.3Y32.2 +N2750G1X17.15Y33.2 +N2760G3X16.85Y34.15I-1.95J-.1 +N2770G3X16.6Y34.1I-.1J-.05 +N2780G3X16.65Y32.7I3.8J-.5 +N2790G1X17.3Y30.65 +N2800G1X17.4Y30.15 +N2810G1X17.3Y29.65 +N2820G1X17.05Y29.15 +N2830G1X16.85Y28.6 +N2840G1X16.8Y28.7 +N2850G1X16.8Y28.85 +N2860G3X16.05Y33I-11.55J0 +N2870G3X15.5Y33.25I-.4J-.15 +N2880G3X15.2Y32.6I.15J-.45 +N2890G2X16.05Y29.95I-11.5J-5.15 +N2900G1X16.4Y29.1 +N2910G1X16.7Y28.25 +N2920G1X16.6Y27.85 +N2930G3X16.4Y26.35I1.35J-.95 +N2940G1X16.6Y26.05 +N2950G1X16.8Y25.7 +N2960G1X17.55Y21.8 +N2970G1X16.65Y25.2 +N2980G3X16.3Y24.6I.1J-.45 +N2990G2X16.85Y22I-9.2J-3.25 +N3000G1X16.9Y21.75 +N3010G1X16.95Y21.5 +N3020G1X16.95Y21.3 +N3030G1X17Y21.25 +N3040G1X17.1Y21.3 +N3050G1X17.05Y21.35 +N3060G1X17Y21.45 +N3070G1X16.95Y21.5 +N3080G2X17.05Y22.75I2.95J.4 +N3090G3X16.6Y23.3I-.4J.1 +N3100G1X16.9Y21.05 +N3110G2X16.5Y21.4I-.1J.3 +N3120G3X16.2Y23.5I-4.85J.45 +N3130G2X16.2Y24.15I1J.35 +N3140G3X15.75Y24.6I-.35J.1 +N3150G1X16.1Y21.75 +N3160G2X15.65Y22.15I-.05J.35 +N3170G3X15.45Y24.35I-6.55J.55 +N3180G2X15Y28.05I14.1J3.75 +N3190G3X14.45Y28.8I-.85J0 +N3200G3X13.85Y28.3I-.15J-.4 +N3210G1X14.35Y25.6 +N3220G1X14.55Y24.75 +N3230G1X15.45Y21.35 +N3240G2X15.2Y21.3I-.1J-.05 +N3250G2X14.7Y23.05I6J2.8 +N3260G1X14.3Y24.35 +N3270G1X14.1Y24.45 +N3280G1X14.2Y21.9 +N3290G1X14Y22.75 +N3300G1X14.05Y21.9 +N3310G1X13.95Y21.6 +N3320G1X13.9Y21.6 +N3330G1X13.05Y26.75 +N3340G1X12.65Y28.55 +N3350G3X12.15Y28.5I-.25J-.05 +N3360G1X11.85Y26.95 +N3370G1X11.3Y25.75 +N3380G3X10.8Y24.55I2.55J-1.7 +N3390G1X10.85Y24.05 +N3400G1X11.25Y22.1 +N3410G1X11.55Y21.55 +N3420G2X11.4Y20.95I-.25J-.25 +N3430G2X11.1Y21.1I-.05J.25 +N3440G2X10.7Y22.6I5.25J2.2 +N3450G2X10.75Y24.05I5.15J.65 +N3460G3X10.55Y24.4I-.3J.05 +N3470G3X9.8Y24.1I-.2J-.6 +N3480G3X8.1Y20I16.95J-9.45 +N3490G3X6.35Y10.3I47.2J-13.5 +N3500G3X8Y2.25I14.85J-1.15 +N3510G2X8.05Y.8I-1.4J-.75 +N3520G2X7Y.1I-1.15J.55 +N3530G1X3.6Y-.2 +N3540G2X1.45Y1.8I-.15J2 +N3550G3X.95Y1.9I-.25J0 +N3560G2X.25Y1.75I-.4J.25 +N3570G00X.25Y1.75 +N3580G00Z6 +N3590G00X0Y0 +N3600M05 +N3610M30 +N3620% diff --git a/tests/test-files/Horse2.tap b/tests/test-files/Horse2.tap new file mode 100644 index 0000000..aeb7db2 --- /dev/null +++ b/tests/test-files/Horse2.tap @@ -0,0 +1,157 @@ +( Horse2 ) +N100G00G21G17G90G40G49G80 +N110G71G91.1 +N120T1M06 +N130(ENGRAVING - 20 DEG TIP 0.1) +N140G00G43Z6H1 +N150S12000M03 +N160 +N170 +N180G94 +N190X0Y0F600 +N200G00X44.05Y21.75 +N210G1Z-0.2 +N220G3X50.4Y15.75I39.9J36 +N230G3X50.65Y15.85I.1J.15 +N240G3X50.75Y16.7I-1.6J.65 +N250G2X51.35Y17.6I.8J.1 +N260G2X55.2Y18.05I3.05J-10.25 +N270G3X60.3Y18.75I.9J12.3 +N280G3X65.8Y21.85I-6.35J17.5 +N290G3X67.15Y26.55I-2.75J3.35 +N300G2X66.15Y31.4I18.55J6.2 +N310G3X65.35Y33.45I-3.65J-.25 +N320G1X62.6Y36.55 +N330G3X54.55Y39.5I-7.15J-6.95 +N340G2X45.95Y39.55I-4.15J46.35 +N350G2X42.65Y40.5I.85J9.15 +N360G3X41.8Y40.15I-.25J-.5 +N370G3X41.75Y38.45I3.55J-.9 +N380G2X41.65Y31.6I-14.1J-3.15 +N390G3X44.05Y21.75I10.3J-2.7 +N400G00Z6 +N410G00X8.35Y73.5 +N420G1Z-0.2 +N430G3X6.95Y75.75I-3.3J-.5 +N440G3X6Y75.1I-.35J-.5 +N450G3X7.65Y73I3.25J.85 +N460G3X8.35Y73.5I.2J.4 +N470G00Z6 +N480G00X10.6Y74.8 +N490G1Z-0.2 +N500G1X13.45Y68.6 +N510G2X14.05Y64.9I-6.9J-3 +N520G3X14.8Y64.25I.6J-.05 +N530G3X16.9Y65.75I-1.25J4 +N540G2X25.45Y71.45I12.4J-9.3 +N550G2X42.75Y72.55I11.45J-44.45 +N560G3X52.1Y72.6I4.4J34.3 +N570G3X69.15Y79.15I-5.85J40.65 +N580G2X87Y82.7I13.15J-19.6 +N590G2X97.5Y79.05I-8.55J-41.65 +N600G2X102Y75.8I-7.8J-15.55 +N610G1X101.95Y76.5 +N620G1X101.85Y77.15 +N630G1X102.05Y76.55 +N640G3X102.5Y76.05I.55J.05 +N650G1X102.55Y76.1 +N660G1X102.55Y76.15 +N670G1X102.6Y76.2 +N680G2X103.3Y76.25I.35J-.05 +N690G3X103.7Y75.65I.9J.2 +N700G1X103.75Y75.7 +N710G1X103.8Y76.1 +N720G2X104.4Y76.3I.35J.05 +N730G3X106.95Y76I1.4J.9 +N740G2X108.8Y75.25I.75J-.8 +N750G3X109.55Y71.8I11J.6 +N760G2X111.15Y65.9I-27.2J-10.75 +N770G2X110.7Y64.8I-1.15J-.2 +N780G3X110.05Y63.5I.95J-1.3 +N790G3X110.3Y61.1I13.35J.15 +N800G2X110.3Y59.4I-4.7J-.9 +N810G1X109.85Y57.55 +N820G3X107.8Y44.45I38.4J-12.7 +N830G2X106.7Y41.3I-4.9J-.05 +N840G2X101.7Y39.35I-4.25J3.45 +N850G2X97.25Y42.65I.8J5.75 +N860G2X97.7Y45.1I1.95J.9 +N870G3X97.9Y45.7I-.5J.5 +N880G3X97.4Y47.75I-10.3J-1.35 +N890G3X93.85Y57.3I-229.55J-80.15 +N900G3X88.85Y59.25I-3.4J-1.35 +N910G3X82.15Y51.65I5.75J-11.85 +N920G2X78.15Y43.5I-32.5J11.05 +N930G2X74.3Y39.95I-9.5J6.4 +N940G1X74.2Y38.05 +N950G1X73.8Y36.35 +N960G3X74.65Y32.7I3.6J-1.1 +N970G2X75.3Y25.75I-4.05J-3.85 +N980G3X72.55Y20.7I28.95J-19.05 +N990G1X71.15Y18 +N1000G2X67.55Y14.8I-6.8J4.05 +N1010G3X65.3Y13.5I5.4J-12 +N1020G2X57.4Y12.1I-5.4J7.6 +N1030G3X53.1Y11.75I-1.7J-6.05 +N1040G2X55.75Y8.2I-7.55J-8.4 +N1050G2X56.35Y4.9I-5.75J-2.7 +N1060G3X53.1Y4.7I0J-25.3 +N1070G2X51.5Y5.4I-.2J1.65 +N1080G3X49.8Y6.9I-3.25J-2.1 +N1090G2X49.1Y7.85I.45J1.1 +N1100G3X47.35Y11.55I-5.55J-.4 +N1110G2X43Y15.9I52.5J56.35 +N1120G3X35.25Y22.9I-40.5J-37.05 +N1130G2X33.9Y25.2I2J2.7 +N1140G2X34.4Y30.55I12.7J1.55 +N1150G3X31.6Y40I-8.5J2.65 +N1160G3X32.4Y27.15I323.3J13.5 +N1170G3X33Y22.6I40.95J3.35 +N1180G3X36.3Y16I13.7J2.7 +N1190G2X40.75Y10.15I-37.35J-33.25 +N1200G3X44.55Y6.05I14J9.2 +N1210G2X45.3Y4.85I-1.2J-1.55 +N1220G3X46.45Y2.65I4.2J.8 +N1230G2X47.1Y1.45I-1.6J-1.6 +N1240G2X46.25Y.25I-1J-.2 +N1250G2X43.35Y0I-3.05J18.6 +N1260G2X39.45Y4.6I-.05J3.95 +N1270G3X38.7Y5.95I-1.2J.2 +N1280G2X35.95Y8.5I1.85J4.7 +N1290G3X27.5Y20.7I-40.8J-19.25 +N1300G2X26Y24.2I3.85J3.75 +N1310G1X25.6Y29.65 +N1320G3X18.25Y42.25I-17.65J-1.9 +N1330G2X13.25Y48.25I9.05J12.6 +N1340G2X11.3Y56.8I18.55J8.7 +N1350G2X12.05Y59.25I4.25J.05 +N1360G3X12.05Y59.55I-.2J.15 +N1370G1X11.55Y59.85 +N1380G2X7.8Y63.05I1J4.9 +N1390G2X6.5Y67.55I38.3J13.6 +N1400G3X5.45Y68.4I-1.1J-.25 +N1410G1X5.15Y68.55 +N1420G2X-.35Y76I6.85J10.8 +N1430G2X.2Y79.2I3.75J1 +N1440G1X.1Y79.15 +N1450G3X.4Y77.35I3.9J-.35 +N1460G3X4.05Y71.1I24.4J10 +N1470G3X4.4Y71.05I.2J.15 +N1480G3X4.5Y71.4I-.2J.25 +N1490G2X2.75Y79.3I24.85J9.6 +N1500G2X3.45Y87.55I28J1.85 +N1510G1X4Y83.2 +N1520G1X5.25Y76.9 +N1530G1X6.45Y77.05 +N1540G3X7.5Y77.6I-.05J1.4 +N1550G1X8.2Y78.7 +N1560G2X10.95Y83.15I32.05J-16.5 +N1570G1X10.3Y81.15 +N1580G1X10Y79.95 +N1590G3X10.6Y74.8I7.85J-1.7 +N1600G00X10.6Y74.8 +N1610G00Z6 +N1620G00X0Y0 +N1630M05 +N1640M30 +N1650% diff --git a/tests/test-files/Letter A (V-Carve).tap b/tests/test-files/Letter A (V-Carve).tap new file mode 100644 index 0000000..d0fdfe0 --- /dev/null +++ b/tests/test-files/Letter A (V-Carve).tap @@ -0,0 +1,183 @@ +(Letter 'A' F-Engrave, V-Carve.) +(60deg. 1/2" V bit) +G90 +G20 +G17 G64 P0.001 M3 S3000 +F5.00 +G0 Z0.2500 +G0 X1.8221 Y0.0000 +G1 Z0.0000 +G1 X1.8221 Y0.0000 Z0.0000 +G1 X1.5484 Y0.1983 Z-0.3435 +G1 X1.5383 Y0.2002 Z-0.3468 +G1 X1.3862 Y0.0000 Z0.0000 +G1 X1.5386 Y0.2007 Z-0.3476 +G1 X1.5387 Y0.2112 Z-0.3526 +G1 X1.4414 Y0.5321 Z-0.3396 +G1 X1.4280 Y0.5719 Z-0.3402 +G1 X1.4113 Y0.6088 Z-0.3479 +G1 X1.3945 Y0.6381 Z-0.3596 +G1 X1.3743 Y0.6678 Z-0.3769 +G1 X1.3564 Y0.6904 Z-0.3942 +G1 X1.3479 Y0.6940 Z-0.3932 +G1 X1.3062 Y0.6824 Z-0.3485 +G1 X1.2723 Y0.6729 Z-0.3205 +G1 X1.2571 Y0.6687 Z-0.3111 +G1 X1.2296 Y0.6616 Z-0.2986 +G1 X1.2095 Y0.6579 Z-0.2920 +G1 X1.1893 Y0.6553 Z-0.2876 +G1 X1.1590 Y0.6538 Z-0.2850 +G1 X0.6646 Y0.6538 Z-0.2850 +G1 X0.6444 Y0.6545 Z-0.2862 +G1 X0.6141 Y0.6579 Z-0.2920 +G1 X0.5939 Y0.6616 Z-0.2986 +G1 X0.5665 Y0.6687 Z-0.3111 +G1 X0.5433 Y0.6752 Z-0.3263 +G1 X0.5264 Y0.6799 Z-0.3402 +G1 X0.4978 Y0.6879 Z-0.3683 +G1 X0.4757 Y0.6940 Z-0.3932 +G1 X0.4670 Y0.6908 Z-0.3951 +G1 X0.4436 Y0.6607 Z-0.3729 +G1 X0.4242 Y0.6311 Z-0.3570 +G1 X0.4082 Y0.6017 Z-0.3466 +G1 X0.3923 Y0.5646 Z-0.3404 +G1 X0.3817 Y0.5323 Z-0.3405 +G1 X0.2843 Y0.2114 Z-0.3537 +G1 X0.2850 Y0.2007 Z-0.3476 +G1 X0.4374 Y0.0000 Z0.0000 +G1 X0.2848 Y0.2009 Z-0.3480 +G1 X0.2746 Y0.1989 Z-0.3444 +G1 X0.0000 Y0.0000 Z0.0000 +G1 X0.2807 Y0.2033 Z-0.3520 +G1 X0.2847 Y0.2125 Z-0.3536 +G1 X0.3836 Y0.5387 Z-0.3402 +G1 X0.3932 Y0.5672 Z-0.3406 +G1 X0.4050 Y0.5950 Z-0.3449 +G1 X0.4190 Y0.6221 Z-0.3533 +G1 X0.4410 Y0.6570 Z-0.3706 +G1 X0.4669 Y0.6907 Z-0.3950 +G1 X0.4703 Y0.7002 Z-0.3955 +G1 X0.4673 Y0.7434 Z-0.3673 +G1 X0.4684 Y0.7852 Z-0.3465 +G1 X0.4735 Y0.8257 Z-0.3330 +G1 X0.4800 Y0.8552 Z-0.3278 +G1 X0.6616 Y1.4498 Z-0.3053 +G1 X0.7179 Y1.6423 Z-0.2938 +G1 X0.7556 Y1.7776 Z-0.2828 +G1 X0.7622 Y1.7966 Z-0.2834 +G1 X0.7744 Y1.8242 Z-0.2885 +G1 X0.7771 Y1.8339 Z-0.2877 +G1 X0.6568 Y2.0000 Z0.0000 +G1 X0.7768 Y1.8343 Z-0.2870 +G1 X0.7868 Y1.8361 Z-0.2838 +G1 X0.8168 Y1.8484 Z-0.2626 +G1 X0.8468 Y1.8573 Z-0.2472 +G1 X0.8768 Y1.8628 Z-0.2376 +G1 X0.9068 Y1.8650 Z-0.2338 +G1 X0.9368 Y1.8639 Z-0.2357 +G1 X0.9668 Y1.8595 Z-0.2434 +G1 X0.9968 Y1.8517 Z-0.2569 +G1 X1.0168 Y1.8447 Z-0.2691 +G1 X1.0368 Y1.8361 Z-0.2838 +G1 X1.0468 Y1.8344 Z-0.2868 +G1 X1.1668 Y2.0000 Z0.0000 +G1 X1.0465 Y1.8340 Z-0.2874 +G1 X1.0491 Y1.8243 Z-0.2884 +G1 X1.0575 Y1.8060 Z-0.2845 +G1 X1.0679 Y1.7778 Z-0.2827 +G1 X1.0862 Y1.7099 Z-0.2891 +G1 X1.1386 Y1.5267 Z-0.3016 +G1 X1.3431 Y0.8555 Z-0.3271 +G1 X1.3496 Y0.8260 Z-0.3323 +G1 X1.3547 Y0.7855 Z-0.3457 +G1 X1.3558 Y0.7437 Z-0.3664 +G1 X1.3528 Y0.7005 Z-0.3946 +G1 X1.3559 Y0.6909 Z-0.3947 +G1 X1.3819 Y0.6573 Z-0.3701 +G1 X1.3988 Y0.6312 Z-0.3564 +G1 X1.4135 Y0.6044 Z-0.3466 +G1 X1.4221 Y0.5861 Z-0.3423 +G1 X1.4297 Y0.5675 Z-0.3398 +G1 X1.4393 Y0.5390 Z-0.3393 +G1 X1.5415 Y0.2034 Z-0.3522 +G1 X1.8121 Y0.0073 Z-0.0126 +G1 X1.8221 Y0.0000 Z0.0000 +G0 Z0.2500 +G0 X0.9118 Y1.7302 +G1 Z0.0000 +G1 X0.9118 Y1.7302 +G1 X0.7511 Y1.7621 Z-0.2838 +G1 X0.7188 Y1.6456 Z-0.2936 +G1 X0.6592 Y1.4417 Z-0.3057 +G1 X0.4801 Y0.8553 Z-0.3278 +G1 X0.4722 Y0.8176 Z-0.3352 +G1 X0.4679 Y0.7772 Z-0.3499 +G1 X0.4677 Y0.7333 Z-0.3733 +G1 X0.4698 Y0.7046 Z-0.3924 +G1 X0.4719 Y0.6951 Z-0.3978 +G1 X0.4942 Y0.6889 Z-0.3722 +G1 X0.5231 Y0.6808 Z-0.3432 +G1 X0.5481 Y0.6738 Z-0.3228 +G1 X0.5706 Y0.6675 Z-0.3088 +G1 X0.5987 Y0.6606 Z-0.2969 +G1 X0.6258 Y0.6562 Z-0.2892 +G1 X0.6525 Y0.6541 Z-0.2855 +G1 X0.6757 Y0.6538 Z-0.2850 +G1 X1.1478 +G1 X1.1844 Y0.6549 Z-0.2869 +G1 X1.2045 Y0.6571 Z-0.2907 +G1 X1.2249 Y0.6606 Z-0.2969 +G1 X1.2458 Y0.6656 Z-0.3054 +G1 X1.2677 Y0.6717 Z-0.3175 +G1 X1.2918 Y0.6784 Z-0.3356 +G1 X1.3096 Y0.6834 Z-0.3518 +G1 X1.3517 Y0.6951 Z-0.3978 +G1 X1.3555 Y0.7335 Z-0.3725 +G1 X1.3553 Y0.7773 Z-0.3492 +G1 X1.3510 Y0.8176 Z-0.3345 +G1 X1.3431 Y0.8553 Z-0.3271 +G1 X1.1400 Y1.5219 Z-0.3019 +G1 X1.0868 Y1.7079 Z-0.2892 +G1 X1.0688 Y1.7750 Z-0.2827 +G1 X1.0575 Y1.8060 Z-0.2845 +G1 X1.0460 Y1.8304 Z-0.2902 +G1 X1.0403 Y1.8345 Z-0.2867 +G1 X1.0083 Y1.8478 Z-0.2636 +G1 X0.9903 Y1.8537 Z-0.2534 +G1 X0.9671 Y1.8594 Z-0.2435 +G1 X0.9503 Y1.8623 Z-0.2384 +G1 X0.9283 Y1.8646 Z-0.2345 +G1 X0.9064 Y1.8650 Z-0.2338 +G1 X0.8846 Y1.8637 Z-0.2361 +G1 X0.8567 Y1.8595 Z-0.2434 +G1 X0.8335 Y1.8537 Z-0.2533 +G1 X0.8030 Y1.8432 Z-0.2716 +G1 X0.7835 Y1.8346 Z-0.2865 +G1 X0.7776 Y1.8307 Z-0.2904 +G1 X0.7688 Y1.8124 Z-0.2857 +G1 X0.7612 Y1.7940 Z-0.2832 +G1 X0.7511 Y1.7621 Z-0.2838 +G1 X1.0725 Y1.7618 Z-0.2837 +G1 X1.0624 Y1.7937 Z-0.2831 +G1 X1.0548 Y1.8122 Z-0.2856 +G1 X1.0460 Y1.8304 Z-0.2902 +G1 X1.0403 Y1.8345 Z-0.2867 +G1 X1.0083 Y1.8478 Z-0.2636 +G1 X0.9902 Y1.8537 Z-0.2534 +G1 X0.9671 Y1.8594 Z-0.2435 +G1 X0.9503 Y1.8623 Z-0.2384 +G1 X0.9282 Y1.8646 Z-0.2345 +G1 X0.9064 Y1.8650 Z-0.2338 +G1 X0.8846 Y1.8637 Z-0.2361 +G1 X0.8567 Y1.8595 Z-0.2434 +G1 X0.8335 Y1.8537 Z-0.2533 +G1 X0.8030 Y1.8432 Z-0.2717 +G1 X0.7835 Y1.8346 Z-0.2865 +G1 X0.7776 Y1.8307 Z-0.2904 +G1 X0.7688 Y1.8124 Z-0.2857 +G1 X0.7612 Y1.7940 Z-0.2832 +G1 X0.7511 Y1.7621 Z-0.2838 +G0 Z0.2500 +M5 +M30 +% diff --git a/tests/test-files/Mach3 write.tap b/tests/test-files/Mach3 write.tap new file mode 100644 index 0000000..ab1b8b4 --- /dev/null +++ b/tests/test-files/Mach3 write.tap @@ -0,0 +1,75 @@ +G00 G49 G40 G17 G80 G50 G90 G21 +M04 S12000 +G90 G90.1 +G00 Z6 +G00 X0 Y0 +F600 +G01 Z-0.4 +G01 X1.8945 Y8.9334 +G02 X3.2091 Y9.9985 I3.2091 J8.6546 +G01 X4.8089 Y9.9985 +G02 X5.5538 Y9.0494 I4.8089 J9.2316 +G00 Z2 +G00 X4.4691 Y4.6164 +G01 Z-0.4 +G01 X5.5572 Y9.04 +G02 X6.7833 Y9.9997 I6.7815 J8.7389 +G01 X8.3784 Y9.9974 +G02 X9.3057 Y8.8497 I8.377 J9.0479 +G01 X7.4175 Y-0.0001 +G00 Z2 +G00 X12.5737 Y0 +G01 Z-0.4 +G01 X14.1923 Y7.7724 +G02 X16.9591 Y10 I16.9317 J7.2019 +G01 X19.3014 Y9.9771 +G02 X20.9532 Y7.9109 I19.2847 J8.2704 +G01 X19.2484 Y0.0001 +G00 Z2 +G00 X13.3612 Y3.7815 +G01 Z-0.4 +G01 X20.0633 Y3.7815 +G00 Z2 +G00 X31.1752 Y1.6931 +G01 Z-0.4 +G02 X29.1577 Y-0.0232 I29.1718 J2.0042 +G01 X25.8234 Y0 +G02 X24.5528 Y1.5916 I25.8325 J1.3103 +G01 X26.0337 Y8.3291 +G02 X28.1285 Y10.0011 I28.1131 J7.872 +G01 X31.2929 Y9.9782 +G02 X32.5962 Y8.3801 I31.2832 J8.6398 +G00 Z2 +G00 X35.8642 Y0 +G01 Z-0.4 +G01 X37.9902 Y10 +G00 Z2 +G00 X36.9272 Y5 +G01 Z-0.4 +G01 X43.5272 Y5 +G00 Z2 +G00 X44.5902 Y10 +G01 Z-0.4 +G01 X42.4642 Y0 +G00 Z2 +G00 X59.2553 Y8.7284 +G01 Z-0.4 +G02 X60.5458 Y10 I60.5458 J8.7094 +G01 X64.4085 Y10 +G02 X65.6721 Y8.4332 I64.4085 J8.707 +G01 X65.3189 Y6.8035 +G02 X63.8438 Y5.6149 I63.8451 J7.1229 +G00 Z2 +G00 X61.3493 Y5.6171 +G01 Z-0.4 +G01 X63.8438 Y5.6149 +G02 X64.808 Y4.4157 I63.8429 J4.627 +G01 X64.17 Y1.502 +G02 X62.3035 Y0 I62.3035 J1.9107 +G01 X58.7792 Y0 +G02 X57.4544 Y1.3515 I58.7792 J1.3251 +G00 Z6 +G00 X0 Y0 +M05 +M30 +% \ No newline at end of file diff --git a/tests/test-files/Mach4 write.tap b/tests/test-files/Mach4 write.tap new file mode 100644 index 0000000..6db9f46 --- /dev/null +++ b/tests/test-files/Mach4 write.tap @@ -0,0 +1,68 @@ +G49 G40 G17 G80 G50 G90 G21 +M04 S12000 +G90 G90.1 +G00 Z6 +G00 X0 Y0 +F600 +G01 Z-0.4 +G01 X1.8945 Y8.9334 +G02 X3.2091 Y9.9985 I3.2091 J8.6546 +G01 X4.8089 Y9.9985 +G02 X5.5538 Y9.0494 I4.8089 J9.2316 +G00 Z2 +G00 X4.4691 Y4.6164 +G01 Z-0.4 +G01 X5.5572 Y9.04 +G02 X6.7833 Y9.9997 I6.7815 J8.7389 +G01 X8.3784 Y9.9974 +G02 X9.3057 Y8.8497 I8.377 J9.0479 +G01 X7.4175 Y-0.0001 +G00 Z2 +G00 X12.5737 Y0 +G01 Z-0.4 +G01 X14.1923 Y7.7724 +G02 X16.9591 Y10 I16.9317 J7.2019 +G01 X19.3014 Y9.9771 +G02 X20.9532 Y7.9109 I19.2847 J8.2704 +G01 X19.2484 Y0.0001 +G00 Z2 +G00 X13.3612 Y3.7815 +G01 Z-0.4 +G01 X20.0633 Y3.7815 +G00 Z2 +G00 X31.1752 Y1.6931 +G01 Z-0.4 +G02 X29.1577 Y-0.0232 I29.1718 J2.0042 +G01 X25.8234 Y0 +G02 X24.5528 Y1.5916 I25.8325 J1.3103 +G01 X26.0337 Y8.3291 +G02 X28.1285 Y10.0011 I28.1131 J7.872 +G01 X31.2929 Y9.9782 +G02 X32.5962 Y8.3801 I31.2832 J8.6398 +G00 Z2 +G00 X35.8642 Y0 +G01 Z-0.4 +G01 X37.9902 Y10 +G00 Z2 +G00 X36.9272 Y5 +G01 Z-0.4 +G01 X43.5272 Y5 +G00 Z2 +G00 X44.5902 Y10 +G01 Z-0.4 +G01 X42.4642 Y0 +G00 Z2 +G00 X59.3067 Y10 +G01 Z-0.4 +G01 X57.9242 Y4.4966 +G03 X59.286 Y2.7504 I59.286 J4.1545 +G01 X64.5422 Y2.7504 +G00 Z2 +G00 X64.2003 Y6.2539 +G01 Z-0.4 +G01 X62.6294 Y0.0001 +G00 Z6 +G00 X0 Y0 +M05 +M30 +% \ No newline at end of file diff --git a/tests/test-files/Scorpion.tap b/tests/test-files/Scorpion.tap new file mode 100644 index 0000000..fe72640 --- /dev/null +++ b/tests/test-files/Scorpion.tap @@ -0,0 +1,276 @@ +G21 +T1M6 +G0Z10.000 +G0X0.000Y0.000S10000M3 +G0X40.094Y235.389Z5.000 +G1Z-3.000F600.0 +G1X39.594Y234.826F1800.0 +X33.059Y225.446 +X29.088Y209.687 +X29.338Y187.488 +X32.027Y174.419 +X36.905Y168.040 +X38.969Y159.598 +X46.473Y148.999 +X55.665Y143.089 +X61.856Y141.870 +X68.047Y138.962 +X78.027Y141.964 +X88.870Y151.907 +X91.496Y155.096 +X100.877Y152.845 +X97.312Y145.903 +X90.934Y143.277 +X83.993Y136.523 +X68.047Y135.023 +X63.544Y134.710 +X56.884Y136.617 +X47.223Y137.461 +X40.845Y139.150 +X35.404Y139.400 +X32.965Y139.712 +X32.965Y136.242 +X46.848Y134.835 +X62.606Y131.458 +X74.881Y129.957 +X82.679Y131.833 +X91.497Y135.023 +X97.312Y140.275 +X99.563Y141.588 +X101.252Y138.587 +X100.501Y134.835 +X95.624Y134.272 +X91.403Y129.957 +X76.864Y121.984 +X62.231Y120.859 +X47.926Y121.328 +X43.283Y122.547 +X33.528Y127.331 +X31.277Y128.644 +X29.401Y123.016 +X28.557Y121.140 +X39.344Y119.639 +X55.477Y116.450 +X73.675Y116.075 +X89.433Y121.328 +X96.499Y126.768 +X100.501Y127.894 +X99.845Y123.298 +X92.435Y120.015 +X88.589Y113.824 +X79.115Y104.256 +X75.926Y96.752 +X58.979Y96.002 +X53.977Y96.189 +X44.221Y98.159 +X33.716Y102.380 +X26.212Y105.569 +X24.336Y100.504 +X33.153Y99.941 +X39.907Y96.940 +X50.225Y92.437 +X58.104Y92.062 +X65.561Y91.030 +X75.644Y92.906 +X83.430Y95.251 +X89.433Y102.755 +X92.059Y110.447 +X97.875Y114.574 +X96.562Y105.382 +X93.842Y105.007 +X92.622Y104.631 +X89.621Y97.221 +X88.964Y89.248 +X83.805Y78.930 +X81.929Y73.865 +X75.082Y68.190 +X67.296Y58.857 +X58.760Y63.172 +X49.287Y67.862 +X40.845Y71.332 +X36.155Y71.239 +X34.279Y68.049 +X44.409Y67.862 +X53.977Y62.609 +X58.667Y58.669 +X63.169Y54.917 +X70.298Y52.479 +X85.118Y66.361 +X86.807Y71.801 +X91.497Y82.119 +X92.059Y92.062 +X93.185Y93.188 +Y79.743 +X97.312Y66.173 +X101.252Y58.763 +X104.159Y51.165 +X111.070Y41.285 +X121.513Y30.154 +X132.206Y19.273 +X146.088Y11.957 +X160.909Y7.924 +X173.478Y7.079 +X183.045Y9.143 +X193.739Y15.146 +X197.960Y21.525 +X196.928Y30.529 +X187.226Y42.589 +X180.419Y52.854 +X178.355Y61.296 +X174.979Y54.355 +X176.479Y36.533 +X183.608Y20.211 +X182.389Y17.397 +X169.726Y18.898 +X162.972Y16.741 +X156.312Y22.181 +X144.775Y23.776 +X138.584Y31.749 +X132.018Y34.281 +X128.266Y39.440 +X123.326Y42.223 +X121.325Y50.040 +X129.767Y67.862 +X134.457Y84.183 +Y90.937 +X138.115Y86.997 +X140.835Y73.677 +X153.029Y60.358 +X157.907Y59.232 +X165.786Y64.110 +X173.290Y72.427 +X182.670Y76.491 +X190.268Y76.116 +X191.487Y79.493 +X176.542Y77.680 +X166.255Y70.394 +X160.533Y64.297 +X153.092Y67.987 +X147.214Y73.302 +X144.400Y83.620 +X141.586Y89.623 +X140.460Y95.627 +X136.521Y99.379 +X134.082Y100.598 +X133.144Y110.259 +X133.707Y111.385 +X138.959Y105.194 +X143.274Y100.879 +X147.120Y98.816 +X151.341Y96.752 +X162.785Y94.970 +X171.508Y92.719 +X178.824Y94.782 +X190.174Y95.251 +X198.241Y90.374 +X199.929Y95.064 +X185.484Y97.878 +X176.198Y97.315 +X164.379Y97.409 +X153.874Y102.286 +X148.339Y102.568 +X141.211Y111.385 +X137.771Y115.012 +X133.144Y118.326 +X130.893Y121.140 +X130.330Y124.329 +X134.832Y121.515 +X139.428Y119.827 +X149.840Y113.261 +X155.281Y111.885 +X161.873Y110.447 +X172.602Y111.823 +X179.997Y111.338 +X184.921Y112.323 +X193.739Y112.573 +X201.055Y110.447 +X201.430Y115.325 +X191.112Y114.387 +X180.794Y115.512 +X172.399Y115.887 +X159.327Y117.763 +X154.718 +X147.589Y123.673 +X140.554Y126.768 +X135.020Y132.209 +X130.142Y133.522 +X129.017Y142.996 +X134.082Y143.089 +X138.021Y139.713 +X146.839Y138.212 +X155.281Y133.147 +X161.284Y133.522 +X168.975Y130.145 +X174.228Y127.456 +X180.794Y120.953 +X183.608Y123.766 +X174.979Y131.646 +X164.098Y134.741 +X157.719Y137.555 +X150.122Y140.651 +X139.710Y144.872 +X134.269Y145.340 +X130.142Y150.781 +X137.021Y152.782 +X142.149Y150.593 +X149.277Y143.465 +X162.972Y140.088 +X171.039Y142.151 +X180.044Y145.903 +X191.300Y156.597 +X193.832Y165.226 +X201.055Y174.981 +X206.120Y189.802 +X205.772Y207.597 +X200.867Y223.945 +X195.427Y232.762 +X194.489Y216.253 +X191.300Y200.120 +X192.050Y229.010 +X188.157Y202.652 +X187.735Y192.991 +X182.952Y186.144 +X183.233Y177.795 +X189.987Y168.228 +X186.891Y164.570 +X175.729Y160.349 +X170.851Y155.283 +X170.101Y149.468 +X165.724Y150.030 +X155.281Y157.159 +X142.524Y158.379 +X137.083Y162.037 +X136.333Y164.007 +X126.203Y156.221 +X123.107Y155.846 +X122.638Y155.096 +X120.293Y160.818 +X117.761Y161.943 +X117.010Y155.096 +X113.258Y156.034 +X114.196Y161.287 +X111.945 +X107.818Y153.970 +X102.040Y159.973 +X93.935Y165.320 +X92.247Y165.414 +X91.403Y161.849 +X86.181Y159.223 +X68.234Y154.158 +X59.980Y150.687 +X57.541Y153.220 +X54.633Y159.786 +X44.484Y166.127 +X40.469Y172.355 +X48.818Y182.861 +X51.350Y191.115 +X44.972Y203.872 +X40.845Y231.637 +X40.657Y213.439 +X39.391Y224.695 +X40.094Y235.389 +G0Z5.000 +G0X0.000Y0.000Z10.000 +G0Z10.000 +G0X0Y0 +M30 diff --git a/tests/test-files/Skull2.tap b/tests/test-files/Skull2.tap new file mode 100644 index 0000000..1f9cc6e --- /dev/null +++ b/tests/test-files/Skull2.tap @@ -0,0 +1,397 @@ +( SKULL2 ) +( MATERIAL SIZE ) +( X= 89.500, Y= 120.000 ) +( TOOL=ENGRAVE {20' 0.02" TIP DIA} ) +N100G00G20G17G90G40G49G80 +N110G71G91.1 +N120T1M06 +N130 +N140G00G43Z0.4H1 +N150S12000M03 +N160 +N170 +N180G94 +N190X0Y0F24 +N200G00X.796Y.6845Z0.1 +N210G1X.796Y.6845Z-0.01F12 +N220G2X.7893Y.7037I.0493J.028F24 +N230G2X.7837Y.7555I.5171J.0816 +N240G2X.7841Y.7948I.2981J.017 +N250G2X.7939Y.8372I.1443J-.0108 +N260G2X.8194Y.8573I.03J-.0119 +N270G2X.8537Y.8378I.0044J-.0321 +N280G2X.8628Y.8058I-.1266J-.0529 +N290G2X.8631Y.7303I-.2524J-.0389 +N300G2X.855Y.7032I-.096J.0139 +N310G2X.8353Y.6806I-.0489J.0228 +N320G2X.8108Y.6748I-.0204J.0318 +N330G2X.796Y.6845I.0021J.0193 +N340G00X.796Y.6845Z0.1 +N350G00X.891Y.6201Z0.1 +N360G1X.891Y.6201Z-0.01F12 +N370G2X.9096Y.6578I.1526J-.0518F24 +N380G2X.9537Y.7064I.1843J-.1232 +N390G2X.9731Y.7174I.0422J-.0517 +N400G2X.9807Y.7193I.0126J-.0347 +N410G2X.9872Y.7193I.0033J-.0245 +N420G2X1.0065Y.7031I-.003J-.0231 +N430G2X1.0143Y.6633I-.1791J-.0558 +N440G2X1.0177Y.5965I-.9403J-.0806 +N450G2X1.0162Y.5343I-.8154J-.0119 +N460G2X1.0019Y.4606I-.2887J.0178 +N470G2X.9865Y.4341I-.0717J.0239 +N480G2X.9562Y.4227I-.0261J.0234 +N490G2X.9312Y.4339I.0056J.0459 +N500G2X.9028Y.4755I.0664J.0758 +N510G2X.8848Y.5848I.287J.1035 +N520G2X.891Y.6201I.1167J-.0022 +N530G00X.891Y.6201Z0.1 +N540G00X1.0641Y.5906Z0.1 +N550G1X1.0641Y.5906Z-0.01F12 +N560G2X1.0775Y.6177I.0903J-.028F24 +N570G2X1.1182Y.6424I.0494J-.0354 +N580G2X1.1416Y.6408I.0079J-.0543 +N590G2X1.1578Y.6308I-.0102J-.0347 +N600G2X1.1801Y.5917I-.0707J-.066 +N610G2X1.209Y.4352I-.7752J-.2244 +N620G2X1.209Y.2824I-.9038J-.0764 +N630G2X1.1998Y.2332I-.2502J.0211 +N640G2X1.1853Y.2019I-.1102J.0322 +N650G2X1.1597Y.1836I-.0367J.0244 +N660G2X1.1359Y.1907I-.0061J.0232 +N670G2X1.1193Y.2103I.2886J.2614 +N680G2X1.0652Y.3119I.2506J.1986 +N690G2X1.0476Y.4354I.3581J.114 +N700G2X1.0524Y.5295I1.8444J-.0468 +N710G2X1.0641Y.5906I.2772J-.0212 +N720G00X1.0641Y.5906Z0.1 +N730G00X1.2752Y.5054Z0.1 +N740G1X1.2752Y.5054Z-0.01F12 +N750G2X1.3209Y.543I.055J-.0204F24 +N760G2X1.3718Y.5369I.0148J-.0924 +N770G2X1.4132Y.5044I-.0381J-.0912 +N780G2X1.4361Y.457I-.1142J-.0843 +N790G2X1.4593Y.3333I-.7849J-.2114 +N800G2X1.4662Y.219I-1.1991J-.13 +N810G2X1.4633Y.1748I-.283J-.0037 +N820G2X1.4409Y.1128I-.1625J.0235 +N830G2X1.4053Y.0798I-.076J.0464 +N840G2X1.3476Y.0785I-.0302J.0594 +N850G2X1.2817Y.1357I.063J.1393 +N860G2X1.2565Y.2002I.1508J.0959 +N870G2X1.251Y.307I.4209J.0752 +N880G3X1.2547Y.3819I-1.483J.1102 +N890G2X1.262Y.4565I.5078J-.012 +N900G2X1.2752Y.5054I.2734J-.0474 +N910G00X1.2752Y.5054Z0.1 +N920G00X1.5359Y.3751Z0.1 +N930G1X1.5359Y.3751Z-0.01F12 +N940G2X1.5738Y.4364I.2285J-.0989F24 +N950G1X1.5883Y.4523Z-0.01 +N960G1X1.6031Y.443Z-0.01 +N970G2X1.6356Y.415I-.1146J-.1657 +N980G2X1.663Y.379I-.1633J-.1528 +N990G2X1.7008Y.2787I-.2424J-.1486 +N1000G2X1.7111Y.1639I-.7037J-.1213 +N1010G2X1.7115Y.0794I-9.3539J-.0844 +N1020G2X1.7111Y.0586I-.5678J0 +N1030G2X1.7092Y.0476I-.0404J.0015 +N1040G2X1.7049Y.0393I-.0273J.0089 +N1050G2X1.6854Y.0251I-.033J.0247 +N1060G2X1.6337Y.0145I-.0651J.1873 +N1070G2X1.532Y.023I-.023J.3405 +N1080G2X1.508Y.0352I.0131J.0551 +N1090G2X1.4967Y.0598I.0213J.0246 +N1100G2X1.4978Y.1259I2.0856J.0002 +N1110G2X1.5035Y.2231I1.7775J-.0562 +N1120G2X1.5124Y.2944I.9678J-.0837 +N1130G2X1.5359Y.3751I.3355J-.0543 +N1140G00X1.5359Y.3751Z0.1 +N1150G00X1.8139Y.3576Z0.1 +N1160G1X1.8139Y.3576Z-0.01F12 +N1170G2X1.8607Y.435I.1898J-.0617F24 +N1180G1X1.8729Y.4464Z-0.01 +N1190G1X1.8946Y.4313Z-0.01 +N1200G2X1.9505Y.3813I-.2257J-.3081 +N1210G2X1.975Y.3436I-.1012J-.0928 +N1220G2X1.9841Y.3105I-.1094J-.0479 +N1230G2X1.9935Y.1964I-1.3194J-.165 +N1240G2X1.9961Y.0943I-3.973J-.1522 +N1250G2X1.9957Y.0567I-.8389J-.0106 +N1260G2X1.9905Y.0403I-.0317J.001 +N1270G2X1.9764Y.0273I-.0331J.0217 +N1280G2X1.9467Y.0173I-.0425J.0775 +N1290G2X1.8451Y.0165I-.054J.3686 +N1300G2X1.8001Y.029I.0207J.1606 +N1310G2X1.7813Y.0567I.0129J.029 +N1320G2X1.781Y.0723I.368J.0157 +N1330G2X1.7813Y.1522I9.5636J0 +N1340G2X1.7818Y.1765I.9845J-.0082 +N1350G2X1.7827Y.1952I.5769J-.0191 +N1360G2X1.8139Y.3576I.6644J-.0435 +N1370G00X1.8139Y.3576Z0.1 +N1380G00X2.0596Y.2953Z0.1 +N1390G1X2.0596Y.2953Z-0.01F12 +N1400G2X2.08Y.4381I.8207J-.0442F24 +N1410G2X2.0996Y.4864I.1619J-.0378 +N1420G2X2.1339Y.5208I.0875J-.053 +N1430G2X2.1806Y.5357I.0543J-.0891 +N1440G1X2.1866Y.5361Z-0.01 +N1450G1X2.1906Y.5361Z-0.01 +N1460G2X2.2177Y.5287I-.0012J-.0581 +N1470G2X2.2397Y.5087I-.0319J-.0571 +N1480G2X2.2583Y.4655I-.0997J-.0685 +N1490G2X2.2702Y.3663I-.5325J-.114 +N1500G3X2.2733Y.3196I.6037J.0165 +N1510G2X2.2743Y.308I-.3703J-.039 +N1520G2X2.2752Y.2544I-.4641J-.0341 +N1530G2X2.2705Y.2165I-.2364J.0099 +N1540G2X2.2417Y.1614I-.1107J.0229 +N1550G2X2.1779Y.1191I-.1244J.1183 +N1560G2X2.1029Y.13I-.0277J.0733 +N1570G2X2.0728Y.1656I.065J.0856 +N1580G2X2.0592Y.2157I.1052J.0554 +N1590G2X2.0596Y.2953I.8179J.0356 +N1600G00X2.0596Y.2953Z0.1 +N1610G00X2.3344Y.3358Z0.1 +N1620G1X2.3344Y.3358Z-0.01F12 +N1630G2X2.3409Y.5192I.9414J.0584F24 +N1640G2X2.3646Y.616I.4606J-.0616 +N1650G2X2.3924Y.6684I.2007J-.0728 +N1660G2X2.4109Y.68I.0235J-.017 +N1670G2X2.4377Y.676I.0074J-.0424 +N1680G2X2.4638Y.6533I-.0317J-.0628 +N1690G2X2.4821Y.6113I-.0959J-.0667 +N1700G2X2.4946Y.4874I-.5456J-.1178 +N1710G2X2.465Y.3232I-.4999J.0056 +N1720G2X2.4337Y.2663I-.1959J.0707 +N1730G2X2.4046Y.2351I-.1863J.1443 +N1740G2X2.3924Y.2276I-.0273J.0305 +N1750G2X2.3753Y.2269I-.0095J.0241 +N1760G2X2.3581Y.2379I.0108J.0355 +N1770G2X2.3455Y.2623I.0434J.038 +N1780G2X2.3344Y.3358I.4102J.0996 +N1790G00X2.3344Y.3358Z0.1 +N1800G00X2.5478Y.4381Z0.1 +N1810G1X2.5478Y.4381Z-0.01F12 +N1820G2X2.5305Y.4746I.0872J.0637F24 +N1830G2X2.5176Y.5544I.4169J.1084 +N1840G2X2.5161Y.6452I.9092J.0606 +N1850G2X2.523Y.7182I.5932J-.0197 +N1860G2X2.544Y.7874I.2595J-.041 +N1870G2X2.5678Y.8151I.0609J-.0281 +N1880G2X2.5717Y.8174I.0263J-.0396 +N1890G2X2.5745Y.8187I.0105J-.0196 +N1900G2X2.5878Y.8176I.0055J-.015 +N1910G2X2.5979Y.8089I-.016J-.0289 +N1920G2X2.6433Y.7269I-.2462J-.1897 +N1930G2X2.6583Y.6452I-.2283J-.0842 +N1940G2X2.6481Y.5282I-.6004J-.0065 +N1950G2X2.6245Y.4651I-.1943J.0364 +N1960G2X2.5959Y.4302I-.1226J.0715 +N1970G2X2.5829Y.4224I-.0276J.0312 +N1980G2X2.5631Y.4242I-.008J.0215 +N1990G2X2.5478Y.4381I.0267J.0446 +N2000G00X2.5478Y.4381Z0.1 +N2010G00X2.6822Y.7157Z0.1 +N2020G1X2.6822Y.7157Z-0.01F12 +N2030G2X2.655Y.7355I-.0029J.0246F24 +N2040G2X2.6504Y.7689I.2901J.0567 +N2050G2X2.6481Y.8328I.7421J.0586 +N2060G2X2.6511Y.8705I.2601J-.0019 +N2070G2X2.6619Y.905I.1194J-.0183 +N2080G2X2.6846Y.9216I.0272J-.0132 +N2090G2X2.6922Y.9219I.0048J-.0319 +N2100G2X2.6991Y.9203I-.0023J-.0262 +N2110G2X2.7144Y.9067I-.0097J-.0264 +N2120G2X2.7278Y.8635I-.1217J-.0617 +N2130G2X2.7309Y.8191I-.325J-.0444 +N2140G2X2.7278Y.778I-.28J0 +N2150G2X2.7183Y.7432I-.1498J.0222 +N2160G2X2.6822Y.7157I-.0414J.0168 +N2170G00X2.6822Y.7157Z0.1 +N2180G00X2.6767Y1.6351Z0.1 +N2190G1X2.6767Y1.6351Z-0.01F12 +N2200G3X2.7798Y1.6441I-.0106J.7161F24 +N2210G3X2.9093Y1.6844I-.0761J.4734 +N2220G3X3.015Y1.7775I-.1095J.2307 +N2230G3X3.0418Y1.8405I-.1753J.112 +N2240G3X3.0625Y1.9732I-.7794J.1893 +N2250G3X3.0647Y2.121I-1.3279J.0939 +N2260G3X3.0515Y2.2456I-.9563J-.0387 +N2270G3X2.9806Y2.4619I-.7761J-.1344 +N2280G3X2.8734Y2.6035I-.4293J-.2135 +N2290G3X2.7472Y2.6841I-.3006J-.3314 +N2300G3X2.6583Y2.715I-.2748J-.6494 +N2310G1X2.655Y2.7004Z-0.01 +N2320G2X2.6515Y2.6859I-.6475J.1458 +N2330G2X2.5868Y2.5063I-.9125J.2272 +N2340G2X2.4903Y2.35I-.7843J.3764 +N2350G2X2.4061Y2.2512I-1.0994J.8513 +N2360G2X2.3301Y2.1788I-.6649J.6222 +N2370G2X2.0145Y2.013I-.5294J.6246 +N2380G2X1.8146Y1.9815I-.2455J.9074 +N2390G2X1.6543Y1.9837I-.0627J1.2905 +N2400G2X1.5156Y2.0042I.0746J.984 +N2410G2X1.2439Y2.1311I.1492J.6738 +N2420G2X1.0965Y2.2639I.7799J1.0135 +N2430G1X1.0654Y2.2968Z-0.01 +N2440G2X1.0583Y2.3057I.0541J.0507 +N2450G1X.9569Y2.5104Z-0.01 +N2460G1X.9062Y2.6127Z-0.01 +N2470G1X.8556Y2.715Z-0.01 +N2480G1X.8424Y2.7116Z-0.01 +N2490G3X.8293Y2.7081I.1089J-.439 +N2500G3X.6885Y2.6477I.1565J-.5587 +N2510G3X.5563Y2.5238I.2174J-.3643 +N2520G3X.4815Y2.3672I.457J-.3143 +N2530G3X.4486Y2.1607I.7722J-.229 +N2540G3X.454Y1.9867I1.4843J-.0415 +N2550G3X.4692Y1.883I.9231J.0827 +N2560G3X.5024Y1.7756I.5712J.1174 +N2570G3X.5606Y1.701I.1648J.0689 +N2580G3X.6319Y1.6648I.1413J.1902 +N2590G3X.7598Y1.6394I.1864J.6022 +N2600G3X.9289Y1.6372I.0982J1.0532 +N2610G3X1.28Y1.7029I-.1017J1.5144 +N2620G3X1.4359Y1.7609I-.4665J1.4926 +N2630G3X1.5893Y1.8281I-8.5693J19.7516 +N2640G1X1.752Y1.9003Z-0.01 +N2650G1X1.9456Y1.8156Z-0.01 +N2660G1X2.2003Y1.7054Z-0.01 +N2670G3X2.2156Y1.7002I.1026J.2778 +N2680G3X2.2543Y1.6888I.5469J1.7731 +N2690G3X2.3359Y1.6683I.3587J1.2594 +N2700G3X2.4216Y1.6526I.2976J1.3744 +N2710G3X2.6767Y1.6351I.2322J1.5241 +N2720G00X2.6767Y1.6351Z0.1 +N2730G00X2.582Y1.442Z0.1 +N2740G1X2.582Y1.442Z-0.01F12 +N2750G2X2.4304Y1.5057I9.6057J23.1048F24 +N2760G2X2.153Y1.6272I4.8191J11.3798 +N2770G2X1.819Y1.8026I1.3311J2.9405 +N2780G1X1.7618Y1.838Z-0.01 +N2790G1X1.6976Y1.8024Z-0.01 +N2800G2X1.4607Y1.6796I-3.1491J5.7836 +N2810G2X1.2122Y1.5631I-3.0789J6.2445 +N2820G2X.9498Y1.4486I-8.0731J18.1425 +N2830G3X.6884Y1.3316I3.3344J-7.7939 +N2840G3X.6499Y1.3129I.6665J-1.423 +N2850G3X.6412Y1.3079I.0387J-.0771 +N2860G3X.6245Y1.293I.0417J-.0633 +N2870G3X.5985Y1.2563I.2352J-.1952 +N2880G3X.5693Y1.2006I.4255J-.2583 +N2890G2X.5345Y1.1481I-.174J.0775 +N2900G2X.4816Y1.1181I-.0745J.0696 +N2910G2X.4454Y1.1153I-.0285J.1312 +N2920G2X.3388Y1.1561I.0108J.1877 +N2930G2X.2904Y1.2065I.167J.2089 +N2940G2X.1799Y1.3607I6.2301J4.5822 +N2950G3X.1171Y1.4414I-.8121J-.5671 +N2960G3X.0637Y1.4981I-.6914J-.5977 +N2970G2X.0507Y1.5125I.1085J.1113 +N2980G2X.0467Y1.518I.0549J.0438 +N2990G2X.0387Y1.5309I.2962J.1926 +N3000G2X.0102Y1.6004I.225J.1329 +N3010G2X0Y1.6859I.3329J.0832 +N3020G2X.0117Y1.7392I.1312J-.0009 +N3030G2X.0518Y1.8004I.2161J-.0978 +N3040G2X.1068Y1.8498I.2625J-.2373 +N3050G2X.1646Y1.8907I1.9738J-2.7266 +N3060G3X.3075Y2.0098I-.5939J.8579 +N3070G3X.3717Y2.0972I-.2507J.2514 +N3080G3X.3973Y2.2175I-.2044J.1064 +N3090G3X.3855Y2.3119I-.7427J-.0449 +N3100G3X.3425Y2.4667I-.9563J-.1822 +N3110G3X.2748Y2.6331I-2.5502J-.941 +N3120G2X.2186Y2.7707I2.1397J.9545 +N3130G2X.1757Y2.9142I1.0715J.3986 +N3140G2X.1523Y3.1311I.9048J.2071 +N3150G2X.1602Y3.2663I1.4144J-.0148 +N3160G2X.3605Y3.8486I1.3726J-.1464 +N3170G2X.5825Y4.1352I1.4985J-.9316 +N3180G2X1.0433Y4.504I1.5998J-1.5268 +N3190G2X1.3807Y4.6536I.7706J-1.2824 +N3200G2X1.698Y4.7083I.3803J-1.2572 +N3210G2X1.8843Y4.7065I.0775J-1.6128 +N3220G2X2.1832Y4.6581I-.1097J-1.6237 +N3230G2X2.6817Y4.4274I-.3861J-1.4883 +N3240G2X2.9458Y4.1991I-1.0065J-1.4311 +N3250G2X3.1052Y4.0028I-1.2101J-1.1455 +N3260G2X3.3387Y3.4551I-1.2137J-.8411 +N3270G2X3.3716Y3.1223I-1.6141J-.3273 +N3280G2X3.3581Y2.9763I-.8277J.0028 +N3290G2X3.3134Y2.8036I-1.2078J.2206 +N3300G2X3.2558Y2.6592I-1.3812J.4671 +N3310G3X3.1953Y2.5161I2.1593J-.9976 +N3320G3X3.1362Y2.312I1.1596J-.4463 +N3330G3X3.126Y2.2043I.5198J-.1033 +N3340G3X3.189Y2.0342I.2672J.0022 +N3350G3X3.2783Y1.9509I.392J.3307 +N3360G3X3.3385Y1.9111I.4483J.6131 +N3370G2X3.4459Y1.831I-.328J-.5517 +N3380G2X3.5011Y1.7669I-.2525J-.2734 +N3390G2X3.5236Y1.6957I-.1074J-.073 +N3400G2X3.5185Y1.6344I-.3196J-.0045 +N3410G2X3.5028Y1.5802I-.2651J.0479 +N3420G2X3.4695Y1.5236I-.2134J.0874 +N3430G2X3.3618Y1.3897I-22.6068J18.0644 +N3440G3X3.2433Y1.2263I1.5011J-1.2141 +N3450G2X3.2111Y1.1874I-.1845J.1197 +N3460G2X3.1389Y1.1394I-.1687J.1757 +N3470G2X3.0656Y1.1246I-.0716J.166 +N3480G2X3.0314Y1.133I.0007J.077 +N3490G2X2.9976Y1.1593I.0516J.1014 +N3500G2X2.9759Y1.191I.1183J.1042 +N3510G1X2.9541Y1.233Z-0.01 +N3520G3X2.9122Y1.2958I-.3209J-.1681 +N3530G3X2.8824Y1.3195I-.0711J-.0589 +N3540G1X2.7304Y1.3809Z-0.01 +N3550G2X2.582Y1.442I8.9839J22.0271 +N3560G00X2.582Y1.442Z0.1 +N3570G00X2.4811Y1.3039Z0.1 +N3580G1X2.4811Y1.3039Z-0.01F12 +N3590G2X2.5227Y1.2777I-.1753J-.3249F24 +N3600G2X2.6012Y1.1952I-.1843J-.2539 +N3610G2X2.6473Y1.0866I-.2817J-.1837 +N3620G2X2.6573Y1.0229I-.4554J-.1043 +N3630G2X2.6583Y.9824I-.32J-.028 +N3640G2X2.6537Y.9594I-.0742J.0029 +N3650G2X2.6386Y.9294I-.1433J.0533 +N3660G2X2.5935Y.8752I-.2526J.1642 +N3670G2X2.4807Y.7793I-.9166J.9642 +N3680G2X2.3002Y.6547I-1.4907J1.9661 +N3690G2X2.1501Y.5722I-.7975J1.2727 +N3700G2X1.9556Y.4996I-.5046J1.056 +N3710G2X1.6308Y.4876I-.1881J.6847 +N3720G2X1.4388Y.544I.2098J1.0692 +N3730G2X1.0721Y.7218I1.0191J2.5686 +N3740G2X.9269Y.8163I.8429J1.4542 +N3750G2X.8593Y.8765I.2694J.3707 +N3760G2X.8236Y.9274I.1714J.158 +N3770G2X.8146Y.9629I.0715J.0369 +N3780G2X.8379Y1.1175I.4674J.0086 +N3790G2X.9396Y1.2654I.3037J-.0998 +N3800G2X.9782Y1.2905I.1356J-.1664 +N3810G3X1.0539Y1.3299I-1.834J3.616 +N3820G3X1.1835Y1.4004I-4.4819J8.394 +N3830G3X1.3448Y1.4911I-7.2425J13.0721 +N3840G3X1.3795Y1.4207I1.4811J.688 +N3850G3X1.4028Y1.3803I.5107J.2678 +N3860G3X1.484Y1.2783I.5084J.3215 +N3870G3X1.6633Y1.177I.2689J.2665 +N3880G3X1.7754Y1.1653I.099J.4066 +N3890G3X1.8544Y1.1762I-.0117J.378 +N3900G3X1.968Y1.2323I-.0707J.2858 +N3910G3X2.0233Y1.2858I-.2603J.3244 +N3920G3X2.0893Y1.3785I-.4769J.4094 +N3930G3X2.1496Y1.4911I-1.5361J.8965 +N3940G3X2.2501Y1.4324I8.3749J14.2267 +N3950G3X2.309Y1.3988I2.8115J4.8538 +N3960G3X2.4811Y1.3039I5.303J9.4159 +N3970G00X2.4811Y1.3039Z0.1 +N3980G00Z0.4 +N3990G00X0Y0 +N4000M05 +N4010M30 +N4020% diff --git a/tests/test-files/Smiley face.tap b/tests/test-files/Smiley face.tap new file mode 100644 index 0000000..b13a7c7 --- /dev/null +++ b/tests/test-files/Smiley face.tap @@ -0,0 +1,68 @@ +(Created 7:48:52 AM 5/1/2011 from Smiley face.dxf) +(Post = Mikes Mach3 Router) +(Tool 8 = .250 Vee bit) +N0001 G90 +N0002 G20 G91.1 M3 +N0003 G00 X0.1250 Y0.0000 Z0.5000 +N0004 G00 X0.1250 Y0.0000 Z0.5000 +N0005 G01 X0.1250 Y0.0000 Z-0.0500 F10.00 +N0006 G03 X0.1250 Y0.0000 I-0.1250 J0.0000 F40.00 +N0007 G00 X0.1250 Y0.0000 Z0.5000 +N0008 G00 X1.8215 Y4.2445 Z0.5000 +N0009 G01 X1.8215 Y4.2445 Z-0.0500 F10.00 +N0010 G03 X1.8215 Y4.2445 I-0.1250 J0.0000 F40.00 +N0011 G00 X1.8215 Y4.2445 Z0.5000 +N0012 G00 X2.2583 Y5.1186 Z0.5000 +N0013 G01 X2.2583 Y5.1186 Z-0.0500 F10.00 +N0014 G01 X2.2583 Y5.9313 Z-0.0500 F40.00 +N0015 G00 X2.2583 Y5.9313 Z0.5000 +N0016 G00 X3.0000 Y6.0244 Z0.5000 +N0017 G01 X3.0000 Y6.0244 Z-0.0500 F10.00 +N0018 G01 X3.0000 Y5.1186 Z-0.0500 F40.00 +N0019 G00 X3.0000 Y5.1186 Z0.5000 +N0020 G00 X3.7417 Y5.1186 Z0.5000 +N0021 G01 X3.7417 Y5.1186 Z-0.0500 F10.00 +N0022 G01 X3.7417 Y5.9313 Z-0.0500 F40.00 +N0023 G00 X3.7417 Y5.9313 Z0.5000 +N0024 G00 X4.4835 Y5.1186 Z0.5000 +N0025 G01 X4.4835 Y5.1186 Z-0.0500 F10.00 +N0026 G01 X4.4835 Y5.6320 Z-0.0500 F40.00 +N0027 G00 X4.4835 Y5.6320 Z0.5000 +N0028 G00 X4.7885 Y4.2445 Z0.5000 +N0029 G01 X4.7885 Y4.2445 Z-0.0500 F10.00 +N0030 G03 X4.7885 Y4.2445 I-0.1250 J0.0000 F40.00 +N0031 G00 X4.7885 Y4.2445 Z0.5000 +N0032 G00 X1.5165 Y1.8003 Z0.5000 +N0033 G01 X1.5165 Y1.8003 Z-0.0500 F10.00 +N0034 G03 X4.4835 Y1.8003 I1.4835 J0.8852 F40.00 +N0035 G02 X1.5165 Y1.8003 I-1.4835 J1.2241 +N0036 G00 X1.5165 Y1.8003 Z0.5000 +N0037 G00 X2.4130 Y2.6855 Z0.5000 +N0038 G01 X2.4130 Y2.6855 Z-0.0500 F10.00 +N0039 G01 X3.5870 Y2.6855 Z-0.0500 F40.00 +N0040 G01 X3.0000 Y3.7022 Z-0.0500 +N0041 G01 X2.4130 Y2.6855 Z-0.0500 +N0042 G00 X2.4130 Y2.6855 Z0.5000 +N0043 G00 X2.0165 Y4.3945 Z0.5000 +N0044 G01 X2.0165 Y4.3945 Z-0.0500 F10.00 +N0045 G03 X2.0165 Y4.3945 I-0.5000 J0.0000 F40.00 +N0046 G00 X2.0165 Y4.3945 Z0.5000 +N0047 G00 X4.9835 Y4.3945 Z0.5000 +N0048 G01 X4.9835 Y4.3945 Z-0.0500 F10.00 +N0049 G03 X4.9835 Y4.3945 I-0.5000 J0.0000 F40.00 +N0050 G00 X4.9835 Y4.3945 Z0.5000 +N0051 G00 X6.0000 Y3.0244 Z0.5000 +N0052 G01 X6.0000 Y3.0244 Z-0.0500 F10.00 +N0053 G03 X6.0000 Y3.0244 I-3.0000 J0.0000 F40.00 +N0054 G00 X6.0000 Y3.0244 Z0.5000 +N0055 G00 X1.5165 Y5.1186 Z0.5000 +N0056 G01 X1.5165 Y5.1186 Z-0.0500 F10.00 +N0057 G01 X1.5165 Y5.6320 Z-0.0500 F40.00 +N0058 G00 X1.5165 Y5.6320 Z0.5000 +N0059 G00 X0.8518 Y5.1186 Z0.5000 +N0060 G01 X0.8518 Y5.1186 Z-0.0500 F10.00 +N0061 G01 X5.1482 Y5.1186 Z-0.0500 F40.00 +N0062 G00 X5.1482 Y5.1186 Z0.5000 +N0063 M5 +N0064 M30 +N0065 % diff --git a/tests/test-files/Smiley001.nc b/tests/test-files/Smiley001.nc new file mode 100644 index 0000000..5567ae7 --- /dev/null +++ b/tests/test-files/Smiley001.nc @@ -0,0 +1,59 @@ +G20 G40 G90 +G91.1 +G0 Z0.250 +G0 X-0.305 Y-0.127 Z0.250 +G1 X-0.305 Y-0.127 Z-0.010 F50 +G3 X0.304 Y-0.127 Z-0.010 I0.305 J0.115 F50 +G2 X-0.305 Y-0.127 Z-0.010 I-0.305 J0.172 +G0 X-0.305 Y-0.127 Z0.250 +G0 X-0.372 Y-0.145 Z0.250 +G1 X-0.372 Y-0.145 Z-0.010 F50 +G3 X-0.267 Y-0.070 Z-0.010 I0.010 J0.097 F50 +G0 X-0.267 Y-0.070 Z0.250 +G0 X0.266 Y-0.070 Z0.250 +G1 X0.266 Y-0.070 Z-0.010 F50 +G3 X0.371 Y-0.145 Z-0.010 I0.095 J0.021 F50 +G0 X0.371 Y-0.145 Z0.250 +G0 X0.174 Y0.083 Z0.250 +G1 X0.174 Y0.083 Z-0.010 F50 +G2 X0.151 Y0.077 Z-0.010 I-0.023 J0.037 F50 +G2 X0.128 Y0.083 Z-0.010 I0.000 J0.044 +G2 X0.105 Y0.105 Z-0.010 I0.039 J0.063 +G2 X0.092 Y0.135 Z-0.010 I0.087 J0.058 +G2 X0.086 Y0.174 Z-0.010 I0.140 J0.039 +G2 X0.092 Y0.213 Z-0.010 I0.145 J0.000 +G2 X0.105 Y0.243 Z-0.010 I0.100 J-0.028 +G2 X0.128 Y0.264 Z-0.010 I0.062 J-0.041 +G2 X0.151 Y0.271 Z-0.010 I0.023 J-0.037 +G2 X0.174 Y0.264 Z-0.010 I0.000 J-0.044 +G2 X0.197 Y0.243 Z-0.010 I-0.039 J-0.063 +G2 X0.211 Y0.213 Z-0.010 I-0.087 J-0.058 +G2 X0.216 Y0.174 Z-0.010 I-0.140 J-0.039 +G2 X0.211 Y0.135 Z-0.010 I-0.145 J0.000 +G2 X0.197 Y0.105 Z-0.010 I-0.100 J0.028 +G2 X0.174 Y0.083 Z-0.010 I-0.062 J0.041 +G0 X0.174 Y0.083 Z0.250 +G0 X-0.174 Y0.083 Z0.250 +G1 X-0.174 Y0.083 Z-0.010 F50 +G3 X-0.151 Y0.077 Z-0.010 I0.023 J0.037 F50 +G3 X-0.128 Y0.083 Z-0.010 I0.000 J0.044 +G3 X-0.105 Y0.105 Z-0.010 I-0.039 J0.063 +G3 X-0.092 Y0.135 Z-0.010 I-0.087 J0.058 +G3 X-0.086 Y0.174 Z-0.010 I-0.140 J0.039 +G3 X-0.092 Y0.213 Z-0.010 I-0.145 J0.000 +G3 X-0.105 Y0.243 Z-0.010 I-0.100 J-0.028 +G3 X-0.128 Y0.264 Z-0.010 I-0.062 J-0.041 +G3 X-0.151 Y0.271 Z-0.010 I-0.023 J-0.037 +G3 X-0.174 Y0.264 Z-0.010 I0.000 J-0.044 +G3 X-0.197 Y0.243 Z-0.010 I0.039 J-0.063 +G3 X-0.211 Y0.213 Z-0.010 I0.087 J-0.058 +G3 X-0.216 Y0.174 Z-0.010 I0.140 J-0.039 +G3 X-0.211 Y0.135 Z-0.010 I0.145 J0.000 +G3 X-0.197 Y0.105 Z-0.010 I0.100 J0.028 +G3 X-0.174 Y0.083 Z-0.010 I0.062 J0.041 +G0 X-0.174 Y0.083 Z0.250 +G0 X0.000 Y0.500 Z0.250 +G1 X0.000 Y0.500 Z-0.010 F50 +G2 X0.000 Y0.500 Z-0.010 I0.000 J-0.500 F50 +G0 X0.000 Y0.500 Z0.250 +M30 diff --git a/tests/test-files/Smiley002.nc b/tests/test-files/Smiley002.nc new file mode 100644 index 0000000..25f32b7 --- /dev/null +++ b/tests/test-files/Smiley002.nc @@ -0,0 +1,142 @@ +G20 G40 G90 +G91.1 +G0 Z0.250 +G0 X0.000 Y-0.366 Z0.250 +G1 X0.000 Y-0.366 Z-0.010 F50 +G2 X-0.056 Y-0.363 Z-0.010 I-0.006 J0.435 F50 +G2 X-0.088 Y-0.347 Z-0.010 I0.013 J0.066 +G2 X-0.082 Y-0.311 Z-0.010 I0.015 J0.016 +G2 X-0.041 Y-0.308 Z-0.010 I0.025 J-0.054 +G2 X-0.006 Y-0.326 Z-0.010 I-0.025 J-0.087 +G1 X0.000 Y-0.332 Z-0.010 +G1 X0.006 Y-0.326 Z-0.010 +G2 X0.041 Y-0.308 Z-0.010 I0.060 J-0.069 +G2 X0.082 Y-0.311 Z-0.010 I0.016 J-0.057 +G2 X0.088 Y-0.347 Z-0.010 I-0.009 J-0.020 +G2 X0.056 Y-0.363 Z-0.010 I-0.045 J0.049 +G2 X0.000 Y-0.366 Z-0.010 I-0.050 J0.432 +G0 X0.000 Y-0.366 Z0.250 +G0 X-0.251 Y-0.117 Z0.250 +G1 X-0.251 Y-0.117 Z-0.010 F50 +G1 X-0.197 Y-0.278 Z-0.010 F50 +G3 X-0.145 Y-0.349 Z-0.010 I0.139 J0.047 +G3 X-0.114 Y-0.364 Z-0.010 I0.052 J0.071 +G3 X0.000 Y-0.377 Z-0.010 I0.108 J0.433 +G3 X0.114 Y-0.364 Z-0.010 I0.006 J0.446 +G3 X0.145 Y-0.349 Z-0.010 I-0.021 J0.085 +G3 X0.197 Y-0.278 Z-0.010 I-0.088 J0.118 +G1 X0.251 Y-0.117 Z-0.010 +G0 X0.251 Y-0.117 Z0.250 +G0 X-0.228 Y-0.117 Z0.250 +G1 X-0.228 Y-0.117 Z-0.010 F50 +G3 X0.228 Y-0.117 Z-0.010 I0.228 J0.270 F50 +G0 X0.228 Y-0.117 Z0.250 +G0 X0.359 Y-0.037 Z0.250 +G1 X0.359 Y-0.037 Z-0.010 F50 +G3 X0.269 Y-0.031 Z-0.010 I-0.051 J-0.089 F50 +G0 X0.269 Y-0.031 Z0.250 +G0 X-0.314 Y-0.023 Z0.250 +G1 X-0.314 Y-0.023 Z-0.010 F50 +G3 X-0.258 Y-0.117 Z-0.010 I0.055 J-0.031 F50 +G1 X0.258 Y-0.117 Z-0.010 +G3 X0.314 Y-0.023 Z-0.010 I0.000 J0.063 +G0 X0.314 Y-0.023 Z0.250 +G0 X-0.269 Y-0.031 Z0.250 +G1 X-0.269 Y-0.031 Z-0.010 F50 +G3 X-0.359 Y-0.037 Z-0.010 I-0.040 J-0.095 F50 +G0 X-0.359 Y-0.037 Z0.250 +G0 X-0.225 Y0.286 Z0.250 +G1 X-0.225 Y0.286 Z-0.010 F50 +G3 X-0.252 Y0.217 Z-0.010 I0.249 J-0.134 F50 +G3 X-0.259 Y0.143 Z-0.010 I0.275 J-0.065 +G3 X-0.248 Y0.083 Z-0.010 I0.199 J0.006 +G3 X-0.217 Y0.033 Z-0.010 I0.130 J0.046 +G3 X-0.179 Y0.011 Z-0.010 I0.057 J0.055 +G3 X-0.134 Y0.013 Z-0.010 I0.018 J0.077 +G3 X-0.084 Y0.044 Z-0.010 I-0.046 J0.131 +G3 X-0.047 Y0.093 Z-0.010 I-0.138 J0.144 +G3 X-0.021 Y0.162 Z-0.010 I-0.249 J0.134 +G3 X-0.013 Y0.235 Z-0.010 I-0.275 J0.065 +G3 X-0.024 Y0.296 Z-0.010 I-0.199 J-0.006 +G3 X-0.055 Y0.346 Z-0.010 I-0.130 J-0.046 +G3 X-0.094 Y0.368 Z-0.010 I-0.057 J-0.055 +G3 X-0.138 Y0.366 Z-0.010 I-0.018 J-0.077 +G3 X-0.188 Y0.335 Z-0.010 I0.046 J-0.131 +G3 X-0.225 Y0.286 Z-0.010 I0.138 J-0.144 +G0 X-0.225 Y0.286 Z0.250 +G0 X-0.092 Y0.154 Z0.250 +G1 X-0.092 Y0.154 Z-0.010 F50 +G3 X-0.094 Y0.175 Z-0.010 I-0.067 J0.004 F50 +G3 X-0.102 Y0.192 Z-0.010 I-0.044 J-0.011 +G3 X-0.114 Y0.200 Z-0.010 I-0.018 J-0.015 +G3 X-0.127 Y0.200 Z-0.010 I-0.007 J-0.023 +G3 X-0.144 Y0.190 Z-0.010 I0.013 J-0.043 +G3 X-0.157 Y0.175 Z-0.010 I0.044 J-0.051 +G3 X-0.167 Y0.153 Z-0.010 I0.084 J-0.052 +G3 X-0.172 Y0.129 Z-0.010 I0.094 J-0.029 +G3 X-0.170 Y0.108 Z-0.010 I0.067 J-0.004 +G3 X-0.161 Y0.091 Z-0.010 I0.044 J0.011 +G3 X-0.150 Y0.084 Z-0.010 I0.018 J0.015 +G3 X-0.136 Y0.083 Z-0.010 I0.007 J0.023 +G3 X-0.119 Y0.093 Z-0.010 I-0.013 J0.043 +G3 X-0.106 Y0.108 Z-0.010 I-0.044 J0.051 +G3 X-0.096 Y0.130 Z-0.010 I-0.084 J0.052 +G3 X-0.092 Y0.154 Z-0.010 I-0.094 J0.029 +G0 X-0.092 Y0.154 Z0.250 +G0 X-0.089 Y0.413 Z0.250 +G1 X-0.089 Y0.413 Z-0.010 F50 +G3 X-0.168 Y0.414 Z-0.010 I-0.040 J-0.055 F50 +G3 X-0.241 Y0.335 Z-0.010 I0.141 J-0.204 +G2 X-0.193 Y0.418 Z-0.010 I0.126 J-0.018 +G2 X-0.089 Y0.413 Z-0.010 I0.049 J-0.064 +G0 X-0.089 Y0.413 Z0.250 +G0 X0.089 Y0.413 Z0.250 +G1 X0.089 Y0.413 Z-0.010 F50 +G2 X0.168 Y0.414 Z-0.010 I0.040 J-0.055 F50 +G2 X0.241 Y0.335 Z-0.010 I-0.141 J-0.204 +G3 X0.193 Y0.418 Z-0.010 I-0.126 J-0.018 +G3 X0.089 Y0.413 Z-0.010 I-0.049 J-0.064 +G0 X0.089 Y0.413 Z0.250 +G0 X0.225 Y0.286 Z0.250 +G1 X0.225 Y0.286 Z-0.010 F50 +G2 X0.252 Y0.217 Z-0.010 I-0.249 J-0.134 F50 +G2 X0.259 Y0.143 Z-0.010 I-0.275 J-0.065 +G2 X0.248 Y0.083 Z-0.010 I-0.199 J0.006 +G2 X0.217 Y0.033 Z-0.010 I-0.130 J0.046 +G2 X0.179 Y0.011 Z-0.010 I-0.057 J0.055 +G2 X0.134 Y0.013 Z-0.010 I-0.018 J0.077 +G2 X0.084 Y0.044 Z-0.010 I0.046 J0.131 +G2 X0.047 Y0.093 Z-0.010 I0.138 J0.144 +G2 X0.021 Y0.162 Z-0.010 I0.249 J0.134 +G2 X0.013 Y0.235 Z-0.010 I0.275 J0.065 +G2 X0.024 Y0.296 Z-0.010 I0.199 J-0.006 +G2 X0.055 Y0.346 Z-0.010 I0.130 J-0.046 +G2 X0.094 Y0.368 Z-0.010 I0.057 J-0.055 +G2 X0.138 Y0.366 Z-0.010 I0.018 J-0.077 +G2 X0.188 Y0.335 Z-0.010 I-0.046 J-0.131 +G2 X0.225 Y0.286 Z-0.010 I-0.138 J-0.144 +G0 X0.225 Y0.286 Z0.250 +G0 X0.092 Y0.154 Z0.250 +G1 X0.092 Y0.154 Z-0.010 F50 +G2 X0.094 Y0.175 Z-0.010 I0.067 J0.004 F50 +G2 X0.102 Y0.192 Z-0.010 I0.044 J-0.011 +G2 X0.114 Y0.200 Z-0.010 I0.018 J-0.015 +G2 X0.127 Y0.200 Z-0.010 I0.007 J-0.023 +G2 X0.144 Y0.190 Z-0.010 I-0.013 J-0.043 +G2 X0.157 Y0.175 Z-0.010 I-0.044 J-0.051 +G2 X0.167 Y0.153 Z-0.010 I-0.084 J-0.052 +G2 X0.172 Y0.129 Z-0.010 I-0.094 J-0.029 +G2 X0.170 Y0.108 Z-0.010 I-0.067 J-0.004 +G2 X0.161 Y0.091 Z-0.010 I-0.044 J0.011 +G2 X0.150 Y0.084 Z-0.010 I-0.018 J0.015 +G2 X0.136 Y0.083 Z-0.010 I-0.007 J0.023 +G2 X0.119 Y0.093 Z-0.010 I0.013 J0.043 +G2 X0.106 Y0.108 Z-0.010 I0.044 J0.051 +G2 X0.096 Y0.130 Z-0.010 I0.084 J0.052 +G2 X0.092 Y0.154 Z-0.010 I0.094 J0.029 +G0 X0.092 Y0.154 Z0.250 +G0 X0.000 Y0.500 Z0.250 +G1 X0.000 Y0.500 Z-0.010 F50 +G2 X0.000 Y0.500 Z-0.010 I0.000 J-0.500 F50 +G0 X0.000 Y0.500 Z0.250 +M30 diff --git a/tests/test-files/Snow White.tap b/tests/test-files/Snow White.tap new file mode 100644 index 0000000..2757671 --- /dev/null +++ b/tests/test-files/Snow White.tap @@ -0,0 +1,170 @@ +( Snow White ) +N100G20G17G90G40G49G80 +N110G70G91.1 +N120T1M06 +N140G00G43Z0.5H1 +N150S12000M03 +N180G94 +N190 (Engrave or Vinyl Cut) +N200G00X2.445Y1.5325Z0.2 +N210G1Z-.01F10.0 +N220G2X2.57Y1.6325I1.52J-1.7725F20.0 +N230G3X2.6975Y1.7325I-1.925J2.5875 +N240G3X2.835Y1.9175I-.305J.37 +N250G3X2.8975Y2.22I-.78J.3225 +N260G3X2.755Y2.7925I-1.1075J.0275 +N270G3X2.48Y3.235I-5.635J-3.1975 +N280G3X2.26Y2.4375I1.0375J-.7125 +N290G3X2.445Y1.5325I3.4725J.2325 +N300G00Z0.2 +N310G00X2.9225Y1.46 +N320G1Z-.01F10.0 +N330G3X3.3075Y1.635I-.075J.67F20.0 +N340G3X3.4675Y1.965I-.345J.37 +N350G3X3.425Y2.3I-.8125J.065 +N360G3X3.26Y2.5625I-.6625J-.2325 +N370G2X3.3425Y2.1325I-7.26J-1.65 +N380G2X3.35Y2.0075I-.61J-.1025 +N390G2X3.2575Y1.7525I-.4425J.0175 +N400G2X2.9225Y1.46I-.9325J.73 +N410G00Z0.2 +N470G00X3.42Y6.7575 +N480G1Z-.01F10.0 +N490G3X3.8575Y6.9375I-.17J1.0425F20.0 +N500G3X4.1425Y7.265I-.515J.73 +N510G2X3.8375Y7.0275I-2.375J2.705 +N520G2X3.42Y6.7575I-3.39J4.815 +N530G00Z0.2 +N540G00X3.18Y5.915 +N550G1Z-.01F10.0 +N560G1X3.28Y5.79F20.0 +N570G2X3.375Y5.665I-2.155J-1.76 +N580G2X3.455Y5.385I-.3375J-.245 +N590G2X3.325Y5.04I-.6675J.055 +N600G2X2.865Y4.875I-.355J.2625 +N610G2X2.3925Y5.0125I1.3875J5.6575 +N620G2X2.7925Y4.81I-4.5375J-9.455 +N630G2X2.9575Y4.71I-.94J-1.76 +N640G2X3.485Y4.0025I-.725J-1.0875 +N650G2X3.6925Y2.89I-5.035J-1.525 +N660G3X3.265Y3.3025I-20.3225J-20.755 +N670G3X3.1825Y3.37I-.6325J-.675 +N680G3X2.465Y3.7675I-1.825J-2.4525 +N690G3X2.0975Y3.8375I-.37J-.9525 +N700G2X3.0425Y3.3475I-3.105J-7.16 +N710G2X3.4725Y3.0025I-1.0825J-1.78 +N720G2X4.0375Y2.3525I-7.0775J-6.7275 +N730G2X4.31Y1.95I-2.4375J-1.9375 +N740G2X4.4675Y1.0975I-1.155J-.655 +N750G2X4.315Y.615I-1.6075J.24 +N760G2X4.0125Y.0975I-3.8775J1.925 +N770G2X3.93Y.05I-.09J.0625 +N780G3X3.7125Y.53I-.765J-.0575 +N790G3X2.925Y1.0775I-1.8125J-1.775 +N800G3X2.435Y1.17I-.4425J-1 +N810G2X1.505Y1.1875I-.3175J7.0825 +N820G2X1.3825Y1.24I.02J.2225 +N830G2X1.2425Y1.405I.38J.4575 +N840G1X1.2825Y1.435 +N850G1X1.3225Y1.46 +N860G2X1.845Y1.5475I.375J-.635 +N870G3X2.5275Y1.4225I3.695J18.2125 +N880G1X2.2225Y1.515 +N890G2X2.0475Y1.73I.07J.235 +N900G3X1.9475Y2.7025I-22.19J-1.765 +N910G3X1.79Y3.1625I-1.1675J-.145 +N920G1X1.6725Y2.85 +N930G3X1.56Y2.5375I5.2225J-2.0525 +N940G3X1.6525Y1.98I.58J-.19 +N950G3X1.9925Y1.585I3.48J2.6375 +N960G1X1.85Y1.605 +N970G1X1.6725Y1.62 +N980G2X1.46Y1.7225I.02J.31 +N990G2X1.1875Y2.165I1.12J.9975 +N1000G2X1.1675Y2.4225I.4J.16 +N1010G2X1.2925Y2.8525I4.3875J-1.03 +N1020G1X1.2525Y2.8325 +N1030G1X1.235Y2.8225 +N1040G3X.9575Y2.5725I1.245J-1.6725 +N1050G3X.8575Y2.415I.3725J-.3475 +N1060G3X.94Y1.98I.3775J-.1525 +N1070G3X1.435Y1.6025I1.51J1.4575 +N1080G3X1.3325Y1.5225I.375J-.59 +N1090G2X1.2075Y1.485I-.1025J.11 +N1100G2X.8575Y1.66I.095J.63 +N1110G2X.5575Y2.2375I.73J.7425 +N1120G2X.6875Y2.74I.6425J.1025 +N1130G1X1.06Y3.2175 +N1140G3X1.1725Y3.44I-.505J.3925 +N1150G3X1.1575Y3.5725I-.1775J.05 +N1160G3X.935Y3.7675I-.36J-.185 +N1170G2X.5025Y4.1075I.2975J.8275 +N1180G2X.15Y4.7175I4.4125J2.9475 +N1190G2X.055Y5.02I.97J.475 +N1200G2X.07Y5.735I1.9375J.315 +N1210G2X.465Y6.215I.65J-.135 +N1220G3Y5.9825I.49J-.1175 +N1230G3X.5675Y5.7725I.505J.115 +N1240G3X.6625Y5.685I.3825J.3075 +N1250G3X1.05Y5.425I3.6875J5.11 +N1260G2X.5925Y5.91I2.8075J3.1 +N1270G2X.515Y6.0925I.2875J.23 +N1280G2X.6175Y6.3275I.2475J.0325 +N1290G2X.8Y6.4325I.6025J-.825 +N1300G3X.8575Y6.5125I-.04J.09 +N1310G1X.9075Y6.89 +N1320G2X1.1475Y7.5225I1.5125J-.215 +N1330G2X1.7275Y8.1225I1.9475J-1.295 +N1340G2X2.1125Y8.2625I.4325J-.6 +N1350G2X2.905Y8.1325I.12J-1.765 +N1360G3X2.57Y7.6775I2.885J-2.4825 +N1370G3X2.42Y7.2525I.8525J-.5375 +N1380G2X2.7075Y7.7925I4.635J-2.13 +N1390G2X2.9325Y8.09I1.6275J-.9975 +N1400G3X3.0325Y8.0025I1.355J1.4325 +N1410G3X3.0725Y7.975I.1725J.21 +N1420G2X2.885Y8.3875I.6875J.5625 +N1430G2X2.9575Y8.645I.3025J.0525 +N1440G2X3.22Y8.6125I.12J-.1075 +N1450G3X3.3825Y8.3275I4.395J2.325 +N1460G1X3.4675Y8.315 +N1470G1X3.51Y8.3075 +N1480G2X3.5525Y8.2275I-.02J-.0625 +N1490G2X3.445Y8.07I-.2775J.0725 +N1500G3X3Y7.675I1.875J-2.57 +N1510G3X2.6925Y7.2675I1.73J-1.625 +N1520G1X2.865Y7.4625 +N1530G2X3.04Y7.6575I3.15J-2.6975 +N1540G2X3.4875Y8.06I3.24J-3.1475 +N1550G2X4.115Y8.0675I.3175J-.405 +N1560G2X4.2575Y7.5625I-.2575J-.345 +N1570G3X4.26Y7.28I.3525J-.1375 +N1580G2X4.3025Y6.4175I-1.195J-.49 +N1590G3X4.2725Y6.2025I.67J-.2025 +N1600G3X4.355Y6.235I-.0975J.37 +N1610G3X4.4975Y6.3225I-.6425J1.2 +N1620G2X4.4125Y6.2025I-.325J.1375 +N1630G2X4.2875Y6.1275I-.24J.2575 +N1640G3X4.23Y5.9625I.035J-.105 +N1650G3X4.4425Y5.69I1.725J1.135 +N1660G2X4.4475Y5.52I-.095J-.0875 +N1670G1X4.325Y5.38 +N1680G3Y5.2725I.06J-.055 +N1690G2X4.3175Y5.0725I-.105J-.095 +N1700G3X4.27Y4.94I.1075J-.115 +N1710G2X4.23Y4.805I-.1775J-.0225 +N1720G3X4.1525Y4.67I.355J-.29 +N1730G2X4.0925Y4.53I-1.1525J.4225 +N1740G2X3.8075Y4.35I-.2925J.15 +N1750G3X3.475Y4.3025I.035J-1.4125 +N1760G3X3.3125Y4.51I-3.0125J-2.2075 +N1770G3X3.105Y4.74I-3.9825J-3.3775 +N1780G3X3.4075Y5.0225I-.6225J.9775 +N1790G3X3.55Y5.335I-.65J.4875 +N1800G3X3.4425Y5.6875I-.37J.08 +N1810G3X3.18Y5.915I-2.1425J-2.2275 +N1830G00Z0.5 +N1840G00X0Y0 +N1850M05 +N1860M30 +N1870% diff --git a/tests/test-files/Star Trek.tap b/tests/test-files/Star Trek.tap new file mode 100644 index 0000000..02e98a3 --- /dev/null +++ b/tests/test-files/Star Trek.tap @@ -0,0 +1,411 @@ +(Tweakie.CNC) +G00G21G17G90G40G49G80 +G71G91.1 +T1M06 +S12000M03 +G94 M63P1 F1016.0 +X0.000Y0.000 +G00X0.033Y15.914M63P1 +G1X0.033Y15.914M62P1 +G1X13.855Y13.140M62P1 +G1X8.012Y1.013 +G1X18.895Y8.132 +G1X28.215Y0.000 +G00X28.215Y0.000M63P1 +G00X28.244Y0.000M63P1 +G1X28.244Y0.000M62P1 +G3X27.385Y6.606I-1605.937J-205.318 +G2X26.567Y13.218I408.701J53.962 +G1X42.895Y23.862M62P1 +G2X42.640Y26.315I527.406J55.934 +G3X42.374Y28.766I-175.888J-17.827 +G2X42.407Y29.013I0.506J0.058 +G2X42.519Y29.213I0.806J-0.320 +G3X42.412Y29.252I-0.205J-0.396 +G2X42.317Y29.318I0.033J0.148 +G2X42.301Y29.378I0.086J0.056 +G3X42.298Y29.628I-2.420J0.102 +G2X38.881Y28.566I-171.156J544.552 +G2X21.945Y23.371I-4108.938J13365.432 +G1X13.257Y33.082M62P1 +G3X13.319Y26.726I1947.056J15.903 +G2X13.384Y20.371I-2736.022J-31.279 +G1X0.672Y16.140M62P1 +G1X0.165Y15.991 +G2X0.033Y15.973I-0.124J0.433 +G00X0.033Y15.973M63P1 +G00X17.110Y11.385M63P1 +G1X17.110Y11.385M62P1 +G1X15.476Y16.162M62P1 +G1X19.386Y12.709 +G1X18.317Y17.815 +G1X21.662Y14.034 +G00X21.662Y14.034M63P1 +G00X21.597Y16.717M63P1 +G1X21.597Y16.717M62P1 +G2X21.729Y17.275I1.794J-0.130 +G2X22.387Y18.023I1.420J-0.588 +G2X24.667Y16.134I0.784J-1.374 +G2X21.709Y16.053I-1.494J0.515 +G2X21.614Y16.381I1.498J0.610 +G2X21.592Y16.715I1.527J0.270 +G1X21.656Y18.260M62P1 +G1X21.721Y19.804 +G00X21.721Y19.804M63P1 +G00X24.434Y19.901M63P1 +G1X24.434Y19.901M62P1 +G2X24.288Y20.373I1.738J0.796 +G2X24.403Y21.161I1.268J0.218 +G2X25.914Y21.870I1.200J-0.592 +G2X26.938Y20.552I-0.312J-1.299 +G1X26.934Y20.479M62P1 +G1X26.913Y20.313 +G2X26.692Y19.043I-23.731J3.479 +G3X26.234Y16.694I168.388J-34.014 +G1X28.588Y18.064M62P1 +G00X28.588Y18.064M63P1 +G00X45.529Y30.532M63P1 +G1X45.529Y30.532M62P1 +G2X52.306Y32.524I1246.421J-4228.934 +G2X57.375Y34.003I692.553J-2363.694 +G2X56.947Y34.874I13.755J7.298 +G2X56.880Y35.094I0.801J0.363 +G3X54.513Y35.505I-79.750J-452.575 +G2X53.927Y35.637I0.980J5.738 +G2X53.776Y35.735I0.081J0.290 +G2X53.584Y35.989I2.608J2.160 +G3X53.771Y36.194I-2.433J2.401 +G2X53.974Y36.384I0.875J-0.734 +G1X64.244Y41.566M62P1 +G2X66.059Y42.433I31.629J-63.907 +G2X66.911Y42.588I0.727J-1.579 +G2X67.379Y42.509I-0.184J-2.534 +G2X68.012Y42.295I-1.289J-4.857 +G2X68.081Y42.256I-0.123J-0.297 +G3X68.158Y42.232I0.072J0.096 +G1X97.113Y57.360M62P1 +G2X97.301Y57.343I0.078J-0.192 +G3X97.482Y57.289I0.187J0.297 +G3X97.655Y57.328I0.007J0.372 +G2X98.328Y57.556I1.159J-2.314 +G2X98.965Y57.542I0.287J-1.502 +G2X100.539Y56.809I-0.978J-4.155 +G2X101.682Y54.510I-1.699J-2.278 +G2X100.506Y52.362I-2.585J0.019 +G3X100.158Y51.962I0.526J-0.809 +G2X99.790Y51.580I-0.745J0.349 +G1X99.044Y51.199M62P1 +G3X98.997Y51.036I0.170J-0.137 +G2X98.834Y50.767I-0.252J-0.031 +G1X98.825Y50.764M62P1 +G1X98.815Y50.761 +G1X91.578Y47.249 +G1X91.757Y46.945 +G3X91.941Y46.645I5.339J3.076 +G1X99.580Y35.901M62P1 +G1X100.113Y39.541 +G1X100.369Y41.266 +G1X97.290Y39.873 +G1X96.261Y41.438 +G1X95.234Y43.003 +G2X94.721Y43.810I29.361J19.221 +G2X94.622Y43.995I1.430J0.882 +G3X105.371Y50.313I-5698.440J9707.666 +G3X108.316Y52.054I-429.841J730.409 +G3X109.355Y50.736I19.078J13.966 +G3X110.902Y49.568I3.367J2.853 +G1X109.130Y45.300M62P1 +G3X108.571Y45.288I0.002J-13.233 +G3X108.310Y45.218I0.026J-0.618 +G1X103.815Y42.911M62P1 +G1X103.064Y37.475 +G1X107.447Y39.910 +G1X109.876Y45.801 +G2X111.100Y48.684I199.626J-83.077 +G2X111.700Y50.012I42.912J-18.592 +G2X110.669Y53.002I1.683J2.253 +G2X111.648Y55.119I6.751J-1.835 +G2X113.893Y57.578I9.877J-6.763 +G2X118.293Y60.619I19.696J-23.799 +G2X123.515Y63.110I19.679J-34.530 +G2X135.336Y66.322I20.864J-53.427 +G2X141.990Y66.854I6.702J-41.982 +G2X146.129Y66.335I0.019J-16.611 +G2X148.819Y65.131I-2.158J-8.426 +G2X149.586Y64.390I-1.689J-2.516 +G3X149.631Y64.337I0.343J0.248 +G2X149.664Y64.275I-0.082J-0.083 +G2X149.657Y64.167I-0.216J-0.040 +G3X149.528Y63.757I18.047J-5.881 +G2X147.830Y60.647I-8.233J2.478 +G2X146.277Y59.121I-9.569J8.180 +G2X142.979Y56.791I-17.061J20.661 +G2X134.226Y52.571I-27.721J46.307 +G2X128.342Y50.681I-22.521J59.994 +G2X121.007Y49.017I-24.640J91.649 +G1X118.735Y48.598M62P1 +G1X117.386Y46.059 +G2X116.925Y45.260I-14.515J7.832 +G2X116.752Y45.026I-1.402J0.861 +G3X116.173Y43.825I1.808J-1.611 +G3X116.203Y41.832I5.328J-0.915 +G3X116.761Y40.032I9.280J1.888 +G3X117.863Y37.908I14.062J5.947 +G3X118.862Y36.588I7.724J4.810 +G3X120.195Y35.590I3.284J2.993 +G2X120.214Y35.518I-0.022J-0.045 +G2X120.085Y35.423I-0.191J0.126 +G1X104.337Y29.005M62P1 +G2X101.797Y28.032I-32.777J81.742 +G2X100.412Y27.712I-1.982J5.422 +G2X99.216Y27.701I-0.653J6.280 +G2X98.475Y27.879I0.220J2.552 +G3X98.322Y27.906I-0.139J-0.343 +G3X97.361Y27.833I0.580J-14.031 +G3X95.234Y27.527I3.603J-32.651 +G3X93.363Y27.124I4.542J-25.640 +G2X92.430Y26.957I-1.646J6.479 +G2X91.665Y26.942I-0.464J4.324 +G2X91.460Y26.981I0.062J0.891 +G2X91.401Y27.025I0.033J0.107 +G1X91.272Y27.350M62P1 +G1X91.446Y28.021 +G3X91.404Y28.258I-0.664J0.006 +G2X91.299Y29.216I1.844J0.687 +G2X91.360Y29.473I1.361J-0.189 +G2X91.475Y29.729I1.455J-0.500 +G2X91.050Y30.397I8.846J6.099 +G2X90.951Y30.802I0.629J0.368 +G1X90.950Y30.826M62P1 +G2X90.955Y30.848I0.032J0.005 +G1X93.752Y32.314M62P1 +G3X95.272Y33.140I-66.215J123.808 +G1X96.788Y33.971M62P1 +G2X95.029Y36.287I50.562J40.220 +G1X88.201Y45.708M62P1 +G3X66.691Y35.913I8550.998J-18808.443 +G2X61.307Y33.480I-357.189J783.279 +G1X60.292Y33.033M62P1 +G2X60.254Y33.036I-0.010J0.117 +G2X60.133Y33.072I0.305J1.260 +G1X59.415Y33.403M62P1 +G3X59.301Y33.386I-0.017J-0.278 +G2X58.847Y33.297I-0.502J1.347 +G2X58.321Y33.349I-0.067J1.989 +G2X57.786Y33.548I0.536J2.265 +G1X48.757Y27.500M62P1 +G1X45.529Y30.532 +G00X45.529Y30.532M63P1 +G00X54.098Y20.976M63P1 +G1X54.098Y20.976M62P1 +G2X54.320Y22.090I1.310J0.318 +G2X56.163Y22.185I0.960J-0.702 +G2X56.493Y21.287I-0.952J-0.859 +G2X56.111Y20.461I-1.160J0.035 +G2X56.017Y20.388I-0.507J0.561 +G1X55.920Y20.321M62P1 +G2X56.379Y20.476I0.839J-1.733 +G2X57.154Y20.390I0.254J-1.261 +G2X57.938Y19.016I-0.540J-1.218 +G2X56.262Y17.848I-1.357J0.160 +G2X55.963Y17.973I0.235J0.979 +G2X55.598Y18.263I1.105J1.766 +G00X55.598Y18.263M63P1 +G00X51.467Y17.269M63P1 +G1X51.467Y17.269M62P1 +G2X51.585Y17.835I1.815J-0.082 +G2X52.230Y18.608I1.450J-0.555 +G2X54.583Y16.763I0.829J-1.366 +G2X51.598Y16.601I-1.523J0.479 +G2X51.493Y16.931I1.507J0.661 +G2X51.462Y17.266I1.524J0.313 +G1X51.485Y18.827M62P1 +G1X51.509Y20.389 +G00X51.509Y20.389M63P1 +G00X47.082Y11.763M63P1 +G1X47.082Y11.763M62P1 +G1X45.302Y16.541M62P1 +G1X49.344Y13.162 +G1X48.126Y18.288 +G1X51.606Y14.561 +G00X51.606Y14.561M63P1 +G00X108.816Y52.254M63P1 +G1X108.816Y52.254M62P1 +G3X109.429Y51.353I3.696J1.858 +G3X110.486Y50.388I5.309J4.752 +G2X110.154Y51.128I16.941J8.047 +G2X109.973Y51.975I2.108J0.892 +G2X110.773Y54.890I5.335J0.104 +G2X112.853Y57.506I12.181J-7.550 +G2X116.779Y60.578I14.897J-14.993 +G2X123.044Y63.694I21.600J-35.571 +G2X137.179Y67.296I21.074J-53.161 +G2X143.440Y67.420I3.733J-30.541 +G2X147.075Y66.695I-1.332J-16.160 +G2X149.274Y65.542I-2.230J-6.929 +G2X149.556Y65.313I-3.776J-4.924 +G1X149.833Y65.079M62P1 +G3X149.918Y66.248I-25.520J2.441 +G3X149.670Y67.421I-2.350J0.117 +G3X148.684Y68.458I-2.197J-1.103 +G3X147.078Y69.164I-4.310J-7.617 +G3X145.448Y69.576I-3.897J-11.995 +G3X143.054Y69.900I-4.686J-25.641 +G3X142.009Y69.986I-8.860J-100.393 +G3X141.764Y70.000I-0.428J-5.497 +G3X140.151Y69.989I-0.668J-20.137 +G3X135.996Y69.614I2.276J-48.437 +G3X128.793Y68.151I7.236J-54.082 +G3X119.281Y64.609I15.171J-55.285 +G3X113.568Y61.352I19.420J-40.709 +G3X110.418Y58.662I9.976J-14.866 +G3X108.499Y55.118I5.939J-5.509 +G3X108.816Y52.254I4.017J-1.005 +G00X108.816Y52.254M63P1 +G00X119.882Y53.603M63P1 +G1X119.882Y53.603M62P1 +G3X120.315Y53.118I0.967J0.427 +G3X121.513Y52.649I2.087J3.568 +G3X123.377Y52.339I3.935J17.877 +G3X128.276Y52.052I5.048J44.327 +G3X130.398Y52.153I0.070J20.929 +G3X131.853Y52.586I-0.393J3.983 +G3X132.461Y52.954I-2.509J4.823 +G3X134.803Y54.677I-35.226J50.343 +G3X139.791Y58.694I-97.462J126.131 +G3X140.505Y59.461I-2.741J3.267 +G3X140.801Y60.014I-1.895J1.372 +G3X140.630Y60.798I-0.693J0.259 +G3X139.949Y61.191I-1.086J-1.094 +G3X137.573Y61.523I-2.484J-9.107 +G3X136.905Y61.516I-0.167J-14.581 +G3X136.159Y61.475I0.627J-18.239 +G3X130.781Y60.515I2.035J-26.962 +G3X125.306Y58.381I8.580J-30.097 +G3X122.155Y56.516I12.001J-23.876 +G3X120.481Y55.059I5.571J-8.094 +G3X119.914Y54.276I3.098J-2.838 +G3X119.882Y53.603I0.657J-0.368 +G00X119.882Y53.603M63P1 +G00X116.901Y44.536M63P1 +G1X116.901Y44.536M62P1 +G3X116.643Y43.254I3.115J-1.294 +G3X116.856Y41.676I5.814J-0.020 +G3X118.487Y38.100I12.132J3.374 +G3X120.255Y36.129I7.574J5.014 +G3X120.810Y35.888I0.690J0.830 +G3X121.190Y35.925I0.108J0.860 +G3X121.954Y36.426I-0.554J1.678 +G3X122.148Y36.698I-1.135J1.013 +G3X122.273Y36.998I-1.257J0.701 +G2X122.381Y37.145I0.255J-0.074 +G3X122.963Y37.576I-3.842J5.799 +G3X123.696Y38.208I-13.350J16.201 +G3X123.895Y38.590I-0.415J0.459 +G3X123.901Y38.791I-1.053J0.132 +G3X123.853Y39.231I-5.131J-0.336 +G1X123.755Y39.822M62P1 +G2X123.808Y39.864I0.075J-0.039 +G3X124.057Y39.965I-0.291J1.073 +G3X124.546Y40.399I-0.728J1.313 +G3X124.721Y40.886I-0.761J0.549 +G1X124.691Y41.709M62P1 +G3X124.559Y42.241I-2.488J-0.337 +G3X123.868Y43.656I-7.373J-2.721 +G3X122.802Y45.037I-7.163J-4.433 +G3X121.772Y45.274I-0.695J-0.663 +G1X121.215Y45.003M62P1 +G2X121.108Y45.051I0.006J0.156 +G3X120.697Y45.277I-0.561J-0.534 +G3X120.594Y45.277I-0.052J-0.261 +G3X120.169Y45.173I0.926J-4.694 +G1X118.758Y44.702M62P1 +G2X118.667Y44.744I0.024J0.172 +G3X118.336Y44.966I-0.982J-1.111 +G3X117.884Y45.074I-0.471J-0.963 +G3X117.361Y44.983I-0.024J-1.402 +G3X116.901Y44.536I0.288J-0.757 +G00X116.901Y44.536M63P1 +G00X93.246Y38.028M63P1 +G1X93.246Y38.028M62P1 +G1X90.509Y41.679M62P1 +G1X83.618Y38.141 +G3X83.399Y38.323I-2.466J-2.727 +G3X83.259Y38.374I-0.147J-0.191 +G3X81.697Y38.093I-0.115J-3.853 +G3X80.447Y37.537I7.572J-18.691 +G3X77.924Y36.269I47.356J-97.340 +G3X76.545Y35.511I15.499J-29.853 +G1X75.942Y35.150M62P1 +G3X75.907Y35.071I0.145J-0.112 +G2X75.825Y34.740I-2.787J0.515 +G2X75.559Y34.112I-3.341J1.045 +G2X74.858Y33.473I-1.274J0.693 +G3X73.796Y32.977I7.530J-17.515 +G2X71.845Y32.012I-61.539J121.888 +G1X71.848Y31.865M62P1 +G1X73.124Y31.463 +G2X73.271Y31.332I-0.286J-0.471 +G3X73.402Y31.185I1.292J1.017 +G1X52.220Y23.471M62P1 +G2X50.074Y25.448I366.897J400.251 +G2X42.668Y32.321I4424.031J4774.434 +G3X43.305Y25.989I4481.152J447.293 +G1X43.943Y19.657M62P1 +G3X35.680Y15.788I2153.789J-4610.324 +G3X32.245Y14.167I374.766J-798.474 +G2X34.889Y13.988I-27.376J-425.352 +G2X44.334Y13.313I-383.394J-5429.970 +G2X41.502Y5.767I-2582.688J965.061 +G3X40.811Y3.875I91.554J-34.516 +G2X40.328Y2.569I-46.055J16.288 +G3X39.876Y1.253I17.311J-6.683 +G2X40.168Y1.515I3.609J-3.735 +G2X41.541Y2.635I67.991J-81.904 +G2X45.804Y6.032I493.654J-615.236 +G3X50.074Y9.418I-1468.170J1855.893 +G1X60.084Y2.168M62P1 +G1X57.220Y15.214 +G1X60.307Y18.057 +G3X67.062Y24.336I-1583.770J1710.541 +G2X73.809Y30.625I4771.573J-5112.781 +G3X74.289Y30.177I1.309J0.922 +G3X74.856Y29.990I0.686J1.133 +G2X75.362Y29.837I-0.117J-1.293 +G3X76.338Y29.748I0.590J1.079 +G3X76.794Y29.946I-0.867J2.626 +G2X77.236Y30.175I5.774J-10.593 +G2X85.239Y34.105I1438.599J-2919.446 +G3X93.246Y38.028I-4291.786J8770.125 +G00X93.246Y38.028M63P1 +G00X120.394Y53.771M63P1 +G1X120.394Y53.771M62P1 +G2X120.365Y53.965I0.134J0.119 +G2X121.013Y54.786I2.041J-0.945 +G2X122.540Y55.908I17.166J-21.757 +G2X127.169Y58.440I15.061J-22.033 +G2X132.671Y60.210I12.518J-29.477 +G2X135.862Y60.707I5.346J-23.809 +G2X138.954Y60.767I1.976J-22.289 +G2X140.089Y60.548I-0.205J-4.113 +G2X140.280Y60.310I-0.093J-0.271 +G2X140.207Y59.997I-0.472J-0.055 +G2X139.616Y59.282I-3.321J2.145 +G2X138.902Y58.649I-8.984J9.412 +G2X134.721Y55.306I-118.849J144.352 +G2X133.275Y54.207I-53.089J68.381 +G2X132.537Y53.682I-12.854J17.294 +G2X131.801Y53.202I-12.653J18.608 +G2X130.918Y52.826I-1.649J2.641 +G2X129.744Y52.649I-1.473J5.799 +G2X127.062Y52.633I-1.517J30.439 +G1X124.008Y52.833M62P1 +G2X121.545Y53.207I2.159J22.538 +G2X120.819Y53.451I0.662J3.175 +G2X120.394Y53.771I0.566J1.194 +G00X120.394Y53.771M63P1 +M63P1 +G00X0.000Y0.000 +M09 +M30 +% diff --git a/tests/test-files/Trispokedovetiles(laser).tap b/tests/test-files/Trispokedovetiles(laser).tap new file mode 100644 index 0000000..b9ca8d9 --- /dev/null +++ b/tests/test-files/Trispokedovetiles(laser).tap @@ -0,0 +1,64 @@ +(Laser cut, interlocking, Trispokedovetiles by Peter Dow) + +G90 (set absolute distance mode) +G90.1 (set absolute distance mode for arc centers) +G17 (set active plane to XY) +G21 (set units to mm) +F600 (set feed-rate) +M10 P1 (turns laser OFF) +G0 X 65.8393 Y 49.0906 +M11 P1 (turns laser ON) +G3 Y 61.7398 I 65.8393 J 55.4203 +G3 Y 49.0906 I 65.8393 J 55.4101 +M10 P1 +G0 X 93.3399 Y 36.7792 +M11 P1 +G3 Y 42.2783 I 93.3399 J 39.5300 +G3 Y 36.7792 I 93.3399 J 39.5300 +M10 P1 +G0 X 38.3388 +M11 P1 +G3 Y 42.2783 I 38.3388 J 39.5300 +G3 Y 36.7792 I 38.3388 J 39.5300 +M10 P1 +G0 X 65.8393 Y 84.4093 +M11 P1 +G3 Y 89.9084 I 65.8393 J 87.1601 +G3 Y 84.4093 I 65.8393 J 87.1601 +M10 P1 +G0 X 93.3399 Y 103.0402 +M11 P1 +G1 X 86.9010 +G3 X 82.5094 Y 98.3285 I 86.9010 J 98.6384 +G3 X 111.3409 Y 48.3895 I 148.3411 J 103.0402 +G3 X 117.6198 Y 49.8297 I 113.8098 J 52.0294 +G1 X 120.8405 Y 55.4101 +G1 X 127.2794 +G2 X 131.6711 Y 50.6984 I 127.2794 J 51.0108 +G2 X 102.8395 Y 0.7595 I 65.8393 J 55.4101 +G2 X 96.5606 Y 2.1996 I 100.3706 J 4.3993 +G1 X 93.3399 Y 7.7800 +G1 X 96.5606 Y 13.3604 +G3 X 94.6709 Y 19.5199 I 92.7506 J 15.5600 +G3 X 37.0103 I 65.8393 J-39.8501 +G3 X 35.1206 Y 13.3604 I 38.9306 J 15.5600 +G1 X 38.3388 Y 7.7800 +G1 X 35.1206 Y 2.1996 +G2 X 28.8392 Y 0.7595 I 31.3106 J 4.3993 +G2 X 0.0102 Y 50.6984 I 65.8393 J 55.4101 +G2 X 4.3993 Y 55.4101 I 4.3993 J 51.0108 +G1 X 10.8407 +G1 X 14.0589 Y 49.8297 +G3 X 20.3403 Y 48.3895 I 17.8689 J 52.0294 +G3 X 49.1693 Y 98.3285 I-16.6599 J 103.0402 +G3 X 44.7802 Y 103.0402 I 44.7802 J 98.6384 +G1 X 38.3388 +G1 X 35.1206 Y 108.6206 +G2 X 37.0103 Y 114.7801 I 38.9306 J 110.8202 +G2 X 94.6709 I 65.8393 J 55.4101 +G2 X 96.5606 Y 108.6206 I 92.7506 J 110.8202 +G1 X 93.3399 Y 103.0402 +M10 P1 +G0 X 0.0000 Y 0.0000 +M30 +% diff --git a/tests/test-files/Tweakie's CNC Cube.nc b/tests/test-files/Tweakie's CNC Cube.nc new file mode 100644 index 0000000..e123d26 --- /dev/null +++ b/tests/test-files/Tweakie's CNC Cube.nc @@ -0,0 +1,196 @@ +(Tweakie's CNC Cube) +(Tool 2mm dia.) +N1 T1 M3 M6 G21 F80 +N2 G0 Z2 +N3 G0 X12.751 Y23.165 +N4 G1 Z-2 +N5 G1 X14.122 Y21.819 +N6 G1 X14.122 Y21.819 +N7 G1 X13.411 Y21.514 +N8 G1 X12.751 Y21.133 +N9 G1 X12.167 Y20.676 +N10 G1 X11.963 Y20.472 +N11 G1 X11.963 Y20.472 +N12 G1 X11.125 Y19.406 +N13 G1 X10.617 Y18.237 +N14 G1 X10.389 Y16.916 +N15 G1 X10.389 Y16.459 +N16 G1 X10.592 Y15.088 +N17 G1 X11.049 Y13.868 +N18 G1 X11.836 Y12.751 +N19 G1 X12.141 Y12.421 +N20 G1 X12.141 Y12.421 +N21 G1 X13.233 Y11.557 +N22 G1 X14.427 Y10.973 +N23 G1 X15.723 Y10.693 +N24 G1 X16.205 Y10.643 +N25 G1 X17.551 Y10.744 +N26 G1 X18.771 Y11.176 +N27 G1 X19.888 Y11.938 +N28 G1 X20.244 Y12.243 +N29 G1 X20.244 Y12.243 +N30 G1 X20.752 Y12.852 +N31 G1 X21.158 Y13.462 +N32 G1 X21.438 Y14.173 +N33 G1 X21.488 Y14.402 +N34 G1 X22.809 Y13.106 +N35 G1 X22.809 Y13.106 +N36 G1 X22.504 Y12.446 +N37 G1 X22.098 Y11.811 +N38 G1 X21.615 Y11.227 +N39 G1 X21.438 Y11.024 +N40 G1 X21.438 Y11.024 +N41 G1 X20.041 Y9.906 +N42 G1 X18.466 Y9.195 +N43 G1 X16.789 Y8.915 +N44 G1 X16.18 Y8.915 +N45 G1 X14.427 Y9.195 +N46 G1 X12.802 Y9.804 +N47 G1 X11.328 Y10.846 +N48 G1 X10.897 Y11.278 +N49 G1 X10.897 Y11.278 +N50 G1 X10.16 Y12.141 +N51 G1 X9.576 Y13.056 +N52 G1 X9.119 Y14.122 +N53 G1 X8.992 Y14.503 +N54 G1 X8.788 Y15.646 +N55 G1 X8.687 Y16.789 +N56 G1 X8.788 Y17.907 +N57 G1 X8.89 Y18.288 +N58 G1 X9.22 Y19.38 +N59 G1 X9.779 Y20.396 +N60 G1 X10.516 Y21.387 +N61 G1 X10.82 Y21.692 +N62 G1 X11.024 Y21.869 +N63 G1 X11.024 Y21.869 +N64 G1 X11.506 Y22.327 +N65 G1 X12.04 Y22.733 +N66 G1 X12.573 Y23.063 +N67 G1 X12.751 Y23.165 +N68 G1 X12.751 Y23.165 +N69 G0 Z2 +N70 G0 X29.591 Y19.558 +N71 G1 Z-2 +N72 G1 X28.27 Y18.237 +N73 G1 X18.034 Y28.448 +N74 G1 X30.099 Y27.864 +N75 G1 X30.099 Y27.864 +N76 G1 X30.226 Y27.889 +N77 G1 X30.328 Y27.915 +N78 G1 X30.404 Y27.991 +N79 G1 X30.429 Y27.991 +N80 G1 X30.429 Y27.991 +N81 G1 X30.48 Y28.067 +N82 G1 X30.48 Y28.118 +N83 G1 X30.48 Y28.194 +N84 G1 X30.48 Y28.219 +N85 G1 X30.48 Y28.219 +N86 G1 X30.353 Y28.397 +N87 G1 X30.175 Y28.626 +N88 G1 X29.896 Y28.931 +N89 G1 X29.794 Y29.032 +N90 G1 X24.155 Y34.671 +N91 G1 X25.476 Y35.992 +N92 G1 X35.814 Y25.654 +N93 G1 X24.333 Y26.391 +N94 G1 X24.333 Y26.391 +N95 G1 X23.927 Y26.416 +N96 G1 X23.647 Y26.391 +N97 G1 X23.47 Y26.34 +N98 G1 X23.419 Y26.314 +N99 G1 X23.419 Y26.314 +N100 G1 X23.317 Y26.111 +N101 G1 X23.368 Y25.857 +N102 G1 X23.571 Y25.578 +N103 G1 X23.647 Y25.476 +N104 G1 X29.591 Y19.558 +N105 G0 Z2 +N106 G0 X37.77 Y48.184 +N107 G1 Z-2 +N108 G1 X39.141 Y46.838 +N109 G1 X39.141 Y46.838 +N110 G1 X38.43 Y46.533 +N111 G1 X37.77 Y46.152 +N112 G1 X37.186 Y45.669 +N113 G1 X36.982 Y45.491 +N114 G1 X36.982 Y45.491 +N115 G1 X36.144 Y44.425 +N116 G1 X35.611 Y43.231 +N117 G1 X35.408 Y41.935 +N118 G1 X35.408 Y41.478 +N119 G1 X35.611 Y40.107 +N120 G1 X36.068 Y38.887 +N121 G1 X36.83 Y37.77 +N122 G1 X37.16 Y37.44 +N123 G1 X37.16 Y37.44 +N124 G1 X38.252 Y36.576 +N125 G1 X39.446 Y35.992 +N126 G1 X40.742 Y35.712 +N127 G1 X41.199 Y35.662 +N128 G1 X42.57 Y35.763 +N129 G1 X43.79 Y36.195 +N130 G1 X44.907 Y36.932 +N131 G1 X45.263 Y37.262 +N132 G1 X45.263 Y37.262 +N133 G1 X45.771 Y37.846 +N134 G1 X46.177 Y38.481 +N135 G1 X46.457 Y39.167 +N136 G1 X46.507 Y39.421 +N137 G1 X47.803 Y38.125 +N138 G1 X47.803 Y38.125 +N139 G1 X47.498 Y37.44 +N140 G1 X47.092 Y36.83 +N141 G1 X46.634 Y36.22 +N142 G1 X46.457 Y36.043 +N143 G1 X46.457 Y36.043 +N144 G1 X45.06 Y34.925 +N145 G1 X43.485 Y34.214 +N146 G1 X41.808 Y33.934 +N147 G1 X41.199 Y33.934 +N148 G1 X39.446 Y34.188 +N149 G1 X37.821 Y34.823 +N150 G1 X36.347 Y35.865 +N151 G1 X35.916 Y36.297 +N152 G1 X35.916 Y36.297 +N153 G1 X35.179 Y37.135 +N154 G1 X34.595 Y38.075 +N155 G1 X34.138 Y39.141 +N156 G1 X34.011 Y39.522 +N157 G1 X33.782 Y40.665 +N158 G1 X33.706 Y41.808 +N159 G1 X33.807 Y42.926 +N160 G1 X33.884 Y43.307 +N161 G1 X34.239 Y44.399 +N162 G1 X34.798 Y45.415 +N163 G1 X35.535 Y46.38 +N164 G1 X35.814 Y46.685 +N165 G1 X36.017 Y46.888 +N166 G1 X36.017 Y46.888 +N167 G1 X36.525 Y47.346 +N168 G1 X37.033 Y47.752 +N169 G1 X37.592 Y48.082 +N170 G1 X37.77 Y48.184 +N171 G1 X37.77 Y48.184 +N172 G0 Z2 +N173 G0 X2.54 Y54.864 +N174 G1 Z-2 +N175 G1 X28.956 Y54.864 +N176 G1 X28.956 Y52.324 +N177 G1 X28.956 Y53.34 +N178 G1 X54.864 Y53.34 +N179 G1 X54.864 Y26.924 +N180 G1 X52.324 Y26.924 +N181 G1 X53.34 Y26.924 +N182 G1 X53.34 Y1.016 +N183 G1 X26.924 Y1.016 +N184 G1 X26.924 Y3.556 +N185 G1 X26.924 Y2.54 +N186 G1 X1.016 Y2.54 +N187 G1 X1.016 Y28.956 +N188 G1 X3.556 Y28.956 +N189 G1 X2.54 Y28.956 +N190 G1 X2.54 Y54.864 +N191 G0 Z2 +N192 G0 X0 Y0 +N193 M30 +N194 % diff --git a/tests/test-files/Tweakie's CNC Cube2.nc b/tests/test-files/Tweakie's CNC Cube2.nc new file mode 100644 index 0000000..052078d --- /dev/null +++ b/tests/test-files/Tweakie's CNC Cube2.nc @@ -0,0 +1,30 @@ +(Tweakie's CNC Cube 2) +(Tool = 2mm dia.) +N1 T1 M3 M6 G21 G91.1 F80 +N2 G0 Z2 +N3 G00 X45.932 Y27.932 +N4 G1 Z-2 +N5 G03 X45.932 Y27.932 I-18 J0 F400 +N6 G0 Z2 +N7 G0 X2.54 Y54.864 +N8 G1 Z-2 +N9 G1 X28.956 Y54.864 +N10 G1 X28.956 Y52.324 +N11 G1 X28.956 Y53.34 +N12 G1 X54.864 Y53.34 +N13 G1 X54.864 Y26.924 +N14 G1 X52.324 Y26.924 +N15 G1 X53.34 Y26.924 +N16 G1 X53.34 Y1.016 +N17 G1 X26.924 Y1.016 +N18 G1 X26.924 Y3.556 +N19 G1 X26.924 Y2.54 +N20 G1 X1.016 Y2.54 +N21 G1 X1.016 Y28.956 +N22 G1 X3.556 Y28.956 +N23 G1 X2.54 Y28.956 +N24 G1 X2.54 Y54.864 +N25 G0 Z2 +N26 G0 X0 Y0 +N27 M30 +N28 % diff --git a/tests/test-files/plug6a.tap b/tests/test-files/plug6a.tap new file mode 100644 index 0000000..a67edb2 --- /dev/null +++ b/tests/test-files/plug6a.tap @@ -0,0 +1,130 @@ +G00G21G17G90G40G49G80 +G71G91.1 + +S12000M03 +G94 M10P1 F600.0 +X0.000Y0.000 +G00X76.918Y-10.288M10P1 +G1X76.918Y-10.288M11P1 +G1X83.317Y-10.288 +G1X83.317Y-14.187 +G1X76.918Y-14.187 +G1X76.918Y-10.288 +G00X76.918Y-10.288M10P1 +G00X98.918Y-10.288 +G1X98.918Y-10.288M11P1 +G1X105.317Y-10.288 +G1X105.317Y-14.187 +G1X98.918Y-14.187 +G1X98.918Y-10.288 +G00X98.918Y-10.288M10P1 +G00X93.022Y5.812 +G1X93.022Y5.812M11P1 +G1X89.122Y5.812 +G1X89.122Y13.712 +G1X93.022Y13.712 +G1X93.022Y5.812 +G00X93.022Y5.812M10P1 +G00X-75.607Y-10.288 +G1X-75.607Y-10.288M11P1 +G1X-75.607Y-14.187 +G1X-82.006Y-14.187 +G1X-82.006Y-10.288 +G1X-75.607Y-10.288 +G00X-75.607Y-10.288M10P1 +G00X-97.607Y-10.288 +G1X-97.607Y-10.288M11P1 +G1X-97.607Y-14.187 +G1X-104.006Y-14.187 +G1X-104.006Y-10.288 +G1X-97.607Y-10.288 +G00X-97.607Y-10.288M10P1 +G00X-91.836Y5.812 +G1X-91.836Y5.812M11P1 +G1X-91.836Y13.712 +G1X-87.937Y13.712 +G1X-87.937Y5.812 +G1X-91.836Y5.812 +G00X-91.836Y5.812M10P1 + +G00X-15.556Y7.900 +G1X-15.556Y7.900M11P1 +G2X-36.650Y9.539I13.488J310.094 +G2X-49.156Y11.364I21.153J188.675 +G2X-59.846Y13.733I24.394J135.416 +G2X-66.307Y15.887I13.581J51.503 +G1X-69.715Y17.476 +G2X-72.492Y19.421I6.409J12.108 +G1X-73.368Y20.224 +G1X-73.972Y20.718 +G3X-76.569Y22.055I-5.802J-8.079 +G3X-79.360Y22.552I-3.021J-8.872 +G1X-79.361Y22.552 + +G1X-99.112Y22.555 +G3X-102.657Y21.875I0.233J-10.791 +G3X-107.639Y17.790I3.489J-9.335 +G3X-108.710Y15.360I8.094J-5.017 +G3X-109.131Y12.506I10.825J-3.055 +G1X-109.131Y12.505 + +G1X-109.131Y-12.496 +G3X-108.453Y-16.055I10.908J0.233 +G3X-104.382Y-21.048I9.343J3.463 +G3X-101.954Y-22.123I5.022J8.056 +G3X-99.111Y-22.545I3.043J10.709 +G1X-79.424Y-22.540 +G1X-79.388Y-22.535 +G1X-79.168Y-22.520 +G3X-75.571Y-21.598I-0.501J9.434 +G3X-73.102Y-19.977I-4.851J10.075 +G1X-72.307Y-19.259 +G1X-71.489Y-18.581 +G2X-68.981Y-17.071I10.154J-14.026 +G2X-63.518Y-14.835I18.951J-38.502 +G2X-55.994Y-12.757I24.388J-73.663 +G2X-40.945Y-10.070I39.192J-176.018 +G2X-22.523Y-8.256I34.302J-253.893 +G2X16.846Y-7.894I23.114J-372.188 +G2X35.881Y-9.294I-13.948J-319.663 +G2X50.651Y-11.397I-20.156J-194.491 +G2X61.189Y-13.743I-24.422J-134.524 +G2X67.555Y-15.868I-13.517J-51.105 +G1X70.871Y-17.420 +G2X73.696Y-19.397I-6.781J-12.701 +G1X74.410Y-20.057 +G1X75.162Y-20.684 +G3X77.822Y-22.036I5.562J7.648 +G3X80.964Y-22.555I3.308J10.258 + +G1X100.290Y-22.545 +G3X103.641Y-21.937I-0.239J10.842 +G3X108.492Y-18.272I-3.303J9.416 +G3X109.799Y-15.631I-7.810J5.509 +G3X110.309Y-12.496I-10.600J3.334 +G1X110.309Y-12.495 + +G1X110.309Y12.506 +G3X109.631Y16.065I-10.907J-0.233 +G3X105.560Y21.057I-9.343J-3.464 +G3X103.131Y22.134I-5.025J-8.060 +G3X100.290Y22.555I-3.037J-10.689 +G1X100.289Y22.555 + +G1X80.686Y22.540 +G3X77.158Y21.806I0.259J-10.091 +G3X74.187Y19.909I3.623J-8.951 +G1X73.261Y19.069 +G1X72.879Y18.756 +G2X69.069Y16.529I-11.097J14.613 +G2X64.340Y14.738I-21.639J50.004 +G2X54.729Y12.209I-26.464J81.059 +G2X39.610Y9.752I-40.016J198.475 +G2X21.814Y8.147I-32.998J266.303 +G2X-15.556Y7.900I-21.148J372.705 +G00X-15.556Y7.900M10P1 +M10P1 +G00X0.000Y0.000 +M09 +M30 +% diff --git a/tests/test-files/random-sample-1.gcode b/tests/test-files/random-sample-1.gcode new file mode 100644 index 0000000..f2d74df --- /dev/null +++ b/tests/test-files/random-sample-1.gcode @@ -0,0 +1,11 @@ +G17 G20 G90 G94 G54 +G0 Z0.25 +X-0.5 Y0. +Z0.1 +G01 Z0. F5. +G02 X0. Y0.5 I0.5 J0. F2.5 +X0.5 Y0. I0. J-0.5 +X0. Y-0.5 I-0.5 J0. +X-0.5 Y0. I0. J0.5 +G01 Z0.1 F5. +G00 X0. Y0. Z0.25 From c4565c35d3830c31a1d756cc611405261ec2efd9 Mon Sep 17 00:00:00 2001 From: Peter Boin Date: Tue, 22 Aug 2017 13:34:46 +1000 Subject: [PATCH 05/14] added files with unsupported gcodes --- .../unsupported/Chucks Deer (V-Carve) {3}.tap | 492 ++++++++++++++++++ .../unsupported/Circular Pocket.tap | 43 ++ tests/test-files/unsupported/Colt.tap | 437 ++++++++++++++++ tests/test-files/unsupported/Cross2.tap | 141 +++++ tests/test-files/unsupported/DB25.tap | 95 ++++ tests/test-files/unsupported/Disc3.tap | 121 +++++ tests/test-files/unsupported/Horse.tap | 354 +++++++++++++ tests/test-files/unsupported/Horse2.tap | 157 ++++++ tests/test-files/unsupported/Mach3 write.tap | 75 +++ tests/test-files/unsupported/Mach4 write.tap | 68 +++ tests/test-files/unsupported/Skull2.tap | 397 ++++++++++++++ tests/test-files/unsupported/Snow White.tap | 170 ++++++ tests/test-files/unsupported/Star Trek.tap | 411 +++++++++++++++ .../unsupported/Trispokedovetiles(laser).tap | 64 +++ tests/test-files/unsupported/plug6a.tap | 130 +++++ 15 files changed, 3155 insertions(+) create mode 100644 tests/test-files/unsupported/Chucks Deer (V-Carve) {3}.tap create mode 100644 tests/test-files/unsupported/Circular Pocket.tap create mode 100644 tests/test-files/unsupported/Colt.tap create mode 100644 tests/test-files/unsupported/Cross2.tap create mode 100644 tests/test-files/unsupported/DB25.tap create mode 100644 tests/test-files/unsupported/Disc3.tap create mode 100644 tests/test-files/unsupported/Horse.tap create mode 100644 tests/test-files/unsupported/Horse2.tap create mode 100644 tests/test-files/unsupported/Mach3 write.tap create mode 100644 tests/test-files/unsupported/Mach4 write.tap create mode 100644 tests/test-files/unsupported/Skull2.tap create mode 100644 tests/test-files/unsupported/Snow White.tap create mode 100644 tests/test-files/unsupported/Star Trek.tap create mode 100644 tests/test-files/unsupported/Trispokedovetiles(laser).tap create mode 100644 tests/test-files/unsupported/plug6a.tap diff --git a/tests/test-files/unsupported/Chucks Deer (V-Carve) {3}.tap b/tests/test-files/unsupported/Chucks Deer (V-Carve) {3}.tap new file mode 100644 index 0000000..124d4ec --- /dev/null +++ b/tests/test-files/unsupported/Chucks Deer (V-Carve) {3}.tap @@ -0,0 +1,492 @@ +( CHUCKS DEER{3} 7 X 5 ) +N100G00G20G17G90G40G49G80 +N110G70G91.1 +N120T1M06 +N130(TOOL: V-BIT {90 DEG 0.5"}) +N140G00G43Z0.8H1 +N150G94S16000M03 +N190X0Y0F25 +N200G00X1.6219Y-1.847Z0.2 +N210G1X1.6219Y-1.847Z-0.0744F8 +N220G1X1.7075Y-1.9046Z-0.0558F25 +N230G1X1.8135Y-1.9567Z0 +N240G1X1.7056Y-1.9046Z-0.0558 +N250G1X1.6015Y-1.8302Z-0.0725 +N260G1X1.4936Y-1.7317Z-0.0428 +N270G1X1.3783Y-1.6814Z0 +N280G1X1.5066Y-1.741Z-0.0484 +N290G1X1.6219Y-1.847Z-0.0744 +N300G00Z0.2 +N310G00X-.0167Y-.7012Z0.2 +N320G1X-.0167Y-.7012Z-0.0558F8 +N330G1X-.1525Y-.6454Z-0.0502F25 +N340G1X-.1767Y-.6212Z-0.0298 +N350G1X-.1321Y-.6566Z-0.0539 +N360G1X.0837Y-.7477Z-0.0521 +N370G1X.2697Y-.8649Z-0.0484 +N380G1X.2716Y-.8649Z-0.0465 +N390G1X.2697Y-.8649Z-0.0484 +N400G1X.0763Y-.7459Z-0.0521 +N410G1X-.0167Y-.7012Z-0.0558 +N420G00Z0.2 +N430G00X-.186Y-.9914Z0.2 +N440G1X-.186Y-.9914Z-0.0986F8 +N450G1X-.1079Y-.9244Z-0.0502F25 +N460G1X-.0242Y-.904Z-0.0353 +N470G1X.0595Y-.93Z-0.0465 +N480G1X.1153Y-.9988Z-0.0725 +N490G1X.1265Y-1.0546Z-0.0893 +N500G1X.0837Y-1.1011Z-0.0744 +N510G1X0Y-1.1216Z-0.0651 +N520G1X-.0949Y-1.103Z-0.0651 +N530G1X-.1655Y-1.0379Z-0.0837 +N540G1X-.186Y-.9914Z-0.0986 +N550G00Z0.2 +N560G1X-.186Y-.9914Z-0.0986F8 +N570G1X-.3125Y-.9579Z-0.0186F25 +N580G1X-.186Y-.9914Z-0.0986 +N590G1X-.1358Y-1.0751Z-0.0707 +N600G1X-.0558Y-1.1179Z-0.0632 +N610G1X.0484Y-1.116Z-0.0688 +N620G1X.119Y-1.0714Z-0.0874 +N630G1X.1246Y-1.023Z-0.0818 +N640G1X.0763Y-.943Z-0.0521 +N650G1X.0019Y-.9077Z-0.0372 +N660G1X-.0874Y-.9151Z-0.0446 +N670G1X-.1693Y-.9709Z-0.0856 +N680G1X-.186Y-.9914Z-0.0986 +N690G00Z0.2 +N700G00X-.452Y-.2046Z0.2 +N710G1X-.452Y-.2046Z-0.2176F8 +N720G1X-.6417Y0Z-0.0502F25 +N730G1X-.452Y-.2046Z-0.2176 +N740G1X-.5264Y-.3776Z-0.0967 +N750G1X-.452Y-.2046Z-0.2176 +N760G1X-.2362Y-.2195Z-0.1414 +N770G1X-.0874Y-.2846Z-0.0744 +N780G1X-.0391Y-.3199Z-0.0502 +N790G1X-.1804Y-.2381Z-0.1172 +N800G1X-.3553Y-.2046Z-0.1841 +N810G1X-.452Y-.2046Z-0.2176 +N820G00Z0.2 +N830G00X-1.0732Y-.0967Z0.2 +N840G1X-1.0732Y-.0967Z-0.1525F8 +N850G1X-1.0435Y.0056Z-0.1339F25 +N860G1X-.9914Y.0893Z-0.0911 +N870G1X-1.0546Y-.0205Z-0.1414 +N880G1X-1.0751Y-.1209Z-0.1525 +N890G1X-1.0528Y-.7254Z-0.0818 +N900G1X-1.0583Y-.9802Z-0.026 +N910G1X-1.0676Y-.9877Z-0.0167 +N920G1X-1.0546Y-.9635Z-0.0353 +N930G1X-1.0528Y-.7254Z-0.0818 +N940G1X-1.0732Y-.0967Z-0.1525 +N950G00Z0.2 +N960G00X-1.7763Y-1.5252Z0.2 +N970G1X-1.7763Y-1.5252Z-0.0911F8 +N980G1X-1.7726Y-1.8767Z-0.0632F25 +N990G1X-1.78Y-2.0683Z-0.0595 +N1000G1X-1.8154Y-2.3101Z-0.0707 +N1010G1X-1.8767Y-2.4868Z-0.0725 +N1020G1X-1.9735Y-2.6486Z-0.0595 +N1030G1X-2.0869Y-2.7826Z-0.0316 +N1040G1X-2.0962Y-2.8012Z-0.0223 +N1050G1X-2.0665Y-2.7547Z-0.0409 +N1060G1X-1.9456Y-2.6096Z-0.0632 +N1070G1X-1.8544Y-2.4385Z-0.0725 +N1080G1X-1.8023Y-2.2506Z-0.067 +N1090G1X-1.78Y-2.059Z-0.0595 +N1100G1X-1.7726Y-1.8674Z-0.0651 +N1110G1X-1.7763Y-1.5252Z-0.0911 +N1120G1X-1.7224Y-1.2295Z-0.0707 +N1130G1X-1.6275Y-.9895Z-0.0688 +N1140G1X-1.5568Y-.8742Z-0.0707 +N1150G1X-1.4954Y-.8091Z-0.0279 +N1160G1X-1.4806Y-.7961Z-0.013 +N1170G1X-1.5457Y-.863Z-0.0688 +N1180G1X-1.5884Y-.9151Z-0.0744 +N1190G1X-1.6814Y-1.1123Z-0.067 +N1200G1X-1.7521Y-1.3671Z-0.08 +N1210G1X-1.7763Y-1.5252Z-0.0911 +N1220G00Z0.2 +N1230G00X-1.421Y.6752Z0.2 +N1240G1X-1.421Y.6752Z-0.1637F8 +N1250G1X-1.4768Y.7961Z-0.1451F25 +N1260G1X-1.5587Y1.0249Z-0.1097 +N1270G1X-1.5922Y1.0565Z-0.0893 +N1280G1X-1.555Y1.0156Z-0.1116 +N1290G1X-1.4768Y.7961Z-0.1451 +N1300G1X-1.421Y.6752Z-0.1637 +N1310G1X-1.3373Y.5822Z-0.1469 +N1320G1X-1.2462Y.5152Z-0.1004 +N1330G1X-1.2369Y.5022Z-0.0856 +N1340G1X-1.2778Y.5394Z-0.1209 +N1350G1X-1.3838Y.6268Z-0.16 +N1360G1X-1.421Y.6752Z-0.1637 +N1370G00Z0.2 +N1380G00X-2.3938Y1.4545Z0.2 +N1390G1X-2.3938Y1.4545Z-0.1637F8 +N1400G1X-2.4236Y1.8619Z-0.1562F25 +N1410G1X-2.4013Y2.2339Z-0.1525 +N1420G1X-2.325Y2.5947Z-0.1451 +N1430G1X-2.1985Y2.9462Z-0.1376 +N1440G1X-1.9865Y3.3387Z-0.1246 +N1450G1X-1.9065Y3.5117Z-0.0911 +N1460G1X-1.873Y3.6084Z-0.0651 +N1470G1X-1.9437Y3.4224Z-0.1116 +N1480G1X-2.0497Y3.2308Z-0.1321 +N1490G1X-2.206Y2.9295Z-0.1395 +N1500G1X-2.325Y2.5947Z-0.1451 +N1510G1X-2.4013Y2.232Z-0.1525 +N1520G1X-2.4217Y1.78Z-0.1618 +N1530G1X-2.392Y1.4248Z-0.1618 +N1540G1X-2.4199Y1.196Z-0.0911 +N1550G1X-2.4329Y1.0193Z-0.0409 +N1560G1X-2.4366Y.9505Z-0.0223 +N1570G1X-2.4422Y.9449Z-0.0149 +N1580G1X-2.431Y.9691Z-0.0316 +N1590G1X-2.4273Y1.1439Z-0.0725 +N1600G1X-2.3938Y1.395Z-0.1581 +N1610G1X-2.3938Y1.4545Z-0.1637 +N1620G00Z0.2 +N1630G00X-.9319Y.4464Z0.2 +N1640G1X-.9319Y.4464Z-0.0967F8 +N1650G1X-.8482Y.4148Z-0.0893F25 +N1660G1X-.7868Y.3385Z-0.0688 +N1670G1X-.7477Y.2102Z-0.0539 +N1680G1X-.7273Y-.1321Z-0.0632 +N1690G1X-.757Y-.465Z-0.0632 +N1700G1X-.837Y-.718Z-0.0539 +N1710G1X-.9337Y-.9728Z-0.0632 +N1720G1X-.9598Y-1.0993Z-0.0428 +N1730G1X-.9598Y-1.0993Z-0.0446 +N1740G1X-.9337Y-.9728Z-0.0632 +N1750G1X-.8351Y-.7124Z-0.0539 +N1760G1X-.757Y-.465Z-0.0632 +N1770G1X-.7273Y-.1004Z-0.0614 +N1780G1X-.7533Y.2381Z-0.0521 +N1790G1X-.7998Y.3627Z-0.0744 +N1800G1X-.8723Y.4297Z-0.093 +N1810G1X-.9579Y.4483Z-0.0949 +N1820G1X-1.0379Y.4259Z-0.0856 +N1830G1X-1.1327Y.3367Z-0.0614 +N1840G1X-1.2257Y.199Z-0.0521 +N1850G1X-1.315Y.0298Z-0.0465 +N1860G1X-1.3913Y-.1804Z-0.0446 +N1870G1X-1.4303Y-.4036Z-0.0465 +N1880G1X-1.4322Y-.5673Z-0.0539 +N1890G1X-1.4043Y-.7607Z-0.0632 +N1900G1X-1.3466Y-.943Z-0.0744 +N1910G1X-1.2797Y-1.0807Z-0.0763 +N1920G1X-1.2183Y-1.222Z-0.0446 +N1930G1X-1.2109Y-1.2667Z-0.0205 +N1940G1X-1.2257Y-1.2016Z-0.0521 +N1950G1X-1.3001Y-1.0453Z-0.0781 +N1960G1X-1.3708Y-.8723Z-0.067 +N1970G1X-1.4117Y-.718Z-0.0595 +N1980G1X-1.4322Y-.558Z-0.0521 +N1990G1X-1.4266Y-.372Z-0.0484 +N2000G1X-1.3913Y-.1804Z-0.0446 +N2010G1X-1.3001Y.0595Z-0.0465 +N2020G1X-1.2071Y.2288Z-0.0558 +N2030G1X-1.0862Y.3887Z-0.0725 +N2040G1X-.9988Y.4427Z-0.093 +N2050G1X-.9319Y.4464Z-0.0967 +N2060G00Z0.2 +N2070G00X.4892Y1.2443Z0.2 +N2080G1X.4892Y1.2443Z-0.2809F8 +N2090G1X.6919Y1.2834Z-0.2102F25 +N2100G1X.904Y1.3448Z-0.173 +N2110G1X1.1606Y1.4434Z-0.1767 +N2120G1X1.3969Y1.5661Z-0.2251 +N2130G1X1.5178Y1.6442Z-0.266 +N2140G1X1.6982Y1.607Z-0.1804 +N2150G1X1.8488Y1.6126Z-0.1414 +N2160G1X2.0776Y1.6721Z-0.1321 +N2170G1X2.2339Y1.7484Z-0.1358 +N2180G1X2.3641Y1.8674Z-0.1339 +N2190G1X2.4589Y2.0181Z-0.1228 +N2200G1X2.5054Y2.1855Z-0.1097 +N2210G1X2.5073Y2.3622Z-0.0967 +N2220G1X2.4719Y2.5556Z-0.0856 +N2230G1X2.4515Y2.671Z-0.0651 +N2240G1X2.4515Y2.671Z-0.0632 +N2250G1X2.4515Y2.671Z-0.0651 +N2260G1X2.4831Y2.5073Z-0.0911 +N2270G1X2.5091Y2.3473Z-0.0986 +N2280G1X2.4998Y2.1557Z-0.1116 +N2290G1X2.444Y1.9883Z-0.1246 +N2300G1X2.3641Y1.8674Z-0.1339 +N2310G1X2.2339Y1.7484Z-0.1358 +N2320G1X2.0776Y1.6721Z-0.1321 +N2330G1X1.8488Y1.6126Z-0.1414 +N2340G1X1.6982Y1.607Z-0.1804 +N2350G1X1.5178Y1.6442Z-0.266 +N2360G1X1.5271Y1.8377Z-0.1693 +N2370G1X1.5661Y2.0925Z-0.119 +N2380G1X1.5996Y2.5147Z-0.0911 +N2390G1X1.5996Y2.9704Z-0.0893 +N2400G1X1.5736Y3.1099Z-0.0763 +N2410G1X1.5736Y3.1118Z-0.0763 +N2420G1X1.5736Y3.1099Z-0.0781 +N2430G1X1.5736Y3.1099Z-0.0763 +N2440G1X1.6033Y2.9109Z-0.0893 +N2450G1X1.5977Y2.5036Z-0.093 +N2460G1X1.5661Y2.0925Z-0.119 +N2470G1X1.5289Y1.8544Z-0.1618 +N2480G1X1.5178Y1.6591Z-0.2567 +N2490G1X1.5178Y1.6442Z-0.266 +N2500G1X1.2667Y1.4936Z-0.1953 +N2510G1X1.0323Y1.3894Z-0.1693 +N2520G1X.8816Y1.3373Z-0.1748 +N2530G1X.664Y1.276Z-0.2176 +N2540G1X.4892Y1.2443Z-0.2809 +N2550G1X.4092Y1.3745Z-0.2027 +N2560G1X.3515Y1.501Z-0.1804 +N2570G1X.3218Y1.6759Z-0.1804 +N2580G1X.4576Y1.9381Z0 +N2590G1X.3218Y1.6759Z-0.1804 +N2600G1X.3069Y1.6833Z-0.1674 +N2610G1X.3218Y1.6759Z-0.1804 +N2620G1X.3571Y1.4861Z-0.1804 +N2630G1X.4166Y1.3615Z-0.2083 +N2640G1X.4892Y1.2443Z-0.2809 +N2650G1X.372Y1.0825Z-0.2102 +N2660G1X.2418Y.9319Z-0.1934 +N2670G1X.0986Y.7645Z-0.2288 +N2680G1X.0818Y.7477Z-0.2362 +N2690G1X-.0521Y.8147Z-0.1414 +N2700G1X-.1451Y.8872Z-0.1135 +N2710G1X-.2753Y1.0918Z-0.1209 +N2720G1X-.3441Y1.2313Z-0.1153 +N2730G1X-.4445Y1.488Z-0.0986 +N2740G1X-.3832Y1.5903Z0 +N2750G1X-.4445Y1.488Z-0.0986 +N2760G1X-.5785Y1.581Z0 +N2770G1X-.4445Y1.488Z-0.0986 +N2780G1X-.3181Y1.1755Z-0.1153 +N2790G1X-.1972Y.9579Z-0.1172 +N2800G1X-.1172Y.8593Z-0.119 +N2810G1X-.013Y.7942Z-0.1637 +N2820G1X.0818Y.7477Z-0.2362 +N2830G1X.0651Y.5003Z-0.1897 +N2840G1X.0744Y.2995Z-0.1823 +N2850G1X.119Y.1432Z-0.2176 +N2860G1X-.0112Y.0558Z-0.1135 +N2870G1X-.0911Y.0112Z-0.0725 +N2880G1X-.1097Y-.0056Z-0.0725 +N2890G1X-.0521Y.0353Z-0.0874 +N2900G1X.0874Y.1172Z-0.1897 +N2910G1X.119Y.1432Z-0.2176 +N2920G1X.2585Y.1135Z-0.1562 +N2930G1X.3925Y.1358Z-0.1023 +N2940G1X.5022Y.2046Z-0.0688 +N2950G1X.6603Y.3497Z-0.0409 +N2960G1X.8072Y.5041Z-0.0298 +N2970G1X.9505Y.664Z-0.0353 +N2980G1X1.1011Y.85Z-0.0614 +N2990G1X1.1699Y.8649Z-0.0688 +N3000G1X1.2332Y.8296Z-0.0614 +N3010G1X1.2667Y.744Z-0.0558 +N3020G1X1.2815Y.5561Z-0.0707 +N3030G1X1.2555Y.3367Z-0.0781 +N3040G1X1.2109Y.1841Z-0.0744 +N3050G1X1.116Y-.013Z-0.0688 +N3060G1X.9133Y-.3274Z-0.0316 +N3070G1X.904Y-.4222Z-0.0391 +N3080G1X.9281Y-.558Z-0.0391 +N3090G1X.9635Y-.6659Z-0.0353 +N3100G1X.9579Y-.7328Z-0.0632 +N3110G1X.9095Y-.7087Z-0.0372 +N3120G1X.7626Y-.5729Z0 +N3130G1X.9095Y-.7087Z-0.0372 +N3140G1X.9579Y-.7347Z-0.0632 +N3150G1X1.0769Y-.9114Z-0.0521 +N3160G1X1.1997Y-1.0304Z-0.0446 +N3170G1X1.4024Y-1.1644Z-0.0484 +N3180G1X1.5624Y-1.2574Z-0.0558 +N3190G1X1.7875Y-1.4192Z-0.0484 +N3200G1X1.8898Y-1.5289Z-0.0539 +N3210G1X2.0665Y-1.7893Z-0.0707 +N3220G1X2.1204Y-1.9251Z-0.0707 +N3230G1X2.126Y-2.0702Z-0.0614 +N3240G1X2.0869Y-2.1948Z-0.0335 +N3250G1X2.0627Y-2.2469Z-0.0167 +N3260G1X1.9567Y-2.2897Z-0.0632 +N3270G1X1.886Y-2.2618Z-0.0409 +N3280G1X1.7298Y-2.2227Z-0.0409 +N3290G1X1.4992Y-2.1427Z-0.0577 +N3300G1X1.3299Y-2.113Z-0.0577 +N3310G1X1.0751Y-2.1185Z-0.026 +N3320G1X.997Y-2.1092Z0 +N3330G1X1.1272Y-2.1185Z-0.0353 +N3340G1X1.3299Y-2.113Z-0.0577 +N3350G1X1.4992Y-2.1427Z-0.0577 +N3360G1X1.8098Y-2.245Z-0.0428 +N3370G1X1.9046Y-2.2636Z-0.0409 +N3380G1X1.9567Y-2.2897Z-0.0632 +N3390G1X1.9307Y-2.338Z-0.0484 +N3400G1X1.7986Y-2.4087Z-0.0725 +N3410G1X1.6889Y-2.4236Z-0.0725 +N3420G1X1.5215Y-2.405Z-0.0539 +N3430G1X1.2871Y-2.3473Z-0.0409 +N3440G1X1.1792Y-2.3529Z-0.0595 +N3450G1X.9653Y-2.3845Z-0.0949 +N3460G1X.7793Y-2.3752Z-0.08 +N3470G1X.4185Y-2.3008Z-0.0353 +N3480G1X.3348Y-2.3269Z-0.0577 +N3490G1X.3162Y-2.3362Z-0.067 +N3500G1X.2437Y-2.3194Z-0.0446 +N3510G1X-.0428Y-2.3789Z-0.0446 +N3520G1X-.2213Y-2.3901Z-0.0465 +N3530G1X-.3013Y-2.392Z0 +N3540G1X-.2083Y-2.3901Z-0.0502 +N3550G1X.0242Y-2.3678Z-0.0484 +N3560G1X.2511Y-2.3194Z-0.0446 +N3570G1X.3162Y-2.3362Z-0.067 +N3580G1X.3199Y-2.418Z-0.0539 +N3590G1X.359Y-2.6803Z-0.0595 +N3600G1X.3608Y-2.8495Z-0.0725 +N3610G1X.3329Y-3.1806Z-0.1283 +N3620G1X.3274Y-3.2978Z-0.1432 +N3630G1X.346Y-3.4057Z-0.1339 +N3640G1X.3925Y-3.5433Z-0.0818 +N3650G1X.3999Y-3.5824Z-0.0595 +N3660G1X.3571Y-3.441Z-0.1246 +N3670G1X.3311Y-3.3331Z-0.1432 +N3680G1X.3274Y-3.2252Z-0.1358 +N3690G1X.3534Y-3.0095Z-0.093 +N3700G1X.3608Y-2.7733Z-0.067 +N3710G1X.3385Y-2.5073Z-0.0521 +N3720G1X.3143Y-2.3585Z-0.0595 +N3730G1X.3162Y-2.3362Z-0.067 +N3740G1X.4036Y-2.3008Z-0.0372 +N3750G1X.4594Y-2.3045Z-0.0372 +N3760G1X.8444Y-2.3827Z-0.0893 +N3770G1X1.0249Y-2.3771Z-0.0893 +N3780G1X1.2518Y-2.3455Z-0.0465 +N3790G1X1.382Y-2.3678Z-0.0428 +N3800G1X1.5364Y-2.4087Z-0.0577 +N3810G1X1.7224Y-2.4217Z-0.0763 +N3820G1X1.8191Y-2.4013Z-0.0725 +N3830G1X1.9307Y-2.338Z-0.0484 +N3840G1X1.9567Y-2.2897Z-0.0632 +N3850G1X2.0627Y-2.2469Z-0.0167 +N3860G1X2.1148Y-2.1204Z-0.0539 +N3870G1X2.1297Y-1.9883Z-0.0688 +N3880G1X2.0944Y-1.8451Z-0.0707 +N3890G1X1.9623Y-1.6256Z-0.0651 +N3900G1X1.8377Y-1.4675Z-0.0502 +N3910G1X1.7131Y-1.3578Z-0.0521 +N3920G1X1.5624Y-1.2574Z-0.0558 +N3930G1X1.2388Y-1.0602Z-0.0446 +N3940G1X1.1011Y-.9374Z-0.0502 +N3950G1X.9579Y-.7328Z-0.0632 +N3960G1X.9635Y-.6659Z-0.0353 +N3970G1X.9077Y-.4687Z-0.0409 +N3980G1X.9095Y-.3348Z-0.0298 +N3990G1X1.1365Y.0223Z-0.0707 +N4000G1X1.222Y.2158Z-0.0763 +N4010G1X1.2629Y.3776Z-0.0744 +N4020G1X1.2815Y.5803Z-0.0707 +N4030G1X1.2574Y.7812Z-0.0539 +N4040G1X1.2164Y.8444Z-0.0651 +N4050G1X1.1569Y.8668Z-0.067 +N4060G1X1.0937Y.8444Z-0.0595 +N4070G1X.9467Y.6603Z-0.0353 +N4080G1X.7868Y.4817Z-0.0298 +N4090G1X.6566Y.346Z-0.0428 +N4100G1X.4557Y.1693Z-0.08 +N4110G1X.3329Y.119Z-0.1246 +N4120G1X.2027Y.119Z-0.1786 +N4130G1X.119Y.1432Z-0.2176 +N4140G1X.0744Y.2995Z-0.1823 +N4150G1X.0651Y.5003Z-0.1897 +N4160G1X.0818Y.7477Z-0.2362 +N4170G1X.2288Y.917Z-0.1953 +N4180G1X.3534Y1.0602Z-0.2046 +N4190G1X.4687Y1.2127Z-0.2641 +N4200G1X.4892Y1.2443Z-0.2809 +N4210G00X.4892Y1.2443Z0.2 +N4220G00X.1451Y2.5147Z0.2 +N4230G1X.1451Y2.5147Z-0.1544F8 +N4240G1X.0316Y2.3064Z0F25 +N4250G1X.1451Y2.5147Z-0.1544 +N4260G1X.3329Y2.4217Z0 +N4270G1X.1451Y2.5147Z-0.1544 +N4280G1X.0763Y2.7156Z-0.1395 +N4290G1X-.1042Y3.0913Z-0.1023 +N4300G1X-.2399Y3.361Z-0.0949 +N4310G1X-.2418Y3.4094Z-0.0725 +N4320G1X-.2306Y3.3331Z-0.1004 +N4330G1X-.0986Y3.082Z-0.1023 +N4340G1X.0763Y2.7156Z-0.1395 +N4350G1X.1451Y2.5147Z-0.1544 +N4360G00Z0.2 +N4370G00X-1.0137Y1.9065Z0.2 +N4380G1X-1.0137Y1.9065Z-0.3255F8 +N4390G1X-.7924Y1.8749Z-0.2288F25 +N4400G1X-.6026Y1.8712Z-0.1786 +N4410G1X-.3832Y1.9065Z-0.1581 +N4420G1X-.1283Y1.9865Z-0.1748 +N4430G1X.212Y2.1185Z-0.173 +N4440G1X.5524Y2.2636Z-0.1395 +N4450G1X.8928Y2.4273Z-0.0725 +N4460G1X.4724Y2.232Z-0.1488 +N4470G1X.212Y2.1185Z-0.173 +N4480G1X-.1283Y1.9865Z-0.1748 +N4490G1X-.4408Y1.8916Z-0.16 +N4500G1X-.6305Y1.8693Z-0.1841 +N4510G1X-.8314Y1.8786Z-0.2418 +N4520G1X-1.0137Y1.9065Z-0.3255 +N4530G1X-1.0546Y2.0851Z-0.2381 +N4540G1X-1.0862Y2.2673Z-0.1879 +N4550G1X-1.0862Y2.4738Z-0.1618 +N4560G1X-1.0304Y2.7156Z-0.1562 +N4570G1X-.9393Y2.9295Z-0.1562 +N4580G1X-.7849Y3.1639Z-0.1562 +N4590G1X-.7105Y3.335Z-0.1172 +N4600G1X-.677Y3.4745Z-0.0614 +N4610G1X-.7328Y3.2736Z-0.1339 +N4620G1X-.8147Y3.1155Z-0.16 +N4630G1X-.9412Y2.9258Z-0.1562 +N4640G1X-1.0304Y2.7156Z-0.1562 +N4650G1X-1.09Y2.4459Z-0.1655 +N4660G1X-1.0825Y2.2394Z-0.1934 +N4670G1X-1.0453Y2.0423Z-0.2567 +N4680G1X-1.0137Y1.9065Z-0.3255 +N4690G1X-1.1904Y1.7521Z-0.2455 +N4700G1X-1.3671Y1.6294Z-0.2102 +N4710G1X-1.6573Y1.4787Z-0.2176 +N4720G1X-1.8916Y1.3113Z-0.2158 +N4730G1X-2.0181Y1.1885Z-0.2009 +N4740G1X-2.113Y1.036Z-0.2009 +N4750G1X-2.1576Y.8891Z-0.2139 +N4760G1X-2.1539Y.7626Z-0.2195 +N4770G1X-2.0962Y.6194Z-0.2139 +N4780G1X-1.9995Y.5134Z-0.199 +N4790G1X-1.8284Y.3999Z-0.199 +N4800G1X-1.5996Y.2976Z-0.2009 +N4810G1X-1.5047Y.2623Z-0.1953 +N4820G1X-1.4024Y.0298Z0 +N4830G1X-1.5047Y.2623Z-0.1953 +N4840G1X-1.2369Y.3553Z0 +N4850G1X-1.5047Y.2623Z-0.1953 +N4860G1X-1.5996Y.2976Z-0.2009 +N4870G1X-1.8916Y.4371Z-0.1953 +N4880G1X-2.033Y.5431Z-0.2046 +N4890G1X-2.1204Y.664Z-0.2176 +N4900G1X-2.1595Y.8147Z-0.2176 +N4910G1X-2.1409Y.9653Z-0.2083 +N4920G1X-2.0572Y1.1346Z-0.199 +N4930G1X-1.9567Y1.2536Z-0.2065 +N4940G1X-1.7763Y1.3987Z-0.2213 +N4950G1X-1.6256Y1.4954Z-0.2139 +N4960G1X-1.3671Y1.6294Z-0.2102 +N4970G1X-1.1904Y1.7521Z-0.2455 +N4980G1X-1.0137Y1.9065Z-0.3255 +N5000G00Z0.8 +N5010G00X0Y0 +N5020M05 +N5030M30 +N5040% diff --git a/tests/test-files/unsupported/Circular Pocket.tap b/tests/test-files/unsupported/Circular Pocket.tap new file mode 100644 index 0000000..7f58fe3 --- /dev/null +++ b/tests/test-files/unsupported/Circular Pocket.tap @@ -0,0 +1,43 @@ +(Code by Newfangled Wizard, 15/01/2017) +(Version 2.86) +(Program Posted for Aluminum ) +G0 G49 G40.1 G17 +G80 G50 G90 G98 +G21 (mm) +(***** Circular Pocket *****) +(Xcen=0 Ycen=0 Dia=10) +(CW-climb mill) +M6 T7(TOOL DIA. 4) +M03 S4000 +M7 (Mist On) +G00 G43 H7 Z2 +X0 Y0 +G01 Z-1 F50 +G2 Y0 X1.60 R0.80 F100 +Y0 X-1.6 R1.6 +Y0 X3 R2.3 +Y0 X-3 R3 +X3 Y0 R3 +Y-1.5 X1.5 R1.5 +G00 Z2 +X0 Y0 +G01 Z-2 F50 +G2 Y0 X1.60 R0.80 F100 +Y0 X-1.6 R1.6 +Y0 X3 R2.3 +Y0 X-3 R3 +X3 Y0 R3 +Y-1.5 X1.5 R1.5 +G00 Z2 +X0 Y0 +G01 Z-3 F50 +G2 Y0 X1.60 R0.80 F100 +Y0 X-1.6 R1.6 +Y0 X3 R2.3 +Y0 X-3 R3 +X3 Y0 R3 +Y-1.5 X1.5 R1.5 +G00 Z2 +M5 M9 +M30 +% \ No newline at end of file diff --git a/tests/test-files/unsupported/Colt.tap b/tests/test-files/unsupported/Colt.tap new file mode 100644 index 0000000..f624bd9 --- /dev/null +++ b/tests/test-files/unsupported/Colt.tap @@ -0,0 +1,437 @@ +( Colt ) +N100G00G21G17G90G40G49G80 +N110G71G91.1 +N120T1M06 +N130(ENGRAVING - 20 DEG TIP 0.1) +N140G00G43Z6H1 +N150S12000M03 +N160 +N170 +N180G94 +N190X0Y0F600.0 +N200G00X14.9Y18.75 +N210G1Z-0.2 +N220G2X13.15Y22.6I1.15J2.85 +N230G3X14.4Y30.3I-20.25J7.25 +N240G2X15.35Y33.4I5.25J.1 +N250G3X18.05Y46.1I-13.8J9.6 +N260G2X18.2Y50.1I8.8J1.65 +N270G3X18.75Y54.05I-14.65J3.95 +N280G2X19Y55.55I3.85J0 +N290G3X20.5Y61.4I-19.4J8 +N300G3X21.4Y74.95I-177.5J18.5 +N310G2X23.25Y88.4I61.45J-1.7 +N320G3X23.15Y88.9I-.55J.15 +N330G3X22.8Y88.95I-.2J-.15 +N340G3X20.55Y86.4I6.8J-8.3 +N350G1X18.6Y83.65 +N360G1X18.35Y83.5 +N370G1X18.2Y83.65 +N380G3X17.65Y83.75I-.3J0 +N390G2X16.5Y82.15I-4.6J2.05 +N400G2X14.6Y80.7I-7.2J7.7 +N410G2X7.25Y76.75I-65.25J111.8 +N420G1X7.05Y76.55 +N430G1X7.05Y76.4 +N440G2X6.7Y75.75I-.35J-.2 +N450G2X2.65Y76.45I-.85J7.2 +N460G2X1.55Y77.5I1.15J2.35 +N470G3X.3Y78.4I-1.55J-.9 +N480G1X.15Y78.35 +N490G1X.05Y78.4 +N500G1X.1Y78.5 +N510G3X1.7Y79.55I-.35J2.3 +N520G2X4.1Y82.2I9.6J-6.15 +N530G1X5.35Y83.15 +N540G1X5.6Y83.25 +N550G3X6.2Y83.55I-.05J.85 +N560G2X8.45Y85.2I4.45J-3.7 +N570G1X12.2Y86.8 +N580G3X15.65Y89.35I-4.4J9.6 +N590G2X19.05Y91I3.75J-3.4 +N600G3X19.7Y91.65I-.05J.7 +N610G2X20.45Y92.15I.55J0 +N620G3X20.8Y92.5I.1J.25 +N630G3X20.5Y92.55I-.2J-.1 +N640G2X20.25Y92.8I-.1J.15 +N650G2X20.7Y92.85I.25J-.25 +N660G3X22.3Y92.55I1.35J2.7 +N670G3X22.45Y92.8I0J.2 +N680G3X22.25Y92.95I-.2J0 +N690G1X22.1Y93.1 +N700G1X22.25Y93.2 +N710G3X25.5Y92.95I2J5 +N720G2X26.2Y92.5I.15J-.6 +N730G3X26.9Y92.45I.35J.1 +N740G2X28.6Y94.5I5J-2.4 +N750G1X28.7Y94.6 +N760G1X28.75Y94.65 +N770G2X29.75Y95.6I1.05J-.1 +N780G3X35Y96.25I-2.3J40.6 +N790G2X41.85Y96.8I6J-31.7 +N800G2X44.15Y96I-.1J-4.1 +N810G3X45.05Y95.65I1.05J1.45 +N820G2X45.55Y94.9I-.05J-.6 +N830G3X45.9Y94I.8J-.2 +N840G3X50.8Y91.1I18.45J25.55 +N850G3X52Y90.8I1.25J2.6 +N860G3X54.3Y91I.3J11.15 +N870G1X54.4Y91.05 +N880G1X54.4Y91.1 +N890G1X54.35Y91.2 +N900G1X54.3Y91.3 +N910G1X54.05Y91.35 +N920G1X54.1Y91.5 +N930G1X54.35Y91.7 +N940G1X54.55Y91.85 +N950G3X54.55Y92.2I-.05J.2 +N960G2X54.4Y92.4I0J.15 +N970G2X54.7Y92.55I.25J-.1 +N980G1X55.95Y92.35 +N990G3X56.15Y92.6I0J.2 +N1000G3X55.85Y92.7I-.2J-.05 +N1010G2X54.65Y93I-.45J.85 +N1020G2X54.7Y93.25I.1J.1 +N1030G3X55Y93.5I-.15J.45 +N1040G2X55.35Y93.6I.2J-.05 +N1050G3X55.65Y93.65I.15J.15 +N1060G3X55.55Y93.95I-.15J.1 +N1070G2X54.5Y94.9I.4J1.5 +N1080G2X55Y95.4I.35J.15 +N1090G2X55.7Y94.6I-.55J-1.15 +N1100G3X56.15Y94.4I.3J.1 +N1110G3X56.2Y94.9I-.15J.3 +N1120G2X54.85Y96.8I6.3J5.95 +N1130G2X55Y97.2I.25J.15 +N1140G2X55.5Y96.9I.15J-.3 +N1150G3X56.8Y95.1I2.25J.25 +N1160G3X57.05Y95.5I.1J.2 +N1170G1X56Y96.65 +N1180G2X56.05Y96.9I.15J.1 +N1190G2X56.3Y96.85I.1J-.15 +N1200G1X57.05Y96 +N1210G1X57.25Y95.8 +N1220G1X57.85Y95.15 +N1230G3X58.1Y95.1I.15J.15 +N1240G3X58.15Y95.4I-.15J.15 +N1250G2X57.45Y96.5I3.15J2.75 +N1260G1X57Y97.25 +N1270G2X56.75Y98.15I.85J.65 +N1280G1X56.75Y98.55 +N1290G1X56.65Y98.75 +N1300G1X56.5Y99 +N1310G2X56.7Y99.15I.1J0 +N1320G2X57.4Y98.15I-.7J-1.25 +N1330G3X57.75Y98.15I.15J.05 +N1340G3X57.65Y99.25I-1.55J.4 +N1350G1X57.7Y99.45 +N1360G1X57.95Y99.35 +N1370G1X58.3Y98.3 +N1380G3X58.9Y97.35I1.7J.4 +N1390G1X59.5Y96.9 +N1400G3X59.75Y97.15I.1J.15 +N1410G1X59.2Y97.75 +N1420G2X58.9Y98.45I.65J.75 +N1430G2X59.35Y100.25I3.1J.15 +N1440G3X59.75Y102.05I-2.45J1.5 +N1450G1X59.8Y102.1 +N1460G1X59.95Y102.05 +N1470G2X59.8Y100.35I-1.35J-.75 +N1480G3X59.6Y98.65I1.2J-1 +N1490G1X60.05Y98.1 +N1500G3X60.2Y98.15I.05J.05 +N1510G1X60.35Y100.45 +N1520G2X61.05Y101.4I1.2J-.15 +N1530G2X61.2Y101.2I.05J-.1 +N1540G1X60.7Y100.4 +N1550G3X60.55Y98.65I3.4J-1.2 +N1560G3X61Y98.6I.25J.05 +N1570G1X61.05Y99.45 +N1580G2X61.55Y100.85I1.7J.2 +N1590G2X61.7Y100.75I.05J-.05 +N1600G1X61.5Y100.2 +N1610G1X61.35Y99.05 +N1620G3X61.7Y98.95I.2J0 +N1630G1X61.85Y99.85 +N1640G2X62.65Y101.35I1.55J.1 +N1650G1X63.35Y101.65 +N1660G1X63.45Y101.65 +N1670G1X63.5Y101.6 +N1680G1X63.3Y101.45 +N1690G3X62.05Y100.15I1.5J-2.65 +N1700G3X62Y98.85I1.4J-.7 +N1710G1X62.35Y98.45 +N1720G1X62.7Y98 +N1730G1X62.85Y97.75 +N1740G3X63.05Y97.9I.05J.1 +N1750G2X62.9Y99.95I3.7J1.25 +N1760G2X63.9Y101.9I4.15J-.9 +N1770G1X64.25Y102.1 +N1780G3X64.55Y102.7I-.1J.4 +N1790G2X64.3Y104I1.75J.95 +N1800G2X64.9Y105.1I1.9J-.3 +N1810G2X65.05Y105I.05J-.05 +N1820G3X65.4Y104.5I.35J-.15 +N1830G2X65.6Y104.2I0J-.2 +N1840G3X66.9Y103.5I.7J-.25 +N1850G3X67.45Y104.85I-2.95J2 +N1860G3X67.15Y105I-.15J.05 +N1870G2X66.4Y104.7I-.95J1.25 +N1880G2X65.3Y104.75I-.4J2.85 +N1890G2X65.25Y105.05I.05J.15 +N1900G3X65.35Y106.25I-.65J.7 +N1910G1X65.25Y106.5 +N1920G2X65.4Y106.55I.1J0 +N1930G2X65.7Y105.8I-.85J-.8 +N1940G3X66.4Y105.3I.5J0 +N1950G1X67.6Y105.85 +N1960G3X67.6Y106.45I-.15J.3 +N1970G1X65.95Y107.15 +N1980G2X65.45Y108.2I.25J.75 +N1990G2X65.7Y108.15I.1J-.05 +N2000G3X66.35Y107.4I.7J-.05 +N2010G3X66.35Y107.65I0J.15 +N2020G2X66.2Y107.85I.05J.2 +N2030G1X66.3Y107.95 +N2040G1X66.55Y107.75 +N2050G1X66.65Y107.7 +N2060G1X66.7Y107.8 +N2070G1X66.7Y108.05 +N2080G1X66.7Y108.35 +N2090G1X66.65Y108.4 +N2100G1X66.65Y108.45 +N2110G1X66.7Y108.45 +N2120G1X66.7Y108.35 +N2130G1X66.7Y108.3 +N2140G1X67.1Y107.65 +N2150G1X67.2Y107.7 +N2160G1X67.1Y107.8 +N2170G1X67.15Y107.85 +N2180G1X67.3Y107.7 +N2190G1X67.5Y107.6 +N2200G1X67.75Y107.55 +N2210G1X67.8Y107.5 +N2220G1X67.85Y107.4 +N2230G1X68.05Y107.25 +N2240G1X68Y107.15 +N2250G3X68.2Y107.35I.1J.1 +N2260G3X67.5Y107.8I-1J-.8 +N2270G2X67Y108.4I.1J.6 +N2280G2X67.35Y108.7I.3J0 +N2290G2X67.55Y108.3I0J-.25 +N2300G3X67.8Y107.9I.2J-.15 +N2310G1X67.85Y108.1 +N2320G1X67.65Y108.75 +N2330G2X67.85Y108.8I.1J0 +N2340G3X68.1Y108.1I1.15J.05 +N2350G1X68.3Y107.95 +N2360G1X68.35Y107.95 +N2370G1X68.4Y108.45 +N2380G2X68.6Y108.45I.1J0 +N2390G3X68.85Y107.85I.85J.05 +N2400G3X70.5Y106.6I6.35J6.7 +N2410G3X71.1Y107.15I.2J.35 +N2420G3X69.75Y108.1I-1.55J-.8 +N2430G1X69.6Y108.1 +N2440G1X69.2Y107.95 +N2450G1X69.05Y107.9 +N2460G1X69Y107.95 +N2470G1X69.05Y108 +N2480G1X69.35Y108.15 +N2490G2X70Y108.2I.4J-.9 +N2500G3X70.95Y108.9I.15J.75 +N2510G2X71.25Y109.6I1.35J-.15 +N2520G2X71.45Y109.55I.1J-.05 +N2530G1X71.35Y108.85 +N2540G3X71.3Y108.2I1.05J-.4 +N2550G3X71.55Y108.05I.2J.05 +N2560G3X71.7Y108.3I-.05J.2 +N2570G2X71.9Y109.75I1.15J.55 +N2580G2X72.85Y109.85I.55J-.5 +N2590G2X72.95Y109.45I-.15J-.25 +N2600G2X72.55Y109.55I-.2J.1 +N2610G3X72.15Y109.6I-.2J0 +N2620G3X72.2Y108.8I.9J-.35 +N2630G3X73.5Y107.1I6.3J3.4 +N2640G3X73.7Y107.15I.1J.1 +N2650G3X73.65Y108.3I-3.25J.45 +N2660G1X73.55Y108.6 +N2670G2X73.7Y108.75I.1J.05 +N2680G1X73.9Y108.5 +N2690G1X73.85Y106.95 +N2700G3X74.15Y106.6I.3J-.05 +N2710G3X74.45Y106.95I0J.3 +N2720G2X75.3Y108.85I2.05J.2 +N2730G1X75.45Y108.85 +N2740G1X75.6Y108.9 +N2750G1X75.55Y110 +N2760G2X76.05Y110.05I.25J0 +N2770G2X75.9Y109.15I-1.65J-.15 +N2780G3X76.1Y109I.1J-.05 +N2790G1X76.7Y109.6 +N2800G1X76.9Y109.6 +N2810G1X76.9Y109.4 +N2820G3X76.5Y108.6I.8J-.9 +N2830G3X76.85Y108.4I.2J0 +N2840G3X77.3Y109.1I-1J1.25 +N2850G2X77.7Y109.35I.35J-.15 +N2860G1X77.7Y109.25 +N2870G1X77.55Y109 +N2880G3X77.9Y108.95I.15J0 +N2890G2X78.4Y109.9I1.7J-.3 +N2900G2X79.85Y110.7I2.15J-2.3 +N2910G2X80.65Y109.8I.15J-.65 +N2920G3X81Y109.6I.2J-.05 +N2930G2X81.7Y109.9I.65J-.55 +N2940G1X81.85Y109.75 +N2950G1X81.65Y109.6 +N2960G3X81.25Y109.25I-.05J-.4 +N2970G3X81.9Y109.05I.35J-.05 +N2980G2X84.25Y110.4I2.15J-1.1 +N2990G2X84.4Y110.2I0J-.2 +N3000G2X84.15Y110.05I-.2J.05 +N3010G3X83.8Y109.95I-.1J-.35 +N3020G3X84.05Y109.7I.15J-.15 +N3030G1X84.4Y109.8 +N3040G1X84.75Y109.8 +N3050G1X84.4Y109.8 +N3060G3X83.2Y109.2I.15J-1.75 +N3070G3X83.45Y108.7I.25J-.2 +N3080G3X85.15Y109.75I-.2J2.2 +N3090G2X85.65Y109.7I.25J-.15 +N3100G1X85.55Y109.6 +N3110G3X85.45Y109.5I-.05J-.05 +N3120G3X86.35Y109.35I.5J.3 +N3130G2X88.05Y109.5I.95J-1.15 +N3140G1X88.1Y109.45 +N3150G1X88Y109.4 +N3160G3X87.55Y109.4I-.25J-.4 +N3170G3X87.45Y109.1I.1J-.2 +N3180G3X87.75Y109.05I.2J.1 +N3190G2X88.15Y108.9I.15J-.2 +N3200G3X88.85Y108.8I.4J.1 +N3210G2X89.55Y108.75I.35J-.25 +N3220G2X89.2Y108.15I-.35J-.2 +N3230G1X88.95Y108 +N3240G1X89Y107.9 +N3250G1X89.5Y107.75 +N3260G2X89.5Y107.55I-.05J-.1 +N3270G3X89.45Y107.15I.1J-.2 +N3280G1X89.6Y106.75 +N3290G1X89.65Y106.5 +N3300G1X89.75Y106.5 +N3310G2X90.75Y107.45I3.55J-2.7 +N3320G3X94.95Y111.05I-16.15J23.15 +N3330G2X95.25Y110.95I.15J-.15 +N3340G2X95.7Y108.75I-6.25J-2.4 +N3350G2X94.15Y104.6I-5.8J-.15 +N3360G1X90.8Y101.1 +N3370G3X90.55Y100.45I.6J-.6 +N3380G3X90.9Y98.75I5.85J.3 +N3390G1X91.1Y98.45 +N3400G1X91.15Y98.45 +N3410G1X91.15Y98.55 +N3420G2X91.85Y98.15I-.05J-.85 +N3430G2X94.3Y92.3I-23.15J-13.3 +N3440G3X95.35Y90I8.25J2.4 +N3450G2X94.85Y89.5I-.3J-.2 +N3460G1X94.55Y89.9 +N3470G3X94.05Y89.9I-.25J-.1 +N3480G3X93.15Y83.95I11.2J-4.8 +N3490G3X95.8Y71.2I57.55J5.3 +N3500G2X95.8Y66.65I-6.9J-2.3 +N3510G2X93.15Y63.05I-6.65J2.15 +N3520G2X89.25Y62.45I-2.55J3.7 +N3530G2X86.35Y65.15I1.35J4.35 +N3540G1X84.25Y70.55 +N3550G3X81.75Y74.7I-12.75J-4.95 +N3560G1X79.75Y76.95 +N3570G1X77.75Y79.2 +N3580G3X77.15Y79I-.25J-.25 +N3590G2X76.5Y76.65I-8.65J1.1 +N3600G3X75.85Y74.5I9.45J-4 +N3610G3X76Y73.95I.6J-.1 +N3620G1X76Y73.85 +N3630G3X75.9Y73.45I.3J-.3 +N3640G1X76.95Y68.4 +N3650G2X76.15Y63.7I-6.45J-1.3 +N3660G3X74.05Y59.5I23.9J-14.55 +N3670G3X73.3Y55.3I9.85J-3.9 +N3680G2X71.9Y48.65I-14.75J-.4 +N3690G3X70.4Y36.1I18.15J-8.5 +N3700G2X70.35Y32.2I-8.65J-1.8 +N3710G3X69.8Y16.55I36.85J-9.1 +N3720G1X70.75Y9.9 +N3730G3X72.4Y5.8I8.4J.95 +N3740G1X72.7Y5.25 +N3750G1X73.05Y4.7 +N3760G2X74.35Y2.45I-4.85J-4.35 +N3770G2X73.5Y.8I-1.2J-.4 +N3780G3X73.2Y.55I.1J-.4 +N3790G2X72.7Y0I-.75J.2 +N3800G1X72.2Y-.05 +N3810G1X70.85Y.1 +N3820G2X67.35Y3.7I.2J3.7 +N3830G3X65.2Y12.6I-21.4J-.5 +N3840G2X64.8Y15.65I4.35J2.15 +N3850G3X65Y27.9I-35.15J6.75 +N3860G1X64.05Y35.15 +N3870G1X62.4Y52.05 +N3880G3X61.55Y52.35I-.5J-.05 +N3890G3X59.15Y47.7I6.2J-6.1 +N3900G3X59.25Y38.7I24.95J-4.25 +N3910G2X58.05Y29.85I-13.75J-2.65 +N3920G3X57.25Y27.15I6.85J-3.4 +N3930G3X56.5Y12.3I150.65J-15.05 +N3940G3X56.85Y9.2I13.45J0 +N3950G3X57.35Y8.8I.5J.1 +N3960G2X57.95Y8I-.05J-.65 +N3970G3X58.55Y4.15I5.15J-1.15 +N3980G1X58.8Y3.35 +N3990G2X58.15Y2.35I-.95J-.1 +N4000G2X55.7Y1.85I-3J8.45 +N4010G2X53.1Y3.55I-.15J2.65 +N4020G2X52.5Y9.3I10.4J3.95 +N4030G3X51.9Y15.1I-10.5J1.75 +N4040G2X51.9Y18.25I3.8J1.55 +N4050G3X52.6Y30.75I-17.15J7.25 +N4060G2X52.35Y34.9I9.25J2.7 +N4070G3X51.7Y51.6I-43.6J6.65 +N4080G2X51.45Y55.15I10.75J2.5 +N4090G3X49.3Y58I-2.65J.25 +N4100G2X43.5Y60.3I3.15J16.35 +N4110G3X40.45Y61.6I-5.65J-8.9 +N4120G3X39.8Y61.15I-.15J-.5 +N4130G2X38.75Y58.25I-6.95J.75 +N4140G3X34.9Y44.05I21.65J-13.5 +N4150G3X39.6Y26.25I39.9J1.05 +N4160G2X40.7Y23.7I-14.1J-7.55 +N4170G2X40.05Y22.45I-.95J-.3 +N4180G2X35.15Y25.75I-1.1J3.6 +N4190G3X32.55Y31I-8.05J-.7 +N4200G1X31.95Y31.4 +N4210G2X31.65Y32.05I.25J.5 +N4220G3X31.5Y40.05I-16.3J3.7 +N4230G2X29.1Y54.7I72.2J19.4 +N4240G2X29.9Y57.45I4J.25 +N4250G3X32.3Y68.5I-10.35J8 +N4260G3X31.3Y68.45I-.5J-.1 +N4270G2X30.2Y65.3I-9.35J1.5 +N4280G1X29.1Y63.5 +N4290G1X28.05Y61.7 +N4300G1X28.1Y61.7 +N4310G1X28.15Y61.65 +N4320G2X28.15Y60.9I-.25J-.4 +N4330G3X26.15Y58.7I3.35J-5.1 +N4340G3X25.15Y55.85I8.65J-4.75 +N4350G2X21.25Y44.45I-44J8.55 +N4360G3X20.2Y41.05I9.85J-4.9 +N4370G1X18.05Y27.1 +N4380G3X17.75Y20.8I26.55J-4.45 +N4390G2X14.9Y18.75I-2.1J-.15 +N4400G00X14.9Y18.75Z6 +N4410G00Z6 +N4420G00X0Y0 +N4430M05 +N4440M30 +N4450% diff --git a/tests/test-files/unsupported/Cross2.tap b/tests/test-files/unsupported/Cross2.tap new file mode 100644 index 0000000..52d862b --- /dev/null +++ b/tests/test-files/unsupported/Cross2.tap @@ -0,0 +1,141 @@ +( Cross2 ) +( Material Size ) +( X=96 mm, Y=120 mm, Z=6 mm ) +( Tools used in this file: ) +( T1 = End Mill 4 mm ) +() +N100G00G21G17G90G40G49G80 +N110G71G91.1 +N120T1M06 +N130 +N140G00G43Z6.001H1 +N150S12000M03 +N160 +N170 +N180G94 +N190X0.000Y0.000F300.0 +N200G00X19.365Y10.204 +N210G1X19.365Y10.204F100.0Z-6.250 +N220G3X21.516Y8.215I3.342J1.456F300.0 +N230G3X34.429Y4.911I26.451J76.500 +N240G1X39.329Y4.240 +N250G1X40.693Y4.106 +N260G1X41.226Y2.568 +N270G3X45.677Y-1.360I6.769J3.185 +N280G1X46.900Y-1.639 +N290G1X47.924Y-1.727 +N300G1X48.076Y-1.727 +N310G1X49.100Y-1.639 +N320G1X50.323Y-1.360 +N330G3X54.774Y2.568I-2.318J7.113 +N340G1X55.307Y4.106 +N350G1X56.671Y4.240 +N360G1X61.571Y4.911 +N370G3X74.484Y8.215I-13.538J79.804 +N380G3X76.635Y10.204I-1.191J3.445 +N390G3X76.934Y11.837I-3.337J1.454 +N400G3X76.476Y13.433I-3.637J-0.179 +N410G1X76.387Y13.582 +N420G1X76.279Y13.746 +N430G1X75.550Y14.804 +N440G1X72.855Y18.835 +N450G2X60.886Y44.862I91.386J57.794 +N460G2X56.171Y73.119I103.357J31.767 +N470G1X56.124Y74.803 +N480G1X56.123Y74.969 +N490G1X57.117Y74.965 +N500G1X60.431Y74.897 +N510G1X64.581Y74.650 +N520G2X74.700Y72.963I-6.338J-69.199 +N530G2X84.461Y69.804I-16.458J-67.516 +N540G1X85.953Y69.181 +N550G1X86.868Y68.927 +N560G3X89.334Y69.473I0.494J3.607 +N570G3X90.862Y71.480I-2.004J3.111 +N580G1X91.035Y72.102 +N590G1X91.308Y73.289 +N600G1X91.347Y73.474 +N610G3X93.056Y73.960I-1.143J7.266 +N620G3X97.553Y82.081I-2.910J6.917 +N630G3X91.345Y88.286I-7.408J-1.204 +N640G1X91.234Y88.787 +N650G1X90.775Y90.562 +N660G1X90.576Y91.205 +N670G3X89.881Y92.426I-3.393J-1.123 +N680G3X88.118Y93.544I-2.750J-2.389 +N690G3X86.033Y93.514I-0.993J-3.526 +N700G1X85.430Y93.282 +N710G1X84.091Y92.688 +N720G2X58.689Y87.223I-27.064J64.027 +N730G1X56.527Y87.219 +N740G1X56.532Y87.237 +N750G1X56.726Y88.030 +N760G2X66.598Y104.001I30.363J-7.731 +N770G1X67.446Y104.720 +N780G3X68.587Y106.437I-2.308J2.772 +N790G3X68.532Y108.707I-3.443J1.053 +N800G3X67.160Y110.507I-3.529J-1.268 +N810G1X66.617Y110.866 +N820G1X65.603Y111.480 +N830G3X60.338Y113.988I-17.052J-29.028 +N840G3X55.464Y115.399I-11.723J-31.363 +N850G3X53.114Y119.751I-7.439J-1.206 +N860G3X48.560Y121.710I-5.090J-5.558 +N870G1X48.236Y121.724 +N880G1X48.065Y121.728 +N890G1X47.935Y121.728 +N900G1X47.764Y121.724 +N910G1X47.440Y121.710 +N920G3X42.886Y119.751I0.535J-7.517 +N930G3X40.536Y115.399I5.089J-5.557 +N940G3X35.662Y113.988I6.852J-32.786 +N950G3X30.397Y111.480I11.786J-31.535 +N960G1X29.383Y110.866 +N970G1X28.840Y110.507 +N980G3X27.468Y108.707I2.157J-3.067 +N990G3X27.413Y106.437I3.388J-1.218 +N1000G3X28.554Y104.720I3.449J1.055 +N1010G1X29.402Y104.001 +N1020G2X39.274Y88.030I-20.492J-23.702 +N1030G1X39.468Y87.237 +N1040G1X39.473Y87.219 +N1050G1X37.311Y87.223 +N1060G2X11.909Y92.688I1.662J69.492 +N1070G1X10.570Y93.282 +N1080G1X9.967Y93.514 +N1090G3X7.882Y93.544I-1.092J-3.496 +N1100G3X6.119Y92.426I0.988J-3.506 +N1110G3X5.424Y91.205I2.698J-2.344 +N1120G1X5.225Y90.562 +N1130G1X4.766Y88.787 +N1140G1X4.655Y88.286 +N1150G3X-1.553Y82.081I1.201J-7.409 +N1160G3X2.944Y73.960I7.407J-1.204 +N1170G3X4.653Y73.474I2.843J6.748 +N1180G1X4.692Y73.289 +N1190G1X4.965Y72.102 +N1200G1X5.138Y71.480 +N1210G3X6.666Y69.473I3.532J1.104 +N1220G3X9.132Y68.927I1.972J3.061 +N1230G1X10.047Y69.181 +N1240G1X11.539Y69.804 +N1250G2X21.300Y72.963I26.219J-64.357 +N1260G2X31.419Y74.650I16.457J-67.512 +N1270G1X35.569Y74.897 +N1280G1X38.883Y74.965 +N1290G1X39.877Y74.969 +N1300G1X39.876Y74.803 +N1310G1X39.829Y73.119 +N1320G2X35.114Y44.862I-108.072J3.510 +N1330G2X23.145Y18.835I-103.356J31.767 +N1340G1X20.450Y14.804 +N1350G1X19.721Y13.746 +N1360G1X19.613Y13.582 +N1370G1X19.524Y13.433 +N1380G3X19.066Y11.837I3.179J-1.775 +N1390G3X19.365Y10.204I3.636J-0.179 +N1400G00X19.365Y10.204Z6.000 +N1410G00Z6.001M05 +N1420G00X0.000Y0.000 +N1430M30 +% diff --git a/tests/test-files/unsupported/DB25.tap b/tests/test-files/unsupported/DB25.tap new file mode 100644 index 0000000..aecac91 --- /dev/null +++ b/tests/test-files/unsupported/DB25.tap @@ -0,0 +1,95 @@ +(Code by Newfangled Wizard, 15/01/2017) +(Version 2.86) +(Program Posted for Aluminum ) +G0 G49 G40.1 G17 +G80 G50 G90 G98 +G21 (mm) +(****DB 25 Pin****) +M6 T7(TOOL DIA. 3) +G43 H7 +M03 S4000 +M7 (Mist On) +G0 X18.6665 Y-3.1674 +X18.6665 Y-3.1674 Z2 +G1 X18.6665 Y-3.1674 Z-1 F39.6 +G41 P1.5 X20.4013 Y-3.9116 F79.2 +G3 X21.0007 Y-2.3038 R2.46126 +G1 X21.0007 Y-1.6002 +X23.3959 Y-1.6002 +G3 X24.9961 Y0 R1.6002 +X23.3959 Y1.6002 R1.6002 +G1 X21.0007 Y1.6002 +X21.0007 Y2.3241 +G3 X17.8257 Y5.4991 R3.175 +G1 X-17.8257 Y5.4991 +G3 X-21.0007 Y2.3241 R3.175 +G1 X-21.0007 Y1.6002 +X-23.3959 Y1.6002 +G3 X-24.9961 Y0 R1.6002 +X-23.3959 Y-1.6002 R1.6002 +G1 X-21.0007 Y-1.6002 +X-21.0007 Y-2.3241 +G3 X-17.8257 Y-5.4991 R3.175 +G1 X17.8257 Y-5.4991 +G3 X21.0007 Y-2.3241 R3.175 +G1 X21.0007 Y-1.6002 +G3 X21.8491 Y-0.7772 R1.69672 +G1 G40 X20.4241 Y-0.0178 +G0 X20.4241 Y-0.0178 Z2 +G0 X18.6665 Y-3.1674 +X18.6665 Y-3.1674 Z2 +G1 X18.6665 Y-3.1674 Z-2 F39.6 +G41 P1.5 X20.4013 Y-3.9116 F79.2 +G3 X21.0007 Y-2.3038 R2.46126 +G1 X21.0007 Y-1.6002 +X23.3959 Y-1.6002 +G3 X24.9961 Y0 R1.6002 +X23.3959 Y1.6002 R1.6002 +G1 X21.0007 Y1.6002 +X21.0007 Y2.3241 +G3 X17.8257 Y5.4991 R3.175 +G1 X-17.8257 Y5.4991 +G3 X-21.0007 Y2.3241 R3.175 +G1 X-21.0007 Y1.6002 +X-23.3959 Y1.6002 +G3 X-24.9961 Y0 R1.6002 +X-23.3959 Y-1.6002 R1.6002 +G1 X-21.0007 Y-1.6002 +X-21.0007 Y-2.3241 +G3 X-17.8257 Y-5.4991 R3.175 +G1 X17.8257 Y-5.4991 +G3 X21.0007 Y-2.3241 R3.175 +G1 X21.0007 Y-1.6002 +G3 X21.8491 Y-0.7772 R1.69672 +G1 G40 X20.4241 Y-0.0178 +G0 X20.4241 Y-0.0178 Z2 +G0 X18.6665 Y-3.1674 +X18.6665 Y-3.1674 Z2 +G1 X18.6665 Y-3.1674 Z-3 F39.6 +G41 P1.5 X20.4013 Y-3.9116 F79.2 +G3 X21.0007 Y-2.3038 R2.46126 +G1 X21.0007 Y-1.6002 +X23.3959 Y-1.6002 +G3 X24.9961 Y0 R1.6002 +X23.3959 Y1.6002 R1.6002 +G1 X21.0007 Y1.6002 +X21.0007 Y2.3241 +G3 X17.8257 Y5.4991 R3.175 +G1 X-17.8257 Y5.4991 +G3 X-21.0007 Y2.3241 R3.175 +G1 X-21.0007 Y1.6002 +X-23.3959 Y1.6002 +G3 X-24.9961 Y0 R1.6002 +X-23.3959 Y-1.6002 R1.6002 +G1 X-21.0007 Y-1.6002 +X-21.0007 Y-2.3241 +G3 X-17.8257 Y-5.4991 R3.175 +G1 X17.8257 Y-5.4991 +G3 X21.0007 Y-2.3241 R3.175 +G1 X21.0007 Y-1.6002 +G3 X21.8491 Y-0.7772 R1.69672 +G1 G40 X20.4241 Y-0.0178 +G0 X20.4241 Y-0.0178 Z2 +M5 M9 +M30 +% diff --git a/tests/test-files/unsupported/Disc3.tap b/tests/test-files/unsupported/Disc3.tap new file mode 100644 index 0000000..70aaa94 --- /dev/null +++ b/tests/test-files/unsupported/Disc3.tap @@ -0,0 +1,121 @@ +(Tweakie.CNC) +G00G21G17G90G40G49G80 +G71G91.1 +T1M06 +G00G43Z10H1 +S12000M03 +G94 +X0.000Y0.000F300.0 +G00X17.477Y7.782Z6.000 +G1X17.477Y7.782Z-2.000F100.0 +G1X17.510Y7.801Z-2.000F300.0 +G1X17.687Y7.912Z-2.000 +G1X17.802Y7.990Z-2.000 +G3X18.687Y13.577I-2.351J3.236 +G3X13.100Y14.462I-3.236J-2.351 +G1X12.988Y14.374Z-2.000 +G1X12.802Y14.218Z-2.000 +G1X12.827Y14.253Z-2.000 +G1X12.941Y14.424Z-2.000 +G1X13.013Y14.540Z-2.000 +G3X11.549Y20.004I-3.464J2.000 +G3X6.085Y18.540I-2.000J-3.464 +G1X6.020Y18.416Z-2.000 +G1X5.913Y18.198Z-2.000 +G1X5.921Y18.243Z-2.000 +G1X5.956Y18.443Z-2.000 +G1X5.974Y18.576Z-2.000 +G3X2.414Y22.972I-3.978J0.418 +G3X-1.982Y19.412I-0.418J-3.978 +G1X-1.991Y19.275Z-2.000 +G1X-2.000Y19.029Z-2.000 +G1X-2.009Y19.067Z-2.000 +G1X-2.060Y19.268Z-2.000 +G1X-2.098Y19.400Z-2.000 +G3X-7.138Y21.968I-3.804J-1.236 +G3X-9.706Y16.928I1.236J-3.804 +G1X-9.659Y16.799Z-2.000 +G1X-9.567Y16.571Z-2.000 +G1X-9.590Y16.600Z-2.000 +G1X-9.718Y16.764Z-2.000 +G1X-9.807Y16.870Z-2.000 +G3X-15.456Y17.166I-2.973J-2.677 +G3X-15.752Y11.517I2.677J-2.973 +G1X-15.653Y11.414Z-2.000 +G1X-15.478Y11.245Z-2.000 +G1X-15.513Y11.265Z-2.000 +G1X-15.697Y11.362Z-2.000 +G1X-15.820Y11.422Z-2.000 +G3X-21.102Y9.395I-1.627J-3.654 +G3X-19.074Y4.114I3.654J-1.627 +G1X-18.943Y4.061Z-2.000 +G1X-18.715Y3.978Z-2.000 +G1X-18.765Y3.982Z-2.000 +G1X-18.966Y3.996Z-2.000 +G1X-19.099Y4.000Z-2.000 +G3X-23.099Y0.000I0.000J-4.000 +G3X-19.099Y-4.000I4.000J0.000 +G1X-18.962Y-3.995Z-2.000 +G1X-18.717Y-3.979Z-2.000 +G1X-18.754Y-3.992Z-2.000 +G1X-18.948Y-4.063Z-2.000 +G1X-19.074Y-4.114Z-2.000 +G3X-21.102Y-9.395I1.627J-3.654 +G3X-15.820Y-11.422I3.654J1.627 +G1X-15.692Y-11.360Z-2.000 +G1X-15.478Y-11.245Z-2.000 +G1X-15.508Y-11.274Z-2.000 +G1X-15.657Y-11.418Z-2.000 +G1X-15.752Y-11.517Z-2.000 +G3X-15.456Y-17.166I2.973J-2.677 +G3X-9.807Y-16.870I2.677J2.973 +G1X-9.717Y-16.762Z-2.000 +G1X-9.566Y-16.570Z-2.000 +G1X-9.582Y-16.606Z-2.000 +G1X-9.659Y-16.799Z-2.000 +G1X-9.706Y-16.928Z-2.000 +G3X-7.138Y-21.968I3.804J-1.236 +G3X-2.098Y-19.400I1.236J3.804 +G1X-2.059Y-19.265Z-2.000 +G1X-2.000Y-19.029Z-2.000 +G1X-1.999Y-19.071Z-2.000 +G1X-1.991Y-19.277Z-2.000 +G1X-1.982Y-19.412Z-2.000 +G3X2.414Y-22.972I3.978J0.418 +G3X5.974Y-18.576I-0.418J3.978 +G1X5.955Y-18.435Z-2.000 +G1X5.912Y-18.197Z-2.000 +G1X5.933Y-18.241Z-2.000 +G1X6.022Y-18.422Z-2.000 +G1X6.085Y-18.540Z-2.000 +G3X11.549Y-20.004I3.464J2.000 +G3X13.013Y-14.540I-2.000J3.464 +G1X12.939Y-14.421Z-2.000 +G1X12.802Y-14.218Z-2.000 +G1X12.831Y-14.242Z-2.000 +G1X12.990Y-14.376Z-2.000 +G1X13.100Y-14.462Z-2.000 +G3X18.687Y-13.577I2.351J3.236 +G3X17.802Y-7.990I-3.236J2.351 +G1X17.684Y-7.910Z-2.000 +G1X17.478Y-7.782Z-2.000 +G1X17.521Y-7.795Z-2.000 +G1X17.718Y-7.851Z-2.000 +G1X17.850Y-7.883Z-2.000 +G3X22.594Y-4.802I0.832J3.913 +G3X19.513Y-0.058I-3.913J0.832 +G1X19.374Y-0.034Z-2.000 +G1X19.133Y0.000Z-2.000 +G1X19.179Y0.006Z-2.000 +G1X19.380Y0.035Z-2.000 +G1X19.513Y0.058Z-2.000 +G3X22.594Y4.802I-0.832J3.913 +G3X17.850Y7.883I-3.913J-0.832 +G1X17.712Y7.849Z-2.000 +G1X17.477Y7.782Z-2.000 +G00X17.477Y7.782Z6.000 +G00Z10 +G00X0.000Y0.000 +M09 +M30 +% diff --git a/tests/test-files/unsupported/Horse.tap b/tests/test-files/unsupported/Horse.tap new file mode 100644 index 0000000..9bd7143 --- /dev/null +++ b/tests/test-files/unsupported/Horse.tap @@ -0,0 +1,354 @@ +( Horse ) +N100G00G21G17G90G40G49G80 +N110G71G91.1 +N120T1M06 +N130(ENGRAVING - 20 DEG TIP 0.1) +N140G00G43Z6H1 +N150S12000M03 +N160 +N170 +N180G94 +N190X0Y0F600.0 +N200G00X.25Y1.75 +N210G1Z-0.2 +N220G2X.2Y2.5I.3J.4 +N230G3X1.85Y4.5I-9J9 +N240G3X.5Y6.75I-1.25J.8 +N250G2X-.3Y7.6I-.05J.75 +N260G2X1.4Y13.3I19.05J-2.6 +N270G3X2.35Y16.05I-12.45J5.95 +N280G3X4.05Y24.7I-120.15J28.25 +N290G1X4.3Y25.2 +N300G3X4.15Y25.8I-.25J.25 +N310G3X3.65Y25.4I-.1J-.35 +N320G2X3.35Y23.15I-8.95J.05 +N330G1X2.95Y21.6 +N340G2X2.55Y21.4I-.3J.05 +N350G1X3.05Y22.85 +N360G1X2.4Y21.7 +N370G1X2.15Y21.5 +N380G1X1.95Y21.55 +N390G1X2.75Y22.75 +N400G1X2.9Y23.1 +N410G1X2.8Y23.2 +N420G3X2.5Y22.95I-.05J-.25 +N430G2X1.75Y21.65I-2.15J.3 +N440G2X1.45Y21.95I-.15J.15 +N450G3X2.25Y23.2I-1.6J1.85 +N460G2X3.4Y26I9.15J-2.25 +N470G3X3.1Y26.7I-.4J.25 +N480G1X2.95Y26.65 +N490G1X2.9Y26.1 +N500G2X2Y24.25I-5.8J1.6 +N510G2X1.05Y23.5I-1.65J1.15 +N520G1X.95Y23.5 +N530G1X.9Y23.6 +N540G3X1.8Y24.6I-1.65J2.45 +N550G3X3.05Y27.65I-10.35J5.95 +N560G2X3.8Y29.1I3.3J-.8 +N570G3X3.75Y29.45I-.2J.15 +N580G3X3.4Y29.35I-.15J-.2 +N590G3X3.05Y28.15I3.65J-1.7 +N600G1X2.8Y27.5 +N610G1X2.7Y27.55 +N620G1X2.8Y27.9 +N630G1X3.4Y30.3 +N640G3X3.5Y31.6I-2.7J.9 +N650G3X3.35Y31.65I-.1J0 +N660G1X3.2Y31.2 +N670G1X2.9Y30.1 +N680G2X2.6Y30.65I.05J.4 +N690G3X3.15Y32.85I-10.65J3.85 +N700G1X3.75Y35.6 +N710G1X5.1Y39.7 +N720G2X5.5Y40.25I1.1J-.4 +N730G3X5.45Y40.95I-.25J.35 +N740G1X4.65Y39.25 +N750G2X4.45Y40.2I.15J.5 +N760G3X6.2Y43.4I-2.85J3.65 +N770G1X6.4Y44.55 +N780G1X6.55Y45.7 +N790G1X6.55Y45.95 +N800G2X6.75Y45.95I.1J0 +N810G1X6.65Y45.85 +N820G1X6.55Y45.75 +N830G1X6.55Y45.7 +N840G1X6.4Y44.45 +N850G2X6.15Y44.25I-.2J0 +N860G2X6Y44.5I0J.2 +N870G1X6.25Y45.75 +N880G1X6.65Y47 +N890G1X7.3Y48.6 +N900G3X6.8Y48.85I-.25J.1 +N910G1X6.55Y48.05 +N920G1X6.25Y47.25 +N930G1X6Y46.9 +N940G1X5.95Y46.85 +N950G1X5.95Y46.7 +N960G1X5.95Y46.5 +N970G1X5.9Y46.3 +N980G1X5.8Y46.3 +N990G1X5.8Y46.35 +N1000G1X5.85Y46.4 +N1010G1X5.95Y46.75 +N1020G1X5.95Y47.05 +N1030G1X6.25Y48.35 +N1040G1X7Y50.1 +N1050G3X6.9Y50.4I-.2J.1 +N1060G3X6.6Y50.3I-.1J-.2 +N1070G1X5.9Y49.1 +N1080G3X5.85Y48.4I.55J-.4 +N1090G1X5.75Y48.25 +N1100G1X5.65Y48.35 +N1110G2X6.25Y50.6I6.3J-.55 +N1120G3X7.25Y54.8I-8.5J4.2 +N1130G1X7.15Y54.95 +N1140G1X7Y54.8 +N1150G1X6.95Y54.45 +N1160G1X6.85Y53.95 +N1170G2X6.65Y53.8I-.2J0 +N1180G2X6.5Y54I0J.2 +N1190G1X6.6Y54.5 +N1200G3X7.05Y56.35I-4.7J2.05 +N1210G2X7.9Y59.45I7.1J-.3 +N1220G3X7.6Y60.2I-.5J.25 +N1230G1X7.45Y60.15 +N1240G1X7.15Y59.4 +N1250G2X6.9Y59.35I-.15J.1 +N1260G2X6.85Y59.6I.1J.15 +N1270G1X7.45Y60.55 +N1280G3X8.25Y64.85I-7.3J3.6 +N1290G2X12.15Y71.9I7.25J.6 +N1300G2X23.2Y75.55I16.65J-32.2 +N1310G2X36.7Y75.75I7.5J-48.2 +N1320G3X58.4Y74.4I22.25J180.2 +N1330G3X66.05Y75.65I.05J23 +N1340G2X73.8Y76.55I5.9J-17 +N1350G2X78.25Y74.4I-.75J-7.15 +N1360G3X78.5Y74.5I.1J.1 +N1370G3X78.4Y74.95I-.45J.1 +N1380G1X78.1Y75.15 +N1390G1X77.85Y75.4 +N1400G1X77.25Y75.85 +N1410G2X78Y75.95I.4J-.2 +N1420G3X80.05Y73.9I10.6J8.55 +N1430G2X83.6Y70.7I-28.3J-34.85 +N1440G2X90.6Y63.3I-143J-141.9 +N1450G2X92Y61.4I-9.1J-8.15 +N1460G3X93.15Y60.9I.95J.55 +N1470G2X93.55Y60.35I.1J-.35 +N1480G3X93.65Y59.75I.45J-.25 +N1490G1X94.9Y58.5 +N1500G3X95.3Y58.4I.3J.25 +N1510G1X95.3Y58.8 +N1520G2X95.55Y58.6I0J-.2 +N1530G3X95.95Y57.55I1.75J.1 +N1540G2X99.7Y52.6I-38.9J-33.25 +N1550G2X100.9Y50.1I-8.7J-5.75 +N1560G2X101.75Y45.9I-16.3J-5.3 +N1570G3X104.2Y38.45I15.75J1.1 +N1580G2X105Y36.4I-4.5J-2.9 +N1590G3X106.15Y36.05I.7J.1 +N1600G2X107.8Y36.95I2.1J-1.8 +N1610G2X108.15Y36.35I.05J-.35 +N1620G1X107.8Y36 +N1630G3X107.3Y35.25I.85J-1.1 +N1640G1X107.3Y34.75 +N1650G1X107.45Y34.7 +N1660G1X110.25Y37.15 +N1670G2X111.15Y36.4I.4J-.45 +N1680G1X110.75Y35.8 +N1690G3X109.35Y33.3I5.25J-4.5 +N1700G2X108.2Y32.05I-1.85J.55 +N1710G3X107.35Y30.6I.5J-1.3 +N1720G2X109.15Y9.65I-310J-37.3 +N1730G2X108.65Y6.15I-8.85J-.45 +N1740G2X107.3Y5.1I-1.55J.55 +N1750G2X101Y5.15I-2.95J21.8 +N1760G2X100.15Y5.65I.2J1.35 +N1770G2X98.9Y8.15I5.35J4.2 +N1780G2X98.8Y9.7I4.1J1.1 +N1790G3X98.4Y11.25I-2.05J.25 +N1800G2X95.8Y14.85I37.3J29.25 +N1810G3X93.2Y18.5I-34.35J-22.05 +N1820G2X92.65Y23.6I3.65J2.95 +N1830G3X92.3Y33.15I-8.65J4.45 +N1840G1X86.4Y42.65 +N1850G3X83.9Y44.05I-2.5J-1.6 +N1860G3X83.2Y43.55I0J-.7 +N1870G2X81.45Y40.9I-5.35J1.6 +N1880G1X79.55Y39.45 +N1890G3X77.9Y37.75I3J-4.5 +N1900G2X76.9Y36.6I-3.55J2.15 +N1910G3X76.05Y35.4I1.6J-2.1 +N1920G3X75.95Y32.5I4.65J-1.6 +N1930G2X76.7Y20.9I-27.25J-7.55 +N1940G3X77Y12.95I21.6J-3.15 +N1950G3X78.75Y9I10.8J2.4 +N1960G3X80.5Y7.35I4.95J3.55 +N1970G2X82.1Y5.6I-2.5J-3.95 +N1980G1X83Y4.1 +N1990G2X82.45Y2.75I-.75J-.45 +N2000G2X79.9Y2.35I-3.45J13.3 +N2010G2X77.5Y4I-.15J2.35 +N2020G3X77.1Y4.2I-.3J-.1 +N2030G2X76.5Y5.75I-.15J.85 +N2040G3X76.05Y7I-.4J.6 +N2050G2X73.7Y7.4I-.45J4.5 +N2060G2X73.25Y8.05I.3J.7 +N2070G1X73.1Y11.1 +N2080G1X72.45Y17.85 +N2090G1X71.3Y26.75 +N2100G1X71.35Y27.45 +N2110G3X70.95Y28I-.45J.1 +N2120G3X70.35Y27.55I-.05J-.55 +N2130G2X69.5Y24.7I-12.95J2.25 +N2140G1X63.65Y10.85 +N2150G3X64.05Y5.55I5.35J-2.25 +N2160G2X65.9Y2.15I-27.8J-17.15 +N2170G2X64.95Y.55I-1J-.45 +N2180G2X60.45Y1I-.95J14.2 +N2190G2X59.65Y1.95I.25J1 +N2200G3X58.8Y2.8I-.85J0 +N2210G2X58.45Y3.3I0J.4 +N2220G2X59.6Y5.7I9.55J-3 +N2230G3X59.5Y8.35I-1.95J1.25 +N2240G1X59.25Y8.55 +N2250G2X58.55Y9.5I.15J.85 +N2260G2X59.6Y13.1I13J-1.9 +N2270G3X64.75Y27.1I-85.8J39.55 +N2280G2X68.5Y36.9I57.75J-16.2 +N2290G3X67.2Y39.4I-1.6J.75 +N2300G3X62.85Y39.4I-2.05J-12.45 +N2310G2X45.6Y40.2I-6.85J37.85 +N2320G2X39Y42.9I8.25J29.4 +N2330G2X33.85Y46.75I12.1J21.8 +N2340G3X32.05Y46.1I-.75J-.75 +N2350G2X30.7Y42.95I-5.95J.7 +N2360G3X28.7Y39.45I8.85J-7.4 +N2370G3X24.2Y22.45I91.3J-33.1 +N2380G3X24.35Y15.65I17.85J-3 +N2390G3X27.25Y8.25I24.15J5.2 +N2400G3X30.85Y4.75I8.2J4.85 +N2410G2X33.6Y.55I-2.6J-4.65 +N2420G2X32.75Y-.25I-.75J-.05 +N2430G3X28.3Y.05I-4.3J-29.6 +N2440G2X25.85Y.35I-.05J10.15 +N2450G2X25.55Y.75I.1J.4 +N2460G2X25.7Y1.7I2.45J.1 +N2470G3X25.6Y2.7I-1.05J.4 +N2480G1X25.55Y3.1 +N2490G3X24.75Y4.5I-1J.35 +N2500G1X22.55Y4.95 +N2510G2X20.9Y6.45I.55J2.25 +N2520G2X19.75Y13.5I18.15J6.5 +N2530G3X17.15Y26.45I-29.6J.8 +N2540G1X16.8Y26.9 +N2550G2X16.6Y27.45I.35J.45 +N2560G2X17.45Y29.6I6.3J-1.25 +N2570G3X20Y38.6I-14.1J8.8 +N2580G2X20.2Y39.7I3.1J.05 +N2590G3X19.6Y40I-.3J.1 +N2600G1X18.45Y38.7 +N2610G3X17.7Y37.15I1.8J-1.85 +N2620G3X18.25Y36.45I.65J-.05 +N2630G2X18.4Y35.55I-.05J-.45 +N2640G2X17.8Y36.3I-.25J.45 +N2650G3X17.55Y36.75I-.25J.2 +N2660G3X17.05Y36.15I.05J-.5 +N2670G1X17.75Y33.35 +N2680G1X18.15Y32.45 +N2690G2X18.1Y32.2I-.15J-.1 +N2700G1X17.35Y33.45 +N2710G1X17.8Y31.9 +N2720G1X17.75Y30.85 +N2730G2X17.5Y31.05I0J.2 +N2740G1X17.3Y32.2 +N2750G1X17.15Y33.2 +N2760G3X16.85Y34.15I-1.95J-.1 +N2770G3X16.6Y34.1I-.1J-.05 +N2780G3X16.65Y32.7I3.8J-.5 +N2790G1X17.3Y30.65 +N2800G1X17.4Y30.15 +N2810G1X17.3Y29.65 +N2820G1X17.05Y29.15 +N2830G1X16.85Y28.6 +N2840G1X16.8Y28.7 +N2850G1X16.8Y28.85 +N2860G3X16.05Y33I-11.55J0 +N2870G3X15.5Y33.25I-.4J-.15 +N2880G3X15.2Y32.6I.15J-.45 +N2890G2X16.05Y29.95I-11.5J-5.15 +N2900G1X16.4Y29.1 +N2910G1X16.7Y28.25 +N2920G1X16.6Y27.85 +N2930G3X16.4Y26.35I1.35J-.95 +N2940G1X16.6Y26.05 +N2950G1X16.8Y25.7 +N2960G1X17.55Y21.8 +N2970G1X16.65Y25.2 +N2980G3X16.3Y24.6I.1J-.45 +N2990G2X16.85Y22I-9.2J-3.25 +N3000G1X16.9Y21.75 +N3010G1X16.95Y21.5 +N3020G1X16.95Y21.3 +N3030G1X17Y21.25 +N3040G1X17.1Y21.3 +N3050G1X17.05Y21.35 +N3060G1X17Y21.45 +N3070G1X16.95Y21.5 +N3080G2X17.05Y22.75I2.95J.4 +N3090G3X16.6Y23.3I-.4J.1 +N3100G1X16.9Y21.05 +N3110G2X16.5Y21.4I-.1J.3 +N3120G3X16.2Y23.5I-4.85J.45 +N3130G2X16.2Y24.15I1J.35 +N3140G3X15.75Y24.6I-.35J.1 +N3150G1X16.1Y21.75 +N3160G2X15.65Y22.15I-.05J.35 +N3170G3X15.45Y24.35I-6.55J.55 +N3180G2X15Y28.05I14.1J3.75 +N3190G3X14.45Y28.8I-.85J0 +N3200G3X13.85Y28.3I-.15J-.4 +N3210G1X14.35Y25.6 +N3220G1X14.55Y24.75 +N3230G1X15.45Y21.35 +N3240G2X15.2Y21.3I-.1J-.05 +N3250G2X14.7Y23.05I6J2.8 +N3260G1X14.3Y24.35 +N3270G1X14.1Y24.45 +N3280G1X14.2Y21.9 +N3290G1X14Y22.75 +N3300G1X14.05Y21.9 +N3310G1X13.95Y21.6 +N3320G1X13.9Y21.6 +N3330G1X13.05Y26.75 +N3340G1X12.65Y28.55 +N3350G3X12.15Y28.5I-.25J-.05 +N3360G1X11.85Y26.95 +N3370G1X11.3Y25.75 +N3380G3X10.8Y24.55I2.55J-1.7 +N3390G1X10.85Y24.05 +N3400G1X11.25Y22.1 +N3410G1X11.55Y21.55 +N3420G2X11.4Y20.95I-.25J-.25 +N3430G2X11.1Y21.1I-.05J.25 +N3440G2X10.7Y22.6I5.25J2.2 +N3450G2X10.75Y24.05I5.15J.65 +N3460G3X10.55Y24.4I-.3J.05 +N3470G3X9.8Y24.1I-.2J-.6 +N3480G3X8.1Y20I16.95J-9.45 +N3490G3X6.35Y10.3I47.2J-13.5 +N3500G3X8Y2.25I14.85J-1.15 +N3510G2X8.05Y.8I-1.4J-.75 +N3520G2X7Y.1I-1.15J.55 +N3530G1X3.6Y-.2 +N3540G2X1.45Y1.8I-.15J2 +N3550G3X.95Y1.9I-.25J0 +N3560G2X.25Y1.75I-.4J.25 +N3570G00X.25Y1.75 +N3580G00Z6 +N3590G00X0Y0 +N3600M05 +N3610M30 +N3620% diff --git a/tests/test-files/unsupported/Horse2.tap b/tests/test-files/unsupported/Horse2.tap new file mode 100644 index 0000000..aeb7db2 --- /dev/null +++ b/tests/test-files/unsupported/Horse2.tap @@ -0,0 +1,157 @@ +( Horse2 ) +N100G00G21G17G90G40G49G80 +N110G71G91.1 +N120T1M06 +N130(ENGRAVING - 20 DEG TIP 0.1) +N140G00G43Z6H1 +N150S12000M03 +N160 +N170 +N180G94 +N190X0Y0F600 +N200G00X44.05Y21.75 +N210G1Z-0.2 +N220G3X50.4Y15.75I39.9J36 +N230G3X50.65Y15.85I.1J.15 +N240G3X50.75Y16.7I-1.6J.65 +N250G2X51.35Y17.6I.8J.1 +N260G2X55.2Y18.05I3.05J-10.25 +N270G3X60.3Y18.75I.9J12.3 +N280G3X65.8Y21.85I-6.35J17.5 +N290G3X67.15Y26.55I-2.75J3.35 +N300G2X66.15Y31.4I18.55J6.2 +N310G3X65.35Y33.45I-3.65J-.25 +N320G1X62.6Y36.55 +N330G3X54.55Y39.5I-7.15J-6.95 +N340G2X45.95Y39.55I-4.15J46.35 +N350G2X42.65Y40.5I.85J9.15 +N360G3X41.8Y40.15I-.25J-.5 +N370G3X41.75Y38.45I3.55J-.9 +N380G2X41.65Y31.6I-14.1J-3.15 +N390G3X44.05Y21.75I10.3J-2.7 +N400G00Z6 +N410G00X8.35Y73.5 +N420G1Z-0.2 +N430G3X6.95Y75.75I-3.3J-.5 +N440G3X6Y75.1I-.35J-.5 +N450G3X7.65Y73I3.25J.85 +N460G3X8.35Y73.5I.2J.4 +N470G00Z6 +N480G00X10.6Y74.8 +N490G1Z-0.2 +N500G1X13.45Y68.6 +N510G2X14.05Y64.9I-6.9J-3 +N520G3X14.8Y64.25I.6J-.05 +N530G3X16.9Y65.75I-1.25J4 +N540G2X25.45Y71.45I12.4J-9.3 +N550G2X42.75Y72.55I11.45J-44.45 +N560G3X52.1Y72.6I4.4J34.3 +N570G3X69.15Y79.15I-5.85J40.65 +N580G2X87Y82.7I13.15J-19.6 +N590G2X97.5Y79.05I-8.55J-41.65 +N600G2X102Y75.8I-7.8J-15.55 +N610G1X101.95Y76.5 +N620G1X101.85Y77.15 +N630G1X102.05Y76.55 +N640G3X102.5Y76.05I.55J.05 +N650G1X102.55Y76.1 +N660G1X102.55Y76.15 +N670G1X102.6Y76.2 +N680G2X103.3Y76.25I.35J-.05 +N690G3X103.7Y75.65I.9J.2 +N700G1X103.75Y75.7 +N710G1X103.8Y76.1 +N720G2X104.4Y76.3I.35J.05 +N730G3X106.95Y76I1.4J.9 +N740G2X108.8Y75.25I.75J-.8 +N750G3X109.55Y71.8I11J.6 +N760G2X111.15Y65.9I-27.2J-10.75 +N770G2X110.7Y64.8I-1.15J-.2 +N780G3X110.05Y63.5I.95J-1.3 +N790G3X110.3Y61.1I13.35J.15 +N800G2X110.3Y59.4I-4.7J-.9 +N810G1X109.85Y57.55 +N820G3X107.8Y44.45I38.4J-12.7 +N830G2X106.7Y41.3I-4.9J-.05 +N840G2X101.7Y39.35I-4.25J3.45 +N850G2X97.25Y42.65I.8J5.75 +N860G2X97.7Y45.1I1.95J.9 +N870G3X97.9Y45.7I-.5J.5 +N880G3X97.4Y47.75I-10.3J-1.35 +N890G3X93.85Y57.3I-229.55J-80.15 +N900G3X88.85Y59.25I-3.4J-1.35 +N910G3X82.15Y51.65I5.75J-11.85 +N920G2X78.15Y43.5I-32.5J11.05 +N930G2X74.3Y39.95I-9.5J6.4 +N940G1X74.2Y38.05 +N950G1X73.8Y36.35 +N960G3X74.65Y32.7I3.6J-1.1 +N970G2X75.3Y25.75I-4.05J-3.85 +N980G3X72.55Y20.7I28.95J-19.05 +N990G1X71.15Y18 +N1000G2X67.55Y14.8I-6.8J4.05 +N1010G3X65.3Y13.5I5.4J-12 +N1020G2X57.4Y12.1I-5.4J7.6 +N1030G3X53.1Y11.75I-1.7J-6.05 +N1040G2X55.75Y8.2I-7.55J-8.4 +N1050G2X56.35Y4.9I-5.75J-2.7 +N1060G3X53.1Y4.7I0J-25.3 +N1070G2X51.5Y5.4I-.2J1.65 +N1080G3X49.8Y6.9I-3.25J-2.1 +N1090G2X49.1Y7.85I.45J1.1 +N1100G3X47.35Y11.55I-5.55J-.4 +N1110G2X43Y15.9I52.5J56.35 +N1120G3X35.25Y22.9I-40.5J-37.05 +N1130G2X33.9Y25.2I2J2.7 +N1140G2X34.4Y30.55I12.7J1.55 +N1150G3X31.6Y40I-8.5J2.65 +N1160G3X32.4Y27.15I323.3J13.5 +N1170G3X33Y22.6I40.95J3.35 +N1180G3X36.3Y16I13.7J2.7 +N1190G2X40.75Y10.15I-37.35J-33.25 +N1200G3X44.55Y6.05I14J9.2 +N1210G2X45.3Y4.85I-1.2J-1.55 +N1220G3X46.45Y2.65I4.2J.8 +N1230G2X47.1Y1.45I-1.6J-1.6 +N1240G2X46.25Y.25I-1J-.2 +N1250G2X43.35Y0I-3.05J18.6 +N1260G2X39.45Y4.6I-.05J3.95 +N1270G3X38.7Y5.95I-1.2J.2 +N1280G2X35.95Y8.5I1.85J4.7 +N1290G3X27.5Y20.7I-40.8J-19.25 +N1300G2X26Y24.2I3.85J3.75 +N1310G1X25.6Y29.65 +N1320G3X18.25Y42.25I-17.65J-1.9 +N1330G2X13.25Y48.25I9.05J12.6 +N1340G2X11.3Y56.8I18.55J8.7 +N1350G2X12.05Y59.25I4.25J.05 +N1360G3X12.05Y59.55I-.2J.15 +N1370G1X11.55Y59.85 +N1380G2X7.8Y63.05I1J4.9 +N1390G2X6.5Y67.55I38.3J13.6 +N1400G3X5.45Y68.4I-1.1J-.25 +N1410G1X5.15Y68.55 +N1420G2X-.35Y76I6.85J10.8 +N1430G2X.2Y79.2I3.75J1 +N1440G1X.1Y79.15 +N1450G3X.4Y77.35I3.9J-.35 +N1460G3X4.05Y71.1I24.4J10 +N1470G3X4.4Y71.05I.2J.15 +N1480G3X4.5Y71.4I-.2J.25 +N1490G2X2.75Y79.3I24.85J9.6 +N1500G2X3.45Y87.55I28J1.85 +N1510G1X4Y83.2 +N1520G1X5.25Y76.9 +N1530G1X6.45Y77.05 +N1540G3X7.5Y77.6I-.05J1.4 +N1550G1X8.2Y78.7 +N1560G2X10.95Y83.15I32.05J-16.5 +N1570G1X10.3Y81.15 +N1580G1X10Y79.95 +N1590G3X10.6Y74.8I7.85J-1.7 +N1600G00X10.6Y74.8 +N1610G00Z6 +N1620G00X0Y0 +N1630M05 +N1640M30 +N1650% diff --git a/tests/test-files/unsupported/Mach3 write.tap b/tests/test-files/unsupported/Mach3 write.tap new file mode 100644 index 0000000..ab1b8b4 --- /dev/null +++ b/tests/test-files/unsupported/Mach3 write.tap @@ -0,0 +1,75 @@ +G00 G49 G40 G17 G80 G50 G90 G21 +M04 S12000 +G90 G90.1 +G00 Z6 +G00 X0 Y0 +F600 +G01 Z-0.4 +G01 X1.8945 Y8.9334 +G02 X3.2091 Y9.9985 I3.2091 J8.6546 +G01 X4.8089 Y9.9985 +G02 X5.5538 Y9.0494 I4.8089 J9.2316 +G00 Z2 +G00 X4.4691 Y4.6164 +G01 Z-0.4 +G01 X5.5572 Y9.04 +G02 X6.7833 Y9.9997 I6.7815 J8.7389 +G01 X8.3784 Y9.9974 +G02 X9.3057 Y8.8497 I8.377 J9.0479 +G01 X7.4175 Y-0.0001 +G00 Z2 +G00 X12.5737 Y0 +G01 Z-0.4 +G01 X14.1923 Y7.7724 +G02 X16.9591 Y10 I16.9317 J7.2019 +G01 X19.3014 Y9.9771 +G02 X20.9532 Y7.9109 I19.2847 J8.2704 +G01 X19.2484 Y0.0001 +G00 Z2 +G00 X13.3612 Y3.7815 +G01 Z-0.4 +G01 X20.0633 Y3.7815 +G00 Z2 +G00 X31.1752 Y1.6931 +G01 Z-0.4 +G02 X29.1577 Y-0.0232 I29.1718 J2.0042 +G01 X25.8234 Y0 +G02 X24.5528 Y1.5916 I25.8325 J1.3103 +G01 X26.0337 Y8.3291 +G02 X28.1285 Y10.0011 I28.1131 J7.872 +G01 X31.2929 Y9.9782 +G02 X32.5962 Y8.3801 I31.2832 J8.6398 +G00 Z2 +G00 X35.8642 Y0 +G01 Z-0.4 +G01 X37.9902 Y10 +G00 Z2 +G00 X36.9272 Y5 +G01 Z-0.4 +G01 X43.5272 Y5 +G00 Z2 +G00 X44.5902 Y10 +G01 Z-0.4 +G01 X42.4642 Y0 +G00 Z2 +G00 X59.2553 Y8.7284 +G01 Z-0.4 +G02 X60.5458 Y10 I60.5458 J8.7094 +G01 X64.4085 Y10 +G02 X65.6721 Y8.4332 I64.4085 J8.707 +G01 X65.3189 Y6.8035 +G02 X63.8438 Y5.6149 I63.8451 J7.1229 +G00 Z2 +G00 X61.3493 Y5.6171 +G01 Z-0.4 +G01 X63.8438 Y5.6149 +G02 X64.808 Y4.4157 I63.8429 J4.627 +G01 X64.17 Y1.502 +G02 X62.3035 Y0 I62.3035 J1.9107 +G01 X58.7792 Y0 +G02 X57.4544 Y1.3515 I58.7792 J1.3251 +G00 Z6 +G00 X0 Y0 +M05 +M30 +% \ No newline at end of file diff --git a/tests/test-files/unsupported/Mach4 write.tap b/tests/test-files/unsupported/Mach4 write.tap new file mode 100644 index 0000000..6db9f46 --- /dev/null +++ b/tests/test-files/unsupported/Mach4 write.tap @@ -0,0 +1,68 @@ +G49 G40 G17 G80 G50 G90 G21 +M04 S12000 +G90 G90.1 +G00 Z6 +G00 X0 Y0 +F600 +G01 Z-0.4 +G01 X1.8945 Y8.9334 +G02 X3.2091 Y9.9985 I3.2091 J8.6546 +G01 X4.8089 Y9.9985 +G02 X5.5538 Y9.0494 I4.8089 J9.2316 +G00 Z2 +G00 X4.4691 Y4.6164 +G01 Z-0.4 +G01 X5.5572 Y9.04 +G02 X6.7833 Y9.9997 I6.7815 J8.7389 +G01 X8.3784 Y9.9974 +G02 X9.3057 Y8.8497 I8.377 J9.0479 +G01 X7.4175 Y-0.0001 +G00 Z2 +G00 X12.5737 Y0 +G01 Z-0.4 +G01 X14.1923 Y7.7724 +G02 X16.9591 Y10 I16.9317 J7.2019 +G01 X19.3014 Y9.9771 +G02 X20.9532 Y7.9109 I19.2847 J8.2704 +G01 X19.2484 Y0.0001 +G00 Z2 +G00 X13.3612 Y3.7815 +G01 Z-0.4 +G01 X20.0633 Y3.7815 +G00 Z2 +G00 X31.1752 Y1.6931 +G01 Z-0.4 +G02 X29.1577 Y-0.0232 I29.1718 J2.0042 +G01 X25.8234 Y0 +G02 X24.5528 Y1.5916 I25.8325 J1.3103 +G01 X26.0337 Y8.3291 +G02 X28.1285 Y10.0011 I28.1131 J7.872 +G01 X31.2929 Y9.9782 +G02 X32.5962 Y8.3801 I31.2832 J8.6398 +G00 Z2 +G00 X35.8642 Y0 +G01 Z-0.4 +G01 X37.9902 Y10 +G00 Z2 +G00 X36.9272 Y5 +G01 Z-0.4 +G01 X43.5272 Y5 +G00 Z2 +G00 X44.5902 Y10 +G01 Z-0.4 +G01 X42.4642 Y0 +G00 Z2 +G00 X59.3067 Y10 +G01 Z-0.4 +G01 X57.9242 Y4.4966 +G03 X59.286 Y2.7504 I59.286 J4.1545 +G01 X64.5422 Y2.7504 +G00 Z2 +G00 X64.2003 Y6.2539 +G01 Z-0.4 +G01 X62.6294 Y0.0001 +G00 Z6 +G00 X0 Y0 +M05 +M30 +% \ No newline at end of file diff --git a/tests/test-files/unsupported/Skull2.tap b/tests/test-files/unsupported/Skull2.tap new file mode 100644 index 0000000..1f9cc6e --- /dev/null +++ b/tests/test-files/unsupported/Skull2.tap @@ -0,0 +1,397 @@ +( SKULL2 ) +( MATERIAL SIZE ) +( X= 89.500, Y= 120.000 ) +( TOOL=ENGRAVE {20' 0.02" TIP DIA} ) +N100G00G20G17G90G40G49G80 +N110G71G91.1 +N120T1M06 +N130 +N140G00G43Z0.4H1 +N150S12000M03 +N160 +N170 +N180G94 +N190X0Y0F24 +N200G00X.796Y.6845Z0.1 +N210G1X.796Y.6845Z-0.01F12 +N220G2X.7893Y.7037I.0493J.028F24 +N230G2X.7837Y.7555I.5171J.0816 +N240G2X.7841Y.7948I.2981J.017 +N250G2X.7939Y.8372I.1443J-.0108 +N260G2X.8194Y.8573I.03J-.0119 +N270G2X.8537Y.8378I.0044J-.0321 +N280G2X.8628Y.8058I-.1266J-.0529 +N290G2X.8631Y.7303I-.2524J-.0389 +N300G2X.855Y.7032I-.096J.0139 +N310G2X.8353Y.6806I-.0489J.0228 +N320G2X.8108Y.6748I-.0204J.0318 +N330G2X.796Y.6845I.0021J.0193 +N340G00X.796Y.6845Z0.1 +N350G00X.891Y.6201Z0.1 +N360G1X.891Y.6201Z-0.01F12 +N370G2X.9096Y.6578I.1526J-.0518F24 +N380G2X.9537Y.7064I.1843J-.1232 +N390G2X.9731Y.7174I.0422J-.0517 +N400G2X.9807Y.7193I.0126J-.0347 +N410G2X.9872Y.7193I.0033J-.0245 +N420G2X1.0065Y.7031I-.003J-.0231 +N430G2X1.0143Y.6633I-.1791J-.0558 +N440G2X1.0177Y.5965I-.9403J-.0806 +N450G2X1.0162Y.5343I-.8154J-.0119 +N460G2X1.0019Y.4606I-.2887J.0178 +N470G2X.9865Y.4341I-.0717J.0239 +N480G2X.9562Y.4227I-.0261J.0234 +N490G2X.9312Y.4339I.0056J.0459 +N500G2X.9028Y.4755I.0664J.0758 +N510G2X.8848Y.5848I.287J.1035 +N520G2X.891Y.6201I.1167J-.0022 +N530G00X.891Y.6201Z0.1 +N540G00X1.0641Y.5906Z0.1 +N550G1X1.0641Y.5906Z-0.01F12 +N560G2X1.0775Y.6177I.0903J-.028F24 +N570G2X1.1182Y.6424I.0494J-.0354 +N580G2X1.1416Y.6408I.0079J-.0543 +N590G2X1.1578Y.6308I-.0102J-.0347 +N600G2X1.1801Y.5917I-.0707J-.066 +N610G2X1.209Y.4352I-.7752J-.2244 +N620G2X1.209Y.2824I-.9038J-.0764 +N630G2X1.1998Y.2332I-.2502J.0211 +N640G2X1.1853Y.2019I-.1102J.0322 +N650G2X1.1597Y.1836I-.0367J.0244 +N660G2X1.1359Y.1907I-.0061J.0232 +N670G2X1.1193Y.2103I.2886J.2614 +N680G2X1.0652Y.3119I.2506J.1986 +N690G2X1.0476Y.4354I.3581J.114 +N700G2X1.0524Y.5295I1.8444J-.0468 +N710G2X1.0641Y.5906I.2772J-.0212 +N720G00X1.0641Y.5906Z0.1 +N730G00X1.2752Y.5054Z0.1 +N740G1X1.2752Y.5054Z-0.01F12 +N750G2X1.3209Y.543I.055J-.0204F24 +N760G2X1.3718Y.5369I.0148J-.0924 +N770G2X1.4132Y.5044I-.0381J-.0912 +N780G2X1.4361Y.457I-.1142J-.0843 +N790G2X1.4593Y.3333I-.7849J-.2114 +N800G2X1.4662Y.219I-1.1991J-.13 +N810G2X1.4633Y.1748I-.283J-.0037 +N820G2X1.4409Y.1128I-.1625J.0235 +N830G2X1.4053Y.0798I-.076J.0464 +N840G2X1.3476Y.0785I-.0302J.0594 +N850G2X1.2817Y.1357I.063J.1393 +N860G2X1.2565Y.2002I.1508J.0959 +N870G2X1.251Y.307I.4209J.0752 +N880G3X1.2547Y.3819I-1.483J.1102 +N890G2X1.262Y.4565I.5078J-.012 +N900G2X1.2752Y.5054I.2734J-.0474 +N910G00X1.2752Y.5054Z0.1 +N920G00X1.5359Y.3751Z0.1 +N930G1X1.5359Y.3751Z-0.01F12 +N940G2X1.5738Y.4364I.2285J-.0989F24 +N950G1X1.5883Y.4523Z-0.01 +N960G1X1.6031Y.443Z-0.01 +N970G2X1.6356Y.415I-.1146J-.1657 +N980G2X1.663Y.379I-.1633J-.1528 +N990G2X1.7008Y.2787I-.2424J-.1486 +N1000G2X1.7111Y.1639I-.7037J-.1213 +N1010G2X1.7115Y.0794I-9.3539J-.0844 +N1020G2X1.7111Y.0586I-.5678J0 +N1030G2X1.7092Y.0476I-.0404J.0015 +N1040G2X1.7049Y.0393I-.0273J.0089 +N1050G2X1.6854Y.0251I-.033J.0247 +N1060G2X1.6337Y.0145I-.0651J.1873 +N1070G2X1.532Y.023I-.023J.3405 +N1080G2X1.508Y.0352I.0131J.0551 +N1090G2X1.4967Y.0598I.0213J.0246 +N1100G2X1.4978Y.1259I2.0856J.0002 +N1110G2X1.5035Y.2231I1.7775J-.0562 +N1120G2X1.5124Y.2944I.9678J-.0837 +N1130G2X1.5359Y.3751I.3355J-.0543 +N1140G00X1.5359Y.3751Z0.1 +N1150G00X1.8139Y.3576Z0.1 +N1160G1X1.8139Y.3576Z-0.01F12 +N1170G2X1.8607Y.435I.1898J-.0617F24 +N1180G1X1.8729Y.4464Z-0.01 +N1190G1X1.8946Y.4313Z-0.01 +N1200G2X1.9505Y.3813I-.2257J-.3081 +N1210G2X1.975Y.3436I-.1012J-.0928 +N1220G2X1.9841Y.3105I-.1094J-.0479 +N1230G2X1.9935Y.1964I-1.3194J-.165 +N1240G2X1.9961Y.0943I-3.973J-.1522 +N1250G2X1.9957Y.0567I-.8389J-.0106 +N1260G2X1.9905Y.0403I-.0317J.001 +N1270G2X1.9764Y.0273I-.0331J.0217 +N1280G2X1.9467Y.0173I-.0425J.0775 +N1290G2X1.8451Y.0165I-.054J.3686 +N1300G2X1.8001Y.029I.0207J.1606 +N1310G2X1.7813Y.0567I.0129J.029 +N1320G2X1.781Y.0723I.368J.0157 +N1330G2X1.7813Y.1522I9.5636J0 +N1340G2X1.7818Y.1765I.9845J-.0082 +N1350G2X1.7827Y.1952I.5769J-.0191 +N1360G2X1.8139Y.3576I.6644J-.0435 +N1370G00X1.8139Y.3576Z0.1 +N1380G00X2.0596Y.2953Z0.1 +N1390G1X2.0596Y.2953Z-0.01F12 +N1400G2X2.08Y.4381I.8207J-.0442F24 +N1410G2X2.0996Y.4864I.1619J-.0378 +N1420G2X2.1339Y.5208I.0875J-.053 +N1430G2X2.1806Y.5357I.0543J-.0891 +N1440G1X2.1866Y.5361Z-0.01 +N1450G1X2.1906Y.5361Z-0.01 +N1460G2X2.2177Y.5287I-.0012J-.0581 +N1470G2X2.2397Y.5087I-.0319J-.0571 +N1480G2X2.2583Y.4655I-.0997J-.0685 +N1490G2X2.2702Y.3663I-.5325J-.114 +N1500G3X2.2733Y.3196I.6037J.0165 +N1510G2X2.2743Y.308I-.3703J-.039 +N1520G2X2.2752Y.2544I-.4641J-.0341 +N1530G2X2.2705Y.2165I-.2364J.0099 +N1540G2X2.2417Y.1614I-.1107J.0229 +N1550G2X2.1779Y.1191I-.1244J.1183 +N1560G2X2.1029Y.13I-.0277J.0733 +N1570G2X2.0728Y.1656I.065J.0856 +N1580G2X2.0592Y.2157I.1052J.0554 +N1590G2X2.0596Y.2953I.8179J.0356 +N1600G00X2.0596Y.2953Z0.1 +N1610G00X2.3344Y.3358Z0.1 +N1620G1X2.3344Y.3358Z-0.01F12 +N1630G2X2.3409Y.5192I.9414J.0584F24 +N1640G2X2.3646Y.616I.4606J-.0616 +N1650G2X2.3924Y.6684I.2007J-.0728 +N1660G2X2.4109Y.68I.0235J-.017 +N1670G2X2.4377Y.676I.0074J-.0424 +N1680G2X2.4638Y.6533I-.0317J-.0628 +N1690G2X2.4821Y.6113I-.0959J-.0667 +N1700G2X2.4946Y.4874I-.5456J-.1178 +N1710G2X2.465Y.3232I-.4999J.0056 +N1720G2X2.4337Y.2663I-.1959J.0707 +N1730G2X2.4046Y.2351I-.1863J.1443 +N1740G2X2.3924Y.2276I-.0273J.0305 +N1750G2X2.3753Y.2269I-.0095J.0241 +N1760G2X2.3581Y.2379I.0108J.0355 +N1770G2X2.3455Y.2623I.0434J.038 +N1780G2X2.3344Y.3358I.4102J.0996 +N1790G00X2.3344Y.3358Z0.1 +N1800G00X2.5478Y.4381Z0.1 +N1810G1X2.5478Y.4381Z-0.01F12 +N1820G2X2.5305Y.4746I.0872J.0637F24 +N1830G2X2.5176Y.5544I.4169J.1084 +N1840G2X2.5161Y.6452I.9092J.0606 +N1850G2X2.523Y.7182I.5932J-.0197 +N1860G2X2.544Y.7874I.2595J-.041 +N1870G2X2.5678Y.8151I.0609J-.0281 +N1880G2X2.5717Y.8174I.0263J-.0396 +N1890G2X2.5745Y.8187I.0105J-.0196 +N1900G2X2.5878Y.8176I.0055J-.015 +N1910G2X2.5979Y.8089I-.016J-.0289 +N1920G2X2.6433Y.7269I-.2462J-.1897 +N1930G2X2.6583Y.6452I-.2283J-.0842 +N1940G2X2.6481Y.5282I-.6004J-.0065 +N1950G2X2.6245Y.4651I-.1943J.0364 +N1960G2X2.5959Y.4302I-.1226J.0715 +N1970G2X2.5829Y.4224I-.0276J.0312 +N1980G2X2.5631Y.4242I-.008J.0215 +N1990G2X2.5478Y.4381I.0267J.0446 +N2000G00X2.5478Y.4381Z0.1 +N2010G00X2.6822Y.7157Z0.1 +N2020G1X2.6822Y.7157Z-0.01F12 +N2030G2X2.655Y.7355I-.0029J.0246F24 +N2040G2X2.6504Y.7689I.2901J.0567 +N2050G2X2.6481Y.8328I.7421J.0586 +N2060G2X2.6511Y.8705I.2601J-.0019 +N2070G2X2.6619Y.905I.1194J-.0183 +N2080G2X2.6846Y.9216I.0272J-.0132 +N2090G2X2.6922Y.9219I.0048J-.0319 +N2100G2X2.6991Y.9203I-.0023J-.0262 +N2110G2X2.7144Y.9067I-.0097J-.0264 +N2120G2X2.7278Y.8635I-.1217J-.0617 +N2130G2X2.7309Y.8191I-.325J-.0444 +N2140G2X2.7278Y.778I-.28J0 +N2150G2X2.7183Y.7432I-.1498J.0222 +N2160G2X2.6822Y.7157I-.0414J.0168 +N2170G00X2.6822Y.7157Z0.1 +N2180G00X2.6767Y1.6351Z0.1 +N2190G1X2.6767Y1.6351Z-0.01F12 +N2200G3X2.7798Y1.6441I-.0106J.7161F24 +N2210G3X2.9093Y1.6844I-.0761J.4734 +N2220G3X3.015Y1.7775I-.1095J.2307 +N2230G3X3.0418Y1.8405I-.1753J.112 +N2240G3X3.0625Y1.9732I-.7794J.1893 +N2250G3X3.0647Y2.121I-1.3279J.0939 +N2260G3X3.0515Y2.2456I-.9563J-.0387 +N2270G3X2.9806Y2.4619I-.7761J-.1344 +N2280G3X2.8734Y2.6035I-.4293J-.2135 +N2290G3X2.7472Y2.6841I-.3006J-.3314 +N2300G3X2.6583Y2.715I-.2748J-.6494 +N2310G1X2.655Y2.7004Z-0.01 +N2320G2X2.6515Y2.6859I-.6475J.1458 +N2330G2X2.5868Y2.5063I-.9125J.2272 +N2340G2X2.4903Y2.35I-.7843J.3764 +N2350G2X2.4061Y2.2512I-1.0994J.8513 +N2360G2X2.3301Y2.1788I-.6649J.6222 +N2370G2X2.0145Y2.013I-.5294J.6246 +N2380G2X1.8146Y1.9815I-.2455J.9074 +N2390G2X1.6543Y1.9837I-.0627J1.2905 +N2400G2X1.5156Y2.0042I.0746J.984 +N2410G2X1.2439Y2.1311I.1492J.6738 +N2420G2X1.0965Y2.2639I.7799J1.0135 +N2430G1X1.0654Y2.2968Z-0.01 +N2440G2X1.0583Y2.3057I.0541J.0507 +N2450G1X.9569Y2.5104Z-0.01 +N2460G1X.9062Y2.6127Z-0.01 +N2470G1X.8556Y2.715Z-0.01 +N2480G1X.8424Y2.7116Z-0.01 +N2490G3X.8293Y2.7081I.1089J-.439 +N2500G3X.6885Y2.6477I.1565J-.5587 +N2510G3X.5563Y2.5238I.2174J-.3643 +N2520G3X.4815Y2.3672I.457J-.3143 +N2530G3X.4486Y2.1607I.7722J-.229 +N2540G3X.454Y1.9867I1.4843J-.0415 +N2550G3X.4692Y1.883I.9231J.0827 +N2560G3X.5024Y1.7756I.5712J.1174 +N2570G3X.5606Y1.701I.1648J.0689 +N2580G3X.6319Y1.6648I.1413J.1902 +N2590G3X.7598Y1.6394I.1864J.6022 +N2600G3X.9289Y1.6372I.0982J1.0532 +N2610G3X1.28Y1.7029I-.1017J1.5144 +N2620G3X1.4359Y1.7609I-.4665J1.4926 +N2630G3X1.5893Y1.8281I-8.5693J19.7516 +N2640G1X1.752Y1.9003Z-0.01 +N2650G1X1.9456Y1.8156Z-0.01 +N2660G1X2.2003Y1.7054Z-0.01 +N2670G3X2.2156Y1.7002I.1026J.2778 +N2680G3X2.2543Y1.6888I.5469J1.7731 +N2690G3X2.3359Y1.6683I.3587J1.2594 +N2700G3X2.4216Y1.6526I.2976J1.3744 +N2710G3X2.6767Y1.6351I.2322J1.5241 +N2720G00X2.6767Y1.6351Z0.1 +N2730G00X2.582Y1.442Z0.1 +N2740G1X2.582Y1.442Z-0.01F12 +N2750G2X2.4304Y1.5057I9.6057J23.1048F24 +N2760G2X2.153Y1.6272I4.8191J11.3798 +N2770G2X1.819Y1.8026I1.3311J2.9405 +N2780G1X1.7618Y1.838Z-0.01 +N2790G1X1.6976Y1.8024Z-0.01 +N2800G2X1.4607Y1.6796I-3.1491J5.7836 +N2810G2X1.2122Y1.5631I-3.0789J6.2445 +N2820G2X.9498Y1.4486I-8.0731J18.1425 +N2830G3X.6884Y1.3316I3.3344J-7.7939 +N2840G3X.6499Y1.3129I.6665J-1.423 +N2850G3X.6412Y1.3079I.0387J-.0771 +N2860G3X.6245Y1.293I.0417J-.0633 +N2870G3X.5985Y1.2563I.2352J-.1952 +N2880G3X.5693Y1.2006I.4255J-.2583 +N2890G2X.5345Y1.1481I-.174J.0775 +N2900G2X.4816Y1.1181I-.0745J.0696 +N2910G2X.4454Y1.1153I-.0285J.1312 +N2920G2X.3388Y1.1561I.0108J.1877 +N2930G2X.2904Y1.2065I.167J.2089 +N2940G2X.1799Y1.3607I6.2301J4.5822 +N2950G3X.1171Y1.4414I-.8121J-.5671 +N2960G3X.0637Y1.4981I-.6914J-.5977 +N2970G2X.0507Y1.5125I.1085J.1113 +N2980G2X.0467Y1.518I.0549J.0438 +N2990G2X.0387Y1.5309I.2962J.1926 +N3000G2X.0102Y1.6004I.225J.1329 +N3010G2X0Y1.6859I.3329J.0832 +N3020G2X.0117Y1.7392I.1312J-.0009 +N3030G2X.0518Y1.8004I.2161J-.0978 +N3040G2X.1068Y1.8498I.2625J-.2373 +N3050G2X.1646Y1.8907I1.9738J-2.7266 +N3060G3X.3075Y2.0098I-.5939J.8579 +N3070G3X.3717Y2.0972I-.2507J.2514 +N3080G3X.3973Y2.2175I-.2044J.1064 +N3090G3X.3855Y2.3119I-.7427J-.0449 +N3100G3X.3425Y2.4667I-.9563J-.1822 +N3110G3X.2748Y2.6331I-2.5502J-.941 +N3120G2X.2186Y2.7707I2.1397J.9545 +N3130G2X.1757Y2.9142I1.0715J.3986 +N3140G2X.1523Y3.1311I.9048J.2071 +N3150G2X.1602Y3.2663I1.4144J-.0148 +N3160G2X.3605Y3.8486I1.3726J-.1464 +N3170G2X.5825Y4.1352I1.4985J-.9316 +N3180G2X1.0433Y4.504I1.5998J-1.5268 +N3190G2X1.3807Y4.6536I.7706J-1.2824 +N3200G2X1.698Y4.7083I.3803J-1.2572 +N3210G2X1.8843Y4.7065I.0775J-1.6128 +N3220G2X2.1832Y4.6581I-.1097J-1.6237 +N3230G2X2.6817Y4.4274I-.3861J-1.4883 +N3240G2X2.9458Y4.1991I-1.0065J-1.4311 +N3250G2X3.1052Y4.0028I-1.2101J-1.1455 +N3260G2X3.3387Y3.4551I-1.2137J-.8411 +N3270G2X3.3716Y3.1223I-1.6141J-.3273 +N3280G2X3.3581Y2.9763I-.8277J.0028 +N3290G2X3.3134Y2.8036I-1.2078J.2206 +N3300G2X3.2558Y2.6592I-1.3812J.4671 +N3310G3X3.1953Y2.5161I2.1593J-.9976 +N3320G3X3.1362Y2.312I1.1596J-.4463 +N3330G3X3.126Y2.2043I.5198J-.1033 +N3340G3X3.189Y2.0342I.2672J.0022 +N3350G3X3.2783Y1.9509I.392J.3307 +N3360G3X3.3385Y1.9111I.4483J.6131 +N3370G2X3.4459Y1.831I-.328J-.5517 +N3380G2X3.5011Y1.7669I-.2525J-.2734 +N3390G2X3.5236Y1.6957I-.1074J-.073 +N3400G2X3.5185Y1.6344I-.3196J-.0045 +N3410G2X3.5028Y1.5802I-.2651J.0479 +N3420G2X3.4695Y1.5236I-.2134J.0874 +N3430G2X3.3618Y1.3897I-22.6068J18.0644 +N3440G3X3.2433Y1.2263I1.5011J-1.2141 +N3450G2X3.2111Y1.1874I-.1845J.1197 +N3460G2X3.1389Y1.1394I-.1687J.1757 +N3470G2X3.0656Y1.1246I-.0716J.166 +N3480G2X3.0314Y1.133I.0007J.077 +N3490G2X2.9976Y1.1593I.0516J.1014 +N3500G2X2.9759Y1.191I.1183J.1042 +N3510G1X2.9541Y1.233Z-0.01 +N3520G3X2.9122Y1.2958I-.3209J-.1681 +N3530G3X2.8824Y1.3195I-.0711J-.0589 +N3540G1X2.7304Y1.3809Z-0.01 +N3550G2X2.582Y1.442I8.9839J22.0271 +N3560G00X2.582Y1.442Z0.1 +N3570G00X2.4811Y1.3039Z0.1 +N3580G1X2.4811Y1.3039Z-0.01F12 +N3590G2X2.5227Y1.2777I-.1753J-.3249F24 +N3600G2X2.6012Y1.1952I-.1843J-.2539 +N3610G2X2.6473Y1.0866I-.2817J-.1837 +N3620G2X2.6573Y1.0229I-.4554J-.1043 +N3630G2X2.6583Y.9824I-.32J-.028 +N3640G2X2.6537Y.9594I-.0742J.0029 +N3650G2X2.6386Y.9294I-.1433J.0533 +N3660G2X2.5935Y.8752I-.2526J.1642 +N3670G2X2.4807Y.7793I-.9166J.9642 +N3680G2X2.3002Y.6547I-1.4907J1.9661 +N3690G2X2.1501Y.5722I-.7975J1.2727 +N3700G2X1.9556Y.4996I-.5046J1.056 +N3710G2X1.6308Y.4876I-.1881J.6847 +N3720G2X1.4388Y.544I.2098J1.0692 +N3730G2X1.0721Y.7218I1.0191J2.5686 +N3740G2X.9269Y.8163I.8429J1.4542 +N3750G2X.8593Y.8765I.2694J.3707 +N3760G2X.8236Y.9274I.1714J.158 +N3770G2X.8146Y.9629I.0715J.0369 +N3780G2X.8379Y1.1175I.4674J.0086 +N3790G2X.9396Y1.2654I.3037J-.0998 +N3800G2X.9782Y1.2905I.1356J-.1664 +N3810G3X1.0539Y1.3299I-1.834J3.616 +N3820G3X1.1835Y1.4004I-4.4819J8.394 +N3830G3X1.3448Y1.4911I-7.2425J13.0721 +N3840G3X1.3795Y1.4207I1.4811J.688 +N3850G3X1.4028Y1.3803I.5107J.2678 +N3860G3X1.484Y1.2783I.5084J.3215 +N3870G3X1.6633Y1.177I.2689J.2665 +N3880G3X1.7754Y1.1653I.099J.4066 +N3890G3X1.8544Y1.1762I-.0117J.378 +N3900G3X1.968Y1.2323I-.0707J.2858 +N3910G3X2.0233Y1.2858I-.2603J.3244 +N3920G3X2.0893Y1.3785I-.4769J.4094 +N3930G3X2.1496Y1.4911I-1.5361J.8965 +N3940G3X2.2501Y1.4324I8.3749J14.2267 +N3950G3X2.309Y1.3988I2.8115J4.8538 +N3960G3X2.4811Y1.3039I5.303J9.4159 +N3970G00X2.4811Y1.3039Z0.1 +N3980G00Z0.4 +N3990G00X0Y0 +N4000M05 +N4010M30 +N4020% diff --git a/tests/test-files/unsupported/Snow White.tap b/tests/test-files/unsupported/Snow White.tap new file mode 100644 index 0000000..2757671 --- /dev/null +++ b/tests/test-files/unsupported/Snow White.tap @@ -0,0 +1,170 @@ +( Snow White ) +N100G20G17G90G40G49G80 +N110G70G91.1 +N120T1M06 +N140G00G43Z0.5H1 +N150S12000M03 +N180G94 +N190 (Engrave or Vinyl Cut) +N200G00X2.445Y1.5325Z0.2 +N210G1Z-.01F10.0 +N220G2X2.57Y1.6325I1.52J-1.7725F20.0 +N230G3X2.6975Y1.7325I-1.925J2.5875 +N240G3X2.835Y1.9175I-.305J.37 +N250G3X2.8975Y2.22I-.78J.3225 +N260G3X2.755Y2.7925I-1.1075J.0275 +N270G3X2.48Y3.235I-5.635J-3.1975 +N280G3X2.26Y2.4375I1.0375J-.7125 +N290G3X2.445Y1.5325I3.4725J.2325 +N300G00Z0.2 +N310G00X2.9225Y1.46 +N320G1Z-.01F10.0 +N330G3X3.3075Y1.635I-.075J.67F20.0 +N340G3X3.4675Y1.965I-.345J.37 +N350G3X3.425Y2.3I-.8125J.065 +N360G3X3.26Y2.5625I-.6625J-.2325 +N370G2X3.3425Y2.1325I-7.26J-1.65 +N380G2X3.35Y2.0075I-.61J-.1025 +N390G2X3.2575Y1.7525I-.4425J.0175 +N400G2X2.9225Y1.46I-.9325J.73 +N410G00Z0.2 +N470G00X3.42Y6.7575 +N480G1Z-.01F10.0 +N490G3X3.8575Y6.9375I-.17J1.0425F20.0 +N500G3X4.1425Y7.265I-.515J.73 +N510G2X3.8375Y7.0275I-2.375J2.705 +N520G2X3.42Y6.7575I-3.39J4.815 +N530G00Z0.2 +N540G00X3.18Y5.915 +N550G1Z-.01F10.0 +N560G1X3.28Y5.79F20.0 +N570G2X3.375Y5.665I-2.155J-1.76 +N580G2X3.455Y5.385I-.3375J-.245 +N590G2X3.325Y5.04I-.6675J.055 +N600G2X2.865Y4.875I-.355J.2625 +N610G2X2.3925Y5.0125I1.3875J5.6575 +N620G2X2.7925Y4.81I-4.5375J-9.455 +N630G2X2.9575Y4.71I-.94J-1.76 +N640G2X3.485Y4.0025I-.725J-1.0875 +N650G2X3.6925Y2.89I-5.035J-1.525 +N660G3X3.265Y3.3025I-20.3225J-20.755 +N670G3X3.1825Y3.37I-.6325J-.675 +N680G3X2.465Y3.7675I-1.825J-2.4525 +N690G3X2.0975Y3.8375I-.37J-.9525 +N700G2X3.0425Y3.3475I-3.105J-7.16 +N710G2X3.4725Y3.0025I-1.0825J-1.78 +N720G2X4.0375Y2.3525I-7.0775J-6.7275 +N730G2X4.31Y1.95I-2.4375J-1.9375 +N740G2X4.4675Y1.0975I-1.155J-.655 +N750G2X4.315Y.615I-1.6075J.24 +N760G2X4.0125Y.0975I-3.8775J1.925 +N770G2X3.93Y.05I-.09J.0625 +N780G3X3.7125Y.53I-.765J-.0575 +N790G3X2.925Y1.0775I-1.8125J-1.775 +N800G3X2.435Y1.17I-.4425J-1 +N810G2X1.505Y1.1875I-.3175J7.0825 +N820G2X1.3825Y1.24I.02J.2225 +N830G2X1.2425Y1.405I.38J.4575 +N840G1X1.2825Y1.435 +N850G1X1.3225Y1.46 +N860G2X1.845Y1.5475I.375J-.635 +N870G3X2.5275Y1.4225I3.695J18.2125 +N880G1X2.2225Y1.515 +N890G2X2.0475Y1.73I.07J.235 +N900G3X1.9475Y2.7025I-22.19J-1.765 +N910G3X1.79Y3.1625I-1.1675J-.145 +N920G1X1.6725Y2.85 +N930G3X1.56Y2.5375I5.2225J-2.0525 +N940G3X1.6525Y1.98I.58J-.19 +N950G3X1.9925Y1.585I3.48J2.6375 +N960G1X1.85Y1.605 +N970G1X1.6725Y1.62 +N980G2X1.46Y1.7225I.02J.31 +N990G2X1.1875Y2.165I1.12J.9975 +N1000G2X1.1675Y2.4225I.4J.16 +N1010G2X1.2925Y2.8525I4.3875J-1.03 +N1020G1X1.2525Y2.8325 +N1030G1X1.235Y2.8225 +N1040G3X.9575Y2.5725I1.245J-1.6725 +N1050G3X.8575Y2.415I.3725J-.3475 +N1060G3X.94Y1.98I.3775J-.1525 +N1070G3X1.435Y1.6025I1.51J1.4575 +N1080G3X1.3325Y1.5225I.375J-.59 +N1090G2X1.2075Y1.485I-.1025J.11 +N1100G2X.8575Y1.66I.095J.63 +N1110G2X.5575Y2.2375I.73J.7425 +N1120G2X.6875Y2.74I.6425J.1025 +N1130G1X1.06Y3.2175 +N1140G3X1.1725Y3.44I-.505J.3925 +N1150G3X1.1575Y3.5725I-.1775J.05 +N1160G3X.935Y3.7675I-.36J-.185 +N1170G2X.5025Y4.1075I.2975J.8275 +N1180G2X.15Y4.7175I4.4125J2.9475 +N1190G2X.055Y5.02I.97J.475 +N1200G2X.07Y5.735I1.9375J.315 +N1210G2X.465Y6.215I.65J-.135 +N1220G3Y5.9825I.49J-.1175 +N1230G3X.5675Y5.7725I.505J.115 +N1240G3X.6625Y5.685I.3825J.3075 +N1250G3X1.05Y5.425I3.6875J5.11 +N1260G2X.5925Y5.91I2.8075J3.1 +N1270G2X.515Y6.0925I.2875J.23 +N1280G2X.6175Y6.3275I.2475J.0325 +N1290G2X.8Y6.4325I.6025J-.825 +N1300G3X.8575Y6.5125I-.04J.09 +N1310G1X.9075Y6.89 +N1320G2X1.1475Y7.5225I1.5125J-.215 +N1330G2X1.7275Y8.1225I1.9475J-1.295 +N1340G2X2.1125Y8.2625I.4325J-.6 +N1350G2X2.905Y8.1325I.12J-1.765 +N1360G3X2.57Y7.6775I2.885J-2.4825 +N1370G3X2.42Y7.2525I.8525J-.5375 +N1380G2X2.7075Y7.7925I4.635J-2.13 +N1390G2X2.9325Y8.09I1.6275J-.9975 +N1400G3X3.0325Y8.0025I1.355J1.4325 +N1410G3X3.0725Y7.975I.1725J.21 +N1420G2X2.885Y8.3875I.6875J.5625 +N1430G2X2.9575Y8.645I.3025J.0525 +N1440G2X3.22Y8.6125I.12J-.1075 +N1450G3X3.3825Y8.3275I4.395J2.325 +N1460G1X3.4675Y8.315 +N1470G1X3.51Y8.3075 +N1480G2X3.5525Y8.2275I-.02J-.0625 +N1490G2X3.445Y8.07I-.2775J.0725 +N1500G3X3Y7.675I1.875J-2.57 +N1510G3X2.6925Y7.2675I1.73J-1.625 +N1520G1X2.865Y7.4625 +N1530G2X3.04Y7.6575I3.15J-2.6975 +N1540G2X3.4875Y8.06I3.24J-3.1475 +N1550G2X4.115Y8.0675I.3175J-.405 +N1560G2X4.2575Y7.5625I-.2575J-.345 +N1570G3X4.26Y7.28I.3525J-.1375 +N1580G2X4.3025Y6.4175I-1.195J-.49 +N1590G3X4.2725Y6.2025I.67J-.2025 +N1600G3X4.355Y6.235I-.0975J.37 +N1610G3X4.4975Y6.3225I-.6425J1.2 +N1620G2X4.4125Y6.2025I-.325J.1375 +N1630G2X4.2875Y6.1275I-.24J.2575 +N1640G3X4.23Y5.9625I.035J-.105 +N1650G3X4.4425Y5.69I1.725J1.135 +N1660G2X4.4475Y5.52I-.095J-.0875 +N1670G1X4.325Y5.38 +N1680G3Y5.2725I.06J-.055 +N1690G2X4.3175Y5.0725I-.105J-.095 +N1700G3X4.27Y4.94I.1075J-.115 +N1710G2X4.23Y4.805I-.1775J-.0225 +N1720G3X4.1525Y4.67I.355J-.29 +N1730G2X4.0925Y4.53I-1.1525J.4225 +N1740G2X3.8075Y4.35I-.2925J.15 +N1750G3X3.475Y4.3025I.035J-1.4125 +N1760G3X3.3125Y4.51I-3.0125J-2.2075 +N1770G3X3.105Y4.74I-3.9825J-3.3775 +N1780G3X3.4075Y5.0225I-.6225J.9775 +N1790G3X3.55Y5.335I-.65J.4875 +N1800G3X3.4425Y5.6875I-.37J.08 +N1810G3X3.18Y5.915I-2.1425J-2.2275 +N1830G00Z0.5 +N1840G00X0Y0 +N1850M05 +N1860M30 +N1870% diff --git a/tests/test-files/unsupported/Star Trek.tap b/tests/test-files/unsupported/Star Trek.tap new file mode 100644 index 0000000..02e98a3 --- /dev/null +++ b/tests/test-files/unsupported/Star Trek.tap @@ -0,0 +1,411 @@ +(Tweakie.CNC) +G00G21G17G90G40G49G80 +G71G91.1 +T1M06 +S12000M03 +G94 M63P1 F1016.0 +X0.000Y0.000 +G00X0.033Y15.914M63P1 +G1X0.033Y15.914M62P1 +G1X13.855Y13.140M62P1 +G1X8.012Y1.013 +G1X18.895Y8.132 +G1X28.215Y0.000 +G00X28.215Y0.000M63P1 +G00X28.244Y0.000M63P1 +G1X28.244Y0.000M62P1 +G3X27.385Y6.606I-1605.937J-205.318 +G2X26.567Y13.218I408.701J53.962 +G1X42.895Y23.862M62P1 +G2X42.640Y26.315I527.406J55.934 +G3X42.374Y28.766I-175.888J-17.827 +G2X42.407Y29.013I0.506J0.058 +G2X42.519Y29.213I0.806J-0.320 +G3X42.412Y29.252I-0.205J-0.396 +G2X42.317Y29.318I0.033J0.148 +G2X42.301Y29.378I0.086J0.056 +G3X42.298Y29.628I-2.420J0.102 +G2X38.881Y28.566I-171.156J544.552 +G2X21.945Y23.371I-4108.938J13365.432 +G1X13.257Y33.082M62P1 +G3X13.319Y26.726I1947.056J15.903 +G2X13.384Y20.371I-2736.022J-31.279 +G1X0.672Y16.140M62P1 +G1X0.165Y15.991 +G2X0.033Y15.973I-0.124J0.433 +G00X0.033Y15.973M63P1 +G00X17.110Y11.385M63P1 +G1X17.110Y11.385M62P1 +G1X15.476Y16.162M62P1 +G1X19.386Y12.709 +G1X18.317Y17.815 +G1X21.662Y14.034 +G00X21.662Y14.034M63P1 +G00X21.597Y16.717M63P1 +G1X21.597Y16.717M62P1 +G2X21.729Y17.275I1.794J-0.130 +G2X22.387Y18.023I1.420J-0.588 +G2X24.667Y16.134I0.784J-1.374 +G2X21.709Y16.053I-1.494J0.515 +G2X21.614Y16.381I1.498J0.610 +G2X21.592Y16.715I1.527J0.270 +G1X21.656Y18.260M62P1 +G1X21.721Y19.804 +G00X21.721Y19.804M63P1 +G00X24.434Y19.901M63P1 +G1X24.434Y19.901M62P1 +G2X24.288Y20.373I1.738J0.796 +G2X24.403Y21.161I1.268J0.218 +G2X25.914Y21.870I1.200J-0.592 +G2X26.938Y20.552I-0.312J-1.299 +G1X26.934Y20.479M62P1 +G1X26.913Y20.313 +G2X26.692Y19.043I-23.731J3.479 +G3X26.234Y16.694I168.388J-34.014 +G1X28.588Y18.064M62P1 +G00X28.588Y18.064M63P1 +G00X45.529Y30.532M63P1 +G1X45.529Y30.532M62P1 +G2X52.306Y32.524I1246.421J-4228.934 +G2X57.375Y34.003I692.553J-2363.694 +G2X56.947Y34.874I13.755J7.298 +G2X56.880Y35.094I0.801J0.363 +G3X54.513Y35.505I-79.750J-452.575 +G2X53.927Y35.637I0.980J5.738 +G2X53.776Y35.735I0.081J0.290 +G2X53.584Y35.989I2.608J2.160 +G3X53.771Y36.194I-2.433J2.401 +G2X53.974Y36.384I0.875J-0.734 +G1X64.244Y41.566M62P1 +G2X66.059Y42.433I31.629J-63.907 +G2X66.911Y42.588I0.727J-1.579 +G2X67.379Y42.509I-0.184J-2.534 +G2X68.012Y42.295I-1.289J-4.857 +G2X68.081Y42.256I-0.123J-0.297 +G3X68.158Y42.232I0.072J0.096 +G1X97.113Y57.360M62P1 +G2X97.301Y57.343I0.078J-0.192 +G3X97.482Y57.289I0.187J0.297 +G3X97.655Y57.328I0.007J0.372 +G2X98.328Y57.556I1.159J-2.314 +G2X98.965Y57.542I0.287J-1.502 +G2X100.539Y56.809I-0.978J-4.155 +G2X101.682Y54.510I-1.699J-2.278 +G2X100.506Y52.362I-2.585J0.019 +G3X100.158Y51.962I0.526J-0.809 +G2X99.790Y51.580I-0.745J0.349 +G1X99.044Y51.199M62P1 +G3X98.997Y51.036I0.170J-0.137 +G2X98.834Y50.767I-0.252J-0.031 +G1X98.825Y50.764M62P1 +G1X98.815Y50.761 +G1X91.578Y47.249 +G1X91.757Y46.945 +G3X91.941Y46.645I5.339J3.076 +G1X99.580Y35.901M62P1 +G1X100.113Y39.541 +G1X100.369Y41.266 +G1X97.290Y39.873 +G1X96.261Y41.438 +G1X95.234Y43.003 +G2X94.721Y43.810I29.361J19.221 +G2X94.622Y43.995I1.430J0.882 +G3X105.371Y50.313I-5698.440J9707.666 +G3X108.316Y52.054I-429.841J730.409 +G3X109.355Y50.736I19.078J13.966 +G3X110.902Y49.568I3.367J2.853 +G1X109.130Y45.300M62P1 +G3X108.571Y45.288I0.002J-13.233 +G3X108.310Y45.218I0.026J-0.618 +G1X103.815Y42.911M62P1 +G1X103.064Y37.475 +G1X107.447Y39.910 +G1X109.876Y45.801 +G2X111.100Y48.684I199.626J-83.077 +G2X111.700Y50.012I42.912J-18.592 +G2X110.669Y53.002I1.683J2.253 +G2X111.648Y55.119I6.751J-1.835 +G2X113.893Y57.578I9.877J-6.763 +G2X118.293Y60.619I19.696J-23.799 +G2X123.515Y63.110I19.679J-34.530 +G2X135.336Y66.322I20.864J-53.427 +G2X141.990Y66.854I6.702J-41.982 +G2X146.129Y66.335I0.019J-16.611 +G2X148.819Y65.131I-2.158J-8.426 +G2X149.586Y64.390I-1.689J-2.516 +G3X149.631Y64.337I0.343J0.248 +G2X149.664Y64.275I-0.082J-0.083 +G2X149.657Y64.167I-0.216J-0.040 +G3X149.528Y63.757I18.047J-5.881 +G2X147.830Y60.647I-8.233J2.478 +G2X146.277Y59.121I-9.569J8.180 +G2X142.979Y56.791I-17.061J20.661 +G2X134.226Y52.571I-27.721J46.307 +G2X128.342Y50.681I-22.521J59.994 +G2X121.007Y49.017I-24.640J91.649 +G1X118.735Y48.598M62P1 +G1X117.386Y46.059 +G2X116.925Y45.260I-14.515J7.832 +G2X116.752Y45.026I-1.402J0.861 +G3X116.173Y43.825I1.808J-1.611 +G3X116.203Y41.832I5.328J-0.915 +G3X116.761Y40.032I9.280J1.888 +G3X117.863Y37.908I14.062J5.947 +G3X118.862Y36.588I7.724J4.810 +G3X120.195Y35.590I3.284J2.993 +G2X120.214Y35.518I-0.022J-0.045 +G2X120.085Y35.423I-0.191J0.126 +G1X104.337Y29.005M62P1 +G2X101.797Y28.032I-32.777J81.742 +G2X100.412Y27.712I-1.982J5.422 +G2X99.216Y27.701I-0.653J6.280 +G2X98.475Y27.879I0.220J2.552 +G3X98.322Y27.906I-0.139J-0.343 +G3X97.361Y27.833I0.580J-14.031 +G3X95.234Y27.527I3.603J-32.651 +G3X93.363Y27.124I4.542J-25.640 +G2X92.430Y26.957I-1.646J6.479 +G2X91.665Y26.942I-0.464J4.324 +G2X91.460Y26.981I0.062J0.891 +G2X91.401Y27.025I0.033J0.107 +G1X91.272Y27.350M62P1 +G1X91.446Y28.021 +G3X91.404Y28.258I-0.664J0.006 +G2X91.299Y29.216I1.844J0.687 +G2X91.360Y29.473I1.361J-0.189 +G2X91.475Y29.729I1.455J-0.500 +G2X91.050Y30.397I8.846J6.099 +G2X90.951Y30.802I0.629J0.368 +G1X90.950Y30.826M62P1 +G2X90.955Y30.848I0.032J0.005 +G1X93.752Y32.314M62P1 +G3X95.272Y33.140I-66.215J123.808 +G1X96.788Y33.971M62P1 +G2X95.029Y36.287I50.562J40.220 +G1X88.201Y45.708M62P1 +G3X66.691Y35.913I8550.998J-18808.443 +G2X61.307Y33.480I-357.189J783.279 +G1X60.292Y33.033M62P1 +G2X60.254Y33.036I-0.010J0.117 +G2X60.133Y33.072I0.305J1.260 +G1X59.415Y33.403M62P1 +G3X59.301Y33.386I-0.017J-0.278 +G2X58.847Y33.297I-0.502J1.347 +G2X58.321Y33.349I-0.067J1.989 +G2X57.786Y33.548I0.536J2.265 +G1X48.757Y27.500M62P1 +G1X45.529Y30.532 +G00X45.529Y30.532M63P1 +G00X54.098Y20.976M63P1 +G1X54.098Y20.976M62P1 +G2X54.320Y22.090I1.310J0.318 +G2X56.163Y22.185I0.960J-0.702 +G2X56.493Y21.287I-0.952J-0.859 +G2X56.111Y20.461I-1.160J0.035 +G2X56.017Y20.388I-0.507J0.561 +G1X55.920Y20.321M62P1 +G2X56.379Y20.476I0.839J-1.733 +G2X57.154Y20.390I0.254J-1.261 +G2X57.938Y19.016I-0.540J-1.218 +G2X56.262Y17.848I-1.357J0.160 +G2X55.963Y17.973I0.235J0.979 +G2X55.598Y18.263I1.105J1.766 +G00X55.598Y18.263M63P1 +G00X51.467Y17.269M63P1 +G1X51.467Y17.269M62P1 +G2X51.585Y17.835I1.815J-0.082 +G2X52.230Y18.608I1.450J-0.555 +G2X54.583Y16.763I0.829J-1.366 +G2X51.598Y16.601I-1.523J0.479 +G2X51.493Y16.931I1.507J0.661 +G2X51.462Y17.266I1.524J0.313 +G1X51.485Y18.827M62P1 +G1X51.509Y20.389 +G00X51.509Y20.389M63P1 +G00X47.082Y11.763M63P1 +G1X47.082Y11.763M62P1 +G1X45.302Y16.541M62P1 +G1X49.344Y13.162 +G1X48.126Y18.288 +G1X51.606Y14.561 +G00X51.606Y14.561M63P1 +G00X108.816Y52.254M63P1 +G1X108.816Y52.254M62P1 +G3X109.429Y51.353I3.696J1.858 +G3X110.486Y50.388I5.309J4.752 +G2X110.154Y51.128I16.941J8.047 +G2X109.973Y51.975I2.108J0.892 +G2X110.773Y54.890I5.335J0.104 +G2X112.853Y57.506I12.181J-7.550 +G2X116.779Y60.578I14.897J-14.993 +G2X123.044Y63.694I21.600J-35.571 +G2X137.179Y67.296I21.074J-53.161 +G2X143.440Y67.420I3.733J-30.541 +G2X147.075Y66.695I-1.332J-16.160 +G2X149.274Y65.542I-2.230J-6.929 +G2X149.556Y65.313I-3.776J-4.924 +G1X149.833Y65.079M62P1 +G3X149.918Y66.248I-25.520J2.441 +G3X149.670Y67.421I-2.350J0.117 +G3X148.684Y68.458I-2.197J-1.103 +G3X147.078Y69.164I-4.310J-7.617 +G3X145.448Y69.576I-3.897J-11.995 +G3X143.054Y69.900I-4.686J-25.641 +G3X142.009Y69.986I-8.860J-100.393 +G3X141.764Y70.000I-0.428J-5.497 +G3X140.151Y69.989I-0.668J-20.137 +G3X135.996Y69.614I2.276J-48.437 +G3X128.793Y68.151I7.236J-54.082 +G3X119.281Y64.609I15.171J-55.285 +G3X113.568Y61.352I19.420J-40.709 +G3X110.418Y58.662I9.976J-14.866 +G3X108.499Y55.118I5.939J-5.509 +G3X108.816Y52.254I4.017J-1.005 +G00X108.816Y52.254M63P1 +G00X119.882Y53.603M63P1 +G1X119.882Y53.603M62P1 +G3X120.315Y53.118I0.967J0.427 +G3X121.513Y52.649I2.087J3.568 +G3X123.377Y52.339I3.935J17.877 +G3X128.276Y52.052I5.048J44.327 +G3X130.398Y52.153I0.070J20.929 +G3X131.853Y52.586I-0.393J3.983 +G3X132.461Y52.954I-2.509J4.823 +G3X134.803Y54.677I-35.226J50.343 +G3X139.791Y58.694I-97.462J126.131 +G3X140.505Y59.461I-2.741J3.267 +G3X140.801Y60.014I-1.895J1.372 +G3X140.630Y60.798I-0.693J0.259 +G3X139.949Y61.191I-1.086J-1.094 +G3X137.573Y61.523I-2.484J-9.107 +G3X136.905Y61.516I-0.167J-14.581 +G3X136.159Y61.475I0.627J-18.239 +G3X130.781Y60.515I2.035J-26.962 +G3X125.306Y58.381I8.580J-30.097 +G3X122.155Y56.516I12.001J-23.876 +G3X120.481Y55.059I5.571J-8.094 +G3X119.914Y54.276I3.098J-2.838 +G3X119.882Y53.603I0.657J-0.368 +G00X119.882Y53.603M63P1 +G00X116.901Y44.536M63P1 +G1X116.901Y44.536M62P1 +G3X116.643Y43.254I3.115J-1.294 +G3X116.856Y41.676I5.814J-0.020 +G3X118.487Y38.100I12.132J3.374 +G3X120.255Y36.129I7.574J5.014 +G3X120.810Y35.888I0.690J0.830 +G3X121.190Y35.925I0.108J0.860 +G3X121.954Y36.426I-0.554J1.678 +G3X122.148Y36.698I-1.135J1.013 +G3X122.273Y36.998I-1.257J0.701 +G2X122.381Y37.145I0.255J-0.074 +G3X122.963Y37.576I-3.842J5.799 +G3X123.696Y38.208I-13.350J16.201 +G3X123.895Y38.590I-0.415J0.459 +G3X123.901Y38.791I-1.053J0.132 +G3X123.853Y39.231I-5.131J-0.336 +G1X123.755Y39.822M62P1 +G2X123.808Y39.864I0.075J-0.039 +G3X124.057Y39.965I-0.291J1.073 +G3X124.546Y40.399I-0.728J1.313 +G3X124.721Y40.886I-0.761J0.549 +G1X124.691Y41.709M62P1 +G3X124.559Y42.241I-2.488J-0.337 +G3X123.868Y43.656I-7.373J-2.721 +G3X122.802Y45.037I-7.163J-4.433 +G3X121.772Y45.274I-0.695J-0.663 +G1X121.215Y45.003M62P1 +G2X121.108Y45.051I0.006J0.156 +G3X120.697Y45.277I-0.561J-0.534 +G3X120.594Y45.277I-0.052J-0.261 +G3X120.169Y45.173I0.926J-4.694 +G1X118.758Y44.702M62P1 +G2X118.667Y44.744I0.024J0.172 +G3X118.336Y44.966I-0.982J-1.111 +G3X117.884Y45.074I-0.471J-0.963 +G3X117.361Y44.983I-0.024J-1.402 +G3X116.901Y44.536I0.288J-0.757 +G00X116.901Y44.536M63P1 +G00X93.246Y38.028M63P1 +G1X93.246Y38.028M62P1 +G1X90.509Y41.679M62P1 +G1X83.618Y38.141 +G3X83.399Y38.323I-2.466J-2.727 +G3X83.259Y38.374I-0.147J-0.191 +G3X81.697Y38.093I-0.115J-3.853 +G3X80.447Y37.537I7.572J-18.691 +G3X77.924Y36.269I47.356J-97.340 +G3X76.545Y35.511I15.499J-29.853 +G1X75.942Y35.150M62P1 +G3X75.907Y35.071I0.145J-0.112 +G2X75.825Y34.740I-2.787J0.515 +G2X75.559Y34.112I-3.341J1.045 +G2X74.858Y33.473I-1.274J0.693 +G3X73.796Y32.977I7.530J-17.515 +G2X71.845Y32.012I-61.539J121.888 +G1X71.848Y31.865M62P1 +G1X73.124Y31.463 +G2X73.271Y31.332I-0.286J-0.471 +G3X73.402Y31.185I1.292J1.017 +G1X52.220Y23.471M62P1 +G2X50.074Y25.448I366.897J400.251 +G2X42.668Y32.321I4424.031J4774.434 +G3X43.305Y25.989I4481.152J447.293 +G1X43.943Y19.657M62P1 +G3X35.680Y15.788I2153.789J-4610.324 +G3X32.245Y14.167I374.766J-798.474 +G2X34.889Y13.988I-27.376J-425.352 +G2X44.334Y13.313I-383.394J-5429.970 +G2X41.502Y5.767I-2582.688J965.061 +G3X40.811Y3.875I91.554J-34.516 +G2X40.328Y2.569I-46.055J16.288 +G3X39.876Y1.253I17.311J-6.683 +G2X40.168Y1.515I3.609J-3.735 +G2X41.541Y2.635I67.991J-81.904 +G2X45.804Y6.032I493.654J-615.236 +G3X50.074Y9.418I-1468.170J1855.893 +G1X60.084Y2.168M62P1 +G1X57.220Y15.214 +G1X60.307Y18.057 +G3X67.062Y24.336I-1583.770J1710.541 +G2X73.809Y30.625I4771.573J-5112.781 +G3X74.289Y30.177I1.309J0.922 +G3X74.856Y29.990I0.686J1.133 +G2X75.362Y29.837I-0.117J-1.293 +G3X76.338Y29.748I0.590J1.079 +G3X76.794Y29.946I-0.867J2.626 +G2X77.236Y30.175I5.774J-10.593 +G2X85.239Y34.105I1438.599J-2919.446 +G3X93.246Y38.028I-4291.786J8770.125 +G00X93.246Y38.028M63P1 +G00X120.394Y53.771M63P1 +G1X120.394Y53.771M62P1 +G2X120.365Y53.965I0.134J0.119 +G2X121.013Y54.786I2.041J-0.945 +G2X122.540Y55.908I17.166J-21.757 +G2X127.169Y58.440I15.061J-22.033 +G2X132.671Y60.210I12.518J-29.477 +G2X135.862Y60.707I5.346J-23.809 +G2X138.954Y60.767I1.976J-22.289 +G2X140.089Y60.548I-0.205J-4.113 +G2X140.280Y60.310I-0.093J-0.271 +G2X140.207Y59.997I-0.472J-0.055 +G2X139.616Y59.282I-3.321J2.145 +G2X138.902Y58.649I-8.984J9.412 +G2X134.721Y55.306I-118.849J144.352 +G2X133.275Y54.207I-53.089J68.381 +G2X132.537Y53.682I-12.854J17.294 +G2X131.801Y53.202I-12.653J18.608 +G2X130.918Y52.826I-1.649J2.641 +G2X129.744Y52.649I-1.473J5.799 +G2X127.062Y52.633I-1.517J30.439 +G1X124.008Y52.833M62P1 +G2X121.545Y53.207I2.159J22.538 +G2X120.819Y53.451I0.662J3.175 +G2X120.394Y53.771I0.566J1.194 +G00X120.394Y53.771M63P1 +M63P1 +G00X0.000Y0.000 +M09 +M30 +% diff --git a/tests/test-files/unsupported/Trispokedovetiles(laser).tap b/tests/test-files/unsupported/Trispokedovetiles(laser).tap new file mode 100644 index 0000000..b9ca8d9 --- /dev/null +++ b/tests/test-files/unsupported/Trispokedovetiles(laser).tap @@ -0,0 +1,64 @@ +(Laser cut, interlocking, Trispokedovetiles by Peter Dow) + +G90 (set absolute distance mode) +G90.1 (set absolute distance mode for arc centers) +G17 (set active plane to XY) +G21 (set units to mm) +F600 (set feed-rate) +M10 P1 (turns laser OFF) +G0 X 65.8393 Y 49.0906 +M11 P1 (turns laser ON) +G3 Y 61.7398 I 65.8393 J 55.4203 +G3 Y 49.0906 I 65.8393 J 55.4101 +M10 P1 +G0 X 93.3399 Y 36.7792 +M11 P1 +G3 Y 42.2783 I 93.3399 J 39.5300 +G3 Y 36.7792 I 93.3399 J 39.5300 +M10 P1 +G0 X 38.3388 +M11 P1 +G3 Y 42.2783 I 38.3388 J 39.5300 +G3 Y 36.7792 I 38.3388 J 39.5300 +M10 P1 +G0 X 65.8393 Y 84.4093 +M11 P1 +G3 Y 89.9084 I 65.8393 J 87.1601 +G3 Y 84.4093 I 65.8393 J 87.1601 +M10 P1 +G0 X 93.3399 Y 103.0402 +M11 P1 +G1 X 86.9010 +G3 X 82.5094 Y 98.3285 I 86.9010 J 98.6384 +G3 X 111.3409 Y 48.3895 I 148.3411 J 103.0402 +G3 X 117.6198 Y 49.8297 I 113.8098 J 52.0294 +G1 X 120.8405 Y 55.4101 +G1 X 127.2794 +G2 X 131.6711 Y 50.6984 I 127.2794 J 51.0108 +G2 X 102.8395 Y 0.7595 I 65.8393 J 55.4101 +G2 X 96.5606 Y 2.1996 I 100.3706 J 4.3993 +G1 X 93.3399 Y 7.7800 +G1 X 96.5606 Y 13.3604 +G3 X 94.6709 Y 19.5199 I 92.7506 J 15.5600 +G3 X 37.0103 I 65.8393 J-39.8501 +G3 X 35.1206 Y 13.3604 I 38.9306 J 15.5600 +G1 X 38.3388 Y 7.7800 +G1 X 35.1206 Y 2.1996 +G2 X 28.8392 Y 0.7595 I 31.3106 J 4.3993 +G2 X 0.0102 Y 50.6984 I 65.8393 J 55.4101 +G2 X 4.3993 Y 55.4101 I 4.3993 J 51.0108 +G1 X 10.8407 +G1 X 14.0589 Y 49.8297 +G3 X 20.3403 Y 48.3895 I 17.8689 J 52.0294 +G3 X 49.1693 Y 98.3285 I-16.6599 J 103.0402 +G3 X 44.7802 Y 103.0402 I 44.7802 J 98.6384 +G1 X 38.3388 +G1 X 35.1206 Y 108.6206 +G2 X 37.0103 Y 114.7801 I 38.9306 J 110.8202 +G2 X 94.6709 I 65.8393 J 55.4101 +G2 X 96.5606 Y 108.6206 I 92.7506 J 110.8202 +G1 X 93.3399 Y 103.0402 +M10 P1 +G0 X 0.0000 Y 0.0000 +M30 +% diff --git a/tests/test-files/unsupported/plug6a.tap b/tests/test-files/unsupported/plug6a.tap new file mode 100644 index 0000000..a67edb2 --- /dev/null +++ b/tests/test-files/unsupported/plug6a.tap @@ -0,0 +1,130 @@ +G00G21G17G90G40G49G80 +G71G91.1 + +S12000M03 +G94 M10P1 F600.0 +X0.000Y0.000 +G00X76.918Y-10.288M10P1 +G1X76.918Y-10.288M11P1 +G1X83.317Y-10.288 +G1X83.317Y-14.187 +G1X76.918Y-14.187 +G1X76.918Y-10.288 +G00X76.918Y-10.288M10P1 +G00X98.918Y-10.288 +G1X98.918Y-10.288M11P1 +G1X105.317Y-10.288 +G1X105.317Y-14.187 +G1X98.918Y-14.187 +G1X98.918Y-10.288 +G00X98.918Y-10.288M10P1 +G00X93.022Y5.812 +G1X93.022Y5.812M11P1 +G1X89.122Y5.812 +G1X89.122Y13.712 +G1X93.022Y13.712 +G1X93.022Y5.812 +G00X93.022Y5.812M10P1 +G00X-75.607Y-10.288 +G1X-75.607Y-10.288M11P1 +G1X-75.607Y-14.187 +G1X-82.006Y-14.187 +G1X-82.006Y-10.288 +G1X-75.607Y-10.288 +G00X-75.607Y-10.288M10P1 +G00X-97.607Y-10.288 +G1X-97.607Y-10.288M11P1 +G1X-97.607Y-14.187 +G1X-104.006Y-14.187 +G1X-104.006Y-10.288 +G1X-97.607Y-10.288 +G00X-97.607Y-10.288M10P1 +G00X-91.836Y5.812 +G1X-91.836Y5.812M11P1 +G1X-91.836Y13.712 +G1X-87.937Y13.712 +G1X-87.937Y5.812 +G1X-91.836Y5.812 +G00X-91.836Y5.812M10P1 + +G00X-15.556Y7.900 +G1X-15.556Y7.900M11P1 +G2X-36.650Y9.539I13.488J310.094 +G2X-49.156Y11.364I21.153J188.675 +G2X-59.846Y13.733I24.394J135.416 +G2X-66.307Y15.887I13.581J51.503 +G1X-69.715Y17.476 +G2X-72.492Y19.421I6.409J12.108 +G1X-73.368Y20.224 +G1X-73.972Y20.718 +G3X-76.569Y22.055I-5.802J-8.079 +G3X-79.360Y22.552I-3.021J-8.872 +G1X-79.361Y22.552 + +G1X-99.112Y22.555 +G3X-102.657Y21.875I0.233J-10.791 +G3X-107.639Y17.790I3.489J-9.335 +G3X-108.710Y15.360I8.094J-5.017 +G3X-109.131Y12.506I10.825J-3.055 +G1X-109.131Y12.505 + +G1X-109.131Y-12.496 +G3X-108.453Y-16.055I10.908J0.233 +G3X-104.382Y-21.048I9.343J3.463 +G3X-101.954Y-22.123I5.022J8.056 +G3X-99.111Y-22.545I3.043J10.709 +G1X-79.424Y-22.540 +G1X-79.388Y-22.535 +G1X-79.168Y-22.520 +G3X-75.571Y-21.598I-0.501J9.434 +G3X-73.102Y-19.977I-4.851J10.075 +G1X-72.307Y-19.259 +G1X-71.489Y-18.581 +G2X-68.981Y-17.071I10.154J-14.026 +G2X-63.518Y-14.835I18.951J-38.502 +G2X-55.994Y-12.757I24.388J-73.663 +G2X-40.945Y-10.070I39.192J-176.018 +G2X-22.523Y-8.256I34.302J-253.893 +G2X16.846Y-7.894I23.114J-372.188 +G2X35.881Y-9.294I-13.948J-319.663 +G2X50.651Y-11.397I-20.156J-194.491 +G2X61.189Y-13.743I-24.422J-134.524 +G2X67.555Y-15.868I-13.517J-51.105 +G1X70.871Y-17.420 +G2X73.696Y-19.397I-6.781J-12.701 +G1X74.410Y-20.057 +G1X75.162Y-20.684 +G3X77.822Y-22.036I5.562J7.648 +G3X80.964Y-22.555I3.308J10.258 + +G1X100.290Y-22.545 +G3X103.641Y-21.937I-0.239J10.842 +G3X108.492Y-18.272I-3.303J9.416 +G3X109.799Y-15.631I-7.810J5.509 +G3X110.309Y-12.496I-10.600J3.334 +G1X110.309Y-12.495 + +G1X110.309Y12.506 +G3X109.631Y16.065I-10.907J-0.233 +G3X105.560Y21.057I-9.343J-3.464 +G3X103.131Y22.134I-5.025J-8.060 +G3X100.290Y22.555I-3.037J-10.689 +G1X100.289Y22.555 + +G1X80.686Y22.540 +G3X77.158Y21.806I0.259J-10.091 +G3X74.187Y19.909I3.623J-8.951 +G1X73.261Y19.069 +G1X72.879Y18.756 +G2X69.069Y16.529I-11.097J14.613 +G2X64.340Y14.738I-21.639J50.004 +G2X54.729Y12.209I-26.464J81.059 +G2X39.610Y9.752I-40.016J198.475 +G2X21.814Y8.147I-32.998J266.303 +G2X-15.556Y7.900I-21.148J372.705 +G00X-15.556Y7.900M10P1 +M10P1 +G00X0.000Y0.000 +M09 +M30 +% From 209ee305ea0f502c1044dfeb4d7e879bed093e17 Mon Sep 17 00:00:00 2001 From: Peter Boin Date: Tue, 22 Aug 2017 14:30:29 +1000 Subject: [PATCH 06/14] added readme --- tests/test-files/unsupported/README.md | 57 ++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 tests/test-files/unsupported/README.md diff --git a/tests/test-files/unsupported/README.md b/tests/test-files/unsupported/README.md new file mode 100644 index 0000000..98db6ad --- /dev/null +++ b/tests/test-files/unsupported/README.md @@ -0,0 +1,57 @@ +# Unsupported Files + +Files containing unsupported gcodes + +We can however still deal with these, workarounds shown below + +## Unsupported GCodes + + +When attempting to process unsupported gcode(s) via a `Machine` the following error (or similar) will be raised + + MachineInvalidState: unsupported gcode(s): 'P1 M10' (machine mode: ) + + +These codes are not currently supported by this library, but you may introduce +them for your project. with the following workaround + +**Workaround** + +Any class inheriting `GCode` is used to parse each gcode string. + +Look to the root `GCode` class definition in `gcodes.py` for more details. + +So, create the following class(es) (anywhere in your codebase, as long as it's +imported) + + +### `M10` / `M11` : Pallet Clamp + + import pygcode + + class GCodePalletClampOn(pygcode.GCode): + """M10: Pallet clamp on""" + word_key = pygcode.Word('M', 10) + word_letter = 'M' + param_letters = set('P') + + class GCodePalletClampOff(pygcode.GCode): + """M10: Pallet clamp off""" + word_key = pygcode.Word('M', 11) + word_letter = 'M' + param_letters = set('P') + + +### `G70` / `G71` : Fixed cycle, multiple repetitive cycle + + import pygcode + + class GCodeFixedCycleMultiRepCycleRough(pygcode.GCode): + """G70: Fixed cycle, multiple repetitive cycle, for finishing (including contours)""" + word_key = pygcode.Word('G', 70) + word_letter = 'G' + + class GCodeFixedCycleMultiRepCycleRough(pygcode.GCode): + """G71: Fixed cycle, multiple repetitive cycle, for roughing (Z-axis emphasis)""" + word_key = pygcode.Word('G', 71) + word_letter = 'G' From 21fb37293c6e06da066a2c188b5f0f03d4a5284b Mon Sep 17 00:00:00 2001 From: Peter Boin Date: Tue, 22 Aug 2017 15:02:48 +1000 Subject: [PATCH 07/14] updates to support more varied file formats --- src/pygcode/gcodes.py | 56 +++++- src/pygcode/machine.py | 35 +++- src/pygcode/words.py | 8 +- .../test-files/Chucks Deer (V-Carve) {3}.tap | 2 +- tests/test-files/Circular Pocket.tap | 6 +- tests/test-files/Colt.tap | 2 +- tests/test-files/Cross2.tap | 2 +- tests/test-files/DB25.tap | 166 +++++++++--------- tests/test-files/Disc3.tap | 2 +- tests/test-files/Horse.tap | 2 +- tests/test-files/Horse2.tap | 2 +- tests/test-files/Mach3 write.tap | 4 +- tests/test-files/Mach4 write.tap | 4 +- tests/test-files/Skull2.tap | 2 +- tests/test-files/Snow White.tap | 2 +- tests/test-files/Star Trek.tap | 2 +- tests/test-files/Trispokedovetiles(laser).tap | 24 +-- tests/test-files/plug6a.tap | 36 ++-- tests/test-files/unsupported/README.md | 1 - tests/test_gcodes.py | 2 +- tests/test_words.py | 6 +- 21 files changed, 217 insertions(+), 149 deletions(-) diff --git a/src/pygcode/gcodes.py b/src/pygcode/gcodes.py index 4449d47..45c7078 100644 --- a/src/pygcode/gcodes.py +++ b/src/pygcode/gcodes.py @@ -341,6 +341,44 @@ class GCode(object): pass +# ======================= Non Operational ======================= +# CODE PARAMETERS DESCRIPTION +# N# Define line number (oldschool) +# O Define program name + +class GCodeDefinition(GCode): + pass + + +class GCodeLineNumber(GCodeDefinition): + """N: Line Number""" + word_letter = 'N' + word_value_configurable = True + exec_order = 0 + + @classmethod + def word_matches(cls, w): + return w.letter == 'N' + + @property + def number(self): + return self.word.value + + +class GCodeProgramName(GCodeDefinition): + """O: Program Name""" + word_letter = 'O' + word_value_configurable = True + exec_order = 1 + + @classmethod + def word_matches(cls, w): + return w.letter == 'O' + + @property + def name(self): + return self.word.value + # ======================= Motion ======================= # (X Y Z A B C U V W apply to all motions) @@ -360,7 +398,7 @@ class GCode(object): class GCodeMotion(GCode): param_letters = set('XYZABCUVW') modal_group = MODAL_GROUP_MAP['motion'] - exec_order = 241 + exec_order = 242 def _process(self, machine): machine.move_to(**self.get_param_dict(letters=machine.axes)) @@ -474,6 +512,18 @@ class GCodeRigidTapping(GCodeMotion): class GCodeCancelCannedCycle(GCodeMotion): """G80: Cancel Canned Cycle""" word_key = Word('G', 80) + # Modal Group + # Technically G80 belongs to the motion modal group, however it's often + # expressed in the same line as another motion command. + # This is alowed, but executed just prior to any other motion command + # eg: G00 G80 + # will leave the machine in rapid motion mode + # Just running G80 will leave machine with no motion mode. + modal_group = None + exec_order = 241 + + def _process(self, machine): + machine.mode.motion = None # ======================= Canned Cycles ======================= @@ -490,7 +540,7 @@ class GCodeCancelCannedCycle(GCodeMotion): class GCodeCannedCycle(GCode): param_letters = set('XYZUVW') modal_group = MODAL_GROUP_MAP['motion'] - exec_order = 241 + exec_order = 242 def _process(self, machine): moveto_coords = self.get_param_dict(letters=machine.axes) @@ -1390,7 +1440,7 @@ def word_gcode_class(word, exhaustive=False): build_maps() # quickly eliminate parameters - if (not exhaustive) and (word.letter not in 'GMFST'): + if (not exhaustive) and (word.letter not in 'GMFSTNO'): return None # by Word Map (faster) diff --git a/src/pygcode/machine.py b/src/pygcode/machine.py index 793abdd..286354d 100644 --- a/src/pygcode/machine.py +++ b/src/pygcode/machine.py @@ -410,20 +410,37 @@ class Machine(object): if not modal_params: return None + if self.mode.motion is None: - raise MachineInvalidState("unable to assign modal parameters when no motion mode is set") - params = copy(self.mode.motion.params) # dict - params.update(dict((w.letter, w) for w in modal_params)) # override retained modal parameters - (modal_gcodes, unasigned_words) = words2gcodes( - [self.mode.motion.word] + list(params.values()) - ) + unasigned_words = modal_params + # forces exception to be raised in next step + else: + params = copy(self.mode.motion.params) # dict + params.update(dict((w.letter, w) for w in modal_params)) # override retained modal parameters + (modal_gcodes, unasigned_words) = words2gcodes( + [self.mode.motion.word] + list(params.values()) + ) + if unasigned_words: - raise MachineInvalidState("modal parameters '%s' cannot be assigned when in mode: %r" % ( - ' '.join(str(x) for x in unasigned_words), self.mode - )) + # Can't process with unknown words on the same line... + # raising: MachineInvalidState + plausable_codes = [w for w in unasigned_words if w.letter in set('GM')] + if plausable_codes: + # words in list are probably valid, but unsupported, G-Codes + # raise exception with a more helpfull message + raise MachineInvalidState("unsupported gcode(s): '%s' (machine mode: %r)" % ( + ' '.join(str(x) for x in unasigned_words), self.mode + )) + else: + # words don't look like gcodes, assuming they're misplaced motion parameters + raise MachineInvalidState("modal parameters '%s' cannot be assigned when in mode: %r" % ( + ' '.join(str(x) for x in unasigned_words), self.mode + )) + if modal_gcodes: assert len(modal_gcodes) == 1, "more than 1 modal code found" return modal_gcodes[0] + return None def block_modal_gcodes(self, block): diff --git a/src/pygcode/words.py b/src/pygcode/words.py index 25d9197..c3dc5ed 100644 --- a/src/pygcode/words.py +++ b/src/pygcode/words.py @@ -4,10 +4,10 @@ import six from .exceptions import GCodeBlockFormatError, GCodeWordStrError -REGEX_FLOAT = re.compile(r'^-?(\d+\.?\d*|\.\d+)') # testcase: ..tests.test_words.WordValueMatchTests.test_float -REGEX_INT = re.compile(r'^-?\d+') -REGEX_POSITIVEINT = re.compile(r'^\d+') -REGEX_CODE = re.compile(r'^\d+(\.\d)?') # similar +REGEX_FLOAT = re.compile(r'^\s*-?(\d+\.?\d*|\.\d+)') # testcase: ..tests.test_words.WordValueMatchTests.test_float +REGEX_INT = re.compile(r'^\s*-?\d+') +REGEX_POSITIVEINT = re.compile(r'^\s*\d+') +REGEX_CODE = re.compile(r'^\s*\d+(\.\d)?') # float, but can't be negative # Value cleaning functions def _clean_codestr(value): diff --git a/tests/test-files/Chucks Deer (V-Carve) {3}.tap b/tests/test-files/Chucks Deer (V-Carve) {3}.tap index 124d4ec..5ced119 100644 --- a/tests/test-files/Chucks Deer (V-Carve) {3}.tap +++ b/tests/test-files/Chucks Deer (V-Carve) {3}.tap @@ -1,6 +1,6 @@ ( CHUCKS DEER{3} 7 X 5 ) N100G00G20G17G90G40G49G80 -N110G70G91.1 +N110G91.1 N120T1M06 N130(TOOL: V-BIT {90 DEG 0.5"}) N140G00G43Z0.8H1 diff --git a/tests/test-files/Circular Pocket.tap b/tests/test-files/Circular Pocket.tap index 7f58fe3..0f1090b 100644 --- a/tests/test-files/Circular Pocket.tap +++ b/tests/test-files/Circular Pocket.tap @@ -1,8 +1,8 @@ (Code by Newfangled Wizard, 15/01/2017) (Version 2.86) (Program Posted for Aluminum ) -G0 G49 G40.1 G17 -G80 G50 G90 G98 +G0 G49 G17 +G80 G90 G98 G21 (mm) (***** Circular Pocket *****) (Xcen=0 Ycen=0 Dia=10) @@ -40,4 +40,4 @@ Y-1.5 X1.5 R1.5 G00 Z2 M5 M9 M30 -% \ No newline at end of file +% diff --git a/tests/test-files/Colt.tap b/tests/test-files/Colt.tap index f624bd9..09ca86d 100644 --- a/tests/test-files/Colt.tap +++ b/tests/test-files/Colt.tap @@ -1,6 +1,6 @@ ( Colt ) N100G00G21G17G90G40G49G80 -N110G71G91.1 +N110G91.1 N120T1M06 N130(ENGRAVING - 20 DEG TIP 0.1) N140G00G43Z6H1 diff --git a/tests/test-files/Cross2.tap b/tests/test-files/Cross2.tap index 52d862b..96c3642 100644 --- a/tests/test-files/Cross2.tap +++ b/tests/test-files/Cross2.tap @@ -5,7 +5,7 @@ ( T1 = End Mill 4 mm ) () N100G00G21G17G90G40G49G80 -N110G71G91.1 +N110G91.1 N120T1M06 N130 N140G00G43Z6.001H1 diff --git a/tests/test-files/DB25.tap b/tests/test-files/DB25.tap index aecac91..fade58b 100644 --- a/tests/test-files/DB25.tap +++ b/tests/test-files/DB25.tap @@ -1,95 +1,95 @@ (Code by Newfangled Wizard, 15/01/2017) (Version 2.86) (Program Posted for Aluminum ) -G0 G49 G40.1 G17 -G80 G50 G90 G98 +G0 G49 G17 +G80 G90 G98 G21 (mm) (****DB 25 Pin****) M6 T7(TOOL DIA. 3) G43 H7 M03 S4000 M7 (Mist On) -G0 X18.6665 Y-3.1674 -X18.6665 Y-3.1674 Z2 -G1 X18.6665 Y-3.1674 Z-1 F39.6 -G41 P1.5 X20.4013 Y-3.9116 F79.2 -G3 X21.0007 Y-2.3038 R2.46126 -G1 X21.0007 Y-1.6002 -X23.3959 Y-1.6002 -G3 X24.9961 Y0 R1.6002 -X23.3959 Y1.6002 R1.6002 -G1 X21.0007 Y1.6002 -X21.0007 Y2.3241 -G3 X17.8257 Y5.4991 R3.175 -G1 X-17.8257 Y5.4991 -G3 X-21.0007 Y2.3241 R3.175 -G1 X-21.0007 Y1.6002 -X-23.3959 Y1.6002 -G3 X-24.9961 Y0 R1.6002 -X-23.3959 Y-1.6002 R1.6002 -G1 X-21.0007 Y-1.6002 -X-21.0007 Y-2.3241 -G3 X-17.8257 Y-5.4991 R3.175 -G1 X17.8257 Y-5.4991 -G3 X21.0007 Y-2.3241 R3.175 -G1 X21.0007 Y-1.6002 -G3 X21.8491 Y-0.7772 R1.69672 -G1 G40 X20.4241 Y-0.0178 -G0 X20.4241 Y-0.0178 Z2 -G0 X18.6665 Y-3.1674 -X18.6665 Y-3.1674 Z2 -G1 X18.6665 Y-3.1674 Z-2 F39.6 -G41 P1.5 X20.4013 Y-3.9116 F79.2 -G3 X21.0007 Y-2.3038 R2.46126 -G1 X21.0007 Y-1.6002 -X23.3959 Y-1.6002 -G3 X24.9961 Y0 R1.6002 -X23.3959 Y1.6002 R1.6002 -G1 X21.0007 Y1.6002 -X21.0007 Y2.3241 -G3 X17.8257 Y5.4991 R3.175 -G1 X-17.8257 Y5.4991 -G3 X-21.0007 Y2.3241 R3.175 -G1 X-21.0007 Y1.6002 -X-23.3959 Y1.6002 -G3 X-24.9961 Y0 R1.6002 -X-23.3959 Y-1.6002 R1.6002 -G1 X-21.0007 Y-1.6002 -X-21.0007 Y-2.3241 -G3 X-17.8257 Y-5.4991 R3.175 -G1 X17.8257 Y-5.4991 -G3 X21.0007 Y-2.3241 R3.175 -G1 X21.0007 Y-1.6002 -G3 X21.8491 Y-0.7772 R1.69672 -G1 G40 X20.4241 Y-0.0178 -G0 X20.4241 Y-0.0178 Z2 -G0 X18.6665 Y-3.1674 -X18.6665 Y-3.1674 Z2 -G1 X18.6665 Y-3.1674 Z-3 F39.6 -G41 P1.5 X20.4013 Y-3.9116 F79.2 -G3 X21.0007 Y-2.3038 R2.46126 -G1 X21.0007 Y-1.6002 -X23.3959 Y-1.6002 -G3 X24.9961 Y0 R1.6002 -X23.3959 Y1.6002 R1.6002 -G1 X21.0007 Y1.6002 -X21.0007 Y2.3241 -G3 X17.8257 Y5.4991 R3.175 -G1 X-17.8257 Y5.4991 -G3 X-21.0007 Y2.3241 R3.175 -G1 X-21.0007 Y1.6002 -X-23.3959 Y1.6002 -G3 X-24.9961 Y0 R1.6002 -X-23.3959 Y-1.6002 R1.6002 -G1 X-21.0007 Y-1.6002 -X-21.0007 Y-2.3241 -G3 X-17.8257 Y-5.4991 R3.175 -G1 X17.8257 Y-5.4991 -G3 X21.0007 Y-2.3241 R3.175 -G1 X21.0007 Y-1.6002 -G3 X21.8491 Y-0.7772 R1.69672 -G1 G40 X20.4241 Y-0.0178 -G0 X20.4241 Y-0.0178 Z2 +G0 X18.6665 Y-3.1674 +X18.6665 Y-3.1674 Z2 +G1 X18.6665 Y-3.1674 Z-1 F39.6 +G41 D1.5 X20.4013 Y-3.9116 F79.2 +G3 X21.0007 Y-2.3038 R2.46126 +G1 X21.0007 Y-1.6002 +X23.3959 Y-1.6002 +G3 X24.9961 Y0 R1.6002 +X23.3959 Y1.6002 R1.6002 +G1 X21.0007 Y1.6002 +X21.0007 Y2.3241 +G3 X17.8257 Y5.4991 R3.175 +G1 X-17.8257 Y5.4991 +G3 X-21.0007 Y2.3241 R3.175 +G1 X-21.0007 Y1.6002 +X-23.3959 Y1.6002 +G3 X-24.9961 Y0 R1.6002 +X-23.3959 Y-1.6002 R1.6002 +G1 X-21.0007 Y-1.6002 +X-21.0007 Y-2.3241 +G3 X-17.8257 Y-5.4991 R3.175 +G1 X17.8257 Y-5.4991 +G3 X21.0007 Y-2.3241 R3.175 +G1 X21.0007 Y-1.6002 +G3 X21.8491 Y-0.7772 R1.69672 +G1 G40 X20.4241 Y-0.0178 +G0 X20.4241 Y-0.0178 Z2 +G0 X18.6665 Y-3.1674 +X18.6665 Y-3.1674 Z2 +G1 X18.6665 Y-3.1674 Z-2 F39.6 +G41 D1.5 X20.4013 Y-3.9116 F79.2 +G3 X21.0007 Y-2.3038 R2.46126 +G1 X21.0007 Y-1.6002 +X23.3959 Y-1.6002 +G3 X24.9961 Y0 R1.6002 +X23.3959 Y1.6002 R1.6002 +G1 X21.0007 Y1.6002 +X21.0007 Y2.3241 +G3 X17.8257 Y5.4991 R3.175 +G1 X-17.8257 Y5.4991 +G3 X-21.0007 Y2.3241 R3.175 +G1 X-21.0007 Y1.6002 +X-23.3959 Y1.6002 +G3 X-24.9961 Y0 R1.6002 +X-23.3959 Y-1.6002 R1.6002 +G1 X-21.0007 Y-1.6002 +X-21.0007 Y-2.3241 +G3 X-17.8257 Y-5.4991 R3.175 +G1 X17.8257 Y-5.4991 +G3 X21.0007 Y-2.3241 R3.175 +G1 X21.0007 Y-1.6002 +G3 X21.8491 Y-0.7772 R1.69672 +G1 G40 X20.4241 Y-0.0178 +G0 X20.4241 Y-0.0178 Z2 +G0 X18.6665 Y-3.1674 +X18.6665 Y-3.1674 Z2 +G1 X18.6665 Y-3.1674 Z-3 F39.6 +G41 D1.5 X20.4013 Y-3.9116 F79.2 +G3 X21.0007 Y-2.3038 R2.46126 +G1 X21.0007 Y-1.6002 +X23.3959 Y-1.6002 +G3 X24.9961 Y0 R1.6002 +X23.3959 Y1.6002 R1.6002 +G1 X21.0007 Y1.6002 +X21.0007 Y2.3241 +G3 X17.8257 Y5.4991 R3.175 +G1 X-17.8257 Y5.4991 +G3 X-21.0007 Y2.3241 R3.175 +G1 X-21.0007 Y1.6002 +X-23.3959 Y1.6002 +G3 X-24.9961 Y0 R1.6002 +X-23.3959 Y-1.6002 R1.6002 +G1 X-21.0007 Y-1.6002 +X-21.0007 Y-2.3241 +G3 X-17.8257 Y-5.4991 R3.175 +G1 X17.8257 Y-5.4991 +G3 X21.0007 Y-2.3241 R3.175 +G1 X21.0007 Y-1.6002 +G3 X21.8491 Y-0.7772 R1.69672 +G1 G40 X20.4241 Y-0.0178 +G0 X20.4241 Y-0.0178 Z2 M5 M9 M30 % diff --git a/tests/test-files/Disc3.tap b/tests/test-files/Disc3.tap index 70aaa94..0ea1723 100644 --- a/tests/test-files/Disc3.tap +++ b/tests/test-files/Disc3.tap @@ -1,6 +1,6 @@ (Tweakie.CNC) G00G21G17G90G40G49G80 -G71G91.1 +G91.1 T1M06 G00G43Z10H1 S12000M03 diff --git a/tests/test-files/Horse.tap b/tests/test-files/Horse.tap index 9bd7143..785fb6f 100644 --- a/tests/test-files/Horse.tap +++ b/tests/test-files/Horse.tap @@ -1,6 +1,6 @@ ( Horse ) N100G00G21G17G90G40G49G80 -N110G71G91.1 +N110G91.1 N120T1M06 N130(ENGRAVING - 20 DEG TIP 0.1) N140G00G43Z6H1 diff --git a/tests/test-files/Horse2.tap b/tests/test-files/Horse2.tap index aeb7db2..e84485e 100644 --- a/tests/test-files/Horse2.tap +++ b/tests/test-files/Horse2.tap @@ -1,6 +1,6 @@ ( Horse2 ) N100G00G21G17G90G40G49G80 -N110G71G91.1 +N110G91.1 N120T1M06 N130(ENGRAVING - 20 DEG TIP 0.1) N140G00G43Z6H1 diff --git a/tests/test-files/Mach3 write.tap b/tests/test-files/Mach3 write.tap index ab1b8b4..4c8f71b 100644 --- a/tests/test-files/Mach3 write.tap +++ b/tests/test-files/Mach3 write.tap @@ -1,4 +1,4 @@ -G00 G49 G40 G17 G80 G50 G90 G21 +G00 G49 G40 G17 G80 G90 G21 M04 S12000 G90 G90.1 G00 Z6 @@ -72,4 +72,4 @@ G00 Z6 G00 X0 Y0 M05 M30 -% \ No newline at end of file +% diff --git a/tests/test-files/Mach4 write.tap b/tests/test-files/Mach4 write.tap index 6db9f46..c3a193f 100644 --- a/tests/test-files/Mach4 write.tap +++ b/tests/test-files/Mach4 write.tap @@ -1,4 +1,4 @@ -G49 G40 G17 G80 G50 G90 G21 +G49 G40 G17 G80 G90 G21 M04 S12000 G90 G90.1 G00 Z6 @@ -65,4 +65,4 @@ G00 Z6 G00 X0 Y0 M05 M30 -% \ No newline at end of file +% diff --git a/tests/test-files/Skull2.tap b/tests/test-files/Skull2.tap index 1f9cc6e..3ad15cf 100644 --- a/tests/test-files/Skull2.tap +++ b/tests/test-files/Skull2.tap @@ -3,7 +3,7 @@ ( X= 89.500, Y= 120.000 ) ( TOOL=ENGRAVE {20' 0.02" TIP DIA} ) N100G00G20G17G90G40G49G80 -N110G71G91.1 +N110G91.1 N120T1M06 N130 N140G00G43Z0.4H1 diff --git a/tests/test-files/Snow White.tap b/tests/test-files/Snow White.tap index 2757671..2db4236 100644 --- a/tests/test-files/Snow White.tap +++ b/tests/test-files/Snow White.tap @@ -1,6 +1,6 @@ ( Snow White ) N100G20G17G90G40G49G80 -N110G70G91.1 +N110G91.1 N120T1M06 N140G00G43Z0.5H1 N150S12000M03 diff --git a/tests/test-files/Star Trek.tap b/tests/test-files/Star Trek.tap index 02e98a3..62bb8de 100644 --- a/tests/test-files/Star Trek.tap +++ b/tests/test-files/Star Trek.tap @@ -1,6 +1,6 @@ (Tweakie.CNC) G00G21G17G90G40G49G80 -G71G91.1 +G91.1 T1M06 S12000M03 G94 M63P1 F1016.0 diff --git a/tests/test-files/Trispokedovetiles(laser).tap b/tests/test-files/Trispokedovetiles(laser).tap index b9ca8d9..88be0ea 100644 --- a/tests/test-files/Trispokedovetiles(laser).tap +++ b/tests/test-files/Trispokedovetiles(laser).tap @@ -5,30 +5,30 @@ G90.1 (set absolute distance mode for arc centers) G17 (set active plane to XY) G21 (set units to mm) F600 (set feed-rate) -M10 P1 (turns laser OFF) + (turns laser OFF) G0 X 65.8393 Y 49.0906 -M11 P1 (turns laser ON) + (turns laser ON) G3 Y 61.7398 I 65.8393 J 55.4203 G3 Y 49.0906 I 65.8393 J 55.4101 -M10 P1 + G0 X 93.3399 Y 36.7792 -M11 P1 + G3 Y 42.2783 I 93.3399 J 39.5300 G3 Y 36.7792 I 93.3399 J 39.5300 -M10 P1 + G0 X 38.3388 -M11 P1 + G3 Y 42.2783 I 38.3388 J 39.5300 G3 Y 36.7792 I 38.3388 J 39.5300 -M10 P1 + G0 X 65.8393 Y 84.4093 -M11 P1 + G3 Y 89.9084 I 65.8393 J 87.1601 G3 Y 84.4093 I 65.8393 J 87.1601 -M10 P1 + G0 X 93.3399 Y 103.0402 -M11 P1 -G1 X 86.9010 + +G1 X 86.9010 G3 X 82.5094 Y 98.3285 I 86.9010 J 98.6384 G3 X 111.3409 Y 48.3895 I 148.3411 J 103.0402 G3 X 117.6198 Y 49.8297 I 113.8098 J 52.0294 @@ -58,7 +58,7 @@ G2 X 37.0103 Y 114.7801 I 38.9306 J 110.8202 G2 X 94.6709 I 65.8393 J 55.4101 G2 X 96.5606 Y 108.6206 I 92.7506 J 110.8202 G1 X 93.3399 Y 103.0402 -M10 P1 + G0 X 0.0000 Y 0.0000 M30 % diff --git a/tests/test-files/plug6a.tap b/tests/test-files/plug6a.tap index a67edb2..5343046 100644 --- a/tests/test-files/plug6a.tap +++ b/tests/test-files/plug6a.tap @@ -1,54 +1,54 @@ G00G21G17G90G40G49G80 -G71G91.1 +G91.1 S12000M03 -G94 M10P1 F600.0 +G94 F600.0 X0.000Y0.000 -G00X76.918Y-10.288M10P1 -G1X76.918Y-10.288M11P1 +G00X76.918Y-10.288 +G1X76.918Y-10.288 G1X83.317Y-10.288 G1X83.317Y-14.187 G1X76.918Y-14.187 G1X76.918Y-10.288 -G00X76.918Y-10.288M10P1 +G00X76.918Y-10.288 G00X98.918Y-10.288 -G1X98.918Y-10.288M11P1 +G1X98.918Y-10.288 G1X105.317Y-10.288 G1X105.317Y-14.187 G1X98.918Y-14.187 G1X98.918Y-10.288 -G00X98.918Y-10.288M10P1 +G00X98.918Y-10.288 G00X93.022Y5.812 -G1X93.022Y5.812M11P1 +G1X93.022Y5.812 G1X89.122Y5.812 G1X89.122Y13.712 G1X93.022Y13.712 G1X93.022Y5.812 -G00X93.022Y5.812M10P1 +G00X93.022Y5.812 G00X-75.607Y-10.288 -G1X-75.607Y-10.288M11P1 +G1X-75.607Y-10.288 G1X-75.607Y-14.187 G1X-82.006Y-14.187 G1X-82.006Y-10.288 G1X-75.607Y-10.288 -G00X-75.607Y-10.288M10P1 +G00X-75.607Y-10.288 G00X-97.607Y-10.288 -G1X-97.607Y-10.288M11P1 +G1X-97.607Y-10.288 G1X-97.607Y-14.187 G1X-104.006Y-14.187 G1X-104.006Y-10.288 G1X-97.607Y-10.288 -G00X-97.607Y-10.288M10P1 +G00X-97.607Y-10.288 G00X-91.836Y5.812 -G1X-91.836Y5.812M11P1 +G1X-91.836Y5.812 G1X-91.836Y13.712 G1X-87.937Y13.712 G1X-87.937Y5.812 G1X-91.836Y5.812 -G00X-91.836Y5.812M10P1 +G00X-91.836Y5.812 G00X-15.556Y7.900 -G1X-15.556Y7.900M11P1 +G1X-15.556Y7.900 G2X-36.650Y9.539I13.488J310.094 G2X-49.156Y11.364I21.153J188.675 G2X-59.846Y13.733I24.394J135.416 @@ -122,8 +122,8 @@ G2X54.729Y12.209I-26.464J81.059 G2X39.610Y9.752I-40.016J198.475 G2X21.814Y8.147I-32.998J266.303 G2X-15.556Y7.900I-21.148J372.705 -G00X-15.556Y7.900M10P1 -M10P1 +G00X-15.556Y7.900 + G00X0.000Y0.000 M09 M30 diff --git a/tests/test-files/unsupported/README.md b/tests/test-files/unsupported/README.md index 98db6ad..04a561f 100644 --- a/tests/test-files/unsupported/README.md +++ b/tests/test-files/unsupported/README.md @@ -6,7 +6,6 @@ We can however still deal with these, workarounds shown below ## Unsupported GCodes - When attempting to process unsupported gcode(s) via a `Machine` the following error (or similar) will be raised MachineInvalidState: unsupported gcode(s): 'P1 M10' (machine mode: ) diff --git a/tests/test_gcodes.py b/tests/test_gcodes.py index 3da46a8..277ead6 100644 --- a/tests/test_gcodes.py +++ b/tests/test_gcodes.py @@ -38,7 +38,7 @@ class GCodeModalGroupTests(unittest.TestCase): table_rows += ''' Non-modal codes (Group 0) G4,G10,G28,G30,G53,G92,G92.1,G92.2,G92.3 Motion (Group 1) G0,G1,G2,G3,G33,G38.2,G38.3,G38.4 - Motion (Group 1) G38.5,G73,G76,G80,G81,G82,G83,G85,G89 + Motion (Group 1) G38.5,G73,G76,G81,G82,G83,G85,G89 Plane selection (Group 2) G17, G18, G19, G17.1, G18.1, G19.1 Distance Mode (Group 3) G90, G91 Arc IJK Distance Mode (Group 4) G90.1, G91.1 diff --git a/tests/test_words.py b/tests/test_words.py index b5482c1..5c98a2c 100644 --- a/tests/test_words.py +++ b/tests/test_words.py @@ -54,10 +54,11 @@ class WordValueMatchTests(unittest.TestCase): ('1.2', '1.2'), ('1', '1'), ('200', '200'), ('0092', '0092'), ('1.', '1.'), ('.2', '.2'), ('-1.234', '-1.234'), ('-1.', '-1.'), ('-.289', '-.289'), + (' 1.2', ' 1.2'), # leading whitespace # error cases (only detectable in gcode context) ('1.2e3', '1.2'), ], - negative_list=['.', ' 1.2'] + negative_list=['.'] ) def test_code(self): @@ -67,8 +68,9 @@ class WordValueMatchTests(unittest.TestCase): ('1.2', '1.2'), ('1', '1'), ('10', '10'), ('02', '02'), ('02.3', '02.3'), ('1.', '1'), ('03 ', '03'), + (' 2', ' 2'), # leading whitespace # error cases (only detectable in gcode context) ('30.12', '30.1'), ], - negative_list=['.2', '.', ' 2'] + negative_list=['.2', '.'] ) From d289a412a85df183446ffe56ba0baab36f807655 Mon Sep 17 00:00:00 2001 From: Peter Boin Date: Tue, 22 Aug 2017 15:03:24 +1000 Subject: [PATCH 08/14] full file parsing tests --- tests/test_parsing.py | 49 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 tests/test_parsing.py diff --git a/tests/test_parsing.py b/tests/test_parsing.py new file mode 100644 index 0000000..588362b --- /dev/null +++ b/tests/test_parsing.py @@ -0,0 +1,49 @@ +import os +import inspect +import re +import glob +import unittest + +# Add relative pygcode to path +from testutils import add_pygcode_to_path, str_lines +add_pygcode_to_path() + +# Units under test +from pygcode.machine import Position, Machine +from pygcode.line import Line +from pygcode.exceptions import MachineInvalidAxis +from pygcode.gcodes import ( + GCodeAbsoluteDistanceMode, GCodeIncrementalDistanceMode, + GCodeAbsoluteArcDistanceMode, GCodeIncrementalArcDistanceMode, + GCodeCannedCycleReturnPrevLevel, GCodeCannedCycleReturnToR, +) + +# Local paths +_this_path = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) +_test_files_dir = os.path.join(_this_path, 'test-files') + +class FileParsingTest(unittest.TestCase): + filename = os.path.join(_test_files_dir, 'random-sample-1.gcode') + + def test_file(self): + m = Machine() + with open(self.filename, 'r') as fh: + for line_str in fh.readlines(): + line = Line(line_str) + m.process_block(line.block) + + + +# Create inheriting class for each gcode file in the _test_files_dir directory +_filetype_regex = re.compile(r'^.*\.(tap|nc|ngc|gcode)$', re.IGNORECASE) +_test_files = [f for f in glob.glob(os.path.join(_test_files_dir, '*')) if _filetype_regex.search(f)] + +for (i, filename) in enumerate(sorted(_test_files)): + basename = os.path.basename(filename) + if basename == os.path.basename(FileParsingTest.filename): + break # already defined as a test + + class_name = "FileParsingTest_" + re.sub(r"""[^a-zA-Z0-9]""", '_', basename) + globals()[class_name] = type(class_name, (FileParsingTest,), { + 'filename': filename, + }) From 8aa195b5d99dda34bf962241f8bb64f246f5c8a8 Mon Sep 17 00:00:00 2001 From: Peter Boin Date: Tue, 22 Aug 2017 15:08:32 +1000 Subject: [PATCH 09/14] restored whitespace diffs --- tests/test-files/DB25.tap | 162 +++++++++--------- tests/test-files/Mach4 write.tap | 2 +- tests/test-files/Trispokedovetiles(laser).tap | 2 +- 3 files changed, 83 insertions(+), 83 deletions(-) diff --git a/tests/test-files/DB25.tap b/tests/test-files/DB25.tap index fade58b..37f5e47 100644 --- a/tests/test-files/DB25.tap +++ b/tests/test-files/DB25.tap @@ -9,87 +9,87 @@ M6 T7(TOOL DIA. 3) G43 H7 M03 S4000 M7 (Mist On) -G0 X18.6665 Y-3.1674 -X18.6665 Y-3.1674 Z2 -G1 X18.6665 Y-3.1674 Z-1 F39.6 -G41 D1.5 X20.4013 Y-3.9116 F79.2 -G3 X21.0007 Y-2.3038 R2.46126 -G1 X21.0007 Y-1.6002 -X23.3959 Y-1.6002 -G3 X24.9961 Y0 R1.6002 -X23.3959 Y1.6002 R1.6002 -G1 X21.0007 Y1.6002 -X21.0007 Y2.3241 -G3 X17.8257 Y5.4991 R3.175 -G1 X-17.8257 Y5.4991 -G3 X-21.0007 Y2.3241 R3.175 -G1 X-21.0007 Y1.6002 -X-23.3959 Y1.6002 -G3 X-24.9961 Y0 R1.6002 -X-23.3959 Y-1.6002 R1.6002 -G1 X-21.0007 Y-1.6002 -X-21.0007 Y-2.3241 -G3 X-17.8257 Y-5.4991 R3.175 -G1 X17.8257 Y-5.4991 -G3 X21.0007 Y-2.3241 R3.175 -G1 X21.0007 Y-1.6002 -G3 X21.8491 Y-0.7772 R1.69672 -G1 G40 X20.4241 Y-0.0178 -G0 X20.4241 Y-0.0178 Z2 -G0 X18.6665 Y-3.1674 -X18.6665 Y-3.1674 Z2 -G1 X18.6665 Y-3.1674 Z-2 F39.6 -G41 D1.5 X20.4013 Y-3.9116 F79.2 -G3 X21.0007 Y-2.3038 R2.46126 -G1 X21.0007 Y-1.6002 -X23.3959 Y-1.6002 -G3 X24.9961 Y0 R1.6002 -X23.3959 Y1.6002 R1.6002 -G1 X21.0007 Y1.6002 -X21.0007 Y2.3241 -G3 X17.8257 Y5.4991 R3.175 -G1 X-17.8257 Y5.4991 -G3 X-21.0007 Y2.3241 R3.175 -G1 X-21.0007 Y1.6002 -X-23.3959 Y1.6002 -G3 X-24.9961 Y0 R1.6002 -X-23.3959 Y-1.6002 R1.6002 -G1 X-21.0007 Y-1.6002 -X-21.0007 Y-2.3241 -G3 X-17.8257 Y-5.4991 R3.175 -G1 X17.8257 Y-5.4991 -G3 X21.0007 Y-2.3241 R3.175 -G1 X21.0007 Y-1.6002 -G3 X21.8491 Y-0.7772 R1.69672 -G1 G40 X20.4241 Y-0.0178 -G0 X20.4241 Y-0.0178 Z2 -G0 X18.6665 Y-3.1674 -X18.6665 Y-3.1674 Z2 -G1 X18.6665 Y-3.1674 Z-3 F39.6 -G41 D1.5 X20.4013 Y-3.9116 F79.2 -G3 X21.0007 Y-2.3038 R2.46126 -G1 X21.0007 Y-1.6002 -X23.3959 Y-1.6002 -G3 X24.9961 Y0 R1.6002 -X23.3959 Y1.6002 R1.6002 -G1 X21.0007 Y1.6002 -X21.0007 Y2.3241 -G3 X17.8257 Y5.4991 R3.175 -G1 X-17.8257 Y5.4991 -G3 X-21.0007 Y2.3241 R3.175 -G1 X-21.0007 Y1.6002 -X-23.3959 Y1.6002 -G3 X-24.9961 Y0 R1.6002 -X-23.3959 Y-1.6002 R1.6002 -G1 X-21.0007 Y-1.6002 -X-21.0007 Y-2.3241 -G3 X-17.8257 Y-5.4991 R3.175 -G1 X17.8257 Y-5.4991 -G3 X21.0007 Y-2.3241 R3.175 -G1 X21.0007 Y-1.6002 -G3 X21.8491 Y-0.7772 R1.69672 -G1 G40 X20.4241 Y-0.0178 -G0 X20.4241 Y-0.0178 Z2 +G0 X18.6665 Y-3.1674 +X18.6665 Y-3.1674 Z2 +G1 X18.6665 Y-3.1674 Z-1 F39.6 +G41 D1.5 X20.4013 Y-3.9116 F79.2 +G3 X21.0007 Y-2.3038 R2.46126 +G1 X21.0007 Y-1.6002 +X23.3959 Y-1.6002 +G3 X24.9961 Y0 R1.6002 +X23.3959 Y1.6002 R1.6002 +G1 X21.0007 Y1.6002 +X21.0007 Y2.3241 +G3 X17.8257 Y5.4991 R3.175 +G1 X-17.8257 Y5.4991 +G3 X-21.0007 Y2.3241 R3.175 +G1 X-21.0007 Y1.6002 +X-23.3959 Y1.6002 +G3 X-24.9961 Y0 R1.6002 +X-23.3959 Y-1.6002 R1.6002 +G1 X-21.0007 Y-1.6002 +X-21.0007 Y-2.3241 +G3 X-17.8257 Y-5.4991 R3.175 +G1 X17.8257 Y-5.4991 +G3 X21.0007 Y-2.3241 R3.175 +G1 X21.0007 Y-1.6002 +G3 X21.8491 Y-0.7772 R1.69672 +G1 G40 X20.4241 Y-0.0178 +G0 X20.4241 Y-0.0178 Z2 +G0 X18.6665 Y-3.1674 +X18.6665 Y-3.1674 Z2 +G1 X18.6665 Y-3.1674 Z-2 F39.6 +G41 D1.5 X20.4013 Y-3.9116 F79.2 +G3 X21.0007 Y-2.3038 R2.46126 +G1 X21.0007 Y-1.6002 +X23.3959 Y-1.6002 +G3 X24.9961 Y0 R1.6002 +X23.3959 Y1.6002 R1.6002 +G1 X21.0007 Y1.6002 +X21.0007 Y2.3241 +G3 X17.8257 Y5.4991 R3.175 +G1 X-17.8257 Y5.4991 +G3 X-21.0007 Y2.3241 R3.175 +G1 X-21.0007 Y1.6002 +X-23.3959 Y1.6002 +G3 X-24.9961 Y0 R1.6002 +X-23.3959 Y-1.6002 R1.6002 +G1 X-21.0007 Y-1.6002 +X-21.0007 Y-2.3241 +G3 X-17.8257 Y-5.4991 R3.175 +G1 X17.8257 Y-5.4991 +G3 X21.0007 Y-2.3241 R3.175 +G1 X21.0007 Y-1.6002 +G3 X21.8491 Y-0.7772 R1.69672 +G1 G40 X20.4241 Y-0.0178 +G0 X20.4241 Y-0.0178 Z2 +G0 X18.6665 Y-3.1674 +X18.6665 Y-3.1674 Z2 +G1 X18.6665 Y-3.1674 Z-3 F39.6 +G41 D1.5 X20.4013 Y-3.9116 F79.2 +G3 X21.0007 Y-2.3038 R2.46126 +G1 X21.0007 Y-1.6002 +X23.3959 Y-1.6002 +G3 X24.9961 Y0 R1.6002 +X23.3959 Y1.6002 R1.6002 +G1 X21.0007 Y1.6002 +X21.0007 Y2.3241 +G3 X17.8257 Y5.4991 R3.175 +G1 X-17.8257 Y5.4991 +G3 X-21.0007 Y2.3241 R3.175 +G1 X-21.0007 Y1.6002 +X-23.3959 Y1.6002 +G3 X-24.9961 Y0 R1.6002 +X-23.3959 Y-1.6002 R1.6002 +G1 X-21.0007 Y-1.6002 +X-21.0007 Y-2.3241 +G3 X-17.8257 Y-5.4991 R3.175 +G1 X17.8257 Y-5.4991 +G3 X21.0007 Y-2.3241 R3.175 +G1 X21.0007 Y-1.6002 +G3 X21.8491 Y-0.7772 R1.69672 +G1 G40 X20.4241 Y-0.0178 +G0 X20.4241 Y-0.0178 Z2 M5 M9 M30 % diff --git a/tests/test-files/Mach4 write.tap b/tests/test-files/Mach4 write.tap index c3a193f..63c6917 100644 --- a/tests/test-files/Mach4 write.tap +++ b/tests/test-files/Mach4 write.tap @@ -65,4 +65,4 @@ G00 Z6 G00 X0 Y0 M05 M30 -% +% \ No newline at end of file diff --git a/tests/test-files/Trispokedovetiles(laser).tap b/tests/test-files/Trispokedovetiles(laser).tap index 88be0ea..b9e73cb 100644 --- a/tests/test-files/Trispokedovetiles(laser).tap +++ b/tests/test-files/Trispokedovetiles(laser).tap @@ -28,7 +28,7 @@ G3 Y 84.4093 I 65.8393 J 87.1601 G0 X 93.3399 Y 103.0402 -G1 X 86.9010 +G1 X 86.9010 G3 X 82.5094 Y 98.3285 I 86.9010 J 98.6384 G3 X 111.3409 Y 48.3895 I 148.3411 J 103.0402 G3 X 117.6198 Y 49.8297 I 113.8098 J 52.0294 From 7c67dec64283ce94ed158d987c7995e43ba354f4 Mon Sep 17 00:00:00 2001 From: Peter Boin Date: Tue, 22 Aug 2017 15:10:02 +1000 Subject: [PATCH 10/14] v0.2.0 --- src/pygcode/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pygcode/__init__.py b/src/pygcode/__init__.py index 86dafdb..21a1d11 100644 --- a/src/pygcode/__init__.py +++ b/src/pygcode/__init__.py @@ -6,7 +6,7 @@ # 1.x - Development Status :: 5 - Production/Stable # .y - developments on that version (pre-release) # *.dev* - development release (intended purely to test deployment) -__version__ = "0.1.2" +__version__ = "0.2.0" __title__ = "pygcode" __description__ = "Basic g-code parser, interpreter, and encoder library." From d6c307f71d009df08bb6a999e1649a8bac72e262 Mon Sep 17 00:00:00 2001 From: Peter Boin Date: Tue, 22 Aug 2017 15:14:03 +1000 Subject: [PATCH 11/14] added lsenv --- deployment/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/deployment/README.md b/deployment/README.md index f5b33fc..9a7c097 100644 --- a/deployment/README.md +++ b/deployment/README.md @@ -20,7 +20,7 @@ At this time, running `./deploy.sh --help` displays: This script is to maintain a consistent method of deployment and testing. - Deployment target: pygcode 0.1.1.dev0 + Deployment target: pygcode 0.2.0 Arguments: Setup: @@ -31,6 +31,7 @@ At this time, running `./deploy.sh --help` displays: creates both 'sdist' and 'wheel' distrobutions. Virtual Environments: + lsenv List created virtual environments for this lib rmenv py# Remove virtual environment remkenv py# Remove, then create re-create virtual environment envprereq py# install environment prerequisites (official PyPi) From 9db1a3ee85730c1574b56710ae8bc6ebd90be697 Mon Sep 17 00:00:00 2001 From: Peter Boin Date: Tue, 22 Aug 2017 15:15:00 +1000 Subject: [PATCH 12/14] built 0.2.0 --- dist/pygcode-0.1.2-py2.py3-none-any.whl | Bin 57794 -> 0 bytes dist/pygcode-0.1.2.tar.gz | Bin 40339 -> 0 bytes dist/pygcode-0.2.0-py2.py3-none-any.whl | Bin 0 -> 58312 bytes dist/pygcode-0.2.0.tar.gz | Bin 0 -> 40848 bytes src/pygcode.egg-info/PKG-INFO | 2 +- 5 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 dist/pygcode-0.1.2-py2.py3-none-any.whl delete mode 100644 dist/pygcode-0.1.2.tar.gz create mode 100644 dist/pygcode-0.2.0-py2.py3-none-any.whl create mode 100644 dist/pygcode-0.2.0.tar.gz diff --git a/dist/pygcode-0.1.2-py2.py3-none-any.whl b/dist/pygcode-0.1.2-py2.py3-none-any.whl deleted file mode 100644 index f786a9253e91b9f0705f07107fda8163ae3e5abb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57794 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 H0MG&eFxb!{ diff --git a/dist/pygcode-0.2.0-py2.py3-none-any.whl b/dist/pygcode-0.2.0-py2.py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..39a65e58e1266884e9a49fba78915b79b20ca961 GIT binary patch literal 58312 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 literal 0 HcmV?d00001 diff --git a/dist/pygcode-0.2.0.tar.gz b/dist/pygcode-0.2.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..960bd8cdb6ceba7e7e25d727d92fe4466a4daf07 GIT binary patch literal 40848 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 w; Date: Tue, 22 Aug 2017 15:32:06 +1000 Subject: [PATCH 13/14] v0.2.0 change history --- dist/README.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/dist/README.md b/dist/README.md index 5b4ea4f..ced233b 100644 --- a/dist/README.md +++ b/dist/README.md @@ -1,5 +1,25 @@ # Change History +## 0.2.0 + +Moved to `alpha` + +Improvements to read more versatile formats + +### Improvements + +* Tests include a sample-set of gcode files from varying CAM software and authors. +* `lsenv` in deployment script. +* added `GCodeLineNumber` and `GCodeProgramName` (in response to #5). +* `GCodeCancelCannedCycle` sets machine mode to `None`, and is run first in list of `motion` gcodes. +* Error message for unsupported gcodes is more helpful / relevant. +* Optional whitespace in `Word`, (eg: `X-1.2` and `X -1.2` are now both valid) + +### Bugfixes + +* Line number in program (#5) + + ## 0.1.2 Changes to accommodate implementation of [grbl-stream](https://github.com/fragmuffin/grbl-stream) From bb0ab66cc968cc9eb768081a5253fb9e6a3f279b Mon Sep 17 00:00:00 2001 From: Peter Boin Date: Tue, 22 Aug 2017 15:34:10 +1000 Subject: [PATCH 14/14] link fix --- dist/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/README.md b/dist/README.md index ced233b..1f6547b 100644 --- a/dist/README.md +++ b/dist/README.md @@ -10,14 +10,14 @@ Improvements to read more versatile formats * Tests include a sample-set of gcode files from varying CAM software and authors. * `lsenv` in deployment script. -* added `GCodeLineNumber` and `GCodeProgramName` (in response to #5). +* added `GCodeLineNumber` and `GCodeProgramName` (in response to [#5](https://github.com/fragmuffin/pygcode/issues/5)). * `GCodeCancelCannedCycle` sets machine mode to `None`, and is run first in list of `motion` gcodes. * Error message for unsupported gcodes is more helpful / relevant. * Optional whitespace in `Word`, (eg: `X-1.2` and `X -1.2` are now both valid) ### Bugfixes -* Line number in program (#5) +* [#5](https://github.com/fragmuffin/pygcode/issues/5) Line number in program ## 0.1.2