From 7c11b7b739003a7661b7a91b73dd3be4286f3bf4 Mon Sep 17 00:00:00 2001 From: Kurt Hutten Date: Wed, 29 Nov 2023 11:20:23 +1100 Subject: [PATCH] test exports (#1139) * test exports * fmt * tidy --- .prettierignore | 1 + .../export-snapshots/gltf-binary.gltf | Bin 0 -> 53176 bytes .../export-snapshots/gltf-embedded.gltf | 2459 +++++++++++++++++ .../export-snapshots/gltf-standard.gltf | Bin 0 -> 6528 bytes e2e/playwright/export-snapshots/obj-.obj | 189 ++ e2e/playwright/export-snapshots/step-.step | 494 ++++ e2e/playwright/snapshot-tests.spec.ts | 151 + src/components/ExportButton.tsx | 2 + src/lib/browserSaveFile.ts | 6 +- tsconfig.json | 3 +- 10 files changed, 3303 insertions(+), 2 deletions(-) create mode 100644 e2e/playwright/export-snapshots/gltf-binary.gltf create mode 100644 e2e/playwright/export-snapshots/gltf-embedded.gltf create mode 100644 e2e/playwright/export-snapshots/gltf-standard.gltf create mode 100644 e2e/playwright/export-snapshots/obj-.obj create mode 100644 e2e/playwright/export-snapshots/step-.step diff --git a/.prettierignore b/.prettierignore index cd0d2b331..9c878f77e 100644 --- a/.prettierignore +++ b/.prettierignore @@ -7,6 +7,7 @@ coverage target src/wasm-lib/pkg src/wasm-lib/kcl/bindings +e2e/playwright/export-snapshots # XState generated files src/machines/modelingMachine.typegen.ts diff --git a/e2e/playwright/export-snapshots/gltf-binary.gltf b/e2e/playwright/export-snapshots/gltf-binary.gltf new file mode 100644 index 0000000000000000000000000000000000000000..11a4fe0c57dd3d2a4bcb0ed260e93886b46cf747 GIT binary patch literal 53176 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 literal 0 HcmV?d00001 diff --git a/e2e/playwright/export-snapshots/gltf-embedded.gltf b/e2e/playwright/export-snapshots/gltf-embedded.gltf new file mode 100644 index 000000000..9f36fe412 --- /dev/null +++ b/e2e/playwright/export-snapshots/gltf-embedded.gltf @@ -0,0 +1,2459 @@ +{ + "accessors": [ + { + "bufferView": 0, + "byteOffset": 0, + "count": 6, + "componentType": 5126, + "type": "VEC3", + "min": [ + 0, + -0.02539999969303608, + -0 + ], + "max": [ + 0, + 0, + 0.10159999877214432 + ] + }, + { + "bufferView": 0, + "byteOffset": 12, + "count": 6, + "componentType": 5126, + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 24, + "count": 6, + "componentType": 5126, + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 0, + "count": 6, + "componentType": 5126, + "type": "VEC3", + "min": [ + 0, + -0.02539999969303608, + -0 + ], + "max": [ + 0.07861346751451492, + -0.02539999969303608, + 0.10159999877214432 + ] + }, + { + "bufferView": 1, + "byteOffset": 12, + "count": 6, + "componentType": 5126, + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 24, + "count": 6, + "componentType": 5126, + "type": "VEC2" + }, + { + "bufferView": 2, + "byteOffset": 0, + "count": 6, + "componentType": 5126, + "type": "VEC3", + "min": [ + 0.07861346751451492, + -0.07620000094175339, + -0 + ], + "max": [ + 0.15116338431835177, + -0.02539999969303608, + 0.10159999877214432 + ] + }, + { + "bufferView": 2, + "byteOffset": 12, + "count": 6, + "componentType": 5126, + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 24, + "count": 6, + "componentType": 5126, + "type": "VEC2" + }, + { + "bufferView": 3, + "byteOffset": 0, + "count": 6, + "componentType": 5126, + "type": "VEC3", + "min": [ + 0.15116338431835177, + -0.07620000094175339, + -0 + ], + "max": [ + 0.24130000174045563, + -0.07620000094175339, + 0.10159999877214432 + ] + }, + { + "bufferView": 3, + "byteOffset": 12, + "count": 6, + "componentType": 5126, + "type": "VEC3" + }, + { + "bufferView": 3, + "byteOffset": 24, + "count": 6, + "componentType": 5126, + "type": "VEC2" + }, + { + "bufferView": 4, + "byteOffset": 0, + "count": 6, + "componentType": 5126, + "type": "VEC3", + "min": [ + 0.24130000174045563, + -0.07620000094175339, + -0 + ], + "max": [ + 0.24130000174045563, + -0.06350000202655792, + 0.10159999877214432 + ] + }, + { + "bufferView": 4, + "byteOffset": 12, + "count": 6, + "componentType": 5126, + "type": "VEC3" + }, + { + "bufferView": 4, + "byteOffset": 24, + "count": 6, + "componentType": 5126, + "type": "VEC2" + }, + { + "bufferView": 5, + "byteOffset": 0, + "count": 6, + "componentType": 5126, + "type": "VEC3", + "min": [ + 0.15516768395900726, + -0.06350000202655792, + -0 + ], + "max": [ + 0.24130000174045563, + -0.06350000202655792, + 0.10159999877214432 + ] + }, + { + "bufferView": 5, + "byteOffset": 12, + "count": 6, + "componentType": 5126, + "type": "VEC3" + }, + { + "bufferView": 5, + "byteOffset": 24, + "count": 6, + "componentType": 5126, + "type": "VEC2" + }, + { + "bufferView": 6, + "byteOffset": 0, + "count": 18, + "componentType": 5126, + "type": "VEC3", + "min": [ + 0.06448028236627579, + -0.06350000202655792, + 0 + ], + "max": [ + 0.15516768395900726, + 0, + 0.10159999877214432 + ] + }, + { + "bufferView": 6, + "byteOffset": 12, + "count": 18, + "componentType": 5126, + "type": "VEC3" + }, + { + "bufferView": 6, + "byteOffset": 24, + "count": 18, + "componentType": 5126, + "type": "VEC2" + }, + { + "bufferView": 7, + "byteOffset": 0, + "count": 18, + "componentType": 5126, + "type": "VEC3", + "min": [ + 0.06448028236627579, + 0, + -0 + ], + "max": [ + 0.1461859941482544, + 0.038100000470876694, + 0.10159999877214432 + ] + }, + { + "bufferView": 7, + "byteOffset": 12, + "count": 18, + "componentType": 5126, + "type": "VEC3" + }, + { + "bufferView": 7, + "byteOffset": 24, + "count": 18, + "componentType": 5126, + "type": "VEC2" + }, + { + "bufferView": 8, + "byteOffset": 0, + "count": 6, + "componentType": 5126, + "type": "VEC3", + "min": [ + 0.1461859941482544, + 0.038100000470876694, + -0 + ], + "max": [ + 0.24130000174045563, + 0.038100000470876694, + 0.10159999877214432 + ] + }, + { + "bufferView": 8, + "byteOffset": 12, + "count": 6, + "componentType": 5126, + "type": "VEC3" + }, + { + "bufferView": 8, + "byteOffset": 24, + "count": 6, + "componentType": 5126, + "type": "VEC2" + }, + { + "bufferView": 9, + "byteOffset": 0, + "count": 6, + "componentType": 5126, + "type": "VEC3", + "min": [ + 0.24130000174045563, + 0.038100000470876694, + -0 + ], + "max": [ + 0.24130000174045563, + 0.05079999938607216, + 0.10159999877214432 + ] + }, + { + "bufferView": 9, + "byteOffset": 12, + "count": 6, + "componentType": 5126, + "type": "VEC3" + }, + { + "bufferView": 9, + "byteOffset": 24, + "count": 6, + "componentType": 5126, + "type": "VEC2" + }, + { + "bufferView": 10, + "byteOffset": 0, + "count": 6, + "componentType": 5126, + "type": "VEC3", + "min": [ + 0.14337047934532166, + 0.05079999938607216, + -0 + ], + "max": [ + 0.24130000174045563, + 0.05079999938607216, + 0.10159999877214432 + ] + }, + { + "bufferView": 10, + "byteOffset": 12, + "count": 6, + "componentType": 5126, + "type": "VEC3" + }, + { + "bufferView": 10, + "byteOffset": 24, + "count": 6, + "componentType": 5126, + "type": "VEC2" + }, + { + "bufferView": 11, + "byteOffset": 0, + "count": 6, + "componentType": 5126, + "type": "VEC3", + "min": [ + 0.08889999985694885, + 0.02539999969303608, + -0 + ], + "max": [ + 0.14337047934532166, + 0.05079999938607216, + 0.10159999877214432 + ] + }, + { + "bufferView": 11, + "byteOffset": 12, + "count": 6, + "componentType": 5126, + "type": "VEC3" + }, + { + "bufferView": 11, + "byteOffset": 24, + "count": 6, + "componentType": 5126, + "type": "VEC2" + }, + { + "bufferView": 12, + "byteOffset": 0, + "count": 6, + "componentType": 5126, + "type": "VEC3", + "min": [ + 0, + 0.02539999969303608, + -0 + ], + "max": [ + 0.08889999985694885, + 0.02539999969303608, + 0.10159999877214432 + ] + }, + { + "bufferView": 12, + "byteOffset": 12, + "count": 6, + "componentType": 5126, + "type": "VEC3" + }, + { + "bufferView": 12, + "byteOffset": 24, + "count": 6, + "componentType": 5126, + "type": "VEC2" + }, + { + "bufferView": 13, + "byteOffset": 0, + "count": 6, + "componentType": 5126, + "type": "VEC3", + "min": [ + 0, + 0, + -0 + ], + "max": [ + 0, + 0.02539999969303608, + 0.10159999877214432 + ] + }, + { + "bufferView": 13, + "byteOffset": 12, + "count": 6, + "componentType": 5126, + "type": "VEC3" + }, + { + "bufferView": 13, + "byteOffset": 24, + "count": 6, + "componentType": 5126, + "type": "VEC2" + }, + { + "bufferView": 14, + "byteOffset": 0, + "count": 48, + "componentType": 5126, + "type": "VEC3", + "min": [ + 0, + -0.07620000094175339, + 0 + ], + "max": [ + 0.24130000174045563, + 0.05079999938607216, + 0 + ] + }, + { + "bufferView": 14, + "byteOffset": 12, + "count": 48, + "componentType": 5126, + "type": "VEC3" + }, + { + "bufferView": 14, + "byteOffset": 24, + "count": 48, + "componentType": 5126, + "type": "VEC2" + }, + { + "bufferView": 15, + "byteOffset": 0, + "count": 48, + "componentType": 5126, + "type": "VEC3", + "min": [ + 0, + -0.07620000094175339, + 0.10159999877214432 + ], + "max": [ + 0.24130000174045563, + 0.05079999938607216, + 0.10159999877214432 + ] + }, + { + "bufferView": 15, + "byteOffset": 12, + "count": 48, + "componentType": 5126, + "type": "VEC3" + }, + { + "bufferView": 15, + "byteOffset": 24, + "count": 48, + "componentType": 5126, + "type": "VEC2" + } + ], + "asset": { + "generator": "kittycad.io", + "version": "2.0" + }, + "buffers": [ + { + "byteLength": 6528, + "uri": "data:application/octet-stream;base64,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" + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteLength": 192, + "byteOffset": 0, + "byteStride": 32, + "target": 34962 + }, + { + "buffer": 0, + "byteLength": 192, + "byteOffset": 192, + "byteStride": 32, + "target": 34962 + }, + { + "buffer": 0, + "byteLength": 192, + "byteOffset": 384, + "byteStride": 32, + "target": 34962 + }, + { + "buffer": 0, + "byteLength": 192, + "byteOffset": 576, + "byteStride": 32, + "target": 34962 + }, + { + "buffer": 0, + "byteLength": 192, + "byteOffset": 768, + "byteStride": 32, + "target": 34962 + }, + { + "buffer": 0, + "byteLength": 192, + "byteOffset": 960, + "byteStride": 32, + "target": 34962 + }, + { + "buffer": 0, + "byteLength": 576, + "byteOffset": 1152, + "byteStride": 32, + "target": 34962 + }, + { + "buffer": 0, + "byteLength": 576, + "byteOffset": 1728, + "byteStride": 32, + "target": 34962 + }, + { + "buffer": 0, + "byteLength": 192, + "byteOffset": 2304, + "byteStride": 32, + "target": 34962 + }, + { + "buffer": 0, + "byteLength": 192, + "byteOffset": 2496, + "byteStride": 32, + "target": 34962 + }, + { + "buffer": 0, + "byteLength": 192, + "byteOffset": 2688, + "byteStride": 32, + "target": 34962 + }, + { + "buffer": 0, + "byteLength": 192, + "byteOffset": 2880, + "byteStride": 32, + "target": 34962 + }, + { + "buffer": 0, + "byteLength": 192, + "byteOffset": 3072, + "byteStride": 32, + "target": 34962 + }, + { + "buffer": 0, + "byteLength": 192, + "byteOffset": 3264, + "byteStride": 32, + "target": 34962 + }, + { + "buffer": 0, + "byteLength": 1536, + "byteOffset": 3456, + "byteStride": 32, + "target": 34962 + }, + { + "buffer": 0, + "byteLength": 1536, + "byteOffset": 4992, + "byteStride": 32, + "target": 34962 + } + ], + "scene": 0, + "extensions": { + "KITTYCAD_boundary_representation": { + "solids": [ + { + "outerShell": 0, + "mesh": 0 + } + ], + "shells": [ + { + "faces": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15 + ] + } + ], + "faces": [ + { + "surface": 0, + "outerLoop": 0 + }, + { + "surface": 1, + "outerLoop": 1 + }, + { + "surface": 2, + "outerLoop": 2 + }, + { + "surface": 3, + "outerLoop": 3 + }, + { + "surface": 4, + "outerLoop": 4 + }, + { + "surface": 5, + "outerLoop": 5 + }, + { + "surface": 6, + "outerLoop": 6 + }, + { + "surface": 7, + "outerLoop": 7 + }, + { + "surface": 8, + "outerLoop": 8 + }, + { + "surface": 9, + "outerLoop": 9 + }, + { + "surface": 10, + "outerLoop": 10 + }, + { + "surface": 11, + "outerLoop": 11 + }, + { + "surface": 12, + "outerLoop": 12 + }, + { + "surface": 13, + "outerLoop": 13 + }, + { + "surface": -14, + "outerLoop": -14 + }, + { + "surface": 15, + "outerLoop": 15 + } + ], + "loops": [ + { + "edges": [ + 0, + 1, + -2, + -3 + ] + }, + { + "edges": [ + 4, + 5, + -6, + -1 + ] + }, + { + "edges": [ + 7, + 8, + -9, + -5 + ] + }, + { + "edges": [ + 10, + 11, + -12, + -8 + ] + }, + { + "edges": [ + 13, + 14, + -15, + -11 + ] + }, + { + "edges": [ + 16, + 17, + -18, + -14 + ] + }, + { + "edges": [ + 19, + 20, + -21, + -17 + ] + }, + { + "edges": [ + 22, + 23, + -24, + -20 + ] + }, + { + "edges": [ + 25, + 26, + -27, + -23 + ] + }, + { + "edges": [ + 28, + 29, + -30, + -26 + ] + }, + { + "edges": [ + 31, + 32, + -33, + -29 + ] + }, + { + "edges": [ + 34, + 35, + -36, + -32 + ] + }, + { + "edges": [ + 37, + 38, + -39, + -35 + ] + }, + { + "edges": [ + 40, + 3, + -41, + -38 + ] + }, + { + "edges": [ + 0, + 4, + 7, + 10, + 13, + 16, + 19, + 22, + 25, + 28, + 31, + 34, + 37, + 40 + ] + }, + { + "edges": [ + 2, + 6, + 9, + 12, + 15, + 18, + 21, + 24, + 27, + 30, + 33, + 36, + 39, + 41 + ] + } + ], + "edges": [ + { + "curve": 0, + "start": 0, + "end": 1, + "closed": false + }, + { + "curve": 1, + "start": 1, + "end": 2, + "closed": false + }, + { + "curve": 2, + "start": 3, + "end": 2, + "closed": false + }, + { + "curve": 3, + "start": 0, + "end": 3, + "closed": false + }, + { + "curve": 4, + "start": 1, + "end": 4, + "closed": false + }, + { + "curve": 5, + "start": 4, + "end": 5, + "closed": false + }, + { + "curve": 6, + "start": 2, + "end": 5, + "closed": false + }, + { + "curve": 7, + "start": 4, + "end": 6, + "closed": false + }, + { + "curve": 8, + "start": 6, + "end": 7, + "closed": false + }, + { + "curve": 9, + "start": 5, + "end": 7, + "closed": false + }, + { + "curve": 10, + "start": 6, + "end": 8, + "closed": false + }, + { + "curve": 11, + "start": 8, + "end": 9, + "closed": false + }, + { + "curve": 12, + "start": 7, + "end": 9, + "closed": false + }, + { + "curve": 13, + "start": 8, + "end": 10, + "closed": false + }, + { + "curve": 14, + "start": 10, + "end": 11, + "closed": false + }, + { + "curve": 15, + "start": 9, + "end": 11, + "closed": false + }, + { + "curve": 16, + "start": 10, + "end": 12, + "closed": false + }, + { + "curve": 17, + "start": 12, + "end": 13, + "closed": false + }, + { + "curve": 18, + "start": 11, + "end": 13, + "closed": false + }, + { + "curve": 19, + "start": 12, + "end": 14, + "closed": false + }, + { + "curve": 20, + "start": 14, + "end": 15, + "closed": false + }, + { + "curve": 21, + "start": 13, + "end": 15, + "closed": false + }, + { + "curve": 22, + "start": 14, + "end": 16, + "closed": false + }, + { + "curve": 23, + "start": 16, + "end": 17, + "closed": false + }, + { + "curve": 24, + "start": 15, + "end": 17, + "closed": false + }, + { + "curve": 25, + "start": 16, + "end": 18, + "closed": false + }, + { + "curve": 26, + "start": 18, + "end": 19, + "closed": false + }, + { + "curve": 27, + "start": 17, + "end": 19, + "closed": false + }, + { + "curve": 28, + "start": 18, + "end": 20, + "closed": false + }, + { + "curve": 29, + "start": 20, + "end": 21, + "closed": false + }, + { + "curve": 30, + "start": 19, + "end": 21, + "closed": false + }, + { + "curve": 31, + "start": 20, + "end": 22, + "closed": false + }, + { + "curve": 32, + "start": 22, + "end": 23, + "closed": false + }, + { + "curve": 33, + "start": 21, + "end": 23, + "closed": false + }, + { + "curve": 34, + "start": 22, + "end": 24, + "closed": false + }, + { + "curve": 35, + "start": 24, + "end": 25, + "closed": false + }, + { + "curve": 36, + "start": 23, + "end": 25, + "closed": false + }, + { + "curve": 37, + "start": 24, + "end": 26, + "closed": false + }, + { + "curve": 38, + "start": 26, + "end": 27, + "closed": false + }, + { + "curve": 39, + "start": 25, + "end": 27, + "closed": false + }, + { + "curve": 40, + "start": 26, + "end": 0, + "closed": false + }, + { + "curve": 41, + "start": 27, + "end": 3, + "closed": false + } + ], + "vertices": [ + [ + 0, + 0, + -0 + ], + [ + 0, + -0.0254, + -0 + ], + [ + 0, + -0.0254, + 0.1016 + ], + [ + 0, + 0, + 0.1016 + ], + [ + 0.07861000000000001, + -0.0254, + -0 + ], + [ + 0.07861000000000001, + -0.0254, + 0.1016 + ], + [ + 0.15116000000000002, + -0.0762, + -0 + ], + [ + 0.15116000000000002, + -0.0762, + 0.1016 + ], + [ + 0.2413, + -0.0762, + -0 + ], + [ + 0.2413, + -0.0762, + 0.1016 + ], + [ + 0.2413, + -0.0635, + -0 + ], + [ + 0.2413, + -0.0635, + 0.1016 + ], + [ + 0.15517, + -0.0635, + -0 + ], + [ + 0.15517, + -0.0635, + 0.1016 + ], + [ + 0.06448000000000001, + 0, + -0 + ], + [ + 0.06448000000000001, + 0, + 0.1016 + ], + [ + 0.14619, + 0.0381, + -0 + ], + [ + 0.14619, + 0.0381, + 0.1016 + ], + [ + 0.2413, + 0.0381, + -0 + ], + [ + 0.2413, + 0.0381, + 0.1016 + ], + [ + 0.2413, + 0.050800000000000005, + -0 + ], + [ + 0.2413, + 0.050800000000000005, + 0.1016 + ], + [ + 0.14337000000000005, + 0.050800000000000005, + -0 + ], + [ + 0.14337000000000005, + 0.050800000000000005, + 0.1016 + ], + [ + 0.0889, + 0.0254, + -0 + ], + [ + 0.0889, + 0.0254, + 0.1016 + ], + [ + 0, + 0.0254, + -0 + ], + [ + 0, + 0.0254, + 0.1016 + ] + ], + "surfaces": [ + { + "type": "plane", + "plane": { + "normal": [ + -1, + 0, + 0 + ], + "point": [ + 0, + -0.0127, + 0.050800000000000005 + ] + } + }, + { + "type": "plane", + "plane": { + "normal": [ + 0, + -1, + -0 + ], + "point": [ + 0.039310000000000005, + -0.0254, + 0.050800000000000005 + ] + } + }, + { + "type": "plane", + "plane": { + "normal": [ + -0.5735800000000001, + -0.81915, + 0 + ], + "point": [ + 0.11489, + -0.050800000000000005, + 0.050800000000000005 + ] + } + }, + { + "type": "plane", + "plane": { + "normal": [ + 0, + -1, + -0 + ], + "point": [ + 0.19623, + -0.0762, + 0.050800000000000005 + ] + } + }, + { + "type": "plane", + "plane": { + "normal": [ + 1, + 0, + -0 + ], + "point": [ + 0.2413, + -0.06985000000000001, + 0.050800000000000005 + ] + } + }, + { + "type": "plane", + "plane": { + "normal": [ + 0, + 1, + -0 + ], + "point": [ + 0.19823, + -0.0635, + 0.050800000000000005 + ] + } + }, + { + "type": "plane", + "plane": { + "normal": [ + 0.5735800000000001, + 0.81915, + 0 + ], + "point": [ + 0.10982, + -0.03175, + 0.050800000000000005 + ] + } + }, + { + "type": "plane", + "plane": { + "normal": [ + 0.4226200000000001, + -0.90631, + -0 + ], + "point": [ + 0.10533, + 0.01905, + 0.050800000000000005 + ] + } + }, + { + "type": "plane", + "plane": { + "normal": [ + 0, + -1, + -0 + ], + "point": [ + 0.19374, + 0.0381, + 0.050800000000000005 + ] + } + }, + { + "type": "plane", + "plane": { + "normal": [ + 1, + 0, + -0 + ], + "point": [ + 0.2413, + 0.04445, + 0.050800000000000005 + ] + } + }, + { + "type": "plane", + "plane": { + "normal": [ + 0, + 1, + -0 + ], + "point": [ + 0.19234, + 0.050800000000000005, + 0.050800000000000005 + ] + } + }, + { + "type": "plane", + "plane": { + "normal": [ + -0.4226200000000001, + 0.90631, + 0 + ], + "point": [ + 0.11614, + 0.0381, + 0.050800000000000005 + ] + } + }, + { + "type": "plane", + "plane": { + "normal": [ + 0, + 1, + -0 + ], + "point": [ + 0.04445, + 0.0254, + 0.050800000000000005 + ] + } + }, + { + "type": "plane", + "plane": { + "normal": [ + -1, + 0, + 0 + ], + "point": [ + 0, + 0.0127, + 0.050800000000000005 + ] + } + }, + { + "type": "plane", + "plane": { + "normal": [ + 0, + 0, + 1 + ], + "point": [ + 0, + 0, + 0 + ] + } + }, + { + "type": "plane", + "plane": { + "normal": [ + 0, + 0, + 1 + ], + "point": [ + 0, + 0, + 0.1016 + ] + } + } + ], + "curves": [ + { + "type": "line", + "line": { + "start": [ + 0, + 0, + 0 + ], + "direction": [ + 0, + -1, + 0 + ] + }, + "domain": { + "min": 0, + "max": 0.0254 + } + }, + { + "type": "line", + "line": { + "start": [ + 0, + -0.0254, + 0 + ], + "direction": [ + 0, + 0, + 1 + ] + }, + "domain": { + "min": 0, + "max": 0.1016 + } + }, + { + "type": "line", + "line": { + "start": [ + 0, + 0, + 0.1016 + ], + "direction": [ + 0, + -1, + 0 + ] + }, + "domain": { + "min": 0, + "max": 0.0254 + } + }, + { + "type": "line", + "line": { + "start": [ + 0, + 0, + 0 + ], + "direction": [ + 0, + 0, + 1 + ] + }, + "domain": { + "min": 0, + "max": 0.1016 + } + }, + { + "type": "line", + "line": { + "start": [ + 0, + -0.0254, + -0 + ], + "direction": [ + 1, + 0, + -0 + ] + }, + "domain": { + "min": 0, + "max": 0.07861000000000001 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.07861000000000001, + -0.0254, + 0 + ], + "direction": [ + 0, + 0, + 1 + ] + }, + "domain": { + "min": 0, + "max": 0.1016 + } + }, + { + "type": "line", + "line": { + "start": [ + 0, + -0.0254, + 0.1016 + ], + "direction": [ + 1, + 0, + -0 + ] + }, + "domain": { + "min": 0, + "max": 0.07861000000000001 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.07861000000000001, + -0.0254, + 0 + ], + "direction": [ + 0.81915, + -0.5735800000000001, + 0 + ] + }, + "domain": { + "min": 0, + "max": 0.08857000000000001 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.15116000000000002, + -0.0762, + 0 + ], + "direction": [ + 0, + 0, + 1 + ] + }, + "domain": { + "min": 0, + "max": 0.1016 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.07861000000000001, + -0.0254, + 0.1016 + ], + "direction": [ + 0.81915, + -0.5735800000000001, + 0 + ] + }, + "domain": { + "min": 0, + "max": 0.08857000000000001 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.15116000000000002, + -0.0762, + 0 + ], + "direction": [ + 1, + -0, + 0 + ] + }, + "domain": { + "min": 0, + "max": 0.09014 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.2413, + -0.0762, + 0 + ], + "direction": [ + 0, + 0, + 1 + ] + }, + "domain": { + "min": 0, + "max": 0.1016 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.15116000000000002, + -0.0762, + 0.1016 + ], + "direction": [ + 1, + -0, + 0 + ] + }, + "domain": { + "min": 0, + "max": 0.09014 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.2413, + -0.0762, + 0 + ], + "direction": [ + 0, + 1, + 0 + ] + }, + "domain": { + "min": 0, + "max": 0.0127 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.2413, + -0.0635, + 0 + ], + "direction": [ + 0, + 0, + 1 + ] + }, + "domain": { + "min": 0, + "max": 0.1016 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.2413, + -0.0762, + 0.1016 + ], + "direction": [ + 0, + 1, + 0 + ] + }, + "domain": { + "min": 0, + "max": 0.0127 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.2413, + -0.0635, + 0 + ], + "direction": [ + -1, + 0, + 0 + ] + }, + "domain": { + "min": 0, + "max": 0.08613000000000001 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.15517, + -0.0635, + 0 + ], + "direction": [ + 0, + 0, + 1 + ] + }, + "domain": { + "min": 0, + "max": 0.1016 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.2413, + -0.0635, + 0.1016 + ], + "direction": [ + -1, + 0, + 0 + ] + }, + "domain": { + "min": 0, + "max": 0.08613000000000001 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.15517, + -0.0635, + 0 + ], + "direction": [ + -0.81915, + 0.5735800000000001, + 0 + ] + }, + "domain": { + "min": 0, + "max": 0.11071 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.06448000000000001, + 0, + 0 + ], + "direction": [ + 0, + 0, + 1 + ] + }, + "domain": { + "min": 0, + "max": 0.1016 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.15517, + -0.0635, + 0.1016 + ], + "direction": [ + -0.81915, + 0.5735800000000001, + 0 + ] + }, + "domain": { + "min": 0, + "max": 0.11071 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.06448000000000001, + 0, + 0 + ], + "direction": [ + 0.90631, + 0.4226200000000001, + 0 + ] + }, + "domain": { + "min": 0, + "max": 0.09015 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.14619, + 0.0381, + 0 + ], + "direction": [ + 0, + 0, + 1 + ] + }, + "domain": { + "min": 0, + "max": 0.1016 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.06448000000000001, + 0, + 0.1016 + ], + "direction": [ + 0.90631, + 0.4226200000000001, + 0 + ] + }, + "domain": { + "min": 0, + "max": 0.09015 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.14619, + 0.0381, + 0 + ], + "direction": [ + 1, + -0, + 0 + ] + }, + "domain": { + "min": 0, + "max": 0.09511 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.2413, + 0.0381, + 0 + ], + "direction": [ + 0, + 0, + 1 + ] + }, + "domain": { + "min": 0, + "max": 0.1016 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.14619, + 0.0381, + 0.1016 + ], + "direction": [ + 1, + -0, + 0 + ] + }, + "domain": { + "min": 0, + "max": 0.09511 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.2413, + 0.0381, + 0 + ], + "direction": [ + 0, + 1, + 0 + ] + }, + "domain": { + "min": 0, + "max": 0.0127 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.2413, + 0.050800000000000005, + 0 + ], + "direction": [ + 0, + 0, + 1 + ] + }, + "domain": { + "min": 0, + "max": 0.1016 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.2413, + 0.0381, + 0.1016 + ], + "direction": [ + 0, + 1, + 0 + ] + }, + "domain": { + "min": 0, + "max": 0.0127 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.2413, + 0.050800000000000005, + 0 + ], + "direction": [ + -1, + 0, + 0 + ] + }, + "domain": { + "min": 0, + "max": 0.09793 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.14337000000000005, + 0.050800000000000005, + 0 + ], + "direction": [ + 0, + 0, + 1 + ] + }, + "domain": { + "min": 0, + "max": 0.1016 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.2413, + 0.050800000000000005, + 0.1016 + ], + "direction": [ + -1, + 0, + 0 + ] + }, + "domain": { + "min": 0, + "max": 0.09793 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.14337000000000005, + 0.050800000000000005, + 0 + ], + "direction": [ + -0.90631, + -0.4226200000000001, + 0 + ] + }, + "domain": { + "min": 0, + "max": 0.06010000000000001 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.0889, + 0.0254, + 0 + ], + "direction": [ + 0, + 0, + 1 + ] + }, + "domain": { + "min": 0, + "max": 0.1016 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.14337000000000005, + 0.050800000000000005, + 0.1016 + ], + "direction": [ + -0.90631, + -0.4226200000000001, + 0 + ] + }, + "domain": { + "min": 0, + "max": 0.06010000000000001 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.0889, + 0.0254, + 0 + ], + "direction": [ + -1, + 0, + 0 + ] + }, + "domain": { + "min": 0, + "max": 0.0889 + } + }, + { + "type": "line", + "line": { + "start": [ + 0, + 0.0254, + 0 + ], + "direction": [ + 0, + 0, + 1 + ] + }, + "domain": { + "min": 0, + "max": 0.1016 + } + }, + { + "type": "line", + "line": { + "start": [ + 0.0889, + 0.0254, + 0.1016 + ], + "direction": [ + -1, + 0, + 0 + ] + }, + "domain": { + "min": 0, + "max": 0.0889 + } + }, + { + "type": "line", + "line": { + "start": [ + 0, + 0.0254, + 0 + ], + "direction": [ + 0, + -1, + 0 + ] + }, + "domain": { + "min": 0, + "max": 0.0254 + } + }, + { + "type": "line", + "line": { + "start": [ + 0, + 0.0254, + 0.1016 + ], + "direction": [ + 0, + -1, + 0 + ] + }, + "domain": { + "min": 0, + "max": 0.0254 + } + } + ] + } + }, + "extensionsUsed": [ + "KITTYCAD_boundary_representation" + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "POSITION": 0, + "NORMAL": 1, + "TEXCOORD_0": 2 + } + }, + { + "attributes": { + "POSITION": 3, + "NORMAL": 4, + "TEXCOORD_0": 5 + } + }, + { + "attributes": { + "POSITION": 6, + "NORMAL": 7, + "TEXCOORD_0": 8 + } + }, + { + "attributes": { + "POSITION": 9, + "NORMAL": 10, + "TEXCOORD_0": 11 + } + }, + { + "attributes": { + "POSITION": 12, + "NORMAL": 13, + "TEXCOORD_0": 14 + } + }, + { + "attributes": { + "POSITION": 15, + "NORMAL": 16, + "TEXCOORD_0": 17 + } + }, + { + "attributes": { + "POSITION": 18, + "NORMAL": 19, + "TEXCOORD_0": 20 + } + }, + { + "attributes": { + "POSITION": 21, + "NORMAL": 22, + "TEXCOORD_0": 23 + } + }, + { + "attributes": { + "POSITION": 24, + "NORMAL": 25, + "TEXCOORD_0": 26 + } + }, + { + "attributes": { + "POSITION": 27, + "NORMAL": 28, + "TEXCOORD_0": 29 + } + }, + { + "attributes": { + "POSITION": 30, + "NORMAL": 31, + "TEXCOORD_0": 32 + } + }, + { + "attributes": { + "POSITION": 33, + "NORMAL": 34, + "TEXCOORD_0": 35 + } + }, + { + "attributes": { + "POSITION": 36, + "NORMAL": 37, + "TEXCOORD_0": 38 + } + }, + { + "attributes": { + "POSITION": 39, + "NORMAL": 40, + "TEXCOORD_0": 41 + } + }, + { + "attributes": { + "POSITION": 42, + "NORMAL": 43, + "TEXCOORD_0": 44 + } + }, + { + "attributes": { + "POSITION": 45, + "NORMAL": 46, + "TEXCOORD_0": 47 + } + } + ] + } + ], + "nodes": [ + { + "children": [ + 1 + ] + }, + { + "children": [ + 2 + ] + }, + { + "extensions": { + "KITTYCAD_boundary_representation": { + "solid": 0 + } + }, + "mesh": 0 + } + ], + "scenes": [ + { + "nodes": [ + 0 + ] + } + ] +} \ No newline at end of file diff --git a/e2e/playwright/export-snapshots/gltf-standard.gltf b/e2e/playwright/export-snapshots/gltf-standard.gltf new file mode 100644 index 0000000000000000000000000000000000000000..bd5b4dc47efca8e8236fc7d7021d667f24114eae GIT binary patch literal 6528 zcmb7|J%}Dv6ov=W%0d!EB8w16E2M}LFtZC5Dps*bVP{eV3ws-ji`ZERS_x@V2C+~f z1UBPnOar(2n zcmDb{dj|ft&$PkKrnA0}A8y#2mhD?yKCGqF{BLmi5AofNkKsahaj1E=U-98WcegM3 zEx75|`xcjl?Cm4zcg8TqpZyDnR$TsPuKNA;%enENZ{PO(zr6Lb=TCeYZt&srM=uieg*e---{*Zj5oZ*ch!@s)kf@zU+fK0nG|@w5Gk_iz01 zqVt^pf@}VU7T?$ZMtu42fBx{B-tzPF!`An)t$(lKjg#N}{J8!1ug0J8`qsSb-o2#! z;L3c1_wZ?d%>J>j$5-3mIJxEZgDd|HKIb3fPx<%#!N-0^ZP@$x;W0mpFFv&D18>FO z<$vG$Y~-){%=L}&r}{SQL;mahmh->M|7X8{)sF{<*JS_x&8J6?&b;U6=l6FX`2A4V zcggel1lRaB`0(e0C+7do%D;8j`s-Wq;mUvM-}4(tyW&gw1&)NBVs5KhL z@9Q7FuJ2W!fAU}RW&Jn&`})Q{j&GX3p%tI;#rVt*Jo=}8wSV<7-Pg~>A74{`JzPLE z@ag_Iv|8x=UvRHazCU*Jef=x2yD$04e~7=jpL*hF`xSS4jWg%J;Pd^};;bJ_vA+Lw zf6o3l;?MV2@vjkPAFqG<<~%;}Y`^0D{h!Vq?XVvdzr|Ibef)34m;Xh4+uz^W`QtS> z^U}X|W|a7{-{Ad~v-eed&X?L==hx8UjIZT?gUkOSzV%Tz&;QEVSG@kj7Z45H*F5_}_ki5tpI;_}~ng`IwVeE**|(d-+6y1_UQHZ*Wx3M=;~L!AI$O5@l$Mbe01s@IXZD7N2g!p=&kw3 zPqas`&&Sdyjp*V2O}S4R(OHM4tEK#u_1T(#=Bd~&=Z}48TrK6N?9Wzw_EE9T{?Qp{ z9UHx>AM2=3s$kE9oa&-Jej^3)T+0l~yGCgH~36}GF$)!`r zV!N#GKJicU&-rP6=DWz!JVqyelospR;YT*Z(!?x67V9B1doeXC9+Hy0S55-{qI*D?0NK UIXe9!M<-6?=<25yc~-mbKRbI000000 literal 0 HcmV?d00001 diff --git a/e2e/playwright/export-snapshots/obj-.obj b/e2e/playwright/export-snapshots/obj-.obj new file mode 100644 index 000000000..1f1b29d05 --- /dev/null +++ b/e2e/playwright/export-snapshots/obj-.obj @@ -0,0 +1,189 @@ +v 0 -4 0 +v 0 0 0 +v 0 -4 -1 +v 0 0 -1 +v 3.0950184 -4 -1 +v 3.0950184 0 -1 +v 5.9513144 -4 -3 +v 5.9513144 0 -3 +v 9.5 -4 -3 +v 9.5 0 -3 +v 9.5 -4 -2.5 +v 9.5 0 -2.5 +v 6.108964 -4 -2.5 +v 6.108964 0 -2.5 +v 3.4311862 -4 -0.625 +v 4.323779 -4 -1.25 +v 4.323779 -0 -1.25 +v 3.4311862 -0 -0.625 +v 2.5385938 0 0 +v 2.5385938 -4 0 +v 3.342784 -4 0.375 +v 4.146974 -4 0.75 +v 3.342784 -0 0.375 +v 4.146974 -0 0.75 +v 5.755354 0 1.5 +v 5.755354 -4 1.5 +v 9.5 -4 1.5 +v 9.5 0 1.5 +v 9.5 -4 2 +v 9.5 0 2 +v 5.644507 -4 2 +v 5.644507 0 2 +v 3.5 -4 1 +v 3.5 0 1 +v 0 -4 1 +v 0 0 1 +vt 0.0127 -0.0508 +vt 0.0127 0.0508 +vt -0.0127 -0.0508 +vt -0.0127 0.0508 +vt -0.039306734 0.0508 +vt -0.039306734 -0.0508 +vt 0.039306734 0.0508 +vt 0.039306734 -0.0508 +vt -0.04428355 0.0508 +vt -0.04428355 -0.0508 +vt 0.04428355 0.0508 +vt 0.04428355 -0.0508 +vt -0.045068305 0.0508 +vt -0.045068305 -0.0508 +vt 0.045068305 0.0508 +vt 0.045068305 -0.0508 +vt -0.00635 0.0508 +vt -0.00635 -0.0508 +vt 0.00635 0.0508 +vt 0.00635 -0.0508 +vt 0.04306616 -0.0508 +vt 0.04306616 0.0508 +vt -0.04306616 -0.0508 +vt -0.04306616 0.0508 +vt -0.027677217 -0.0508 +vt 0.000000000000000048572257 -0.0508 +vt 0.000000000000000048572257 0.0508 +vt 0.055354435 -0.0508 +vt 0.055354435 0.0508 +vt -0.027677217 0.0508 +vt -0.055354435 0.0508 +vt -0.055354435 -0.0508 +vt -0.02253807 0.0508 +vt -0.04507614 0.0508 +vt -0.04507614 -0.0508 +vt 0.00000000000000005551115 0.0508 +vt -0.02253807 -0.0508 +vt 0.00000000000000005551115 -0.0508 +vt 0.04507614 -0.0508 +vt 0.04507614 0.0508 +vt -0.047557 0.0508 +vt -0.047557 -0.0508 +vt 0.047557 0.0508 +vt 0.047557 -0.0508 +vt 0.04896476 -0.0508 +vt 0.04896476 0.0508 +vt -0.04896476 -0.0508 +vt -0.04896476 0.0508 +vt 0.03005076 -0.0508 +vt 0.03005076 0.0508 +vt -0.03005076 -0.0508 +vt -0.03005076 0.0508 +vt 0.04445 -0.0508 +vt 0.04445 0.0508 +vt -0.04445 -0.0508 +vt -0.04445 0.0508 +vt 0.08490671 0.009525 +vt 0.06448028 0 +vt 0.0889 0.0254 +vt 0.08715213 -0.015875 +vt 0.10982399 -0.03175 +vt 0.07861347 -0.0254 +vt 0.10533314 0.01905 +vt 0.15116338 -0.0762 +vt 0 -0.0254 +vt 0 0 +vt 0.2413 -0.0762 +vt 0.15516768 -0.0635 +vt 0.2413 -0.0635 +vt 0.14337048 0.0508 +vt 0.146186 0.0381 +vt 0.2413 0.0381 +vt 0.2413 0.0508 +vt 0 0.0254 +vn -1 -0 0 +vn 0 -0 -1 +vn -0.57357645 -0 -0.81915206 +vn 1 -0 0 +vn 0 -0 1 +vn 0.57357645 -0 0.81915206 +vn 0.42261827 -0 -0.9063078 +vn -0.42261827 -0 0.9063078 +vn -0 1 -0 +vn 0 -1 0 +o Unnamed-0 +f 1/1/1 2/2/1 3/3/1 +f 3/3/1 2/2/1 4/4/1 +f 3/5/2 4/6/2 5/7/2 +f 5/7/2 4/6/2 6/8/2 +f 5/9/3 6/10/3 7/11/3 +f 7/11/3 6/10/3 8/12/3 +f 7/13/2 8/14/2 9/15/2 +f 9/15/2 8/14/2 10/16/2 +f 9/17/4 10/18/4 11/19/4 +f 11/19/4 10/18/4 12/20/4 +f 11/21/5 12/22/5 13/23/5 +f 13/23/5 12/22/5 14/24/5 +f 15/25/6 16/26/6 17/27/6 +f 16/26/6 13/28/6 14/29/6 +f 18/30/6 19/31/6 20/32/6 +f 15/25/6 18/30/6 20/32/6 +f 16/26/6 14/29/6 17/27/6 +f 18/30/6 15/25/6 17/27/6 +f 21/33/7 20/34/7 19/35/7 +f 22/36/7 21/33/7 23/37/7 +f 23/37/7 24/38/7 22/36/7 +f 24/38/7 25/39/7 26/40/7 +f 21/33/7 19/35/7 23/37/7 +f 26/40/7 22/36/7 24/38/7 +f 26/41/2 25/42/2 27/43/2 +f 27/43/2 25/42/2 28/44/2 +f 27/17/4 28/18/4 29/19/4 +f 29/19/4 28/18/4 30/20/4 +f 29/45/5 30/46/5 31/47/5 +f 31/47/5 30/46/5 32/48/5 +f 31/49/8 32/50/8 33/51/8 +f 33/51/8 32/50/8 34/52/8 +f 33/53/5 34/54/5 35/55/5 +f 35/55/5 34/54/5 36/56/5 +f 35/1/1 36/2/1 1/3/1 +f 1/3/1 36/2/1 2/4/1 +f 23/57/9 19/58/9 34/59/9 +f 18/60/9 17/61/9 6/62/9 +f 23/57/9 34/59/9 24/63/9 +f 17/61/9 8/64/9 6/62/9 +f 4/65/9 19/58/9 6/62/9 +f 4/65/9 2/66/9 19/58/9 +f 10/67/9 14/68/9 12/69/9 +f 10/67/9 8/64/9 14/68/9 +f 8/64/9 17/61/9 14/68/9 +f 32/70/9 25/71/9 24/63/9 +f 6/62/9 19/58/9 18/60/9 +f 24/63/9 34/59/9 32/70/9 +f 28/72/9 25/71/9 30/73/9 +f 25/71/9 32/70/9 30/73/9 +f 19/58/9 2/66/9 36/74/9 +f 34/59/9 19/58/9 36/74/9 +f 21/57/10 33/59/10 20/58/10 +f 22/63/10 33/59/10 21/57/10 +f 15/60/10 5/62/10 16/61/10 +f 22/63/10 26/71/10 31/70/10 +f 35/74/10 20/58/10 33/59/10 +f 35/74/10 1/66/10 20/58/10 +f 31/70/10 26/71/10 29/73/10 +f 29/73/10 26/71/10 27/72/10 +f 22/63/10 31/70/10 33/59/10 +f 20/58/10 5/62/10 15/60/10 +f 16/61/10 5/62/10 7/64/10 +f 13/68/10 16/61/10 7/64/10 +f 11/69/10 13/68/10 9/67/10 +f 13/68/10 7/64/10 9/67/10 +f 20/58/10 3/65/10 5/62/10 +f 3/65/10 20/58/10 1/66/10 diff --git a/e2e/playwright/export-snapshots/step-.step b/e2e/playwright/export-snapshots/step-.step new file mode 100644 index 000000000..be3513e0b --- /dev/null +++ b/e2e/playwright/export-snapshots/step-.step @@ -0,0 +1,494 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION((('kittycad.io export')), '2;1'); +FILE_NAME('dump.step', '1970-01-01T00:00:00.0+00:00', ('Author unknown'), ('Organization unknown'), 'kittycad.io beta', 'kittycad.io', 'Authorization unknown'); +FILE_SCHEMA(('AP203_CONFIGURATION_CONTROLLED_3D_DESIGN_OF_MECHANICAL_PARTS_AND_ASSEMBLIES_MIM_LF')); +ENDSEC; +DATA; +#1 = ( + LENGTH_UNIT() + NAMED_UNIT(*) + SI_UNIT($, .METRE.) +); +#2 = UNCERTAINTY_MEASURE_WITH_UNIT(0.00001, #1, 'DISTANCE_ACCURACY_VALUE', $); +#3 = ( + GEOMETRIC_REPRESENTATION_CONTEXT(3) + GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#2)) + GLOBAL_UNIT_ASSIGNED_CONTEXT((#1)) + REPRESENTATION_CONTEXT('', '3D') +); +#4 = CARTESIAN_POINT('NONE', (0, 0, -0)); +#5 = VERTEX_POINT('NONE', #4); +#6 = CARTESIAN_POINT('NONE', (0, -0.0254, -0)); +#7 = VERTEX_POINT('NONE', #6); +#8 = CARTESIAN_POINT('NONE', (0, -0.0254, 0.1016)); +#9 = VERTEX_POINT('NONE', #8); +#10 = CARTESIAN_POINT('NONE', (0, 0, 0.1016)); +#11 = VERTEX_POINT('NONE', #10); +#12 = CARTESIAN_POINT('NONE', (0.07861346939195568, -0.0254, -0)); +#13 = VERTEX_POINT('NONE', #12); +#14 = CARTESIAN_POINT('NONE', (0.07861346939195568, -0.0254, 0.1016)); +#15 = VERTEX_POINT('NONE', #14); +#16 = CARTESIAN_POINT('NONE', (0.1511633881344551, -0.07619999999999998, -0)); +#17 = VERTEX_POINT('NONE', #16); +#18 = CARTESIAN_POINT('NONE', (0.1511633881344551, -0.07619999999999998, 0.1016)); +#19 = VERTEX_POINT('NONE', #18); +#20 = CARTESIAN_POINT('NONE', (0.2413, -0.0762, -0)); +#21 = VERTEX_POINT('NONE', #20); +#22 = CARTESIAN_POINT('NONE', (0.2413, -0.0762, 0.1016)); +#23 = VERTEX_POINT('NONE', #22); +#24 = CARTESIAN_POINT('NONE', (0.2413, -0.0635, -0)); +#25 = VERTEX_POINT('NONE', #24); +#26 = CARTESIAN_POINT('NONE', (0.2413, -0.0635, 0.1016)); +#27 = VERTEX_POINT('NONE', #26); +#28 = CARTESIAN_POINT('NONE', (0.1551676827532182, -0.0635, -0)); +#29 = VERTEX_POINT('NONE', #28); +#30 = CARTESIAN_POINT('NONE', (0.1551676827532182, -0.0635, 0.1016)); +#31 = VERTEX_POINT('NONE', #30); +#32 = CARTESIAN_POINT('NONE', (0.06448028432509392, 0, -0)); +#33 = VERTEX_POINT('NONE', #32); +#34 = CARTESIAN_POINT('NONE', (0.06448028432509392, 0, 0.1016)); +#35 = VERTEX_POINT('NONE', #34); +#36 = CARTESIAN_POINT('NONE', (0.14618599799650817, 0.03810000000000001, -0)); +#37 = VERTEX_POINT('NONE', #36); +#38 = CARTESIAN_POINT('NONE', (0.14618599799650817, 0.03810000000000001, 0.1016)); +#39 = VERTEX_POINT('NONE', #38); +#40 = CARTESIAN_POINT('NONE', (0.2413, 0.0381, -0)); +#41 = VERTEX_POINT('NONE', #40); +#42 = CARTESIAN_POINT('NONE', (0.2413, 0.0381, 0.1016)); +#43 = VERTEX_POINT('NONE', #42); +#44 = CARTESIAN_POINT('NONE', (0.2413, 0.0508, -0)); +#45 = VERTEX_POINT('NONE', #44); +#46 = CARTESIAN_POINT('NONE', (0.2413, 0.0508, 0.1016)); +#47 = VERTEX_POINT('NONE', #46); +#48 = CARTESIAN_POINT('NONE', (0.14337047578094278, 0.0508, -0)); +#49 = VERTEX_POINT('NONE', #48); +#50 = CARTESIAN_POINT('NONE', (0.14337047578094278, 0.0508, 0.1016)); +#51 = VERTEX_POINT('NONE', #50); +#52 = CARTESIAN_POINT('NONE', (0.08889999999999999, 0.0254, -0)); +#53 = VERTEX_POINT('NONE', #52); +#54 = CARTESIAN_POINT('NONE', (0.08889999999999999, 0.0254, 0.1016)); +#55 = VERTEX_POINT('NONE', #54); +#56 = CARTESIAN_POINT('NONE', (0, 0.0254, -0)); +#57 = VERTEX_POINT('NONE', #56); +#58 = CARTESIAN_POINT('NONE', (0, 0.0254, 0.1016)); +#59 = VERTEX_POINT('NONE', #58); +#60 = DIRECTION('NONE', (0, -1, 0)); +#61 = VECTOR('NONE', #60, 0.0254); +#62 = CARTESIAN_POINT('NONE', (0, 0, -0)); +#63 = LINE('NONE', #62, #61); +#64 = DIRECTION('NONE', (0, 0, 1)); +#65 = VECTOR('NONE', #64, 0.1016); +#66 = CARTESIAN_POINT('NONE', (0, -0.0254, -0)); +#67 = LINE('NONE', #66, #65); +#68 = DIRECTION('NONE', (0, -1, 0)); +#69 = VECTOR('NONE', #68, 0.0254); +#70 = CARTESIAN_POINT('NONE', (0, 0, 0.1016)); +#71 = LINE('NONE', #70, #69); +#72 = DIRECTION('NONE', (0, 0, 1)); +#73 = VECTOR('NONE', #72, 0.1016); +#74 = CARTESIAN_POINT('NONE', (0, 0, -0)); +#75 = LINE('NONE', #74, #73); +#76 = DIRECTION('NONE', (1, 0, 0)); +#77 = VECTOR('NONE', #76, 0.07861346939195568); +#78 = CARTESIAN_POINT('NONE', (0, -0.0254, -0)); +#79 = LINE('NONE', #78, #77); +#80 = DIRECTION('NONE', (0, 0, 1)); +#81 = VECTOR('NONE', #80, 0.1016); +#82 = CARTESIAN_POINT('NONE', (0.07861346939195568, -0.0254, -0)); +#83 = LINE('NONE', #82, #81); +#84 = DIRECTION('NONE', (1, 0, 0)); +#85 = VECTOR('NONE', #84, 0.07861346939195568); +#86 = CARTESIAN_POINT('NONE', (0, -0.0254, 0.1016)); +#87 = LINE('NONE', #86, #85); +#88 = DIRECTION('NONE', (0.8191520442889919, -0.5735764363510459, 0)); +#89 = VECTOR('NONE', #88, 0.08856709721755177); +#90 = CARTESIAN_POINT('NONE', (0.07861346939195568, -0.0254, -0)); +#91 = LINE('NONE', #90, #89); +#92 = DIRECTION('NONE', (0, 0, 1)); +#93 = VECTOR('NONE', #92, 0.1016); +#94 = CARTESIAN_POINT('NONE', (0.1511633881344551, -0.07619999999999998, -0)); +#95 = LINE('NONE', #94, #93); +#96 = DIRECTION('NONE', (0.8191520442889919, -0.5735764363510459, 0)); +#97 = VECTOR('NONE', #96, 0.08856709721755177); +#98 = CARTESIAN_POINT('NONE', (0.07861346939195568, -0.0254, 0.1016)); +#99 = LINE('NONE', #98, #97); +#100 = DIRECTION('NONE', (1, -0.0000000000000003079278779307945, 0)); +#101 = VECTOR('NONE', #100, 0.09013661186554489); +#102 = CARTESIAN_POINT('NONE', (0.1511633881344551, -0.07619999999999998, -0)); +#103 = LINE('NONE', #102, #101); +#104 = DIRECTION('NONE', (0, 0, 1)); +#105 = VECTOR('NONE', #104, 0.1016); +#106 = CARTESIAN_POINT('NONE', (0.2413, -0.0762, -0)); +#107 = LINE('NONE', #106, #105); +#108 = DIRECTION('NONE', (1, -0.0000000000000003079278779307945, 0)); +#109 = VECTOR('NONE', #108, 0.09013661186554489); +#110 = CARTESIAN_POINT('NONE', (0.1511633881344551, -0.07619999999999998, 0.1016)); +#111 = LINE('NONE', #110, #109); +#112 = DIRECTION('NONE', (0, 1, 0)); +#113 = VECTOR('NONE', #112, 0.012700000000000003); +#114 = CARTESIAN_POINT('NONE', (0.2413, -0.0762, -0)); +#115 = LINE('NONE', #114, #113); +#116 = DIRECTION('NONE', (0, 0, 1)); +#117 = VECTOR('NONE', #116, 0.1016); +#118 = CARTESIAN_POINT('NONE', (0.2413, -0.0635, -0)); +#119 = LINE('NONE', #118, #117); +#120 = DIRECTION('NONE', (0, 1, 0)); +#121 = VECTOR('NONE', #120, 0.012700000000000003); +#122 = CARTESIAN_POINT('NONE', (0.2413, -0.0762, 0.1016)); +#123 = LINE('NONE', #122, #121); +#124 = DIRECTION('NONE', (-1, 0, 0)); +#125 = VECTOR('NONE', #124, 0.08613231724678178); +#126 = CARTESIAN_POINT('NONE', (0.2413, -0.0635, -0)); +#127 = LINE('NONE', #126, #125); +#128 = DIRECTION('NONE', (0, 0, 1)); +#129 = VECTOR('NONE', #128, 0.1016); +#130 = CARTESIAN_POINT('NONE', (0.1551676827532182, -0.0635, -0)); +#131 = LINE('NONE', #130, #129); +#132 = DIRECTION('NONE', (-1, 0, 0)); +#133 = VECTOR('NONE', #132, 0.08613231724678178); +#134 = CARTESIAN_POINT('NONE', (0.2413, -0.0635, 0.1016)); +#135 = LINE('NONE', #134, #133); +#136 = DIRECTION('NONE', (-0.8191520442889918, 0.573576436351046, 0)); +#137 = VECTOR('NONE', #136, 0.11070887152193974); +#138 = CARTESIAN_POINT('NONE', (0.1551676827532182, -0.0635, -0)); +#139 = LINE('NONE', #138, #137); +#140 = DIRECTION('NONE', (0, 0, 1)); +#141 = VECTOR('NONE', #140, 0.1016); +#142 = CARTESIAN_POINT('NONE', (0.06448028432509392, 0, -0)); +#143 = LINE('NONE', #142, #141); +#144 = DIRECTION('NONE', (-0.8191520442889918, 0.573576436351046, 0)); +#145 = VECTOR('NONE', #144, 0.11070887152193974); +#146 = CARTESIAN_POINT('NONE', (0.1551676827532182, -0.0635, 0.1016)); +#147 = LINE('NONE', #146, #145); +#148 = DIRECTION('NONE', (0.90630778703665, 0.4226182617406993, 0)); +#149 = VECTOR('NONE', #148, 0.09015228031811025); +#150 = CARTESIAN_POINT('NONE', (0.06448028432509392, 0, -0)); +#151 = LINE('NONE', #150, #149); +#152 = DIRECTION('NONE', (0, 0, 1)); +#153 = VECTOR('NONE', #152, 0.1016); +#154 = CARTESIAN_POINT('NONE', (0.14618599799650817, 0.03810000000000001, -0)); +#155 = LINE('NONE', #154, #153); +#156 = DIRECTION('NONE', (0.90630778703665, 0.4226182617406993, 0)); +#157 = VECTOR('NONE', #156, 0.09015228031811025); +#158 = CARTESIAN_POINT('NONE', (0.06448028432509392, 0, 0.1016)); +#159 = LINE('NONE', #158, #157); +#160 = DIRECTION('NONE', (1, -0.00000000000000007295344279228718, 0)); +#161 = VECTOR('NONE', #160, 0.09511400200349182); +#162 = CARTESIAN_POINT('NONE', (0.14618599799650817, 0.03810000000000001, -0)); +#163 = LINE('NONE', #162, #161); +#164 = DIRECTION('NONE', (0, 0, 1)); +#165 = VECTOR('NONE', #164, 0.1016); +#166 = CARTESIAN_POINT('NONE', (0.2413, 0.0381, -0)); +#167 = LINE('NONE', #166, #165); +#168 = DIRECTION('NONE', (1, -0.00000000000000007295344279228718, 0)); +#169 = VECTOR('NONE', #168, 0.09511400200349182); +#170 = CARTESIAN_POINT('NONE', (0.14618599799650817, 0.03810000000000001, 0.1016)); +#171 = LINE('NONE', #170, #169); +#172 = DIRECTION('NONE', (0, 1, 0)); +#173 = VECTOR('NONE', #172, 0.012699999999999996); +#174 = CARTESIAN_POINT('NONE', (0.2413, 0.0381, -0)); +#175 = LINE('NONE', #174, #173); +#176 = DIRECTION('NONE', (0, 0, 1)); +#177 = VECTOR('NONE', #176, 0.1016); +#178 = CARTESIAN_POINT('NONE', (0.2413, 0.0508, -0)); +#179 = LINE('NONE', #178, #177); +#180 = DIRECTION('NONE', (0, 1, 0)); +#181 = VECTOR('NONE', #180, 0.012699999999999996); +#182 = CARTESIAN_POINT('NONE', (0.2413, 0.0381, 0.1016)); +#183 = LINE('NONE', #182, #181); +#184 = DIRECTION('NONE', (-1, 0, 0)); +#185 = VECTOR('NONE', #184, 0.0979295242190572); +#186 = CARTESIAN_POINT('NONE', (0.2413, 0.0508, -0)); +#187 = LINE('NONE', #186, #185); +#188 = DIRECTION('NONE', (0, 0, 1)); +#189 = VECTOR('NONE', #188, 0.1016); +#190 = CARTESIAN_POINT('NONE', (0.14337047578094278, 0.0508, -0)); +#191 = LINE('NONE', #190, #189); +#192 = DIRECTION('NONE', (-1, 0, 0)); +#193 = VECTOR('NONE', #192, 0.0979295242190572); +#194 = CARTESIAN_POINT('NONE', (0.2413, 0.0508, 0.1016)); +#195 = LINE('NONE', #194, #193); +#196 = DIRECTION('NONE', (-0.9063077870366499, -0.42261826174069944, 0)); +#197 = VECTOR('NONE', #196, 0.06010152021207346); +#198 = CARTESIAN_POINT('NONE', (0.14337047578094278, 0.0508, -0)); +#199 = LINE('NONE', #198, #197); +#200 = DIRECTION('NONE', (0, 0, 1)); +#201 = VECTOR('NONE', #200, 0.1016); +#202 = CARTESIAN_POINT('NONE', (0.08889999999999999, 0.0254, -0)); +#203 = LINE('NONE', #202, #201); +#204 = DIRECTION('NONE', (-0.9063077870366499, -0.42261826174069944, 0)); +#205 = VECTOR('NONE', #204, 0.06010152021207346); +#206 = CARTESIAN_POINT('NONE', (0.14337047578094278, 0.0508, 0.1016)); +#207 = LINE('NONE', #206, #205); +#208 = DIRECTION('NONE', (-1, 0, 0)); +#209 = VECTOR('NONE', #208, 0.08889999999999999); +#210 = CARTESIAN_POINT('NONE', (0.08889999999999999, 0.0254, -0)); +#211 = LINE('NONE', #210, #209); +#212 = DIRECTION('NONE', (0, 0, 1)); +#213 = VECTOR('NONE', #212, 0.1016); +#214 = CARTESIAN_POINT('NONE', (0, 0.0254, -0)); +#215 = LINE('NONE', #214, #213); +#216 = DIRECTION('NONE', (-1, 0, 0)); +#217 = VECTOR('NONE', #216, 0.08889999999999999); +#218 = CARTESIAN_POINT('NONE', (0.08889999999999999, 0.0254, 0.1016)); +#219 = LINE('NONE', #218, #217); +#220 = DIRECTION('NONE', (0, -1, 0)); +#221 = VECTOR('NONE', #220, 0.0254); +#222 = CARTESIAN_POINT('NONE', (0, 0.0254, -0)); +#223 = LINE('NONE', #222, #221); +#224 = DIRECTION('NONE', (0, -1, 0)); +#225 = VECTOR('NONE', #224, 0.0254); +#226 = CARTESIAN_POINT('NONE', (0, 0.0254, 0.1016)); +#227 = LINE('NONE', #226, #225); +#228 = EDGE_CURVE('NONE', #5, #7, #63, .T.); +#229 = EDGE_CURVE('NONE', #7, #9, #67, .T.); +#230 = EDGE_CURVE('NONE', #11, #9, #71, .T.); +#231 = EDGE_CURVE('NONE', #5, #11, #75, .T.); +#232 = EDGE_CURVE('NONE', #7, #13, #79, .T.); +#233 = EDGE_CURVE('NONE', #13, #15, #83, .T.); +#234 = EDGE_CURVE('NONE', #9, #15, #87, .T.); +#235 = EDGE_CURVE('NONE', #13, #17, #91, .T.); +#236 = EDGE_CURVE('NONE', #17, #19, #95, .T.); +#237 = EDGE_CURVE('NONE', #15, #19, #99, .T.); +#238 = EDGE_CURVE('NONE', #17, #21, #103, .T.); +#239 = EDGE_CURVE('NONE', #21, #23, #107, .T.); +#240 = EDGE_CURVE('NONE', #19, #23, #111, .T.); +#241 = EDGE_CURVE('NONE', #21, #25, #115, .T.); +#242 = EDGE_CURVE('NONE', #25, #27, #119, .T.); +#243 = EDGE_CURVE('NONE', #23, #27, #123, .T.); +#244 = EDGE_CURVE('NONE', #25, #29, #127, .T.); +#245 = EDGE_CURVE('NONE', #29, #31, #131, .T.); +#246 = EDGE_CURVE('NONE', #27, #31, #135, .T.); +#247 = EDGE_CURVE('NONE', #29, #33, #139, .T.); +#248 = EDGE_CURVE('NONE', #33, #35, #143, .T.); +#249 = EDGE_CURVE('NONE', #31, #35, #147, .T.); +#250 = EDGE_CURVE('NONE', #33, #37, #151, .T.); +#251 = EDGE_CURVE('NONE', #37, #39, #155, .T.); +#252 = EDGE_CURVE('NONE', #35, #39, #159, .T.); +#253 = EDGE_CURVE('NONE', #37, #41, #163, .T.); +#254 = EDGE_CURVE('NONE', #41, #43, #167, .T.); +#255 = EDGE_CURVE('NONE', #39, #43, #171, .T.); +#256 = EDGE_CURVE('NONE', #41, #45, #175, .T.); +#257 = EDGE_CURVE('NONE', #45, #47, #179, .T.); +#258 = EDGE_CURVE('NONE', #43, #47, #183, .T.); +#259 = EDGE_CURVE('NONE', #45, #49, #187, .T.); +#260 = EDGE_CURVE('NONE', #49, #51, #191, .T.); +#261 = EDGE_CURVE('NONE', #47, #51, #195, .T.); +#262 = EDGE_CURVE('NONE', #49, #53, #199, .T.); +#263 = EDGE_CURVE('NONE', #53, #55, #203, .T.); +#264 = EDGE_CURVE('NONE', #51, #55, #207, .T.); +#265 = EDGE_CURVE('NONE', #53, #57, #211, .T.); +#266 = EDGE_CURVE('NONE', #57, #59, #215, .T.); +#267 = EDGE_CURVE('NONE', #55, #59, #219, .T.); +#268 = EDGE_CURVE('NONE', #57, #5, #223, .T.); +#269 = EDGE_CURVE('NONE', #59, #11, #227, .T.); +#270 = ORIENTED_EDGE('NONE', *, *, #228, .T.); +#271 = ORIENTED_EDGE('NONE', *, *, #229, .T.); +#272 = ORIENTED_EDGE('NONE', *, *, #230, .F.); +#273 = ORIENTED_EDGE('NONE', *, *, #231, .F.); +#274 = EDGE_LOOP('NONE', (#270, #271, #272, #273)); +#275 = ORIENTED_EDGE('NONE', *, *, #232, .T.); +#276 = ORIENTED_EDGE('NONE', *, *, #233, .T.); +#277 = ORIENTED_EDGE('NONE', *, *, #234, .F.); +#278 = ORIENTED_EDGE('NONE', *, *, #229, .F.); +#279 = EDGE_LOOP('NONE', (#275, #276, #277, #278)); +#280 = ORIENTED_EDGE('NONE', *, *, #235, .T.); +#281 = ORIENTED_EDGE('NONE', *, *, #236, .T.); +#282 = ORIENTED_EDGE('NONE', *, *, #237, .F.); +#283 = ORIENTED_EDGE('NONE', *, *, #233, .F.); +#284 = EDGE_LOOP('NONE', (#280, #281, #282, #283)); +#285 = ORIENTED_EDGE('NONE', *, *, #238, .T.); +#286 = ORIENTED_EDGE('NONE', *, *, #239, .T.); +#287 = ORIENTED_EDGE('NONE', *, *, #240, .F.); +#288 = ORIENTED_EDGE('NONE', *, *, #236, .F.); +#289 = EDGE_LOOP('NONE', (#285, #286, #287, #288)); +#290 = ORIENTED_EDGE('NONE', *, *, #241, .T.); +#291 = ORIENTED_EDGE('NONE', *, *, #242, .T.); +#292 = ORIENTED_EDGE('NONE', *, *, #243, .F.); +#293 = ORIENTED_EDGE('NONE', *, *, #239, .F.); +#294 = EDGE_LOOP('NONE', (#290, #291, #292, #293)); +#295 = ORIENTED_EDGE('NONE', *, *, #244, .T.); +#296 = ORIENTED_EDGE('NONE', *, *, #245, .T.); +#297 = ORIENTED_EDGE('NONE', *, *, #246, .F.); +#298 = ORIENTED_EDGE('NONE', *, *, #242, .F.); +#299 = EDGE_LOOP('NONE', (#295, #296, #297, #298)); +#300 = ORIENTED_EDGE('NONE', *, *, #247, .T.); +#301 = ORIENTED_EDGE('NONE', *, *, #248, .T.); +#302 = ORIENTED_EDGE('NONE', *, *, #249, .F.); +#303 = ORIENTED_EDGE('NONE', *, *, #245, .F.); +#304 = EDGE_LOOP('NONE', (#300, #301, #302, #303)); +#305 = ORIENTED_EDGE('NONE', *, *, #250, .T.); +#306 = ORIENTED_EDGE('NONE', *, *, #251, .T.); +#307 = ORIENTED_EDGE('NONE', *, *, #252, .F.); +#308 = ORIENTED_EDGE('NONE', *, *, #248, .F.); +#309 = EDGE_LOOP('NONE', (#305, #306, #307, #308)); +#310 = ORIENTED_EDGE('NONE', *, *, #253, .T.); +#311 = ORIENTED_EDGE('NONE', *, *, #254, .T.); +#312 = ORIENTED_EDGE('NONE', *, *, #255, .F.); +#313 = ORIENTED_EDGE('NONE', *, *, #251, .F.); +#314 = EDGE_LOOP('NONE', (#310, #311, #312, #313)); +#315 = ORIENTED_EDGE('NONE', *, *, #256, .T.); +#316 = ORIENTED_EDGE('NONE', *, *, #257, .T.); +#317 = ORIENTED_EDGE('NONE', *, *, #258, .F.); +#318 = ORIENTED_EDGE('NONE', *, *, #254, .F.); +#319 = EDGE_LOOP('NONE', (#315, #316, #317, #318)); +#320 = ORIENTED_EDGE('NONE', *, *, #259, .T.); +#321 = ORIENTED_EDGE('NONE', *, *, #260, .T.); +#322 = ORIENTED_EDGE('NONE', *, *, #261, .F.); +#323 = ORIENTED_EDGE('NONE', *, *, #257, .F.); +#324 = EDGE_LOOP('NONE', (#320, #321, #322, #323)); +#325 = ORIENTED_EDGE('NONE', *, *, #262, .T.); +#326 = ORIENTED_EDGE('NONE', *, *, #263, .T.); +#327 = ORIENTED_EDGE('NONE', *, *, #264, .F.); +#328 = ORIENTED_EDGE('NONE', *, *, #260, .F.); +#329 = EDGE_LOOP('NONE', (#325, #326, #327, #328)); +#330 = ORIENTED_EDGE('NONE', *, *, #265, .T.); +#331 = ORIENTED_EDGE('NONE', *, *, #266, .T.); +#332 = ORIENTED_EDGE('NONE', *, *, #267, .F.); +#333 = ORIENTED_EDGE('NONE', *, *, #263, .F.); +#334 = EDGE_LOOP('NONE', (#330, #331, #332, #333)); +#335 = ORIENTED_EDGE('NONE', *, *, #268, .T.); +#336 = ORIENTED_EDGE('NONE', *, *, #231, .T.); +#337 = ORIENTED_EDGE('NONE', *, *, #269, .F.); +#338 = ORIENTED_EDGE('NONE', *, *, #266, .F.); +#339 = EDGE_LOOP('NONE', (#335, #336, #337, #338)); +#340 = ORIENTED_EDGE('NONE', *, *, #228, .T.); +#341 = ORIENTED_EDGE('NONE', *, *, #232, .T.); +#342 = ORIENTED_EDGE('NONE', *, *, #235, .T.); +#343 = ORIENTED_EDGE('NONE', *, *, #238, .T.); +#344 = ORIENTED_EDGE('NONE', *, *, #241, .T.); +#345 = ORIENTED_EDGE('NONE', *, *, #244, .T.); +#346 = ORIENTED_EDGE('NONE', *, *, #247, .T.); +#347 = ORIENTED_EDGE('NONE', *, *, #250, .T.); +#348 = ORIENTED_EDGE('NONE', *, *, #253, .T.); +#349 = ORIENTED_EDGE('NONE', *, *, #256, .T.); +#350 = ORIENTED_EDGE('NONE', *, *, #259, .T.); +#351 = ORIENTED_EDGE('NONE', *, *, #262, .T.); +#352 = ORIENTED_EDGE('NONE', *, *, #265, .T.); +#353 = ORIENTED_EDGE('NONE', *, *, #268, .T.); +#354 = EDGE_LOOP('NONE', (#340, #341, #342, #343, #344, #345, #346, #347, #348, #349, #350, #351, #352, #353)); +#355 = ORIENTED_EDGE('NONE', *, *, #230, .T.); +#356 = ORIENTED_EDGE('NONE', *, *, #234, .T.); +#357 = ORIENTED_EDGE('NONE', *, *, #237, .T.); +#358 = ORIENTED_EDGE('NONE', *, *, #240, .T.); +#359 = ORIENTED_EDGE('NONE', *, *, #243, .T.); +#360 = ORIENTED_EDGE('NONE', *, *, #246, .T.); +#361 = ORIENTED_EDGE('NONE', *, *, #249, .T.); +#362 = ORIENTED_EDGE('NONE', *, *, #252, .T.); +#363 = ORIENTED_EDGE('NONE', *, *, #255, .T.); +#364 = ORIENTED_EDGE('NONE', *, *, #258, .T.); +#365 = ORIENTED_EDGE('NONE', *, *, #261, .T.); +#366 = ORIENTED_EDGE('NONE', *, *, #264, .T.); +#367 = ORIENTED_EDGE('NONE', *, *, #267, .T.); +#368 = ORIENTED_EDGE('NONE', *, *, #269, .T.); +#369 = EDGE_LOOP('NONE', (#355, #356, #357, #358, #359, #360, #361, #362, #363, #364, #365, #366, #367, #368)); +#370 = CARTESIAN_POINT('NONE', (0, -0.0127, 0.0508)); +#371 = DIRECTION('NONE', (-1, 0, -0)); +#372 = AXIS2_PLACEMENT_3D('NONE', #370, #371, $); +#373 = PLANE('NONE', #372); +#374 = CARTESIAN_POINT('NONE', (0.039306734695977924, -0.025399999999999995, 0.0508)); +#375 = DIRECTION('NONE', (0, -1, -0)); +#376 = AXIS2_PLACEMENT_3D('NONE', #374, #375, $); +#377 = PLANE('NONE', #376); +#378 = CARTESIAN_POINT('NONE', (0.11488842876320533, -0.05079999999999996, 0.05079999999999999)); +#379 = DIRECTION('NONE', (-0.5735764363510459, -0.819152044288992, 0)); +#380 = AXIS2_PLACEMENT_3D('NONE', #378, #379, $); +#381 = PLANE('NONE', #380); +#382 = CARTESIAN_POINT('NONE', (0.19623169406722757, -0.07619999999999999, 0.0508)); +#383 = DIRECTION('NONE', (0, -1, -0)); +#384 = AXIS2_PLACEMENT_3D('NONE', #382, #383, $); +#385 = PLANE('NONE', #384); +#386 = CARTESIAN_POINT('NONE', (0.2413, -0.06985, 0.0508)); +#387 = DIRECTION('NONE', (1, 0, -0)); +#388 = AXIS2_PLACEMENT_3D('NONE', #386, #387, $); +#389 = PLANE('NONE', #388); +#390 = CARTESIAN_POINT('NONE', (0.19823384137660915, -0.0635, 0.0508)); +#391 = DIRECTION('NONE', (0, 1, -0)); +#392 = AXIS2_PLACEMENT_3D('NONE', #390, #391, $); +#393 = PLANE('NONE', #392); +#394 = CARTESIAN_POINT('NONE', (0.10982398353915601, -0.03174999999999997, 0.0508)); +#395 = DIRECTION('NONE', (0.573576436351046, 0.8191520442889918, -0)); +#396 = AXIS2_PLACEMENT_3D('NONE', #394, #395, $); +#397 = PLANE('NONE', #396); +#398 = CARTESIAN_POINT('NONE', (0.105333141160801, 0.019049999999999987, 0.0508)); +#399 = DIRECTION('NONE', (0.4226182617406993, -0.90630778703665, -0)); +#400 = AXIS2_PLACEMENT_3D('NONE', #398, #399, $); +#401 = PLANE('NONE', #400); +#402 = CARTESIAN_POINT('NONE', (0.19374299899825406, 0.0381, 0.0508)); +#403 = DIRECTION('NONE', (0, -1, -0)); +#404 = AXIS2_PLACEMENT_3D('NONE', #402, #403, $); +#405 = PLANE('NONE', #404); +#406 = CARTESIAN_POINT('NONE', (0.2413, 0.044449999999999996, 0.0508)); +#407 = DIRECTION('NONE', (1, 0, -0)); +#408 = AXIS2_PLACEMENT_3D('NONE', #406, #407, $); +#409 = PLANE('NONE', #408); +#410 = CARTESIAN_POINT('NONE', (0.19233523789047138, 0.0508, 0.0508)); +#411 = DIRECTION('NONE', (0, 1, -0)); +#412 = AXIS2_PLACEMENT_3D('NONE', #410, #411, $); +#413 = PLANE('NONE', #412); +#414 = CARTESIAN_POINT('NONE', (0.11613523789047137, 0.0381, 0.05079999999999999)); +#415 = DIRECTION('NONE', (-0.42261826174069966, 0.90630778703665, -0)); +#416 = AXIS2_PLACEMENT_3D('NONE', #414, #415, $); +#417 = PLANE('NONE', #416); +#418 = CARTESIAN_POINT('NONE', (0.044449999999999996, 0.0254, 0.0508)); +#419 = DIRECTION('NONE', (0, 1, -0)); +#420 = AXIS2_PLACEMENT_3D('NONE', #418, #419, $); +#421 = PLANE('NONE', #420); +#422 = CARTESIAN_POINT('NONE', (0, 0.0127, 0.0508)); +#423 = DIRECTION('NONE', (-1, 0, -0)); +#424 = AXIS2_PLACEMENT_3D('NONE', #422, #423, $); +#425 = PLANE('NONE', #424); +#426 = CARTESIAN_POINT('NONE', (0, 0, -0)); +#427 = DIRECTION('NONE', (0, 0, 1)); +#428 = AXIS2_PLACEMENT_3D('NONE', #426, #427, $); +#429 = PLANE('NONE', #428); +#430 = CARTESIAN_POINT('NONE', (0, 0, 0.1016)); +#431 = DIRECTION('NONE', (0, 0, 1)); +#432 = AXIS2_PLACEMENT_3D('NONE', #430, #431, $); +#433 = PLANE('NONE', #432); +#434 = FACE_OUTER_BOUND('NONE', #274, .T.); +#435 = ADVANCED_FACE('NONE', (#434), #373, .T.); +#436 = FACE_OUTER_BOUND('NONE', #279, .T.); +#437 = ADVANCED_FACE('NONE', (#436), #377, .T.); +#438 = FACE_OUTER_BOUND('NONE', #284, .T.); +#439 = ADVANCED_FACE('NONE', (#438), #381, .T.); +#440 = FACE_OUTER_BOUND('NONE', #289, .T.); +#441 = ADVANCED_FACE('NONE', (#440), #385, .T.); +#442 = FACE_OUTER_BOUND('NONE', #294, .T.); +#443 = ADVANCED_FACE('NONE', (#442), #389, .T.); +#444 = FACE_OUTER_BOUND('NONE', #299, .T.); +#445 = ADVANCED_FACE('NONE', (#444), #393, .T.); +#446 = FACE_OUTER_BOUND('NONE', #304, .T.); +#447 = ADVANCED_FACE('NONE', (#446), #397, .T.); +#448 = FACE_OUTER_BOUND('NONE', #309, .T.); +#449 = ADVANCED_FACE('NONE', (#448), #401, .T.); +#450 = FACE_OUTER_BOUND('NONE', #314, .T.); +#451 = ADVANCED_FACE('NONE', (#450), #405, .T.); +#452 = FACE_OUTER_BOUND('NONE', #319, .T.); +#453 = ADVANCED_FACE('NONE', (#452), #409, .T.); +#454 = FACE_OUTER_BOUND('NONE', #324, .T.); +#455 = ADVANCED_FACE('NONE', (#454), #413, .T.); +#456 = FACE_OUTER_BOUND('NONE', #329, .T.); +#457 = ADVANCED_FACE('NONE', (#456), #417, .T.); +#458 = FACE_OUTER_BOUND('NONE', #334, .T.); +#459 = ADVANCED_FACE('NONE', (#458), #421, .T.); +#460 = FACE_OUTER_BOUND('NONE', #339, .T.); +#461 = ADVANCED_FACE('NONE', (#460), #425, .T.); +#462 = FACE_OUTER_BOUND('NONE', #354, .T.); +#463 = ADVANCED_FACE('NONE', (#462), #429, .F.); +#464 = FACE_OUTER_BOUND('NONE', #369, .T.); +#465 = ADVANCED_FACE('NONE', (#464), #433, .T.); +#466 = CLOSED_SHELL('NONE', (#435, #437, #439, #441, #443, #445, #447, #449, #451, #453, #455, #457, #459, #461, #463, #465)); +#467 = ORIENTED_CLOSED_SHELL('NONE', *, #466, .T.); +#468 = MANIFOLD_SOLID_BREP('NONE', #467); +#469 = APPLICATION_CONTEXT('configuration controlled 3D design of mechanical parts and assemblies'); +#470 = PRODUCT_DEFINITION_CONTEXT('part definition', #469, 'design'); +#471 = PRODUCT('UNIDENTIFIED_PRODUCT', 'NONE', $, ()); +#472 = PRODUCT_DEFINITION_FORMATION('', $, #471); +#473 = PRODUCT_DEFINITION('design', $, #472, #470); +#474 = PRODUCT_DEFINITION_SHAPE('NONE', $, #473); +#475 = ADVANCED_BREP_SHAPE_REPRESENTATION('NONE', (#468), #3); +#476 = SHAPE_DEFINITION_REPRESENTATION(#474, #475); +ENDSEC; +END-ISO-10303-21; diff --git a/e2e/playwright/snapshot-tests.spec.ts b/e2e/playwright/snapshot-tests.spec.ts index 105fc4447..8d46bb873 100644 --- a/e2e/playwright/snapshot-tests.spec.ts +++ b/e2e/playwright/snapshot-tests.spec.ts @@ -3,6 +3,8 @@ import { secrets } from './secrets' import { EngineCommand } from '../../src/lang/std/engineConnection' import { v4 as uuidv4 } from 'uuid' import { getUtils } from './test-utils' +import { Models } from '@kittycad/lib' +import fsp from 'fs/promises' test.beforeEach(async ({ context, page }) => { await context.addInitScript(async (token) => { @@ -132,3 +134,152 @@ test('change camera, show planes', async ({ page, context }) => { maxDiffPixels: 100, }) }) + +test('exports of each format should work', async ({ page, context }) => { + // FYI this test doesn't work with only engine running locally + const u = getUtils(page) + await context.addInitScript(async () => { + ;(window as any).playwrightSkipFilePicker = true + localStorage.setItem( + 'persistCode', + `const topAng = 25 +const bottomAng = 35 +const baseLen = 3.5 +const baseHeight = 1 +const totalHeightHalf = 2 +const armThick = 0.5 +const totalLen = 9.5 +const part001 = startSketchOn('-XZ') + |> startProfileAt([0, 0], %) + |> yLine(baseHeight, %) + |> xLine(baseLen, %) + |> angledLineToY({ + angle: topAng, + to: totalHeightHalf, + tag: 'seg04' + }, %) + |> xLineTo({ to: totalLen, tag: 'seg03' }, %) + |> yLine({ length: -armThick, tag: 'seg01' }, %) + |> angledLineThatIntersects({ + angle: _180, + offset: -armThick, + intersectTag: 'seg04' + }, %) + |> angledLineToY([segAng('seg04', %) + 180, _0], %) + |> angledLineToY({ + angle: -bottomAng, + to: -totalHeightHalf - armThick, + tag: 'seg02' + }, %) + |> xLineTo(segEndX('seg03', %) + 0, %) + |> yLine(-segLen('seg01', %), %) + |> angledLineThatIntersects({ + angle: _180, + offset: -armThick, + intersectTag: 'seg02' + }, %) + |> angledLineToY([segAng('seg02', %) + 180, -baseHeight], %) + |> xLineTo(_0, %) + |> close(%) + |> extrude(4, %)` + ) + }) + await page.setViewportSize({ width: 1200, height: 500 }) + await page.goto('/') + await u.waitForAuthSkipAppStart() + await u.openDebugPanel() + await u.waitForDefaultPlanesVisibilityChange() + await u.expectCmdLog('[data-message-type="execution-done"]') + await u.waitForCmdReceive('extrude') + await page.waitForTimeout(1000) + await u.clearAndCloseDebugPanel() + + await page.getByRole('button', { name: 'KittyCAD Modeling App' }).click() + + const doExport = async (output: Models['OutputFormat_type']) => { + await page.getByRole('button', { name: 'Export Model' }).click() + + const exportSelect = page.getByTestId('export-type') + await exportSelect.selectOption({ label: output.type }) + + if ('storage' in output) { + const storageSelect = page.getByTestId('export-storage') + await storageSelect.selectOption({ label: output.storage }) + } + + const downloadPromise = page.waitForEvent('download') + await page.getByRole('button', { name: 'Export', exact: true }).click() + const download = await downloadPromise + + const downloadLocation = `./e2e/playwright/export-snapshots/${ + output.type + }-${'storage' in output ? output.storage : ''}.${output.type}` + await download.saveAs(downloadLocation) + if (output.type === 'step') { + // stable timestamps for step files + const fileContents = await fsp.readFile(downloadLocation, 'utf-8') + const newFileContents = fileContents.replace( + /[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]+[0-9]+[0-9]\+[0-9]{2}:[0-9]{2}/g, + '1970-01-01T00:00:00.0+00:00' + ) + await fsp.writeFile(downloadLocation, newFileContents) + } + } + const axisDirectionPair: Models['AxisDirectionPair_type'] = { + axis: 'z', + direction: 'positive', + } + const sysType: Models['System_type'] = { + forward: axisDirectionPair, + up: axisDirectionPair, + } + await doExport({ + type: 'step', + coords: sysType, + }) + await doExport({ + type: 'gltf', + storage: 'embedded', + presentation: 'pretty', + }) + await doExport({ + type: 'gltf', + storage: 'binary', + presentation: 'pretty', + }) + await doExport({ + type: 'gltf', + storage: 'standard', + presentation: 'pretty', + }) + await doExport({ + // obj seems to be a little flaky, times out tests sometimes + type: 'obj', + coords: sysType, + units: 'in', + }) + + // the following exports are failing + // await doExport({ + // type: 'ply', + // storage: 'ascii', + // coords: sysType, + // }) + // await doExport({ + // type: 'ply', + // storage: 'binary' as unknown as 'binary_little_endian', + // coords: sysType, + // }) + // await doExport({ + // type: 'stl', + // storage: 'ascii', + // coords: sysType, + // units: 'in', + // }) + // await doExport({ + // type: 'stl', + // storage: 'binary', + // coords: sysType, + // units: 'in', + // }) +}) diff --git a/src/components/ExportButton.tsx b/src/components/ExportButton.tsx index 757e27d9a..11865ce3d 100644 --- a/src/components/ExportButton.tsx +++ b/src/components/ExportButton.tsx @@ -133,6 +133,7 @@ export const ExportButton = ({ children, className }: ExportButtonProps) => { { setStorage(e.target.value as StorageUnion) formik.handleChange(e) diff --git a/src/lib/browserSaveFile.ts b/src/lib/browserSaveFile.ts index 54c0666e6..eaf50755c 100644 --- a/src/lib/browserSaveFile.ts +++ b/src/lib/browserSaveFile.ts @@ -15,7 +15,11 @@ export const browserSaveFile = async (blob: Blob, suggestedName: string) => { } })() // If the File System Access API is supported… - if (supportsFileSystemAccess && window.showSaveFilePicker) { + if ( + supportsFileSystemAccess && + window.showSaveFilePicker && + !(window as any).playwrightSkipFilePicker + ) { try { // Show the file save dialog. const handle = await window.showSaveFilePicker({ diff --git a/tsconfig.json b/tsconfig.json index 5e367f318..f8b7aaf79 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -26,7 +26,8 @@ "jsx": "react-jsx" }, "include": [ - "src" + "src", + "e2e" ], "references": [{ "path": "./tsconfig.node.json" }] }