Compare commits
	
		
			141 Commits
		
	
	
		
			pierremtb/
			...
			jtran/y-co
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| b4fb903bd0 | |||
| 1b8688f274 | |||
| 397839da84 | |||
| ac120838e5 | |||
| e6a2ac9c4a | |||
| 6e7e6e96cf | |||
| 73e155d79b | |||
| a782f26ec2 | |||
| 01076c3aed | |||
| fe512611ac | |||
| cba953c245 | |||
| 54ca6ea0b2 | |||
| 6a01608c3a | |||
| 530f15e04a | |||
| 725e59d987 | |||
| 54313c9b03 | |||
| 890d96496c | |||
| 35999366a7 | |||
| 2affc7271d | |||
| d30fbf8b4b | |||
| 3f7e776464 | |||
| 79cff57f43 | |||
| 1cd2cd82b2 | |||
| 60e187bd3e | |||
| c64175425b | |||
| 36464e6984 | |||
| 2f0002e53c | |||
| 482833c88f | |||
| d9d0a72306 | |||
| 65cd9fab64 | |||
| 5e41e382ce | |||
| 1e3cb00092 | |||
| d1a2bd01ca | |||
| aca13d087b | |||
| fcdde3e482 | |||
| a1df3d0ffc | |||
| 1852e6167b | |||
| 29bf77bb82 | |||
| e81b614523 | |||
| 5a5fe3bb95 | |||
| 0710f6e5f2 | |||
| c9d5633647 | |||
| f9419a98b5 | |||
| 999f72bccf | |||
| 9dbe74e008 | |||
| 88d9cdc52b | |||
| 2dd1f0f213 | |||
| b971f3ecf4 | |||
| 2198bd7580 | |||
| 5fa1497b75 | |||
| ff86e41283 | |||
| 08e4c03ca7 | |||
| c654582137 | |||
| 6c2fa95a32 | |||
| 263a4f324d | |||
| 3160c58d8a | |||
| 73e26cbb4d | |||
| 21e2a92f54 | |||
| d7f2bfdabe | |||
| a76eabbb80 | |||
| a82564989e | |||
| e69837a411 | |||
| 7e31f870bf | |||
| 2f51763df9 | |||
| 7c4bf8d793 | |||
| 4747cdcab6 | |||
| de73f335fe | |||
| a62004da82 | |||
| 92e0da1f8d | |||
| a111473658 | |||
| 7cfed9bff4 | |||
| a30bd185d8 | |||
| e8cae630a1 | |||
| 74ec749560 | |||
| ebdaf59d1c | |||
| cd68414d54 | |||
| c8238ff04a | |||
| 8089369108 | |||
| 8ebe78c664 | |||
| a85c1a9375 | |||
| 5701616f3e | |||
| 846acaba2f | |||
| 0a524d42f6 | |||
| fe28527ef9 | |||
| 0e8d0083c4 | |||
| 4f4167b247 | |||
| fbc2e9d02c | |||
| 33b15e818b | |||
| 6cebb84ae0 | |||
| 85403e47e4 | |||
| 0dfee64e3b | |||
| 6370d45f94 | |||
| fb3e922180 | |||
| 1257ec0327 | |||
| 08e9fe2e52 | |||
| 7cec1d45fe | |||
| 93710bc8f2 | |||
| 87e7e9447f | |||
| 8be113d284 | |||
| 7cfc927d5c | |||
| c0f04d5f86 | |||
| 3dbc701f26 | |||
| 16e7ae38e3 | |||
| 24c7260327 | |||
| 72cfc4a471 | |||
| 2d128ed32e | |||
| cd6749ba02 | |||
| 7243405e1b | |||
| c8da057ec2 | |||
| 220fe5b2b8 | |||
| 4e6429de49 | |||
| 5391a65b18 | |||
| 592628917a | |||
| 4c6e8633f7 | |||
| c5150468a2 | |||
| 39126dbff1 | |||
| f86a69f12a | |||
| de354ee5d3 | |||
| dfef7338ee | |||
| ee08948f54 | |||
| 832f6b65e2 | |||
| 68efd77c5d | |||
| 8f138109dd | |||
| 8972f53256 | |||
| 0c5b13ade5 | |||
| 446f92a53a | |||
| 2256e3bc09 | |||
| 9e2876edc6 | |||
| a138af1ec8 | |||
| 684c585a48 | |||
| 500be20649 | |||
| 5fbbe2fa8c | |||
| 5f5ecc5afe | |||
| 3dafc31cad | |||
| 9c230bc678 | |||
| 1fad6966b6 | |||
| c7efb4c006 | |||
| 68fd921a64 | |||
| a20e710e8f | |||
| 9daf2d7794 | |||
| f86473d13b | 
							
								
								
									
										37
									
								
								.github/ISSUE_TEMPLATE/cryptic_error.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,37 @@ | |||||||
|  | name: Cryptic KCL Error | ||||||
|  | description: File a bug report for source code that produces a confusing error | ||||||
|  | title: "[CRYPTIC]: " | ||||||
|  | labels: ["cryptic-error"] | ||||||
|  | assignees: [] | ||||||
|  | body: | ||||||
|  |   - type: markdown | ||||||
|  |     attributes: | ||||||
|  |       value: "Thank you for taking the time to report a confusing error. Please provide as much information as possible to help us resolve it." | ||||||
|  |  | ||||||
|  |   - type: textarea | ||||||
|  |     id: kcl | ||||||
|  |     attributes: | ||||||
|  |       label: Paste minimal KCL source that produces a cryptic error | ||||||
|  |       description: Minimal KCL reproducer that produces a cryptic error | ||||||
|  |       placeholder: "const ..." | ||||||
|  |       render: javascript | ||||||
|  |     validations: | ||||||
|  |       required: true | ||||||
|  |  | ||||||
|  |   - type: textarea | ||||||
|  |     id: expected-behavior | ||||||
|  |     attributes: | ||||||
|  |       label: Expected Behavior | ||||||
|  |       description: Description of what you expected to happen (if you know). | ||||||
|  |       placeholder: "I expected that..." | ||||||
|  |     validations: | ||||||
|  |       required: false | ||||||
|  |  | ||||||
|  |   - type: textarea | ||||||
|  |     id: additional-context | ||||||
|  |     attributes: | ||||||
|  |       label: Additional Context | ||||||
|  |       description: Add any other context about the problem here. | ||||||
|  |       placeholder: "Anything else you want to add..." | ||||||
|  |     validations: | ||||||
|  |       required: false | ||||||
							
								
								
									
										48
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| @ -13,6 +13,7 @@ on: | |||||||
|   # Will checkout the last commit from the default branch (main as of 2023-10-04) |   # Will checkout the last commit from the default branch (main as of 2023-10-04) | ||||||
|  |  | ||||||
| env: | env: | ||||||
|  |   CUT_RELEASE_PR: ${{ github.event_name == 'pull_request' && (contains(github.event.pull_request.title, 'Cut release v')) }} | ||||||
|   BUILD_RELEASE: ${{ github.event_name == 'release' || github.event_name == 'schedule' || github.event_name == 'pull_request' && (contains(github.event.pull_request.title, 'Cut release v')) }} |   BUILD_RELEASE: ${{ github.event_name == 'release' || github.event_name == 'schedule' || github.event_name == 'pull_request' && (contains(github.event.pull_request.title, 'Cut release v')) }} | ||||||
|  |  | ||||||
| concurrency: | concurrency: | ||||||
| @ -110,8 +111,14 @@ jobs: | |||||||
|           echo "$(jq --arg name 'Zoo Modeling App (Nightly)' \ |           echo "$(jq --arg name 'Zoo Modeling App (Nightly)' \ | ||||||
|             '.productName=$name' src-tauri/tauri.release.conf.json --indent 2)" > src-tauri/tauri.release.conf.json |             '.productName=$name' src-tauri/tauri.release.conf.json --indent 2)" > src-tauri/tauri.release.conf.json | ||||||
|  |  | ||||||
|  |       - name: Set updater test version | ||||||
|  |         if: ${{ env.CUT_RELEASE_PR == 'true' }} | ||||||
|  |         run: | | ||||||
|  |           echo "$(jq --arg url 'https://dl.zoo.dev/releases/modeling-app/test/last_update.json' \ | ||||||
|  |             '.plugins.updater.endpoints[]=$url' src-tauri/tauri.release.conf.json --indent 2)" > src-tauri/tauri.release.conf.json | ||||||
|  |  | ||||||
|       - uses: actions/upload-artifact@v3 |       - uses: actions/upload-artifact@v3 | ||||||
|         if: github.event_name == 'schedule' |         if: ${{ github.event_name == 'schedule' || env.CUT_RELEASE_PR == 'true' }} | ||||||
|         with: |         with: | ||||||
|           path: | |           path: | | ||||||
|             package.json |             package.json | ||||||
| @ -138,6 +145,7 @@ jobs: | |||||||
|       - uses: actions/checkout@v4 |       - uses: actions/checkout@v4 | ||||||
|  |  | ||||||
|       - uses: actions/download-artifact@v3 |       - uses: actions/download-artifact@v3 | ||||||
|  |         if: github.event_name == 'schedule' | ||||||
|  |  | ||||||
|       - name: Copy updated .json files |       - name: Copy updated .json files | ||||||
|         if: github.event_name == 'schedule' |         if: github.event_name == 'schedule' | ||||||
| @ -238,12 +246,8 @@ jobs: | |||||||
|         shell: cmd |         shell: cmd | ||||||
|  |  | ||||||
|       - name: Build the app (debug) |       - name: Build the app (debug) | ||||||
|         uses: tauri-apps/tauri-action@v0 |  | ||||||
|         if: ${{ env.BUILD_RELEASE == 'false' }} |         if: ${{ env.BUILD_RELEASE == 'false' }} | ||||||
|         with: |         run: "yarn tauri build --debug ${{ env.TAURI_ARGS_MACOS }} ${{ env.TAURI_ARGS_UBUNTU }}" | ||||||
|           includeRelease: false |  | ||||||
|           includeDebug: true |  | ||||||
|           args: "${{ env.TAURI_ARGS_MACOS }} ${{ env.TAURI_ARGS_UBUNTU }}" |  | ||||||
|  |  | ||||||
|       - name: Build for Mac TestFlight (nightly) |       - name: Build for Mac TestFlight (nightly) | ||||||
|         if: ${{ github.event_name == 'schedule' && matrix.os == 'macos-14' }} |         if: ${{ github.event_name == 'schedule' && matrix.os == 'macos-14' }} | ||||||
| @ -336,7 +340,6 @@ jobs: | |||||||
|       # specific and we want to overwrite it with the this new build after and |       # specific and we want to overwrite it with the this new build after and | ||||||
|       # not upload the apple store build to the public bucket |       # not upload the apple store build to the public bucket | ||||||
|       - name: Build the app (release) and sign |       - name: Build the app (release) and sign | ||||||
|         uses: tauri-apps/tauri-action@v0 |  | ||||||
|         if: ${{ env.BUILD_RELEASE == 'true' }} |         if: ${{ env.BUILD_RELEASE == 'true' }} | ||||||
|         env: |         env: | ||||||
|           TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }} |           TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }} | ||||||
| @ -348,8 +351,7 @@ jobs: | |||||||
|           APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} |           APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} | ||||||
|           APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} |           APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} | ||||||
|           TAURI_CONF_ARGS: "--config ${{ matrix.os == 'windows-latest' && 'src-tauri\\tauri.release.conf.json' || 'src-tauri/tauri.release.conf.json' }}" |           TAURI_CONF_ARGS: "--config ${{ matrix.os == 'windows-latest' && 'src-tauri\\tauri.release.conf.json' || 'src-tauri/tauri.release.conf.json' }}" | ||||||
|         with: |         run: "yarn tauri build ${{ env.TAURI_CONF_ARGS }} ${{ env.TAURI_ARGS_MACOS }} ${{ env.TAURI_ARGS_UBUNTU }}" | ||||||
|           args: "${{ env.TAURI_CONF_ARGS }} ${{ env.TAURI_ARGS_MACOS }} ${{ env.TAURI_ARGS_UBUNTU }}" |  | ||||||
|  |  | ||||||
|       - uses: actions/upload-artifact@v3 |       - uses: actions/upload-artifact@v3 | ||||||
|         if: matrix.os != 'ubuntu-latest' |         if: matrix.os != 'ubuntu-latest' | ||||||
| @ -376,13 +378,39 @@ jobs: | |||||||
|           cargo install tauri-driver --force |           cargo install tauri-driver --force | ||||||
|           yarn wdio run wdio.conf.ts |           yarn wdio run wdio.conf.ts | ||||||
|         env: |         env: | ||||||
|           E2E_APPLICATION: ".\\src-tauri\\target\\${{ env.BUILD_RELEASE == 'true' && 'release' || 'debug' }}\\zoo-modeling-app.exe" |           E2E_APPLICATION: ".\\src-tauri\\target\\${{ env.BUILD_RELEASE == 'true' && 'release' || 'debug' }}\\Zoo Modeling App.exe" | ||||||
|           KITTYCAD_API_TOKEN: ${{ env.BUILD_RELEASE == 'true' && secrets.KITTYCAD_API_TOKEN || secrets.KITTYCAD_API_TOKEN_DEV }} |           KITTYCAD_API_TOKEN: ${{ env.BUILD_RELEASE == 'true' && secrets.KITTYCAD_API_TOKEN || secrets.KITTYCAD_API_TOKEN_DEV }} | ||||||
|           VITE_KC_API_BASE_URL: ${{ env.BUILD_RELEASE == 'true' && 'https://api.zoo.dev' || 'https://api.dev.zoo.dev' }} |           VITE_KC_API_BASE_URL: ${{ env.BUILD_RELEASE == 'true' && 'https://api.zoo.dev' || 'https://api.dev.zoo.dev' }} | ||||||
|           E2E_TAURI_ENABLED: true |           E2E_TAURI_ENABLED: true | ||||||
|           TS_NODE_COMPILER_OPTIONS: '{"module": "commonjs"}' |           TS_NODE_COMPILER_OPTIONS: '{"module": "commonjs"}' | ||||||
|  |  | ||||||
|  |       - uses: actions/download-artifact@v3 | ||||||
|  |         if: ${{ env.CUT_RELEASE_PR == 'true' }} | ||||||
|  |  | ||||||
|  |       - name: Copy updated .json file for updater test | ||||||
|  |         if: ${{ env.CUT_RELEASE_PR == 'true' }} | ||||||
|  |         run: | | ||||||
|  |           ls -l artifact | ||||||
|  |           cp artifact/src-tauri/tauri.release.conf.json src-tauri/tauri.release.conf.json | ||||||
|  |           cat src-tauri/tauri.release.conf.json | ||||||
|  |  | ||||||
|  |       - name: Build the app (release, updater test) | ||||||
|  |         if: ${{ env.CUT_RELEASE_PR == 'true' && matrix.os != 'ubuntu-latest' }} | ||||||
|  |         env: | ||||||
|  |           TAURI_CONF_ARGS: "-c ${{ matrix.os == 'windows-latest' && 'src-tauri\\tauri.release.conf.json' || 'src-tauri/tauri.release.conf.json' }}" | ||||||
|  |           TAURI_BUNDLE_ARGS: "-b ${{ matrix.os == 'windows-latest' && 'msi' || 'dmg' }}" | ||||||
|  |         run: "yarn tauri build ${{ env.TAURI_CONF_ARGS }} ${{ env.TAURI_BUNDLE_ARGS }} ${{ env.TAURI_ARGS_MACOS }}" | ||||||
|  |  | ||||||
|  |       - uses: actions/upload-artifact@v3 | ||||||
|  |         if: ${{ env.CUT_RELEASE_PR == 'true' && matrix.os != 'ubuntu-latest' }} | ||||||
|  |         with: | ||||||
|  |           path: "${{ matrix.os == 'macos-14' && 'src-tauri/target/universal-apple-darwin/release/bundle/dmg/*.dmg' || 'src-tauri/target/release/bundle/msi/*.msi' }}" | ||||||
|  |           name: updater-test | ||||||
|  |  | ||||||
|  |  | ||||||
|   publish-apps-release: |   publish-apps-release: | ||||||
|  |     permissions: | ||||||
|  |       contents: write | ||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     if: ${{ github.event_name == 'release' || github.event_name == 'schedule' }} |     if: ${{ github.event_name == 'release' || github.event_name == 'schedule' }} | ||||||
|     needs: [check-format, check-types, check-typos, build-test-web, prepare-json-files, build-test-apps] |     needs: [check-format, check-types, check-typos, build-test-web, prepare-json-files, build-test-apps] | ||||||
|  | |||||||
							
								
								
									
										151
									
								
								.github/workflows/playwright.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| @ -83,6 +83,20 @@ jobs: | |||||||
|       uses: Swatinem/rust-cache@v2 |       uses: Swatinem/rust-cache@v2 | ||||||
|       with: |       with: | ||||||
|         workspaces: './src/wasm-lib' |         workspaces: './src/wasm-lib' | ||||||
|  |     - name: Install vector | ||||||
|  |       run: | | ||||||
|  |         curl --proto '=https' --tlsv1.2 -sSfL https://sh.vector.dev > /tmp/vector.sh | ||||||
|  |         chmod +x /tmp/vector.sh | ||||||
|  |         /tmp/vector.sh -y -no-modify-path | ||||||
|  |         mkdir -p /tmp/vector | ||||||
|  |         cp .github/workflows/vector.toml /tmp/vector.toml | ||||||
|  |         sed -i "s#GITHUB_WORKFLOW#${GITHUB_WORKFLOW}#g" /tmp/vector.toml | ||||||
|  |         sed -i "s#GITHUB_REPOSITORY#${GITHUB_REPOSITORY}#g" /tmp/vector.toml | ||||||
|  |         sed -i "s#GITHUB_SHA#${GITHUB_SHA}#g" /tmp/vector.toml | ||||||
|  |         sed -i "s#GITHUB_REF_NAME#${GITHUB_REF_NAME}#g" /tmp/vector.toml | ||||||
|  |         sed -i "s#GH_ACTIONS_AXIOM_TOKEN#${{secrets.GH_ACTIONS_AXIOM_TOKEN}}#g" /tmp/vector.toml | ||||||
|  |         cat /tmp/vector.toml | ||||||
|  |         ${HOME}/.vector/bin/vector --config /tmp/vector.toml & | ||||||
|     - name: Build Wasm (because rust diff) |     - name: Build Wasm (because rust diff) | ||||||
|       if: needs.check-rust-changes.outputs.rust-changed == 'true' |       if: needs.check-rust-changes.outputs.rust-changed == 'true' | ||||||
|       run: yarn build:wasm |       run: yarn build:wasm | ||||||
| @ -139,27 +153,60 @@ jobs: | |||||||
|       with: |       with: | ||||||
|         name: test-results-ubuntu-${{ github.sha }} |         name: test-results-ubuntu-${{ github.sha }} | ||||||
|         path: test-results/ |         path: test-results/ | ||||||
|     - name: Run ubuntu/chrome flow retry failures |     - name: Run ubuntu/chrome flow (with retries) | ||||||
|       id: retry |       id: retry | ||||||
|       if: always() |       if: always() | ||||||
|       run: | |       run: | | ||||||
|         if [[ -d "test-results" ]]; |         if [[ ! -f "test-results/.last-run.json" ]]; then | ||||||
|         then if [[ $(ls -1 "test-results" | wc -l) != "0" ]]; |             # if no last run artifact, than run plawright normally | ||||||
|           then echo "retried=true" >> $GITHUB_OUTPUT; |             echo "run playwright normally" | ||||||
|           else echo "retried=false" >> $GITHUB_OUTPUT; exit 0; |             yarn playwright test --project="Google Chrome" e2e/playwright/flow-tests.spec.ts || true | ||||||
|           fi; |             # # send to axiom | ||||||
|         else echo "retried=false" >> $GITHUB_OUTPUT; exit 0; |             node playwrightProcess.mjs | tee /tmp/github-actions.log > /dev/null 2>&1 | ||||||
|         fi; |         fi | ||||||
|         yarn playwright test --project="Google Chrome" --last-failed e2e/playwright/flow-tests.spec.ts |          | ||||||
|       env: |         retry=1 | ||||||
|         CI: true |         max_retrys=4 | ||||||
|         token: ${{ secrets.KITTYCAD_API_TOKEN_DEV }} |          | ||||||
|     - name: Run ubuntu/chrome flow |         # retry failed tests, doing our own retries because using inbuilt playwright retries causes connection issues | ||||||
|       if: steps.retry.outputs.retried == 'false' |         while [[ $retry -le $max_retrys ]]; do | ||||||
|       run: yarn playwright test --project="Google Chrome" e2e/playwright/flow-tests.spec.ts |             if [[ -f "test-results/.last-run.json" ]]; then | ||||||
|  |                 failed_tests=$(jq '.failedTests | length' test-results/.last-run.json) | ||||||
|  |                 if [[ $failed_tests -gt 0 ]]; then | ||||||
|  |                     echo "retried=true" >>$GITHUB_OUTPUT | ||||||
|  |                     echo "run playwright with last failed tests and retry $retry" | ||||||
|  |                     yarn playwright test --project="Google Chrome" --last-failed e2e/playwright/flow-tests.spec.ts || true | ||||||
|  |                     # send to axiom | ||||||
|  |                     node playwrightProcess.mjs | tee /tmp/github-actions.log > /dev/null 2>&1 | ||||||
|  |                     retry=$((retry + 1)) | ||||||
|  |                 else | ||||||
|  |                     echo "retried=false" >>$GITHUB_OUTPUT | ||||||
|  |                     exit 0 | ||||||
|  |                 fi | ||||||
|  |             else | ||||||
|  |                 echo "retried=false" >>$GITHUB_OUTPUT | ||||||
|  |                 exit 0 | ||||||
|  |             fi | ||||||
|  |         done | ||||||
|  |          | ||||||
|  |         echo "retried=false" >>$GITHUB_OUTPUT | ||||||
|  |          | ||||||
|  |         if [[ -f "test-results/.last-run.json" ]]; then | ||||||
|  |             failed_tests=$(jq '.failedTests | length' test-results/.last-run.json) | ||||||
|  |             if [[ $failed_tests -gt 0 ]]; then | ||||||
|  |                 # if it still fails after 3 retrys, then fail the job | ||||||
|  |                 exit 1 | ||||||
|  |             fi | ||||||
|  |         fi | ||||||
|  |         exit 0 | ||||||
|       env: |       env: | ||||||
|         CI: true |         CI: true | ||||||
|         token: ${{ secrets.KITTYCAD_API_TOKEN_DEV }} |         token: ${{ secrets.KITTYCAD_API_TOKEN_DEV }} | ||||||
|  |     - name: send to axiom | ||||||
|  |       if: always() | ||||||
|  |       shell: bash | ||||||
|  |       run: | | ||||||
|  |         node playwrightProcess.mjs | tee /tmp/github-actions.log | ||||||
|     - uses: actions/upload-artifact@v4 |     - uses: actions/upload-artifact@v4 | ||||||
|       if: always() |       if: always() | ||||||
|       with: |       with: | ||||||
| @ -226,6 +273,20 @@ jobs: | |||||||
|       uses: Swatinem/rust-cache@v2 |       uses: Swatinem/rust-cache@v2 | ||||||
|       with: |       with: | ||||||
|         workspaces: './src/wasm-lib' |         workspaces: './src/wasm-lib' | ||||||
|  |     - name: Install vector | ||||||
|  |       run: | | ||||||
|  |         curl --proto '=https' --tlsv1.2 -sSfL https://sh.vector.dev > /tmp/vector.sh | ||||||
|  |         chmod +x /tmp/vector.sh | ||||||
|  |         /tmp/vector.sh -y -no-modify-path | ||||||
|  |         mkdir -p /tmp/vector | ||||||
|  |         cp .github/workflows/vector.toml /tmp/vector.toml | ||||||
|  |         sed -i "" "s#GITHUB_WORKFLOW#${GITHUB_WORKFLOW}#g" /tmp/vector.toml | ||||||
|  |         sed -i "" "s#GITHUB_REPOSITORY#${GITHUB_REPOSITORY}#g" /tmp/vector.toml | ||||||
|  |         sed -i "" "s#GITHUB_SHA#${GITHUB_SHA}#g" /tmp/vector.toml | ||||||
|  |         sed -i "" "s#GITHUB_REF_NAME#${GITHUB_REF_NAME}#g" /tmp/vector.toml | ||||||
|  |         sed -i "" "s#GH_ACTIONS_AXIOM_TOKEN#${{secrets.GH_ACTIONS_AXIOM_TOKEN}}#g" /tmp/vector.toml | ||||||
|  |         cat /tmp/vector.toml | ||||||
|  |         ${HOME}/.vector/bin/vector --config /tmp/vector.toml & | ||||||
|     - name: Build Wasm (because rust diff) |     - name: Build Wasm (because rust diff) | ||||||
|       if: needs.check-rust-changes.outputs.rust-changed == 'true' |       if: needs.check-rust-changes.outputs.rust-changed == 'true' | ||||||
|       run: yarn build:wasm |       run: yarn build:wasm | ||||||
| @ -241,26 +302,52 @@ jobs: | |||||||
|       with: |       with: | ||||||
|         name: test-results-macos-${{ github.sha }} |         name: test-results-macos-${{ github.sha }} | ||||||
|         path: test-results/ |         path: test-results/ | ||||||
|     - name: Run macos/safari flow retry failures |     - name: Run macos/safari flow (with retries) | ||||||
|       id: retry |       id: retry | ||||||
|       if: always() |       if: always() | ||||||
|       run: | |       run: | | ||||||
|         if [[ -d "test-results" ]]; |         if [[ ! -f "test-results/.last-run.json" ]]; then | ||||||
|         then if [[ $(ls -1 "test-results" | wc -l) != "0" ]]; |             # if no last run artifact, than run plawright normally | ||||||
|           then echo "retried=true" >> $GITHUB_OUTPUT; |             echo "run playwright normally" | ||||||
|           else echo "retried=false" >> $GITHUB_OUTPUT; exit 0; |             yarn playwright test --project="webkit" e2e/playwright/flow-tests.spec.ts || true | ||||||
|           fi; |             # # send to axiom | ||||||
|         else echo "retried=false" >> $GITHUB_OUTPUT; exit 0; |             node playwrightProcess.mjs | tee /tmp/github-actions.log > /dev/null 2>&1 | ||||||
|         fi; |         fi | ||||||
|         yarn playwright test --project="webkit" --last-failed e2e/playwright/flow-tests.spec.ts |          | ||||||
|       env: |         retry=1 | ||||||
|         CI: true |         max_retrys=4 | ||||||
|         token: ${{ secrets.KITTYCAD_API_TOKEN_DEV }} |          | ||||||
|     - name: Run macos/safari flow |         # retry failed tests, doing our own retries because using inbuilt playwright retries causes connection issues | ||||||
|       if: steps.retry.outputs.retried == 'false' |         while [[ $retry -le $max_retrys ]]; do | ||||||
|       # webkit doesn't work on Ubuntu because of the same reason tauri doesn't (webRTC issues) |             if [[ -f "test-results/.last-run.json" ]]; then | ||||||
|       # TODO remove this and the matrix and run all tests on ubuntu when this is fixed |                 failed_tests=$(jq '.failedTests | length' test-results/.last-run.json) | ||||||
|       run: yarn playwright test --project="webkit" e2e/playwright/flow-tests.spec.ts |                 if [[ $failed_tests -gt 0 ]]; then | ||||||
|  |                     echo "retried=true" >>$GITHUB_OUTPUT | ||||||
|  |                     echo "run playwright with last failed tests and retry $retry" | ||||||
|  |                     yarn playwright test --project="webkit" --last-failed e2e/playwright/flow-tests.spec.ts || true | ||||||
|  |                     # send to axiom | ||||||
|  |                     node playwrightProcess.mjs | tee /tmp/github-actions.log > /dev/null 2>&1 | ||||||
|  |                     retry=$((retry + 1)) | ||||||
|  |                 else | ||||||
|  |                     echo "retried=false" >>$GITHUB_OUTPUT | ||||||
|  |                     exit 0 | ||||||
|  |                 fi | ||||||
|  |             else | ||||||
|  |                 echo "retried=false" >>$GITHUB_OUTPUT | ||||||
|  |                 exit 0 | ||||||
|  |             fi | ||||||
|  |         done | ||||||
|  |          | ||||||
|  |         echo "retried=false" >>$GITHUB_OUTPUT | ||||||
|  |          | ||||||
|  |         if [[ -f "test-results/.last-run.json" ]]; then | ||||||
|  |             failed_tests=$(jq '.failedTests | length' test-results/.last-run.json) | ||||||
|  |             if [[ $failed_tests -gt 0 ]]; then | ||||||
|  |                 # if it still fails after 3 retrys, then fail the job | ||||||
|  |                 exit 1 | ||||||
|  |             fi | ||||||
|  |         fi | ||||||
|  |         exit 0 | ||||||
|       env: |       env: | ||||||
|         CI: true |         CI: true | ||||||
|         token: ${{ secrets.KITTYCAD_API_TOKEN_DEV }} |         token: ${{ secrets.KITTYCAD_API_TOKEN_DEV }} | ||||||
|  | |||||||
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						| @ -56,3 +56,7 @@ src-tauri/gen | |||||||
|  |  | ||||||
| src/wasm-lib/grackle/stdlib_cube_partial.json | src/wasm-lib/grackle/stdlib_cube_partial.json | ||||||
| Mac_App_Distribution.provisionprofile | Mac_App_Distribution.provisionprofile | ||||||
|  |  | ||||||
|  | *.tsbuildinfo | ||||||
|  |  | ||||||
|  | venv | ||||||
|  | |||||||
| @ -1,5 +1,6 @@ | |||||||
| # Ignore artifacts: | # Ignore artifacts: | ||||||
| build | build | ||||||
|  | dist | ||||||
| coverage | coverage | ||||||
|  |  | ||||||
| # Ignore Rust projects: | # Ignore Rust projects: | ||||||
| @ -9,5 +10,6 @@ src/wasm-lib/pkg | |||||||
| src/wasm-lib/kcl/bindings | src/wasm-lib/kcl/bindings | ||||||
| e2e/playwright/export-snapshots | e2e/playwright/export-snapshots | ||||||
|  |  | ||||||
|  |  | ||||||
| # XState generated files | # XState generated files | ||||||
| src/machines/**.typegen.ts | src/machines/**.typegen.ts | ||||||
|  | |||||||
							
								
								
									
										7
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						| @ -1,7 +0,0 @@ | |||||||
| { |  | ||||||
|     "cSpell.words": [ |  | ||||||
|         "geos" |  | ||||||
|     ], |  | ||||||
|     "editor.tabSize": 2, |  | ||||||
|     "editor.insertSpaces": true, |  | ||||||
| } |  | ||||||
							
								
								
									
										48
									
								
								README.md
									
									
									
									
									
								
							
							
						
						| @ -124,36 +124,40 @@ Before you submit a contribution PR to this repo, please ensure that: | |||||||
|  |  | ||||||
| ## Release a new version | ## Release a new version | ||||||
|  |  | ||||||
| 1. Bump the versions in the .json files by creating a `Cut release v{x}.{y}.{z}` PR, committing the changes from | #### 1. Bump the versions by running `./make-release.sh` and create a Cut Release PR | ||||||
|  |  | ||||||
| ```bash | That will create the branch with the updated json files for you: | ||||||
| VERSION=x.y.z yarn run bump-jsons | - run `./make-release.sh` or `./make-release.sh patch` for a patch update; | ||||||
| ``` | - run `./make-release.sh minor` for minor; or | ||||||
|  | - run `./make-release.sh major` for major. | ||||||
|  |  | ||||||
| Alternatively you can try the experimental `make-release.sh` bash script that will create the branch with the updated json files for you. | After it runs you should just need the push the branch and open a PR. | ||||||
| run `./make-release.sh` for a patch update |  | ||||||
| run `./make-release.sh "minor"` for minor |  | ||||||
| run `./make-release.sh "major"` for major |  | ||||||
|  |  | ||||||
| The PR may serve as a place to discuss the human-readable changelog and extra QA. A quick way of getting PR's merged since the last bump is to [use this PR filter](https://github.com/KittyCAD/modeling-app/pulls?q=is%3Apr+sort%3Aupdated-desc+is%3Amerged+), open up the browser console and paste in the following | **Important:** It needs to be prefixed with `Cut release v` to build in release mode and a few other things to test in the best context possible, the intent would be for instance to have `Cut release v1.2.3` for the `v1.2.3` release candidate. | ||||||
|  |  | ||||||
| ```typescript | The PR may then serve as a place to discuss the human-readable changelog and extra QA. The `make-release.sh` tool suggests a changelog for you too to be used as PR description, just make sure to delete lines that are not user facing. | ||||||
| console.log( |  | ||||||
|   '- ' + |  | ||||||
|     Array.from( |  | ||||||
|       document.querySelectorAll('[data-hovercard-type="pull_request"]') |  | ||||||
|     ).map((a) => `[${a.innerText}](${a.href})`).join(` |  | ||||||
| - `) |  | ||||||
| ) |  | ||||||
| ``` |  | ||||||
|  |  | ||||||
| grab the md list and delete any that are older than the last bump | #### 2. Smoke test artifacts from the Cut Release PR | ||||||
|  |  | ||||||
| 2. Merge the PR | The release builds can be find under the `artifact` zip, at the very bottom of the `ci` action page for each commit on this branch. | ||||||
|  |  | ||||||
| 3. Create a new release and tag pointing to the bump version commit using semantic versioning `v{x}.{y}.{z}` | We don't have a strict process, but click around and check for anything obvious, posting results as comments in the Cut Release PR. | ||||||
|  |  | ||||||
|  | The other `ci` output in Cut Release PRs is `updater-test`, because we don't have a way to test this fully automated, we have a semi-automated process. Download updater-test zip file, install the app, run it, expect an updater prompt to a dummy v0.99.99, install it and check that the app comes back at that version (on both macOS and Windows). | ||||||
|  |  | ||||||
|  | #### 3. Merge the Cut Release PR | ||||||
|  |  | ||||||
|  | This will kick the `create-release` action, that creates a _Draft_ release out of this Cut Release PR merge after less than a minute, with the new version as title and Cut Release PR as description. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #### 4. Publish the release | ||||||
|  |  | ||||||
|  | Head over to https://github.com/KittyCAD/modeling-app/releases, the draft release corresponding to the merged Cut Release PR should show up at the top as _Draft_. Click on it, verify the content, and hit _Publish_. | ||||||
|  |  | ||||||
|  | #### 5. Profit | ||||||
|  |  | ||||||
|  | A new Action kicks in at https://github.com/KittyCAD/modeling-app/actions, which can be found under `release` event filter. | ||||||
|  |  | ||||||
| 4. A new Action kicks in at https://github.com/KittyCAD/modeling-app/actions, uploading artifacts to the release |  | ||||||
|  |  | ||||||
| ## Fuzzing the parser | ## Fuzzing the parser | ||||||
|  |  | ||||||
|  | |||||||
| @ -105,6 +105,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	id: uuid, | 	id: uuid, | ||||||
| 	length: number, | 	length: number, | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -127,12 +128,16 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| }, | }, | ||||||
| 	// The to point. | 	// The to point. | ||||||
| 	to: [number, number], | 	to: [number, number], | ||||||
|  | }, | ||||||
|  | 	// Tag identifiers that have been declared in this sketch group. | ||||||
|  | 	tags: { | ||||||
| }, | }, | ||||||
| 	// The paths in the sketch group. | 	// The paths in the sketch group. | ||||||
| 	value: [{ | 	value: [{ | ||||||
| @ -140,6 +145,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -157,6 +163,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -170,6 +177,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -183,6 +191,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -198,6 +207,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -215,6 +225,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -236,6 +247,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	sourceRange: [number, number], | 	sourceRange: [number, number], | ||||||
| 	// The tag. | 	// The tag. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -251,6 +263,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	sourceRange: [number, number], | 	sourceRange: [number, number], | ||||||
| 	// The tag. | 	// The tag. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -288,12 +301,16 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| }, | }, | ||||||
| 	// The to point. | 	// The to point. | ||||||
| 	to: [number, number], | 	to: [number, number], | ||||||
|  | }, | ||||||
|  | 	// Tag identifiers that have been declared in this sketch group. | ||||||
|  | 	tags: { | ||||||
| }, | }, | ||||||
| 	// The paths in the sketch group. | 	// The paths in the sketch group. | ||||||
| 	value: [{ | 	value: [{ | ||||||
| @ -301,6 +318,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -318,6 +336,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -331,6 +350,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -344,6 +364,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -359,6 +380,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -376,6 +398,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -389,6 +412,7 @@ const example = extrude(10, exampleSketch) | |||||||
| * `tag`: `TagDeclarator` (OPTIONAL) | * `tag`: `TagDeclarator` (OPTIONAL) | ||||||
| ```js | ```js | ||||||
| { | { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -455,6 +479,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	id: uuid, | 	id: uuid, | ||||||
| 	length: number, | 	length: number, | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -477,12 +502,16 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| }, | }, | ||||||
| 	// The to point. | 	// The to point. | ||||||
| 	to: [number, number], | 	to: [number, number], | ||||||
|  | }, | ||||||
|  | 	// Tag identifiers that have been declared in this sketch group. | ||||||
|  | 	tags: { | ||||||
| }, | }, | ||||||
| 	// The paths in the sketch group. | 	// The paths in the sketch group. | ||||||
| 	value: [{ | 	value: [{ | ||||||
| @ -490,6 +519,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -507,6 +537,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -520,6 +551,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -533,6 +565,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -548,6 +581,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -565,6 +599,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -586,6 +621,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	sourceRange: [number, number], | 	sourceRange: [number, number], | ||||||
| 	// The tag. | 	// The tag. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -601,6 +637,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	sourceRange: [number, number], | 	sourceRange: [number, number], | ||||||
| 	// The tag. | 	// The tag. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -638,12 +675,16 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| }, | }, | ||||||
| 	// The to point. | 	// The to point. | ||||||
| 	to: [number, number], | 	to: [number, number], | ||||||
|  | }, | ||||||
|  | 	// Tag identifiers that have been declared in this sketch group. | ||||||
|  | 	tags: { | ||||||
| }, | }, | ||||||
| 	// The paths in the sketch group. | 	// The paths in the sketch group. | ||||||
| 	value: [{ | 	value: [{ | ||||||
| @ -651,6 +692,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -668,6 +710,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -681,6 +724,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -694,6 +738,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -709,6 +754,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -726,6 +772,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
|  | |||||||
| @ -96,6 +96,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	id: uuid, | 	id: uuid, | ||||||
| 	length: number, | 	length: number, | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -118,12 +119,16 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| }, | }, | ||||||
| 	// The to point. | 	// The to point. | ||||||
| 	to: [number, number], | 	to: [number, number], | ||||||
|  | }, | ||||||
|  | 	// Tag identifiers that have been declared in this sketch group. | ||||||
|  | 	tags: { | ||||||
| }, | }, | ||||||
| 	// The paths in the sketch group. | 	// The paths in the sketch group. | ||||||
| 	value: [{ | 	value: [{ | ||||||
| @ -131,6 +136,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -148,6 +154,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -161,6 +168,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -174,6 +182,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -189,6 +198,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -206,6 +216,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -227,6 +238,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	sourceRange: [number, number], | 	sourceRange: [number, number], | ||||||
| 	// The tag. | 	// The tag. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -242,6 +254,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	sourceRange: [number, number], | 	sourceRange: [number, number], | ||||||
| 	// The tag. | 	// The tag. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -279,12 +292,16 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| }, | }, | ||||||
| 	// The to point. | 	// The to point. | ||||||
| 	to: [number, number], | 	to: [number, number], | ||||||
|  | }, | ||||||
|  | 	// Tag identifiers that have been declared in this sketch group. | ||||||
|  | 	tags: { | ||||||
| }, | }, | ||||||
| 	// The paths in the sketch group. | 	// The paths in the sketch group. | ||||||
| 	value: [{ | 	value: [{ | ||||||
| @ -292,6 +309,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -309,6 +327,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -322,6 +341,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -335,6 +355,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -350,6 +371,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -367,6 +389,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -380,6 +403,7 @@ const example = extrude(10, exampleSketch) | |||||||
| * `tag`: `TagDeclarator` (OPTIONAL) | * `tag`: `TagDeclarator` (OPTIONAL) | ||||||
| ```js | ```js | ||||||
| { | { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -446,6 +470,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	id: uuid, | 	id: uuid, | ||||||
| 	length: number, | 	length: number, | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -468,12 +493,16 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| }, | }, | ||||||
| 	// The to point. | 	// The to point. | ||||||
| 	to: [number, number], | 	to: [number, number], | ||||||
|  | }, | ||||||
|  | 	// Tag identifiers that have been declared in this sketch group. | ||||||
|  | 	tags: { | ||||||
| }, | }, | ||||||
| 	// The paths in the sketch group. | 	// The paths in the sketch group. | ||||||
| 	value: [{ | 	value: [{ | ||||||
| @ -481,6 +510,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -498,6 +528,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -511,6 +542,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -524,6 +556,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -539,6 +572,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -556,6 +590,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -577,6 +612,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	sourceRange: [number, number], | 	sourceRange: [number, number], | ||||||
| 	// The tag. | 	// The tag. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -592,6 +628,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	sourceRange: [number, number], | 	sourceRange: [number, number], | ||||||
| 	// The tag. | 	// The tag. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -629,12 +666,16 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| }, | }, | ||||||
| 	// The to point. | 	// The to point. | ||||||
| 	to: [number, number], | 	to: [number, number], | ||||||
|  | }, | ||||||
|  | 	// Tag identifiers that have been declared in this sketch group. | ||||||
|  | 	tags: { | ||||||
| }, | }, | ||||||
| 	// The paths in the sketch group. | 	// The paths in the sketch group. | ||||||
| 	value: [{ | 	value: [{ | ||||||
| @ -642,6 +683,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -659,6 +701,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -672,6 +715,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -685,6 +729,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -700,6 +745,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -717,6 +763,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
|  | |||||||
| @ -122,6 +122,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	id: uuid, | 	id: uuid, | ||||||
| 	length: number, | 	length: number, | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -144,12 +145,16 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| }, | }, | ||||||
| 	// The to point. | 	// The to point. | ||||||
| 	to: [number, number], | 	to: [number, number], | ||||||
|  | }, | ||||||
|  | 	// Tag identifiers that have been declared in this sketch group. | ||||||
|  | 	tags: { | ||||||
| }, | }, | ||||||
| 	// The paths in the sketch group. | 	// The paths in the sketch group. | ||||||
| 	value: [{ | 	value: [{ | ||||||
| @ -157,6 +162,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -174,6 +180,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -187,6 +194,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -200,6 +208,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -215,6 +224,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -232,6 +242,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -253,6 +264,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	sourceRange: [number, number], | 	sourceRange: [number, number], | ||||||
| 	// The tag. | 	// The tag. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -268,6 +280,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	sourceRange: [number, number], | 	sourceRange: [number, number], | ||||||
| 	// The tag. | 	// The tag. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -305,12 +318,16 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| }, | }, | ||||||
| 	// The to point. | 	// The to point. | ||||||
| 	to: [number, number], | 	to: [number, number], | ||||||
|  | }, | ||||||
|  | 	// Tag identifiers that have been declared in this sketch group. | ||||||
|  | 	tags: { | ||||||
| }, | }, | ||||||
| 	type: "sketchGroup", | 	type: "sketchGroup", | ||||||
| 	// The paths in the sketch group. | 	// The paths in the sketch group. | ||||||
| @ -319,6 +336,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -336,6 +354,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -349,6 +368,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -362,6 +382,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -377,6 +398,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -394,6 +416,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -431,6 +454,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	id: uuid, | 	id: uuid, | ||||||
| 	length: number, | 	length: number, | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -498,6 +522,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	id: uuid, | 	id: uuid, | ||||||
| 	length: number, | 	length: number, | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -522,6 +547,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	sourceRange: [number, number], | 	sourceRange: [number, number], | ||||||
| 	// The tag. | 	// The tag. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -537,6 +563,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	sourceRange: [number, number], | 	sourceRange: [number, number], | ||||||
| 	// The tag. | 	// The tag. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -574,12 +601,16 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| }, | }, | ||||||
| 	// The to point. | 	// The to point. | ||||||
| 	to: [number, number], | 	to: [number, number], | ||||||
|  | }, | ||||||
|  | 	// Tag identifiers that have been declared in this sketch group. | ||||||
|  | 	tags: { | ||||||
| }, | }, | ||||||
| 	// The paths in the sketch group. | 	// The paths in the sketch group. | ||||||
| 	value: [{ | 	value: [{ | ||||||
| @ -587,6 +618,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -604,6 +636,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -617,6 +650,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -630,6 +664,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -645,6 +680,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -662,6 +698,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -684,6 +721,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	sourceRange: [number, number], | 	sourceRange: [number, number], | ||||||
| 	// The tag. | 	// The tag. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -699,6 +737,7 @@ const example = extrude(10, exampleSketch) | |||||||
| 	sourceRange: [number, number], | 	sourceRange: [number, number], | ||||||
| 	// The tag. | 	// The tag. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
|  | |||||||
| @ -84,6 +84,7 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	id: uuid, | 	id: uuid, | ||||||
| 	length: number, | 	length: number, | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -106,12 +107,16 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| }, | }, | ||||||
| 	// The to point. | 	// The to point. | ||||||
| 	to: [number, number], | 	to: [number, number], | ||||||
|  | }, | ||||||
|  | 	// Tag identifiers that have been declared in this sketch group. | ||||||
|  | 	tags: { | ||||||
| }, | }, | ||||||
| 	// The paths in the sketch group. | 	// The paths in the sketch group. | ||||||
| 	value: [{ | 	value: [{ | ||||||
| @ -119,6 +124,7 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -136,6 +142,7 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -149,6 +156,7 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -162,6 +170,7 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -177,6 +186,7 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -194,6 +204,7 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -215,6 +226,7 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	sourceRange: [number, number], | 	sourceRange: [number, number], | ||||||
| 	// The tag. | 	// The tag. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -230,6 +242,7 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	sourceRange: [number, number], | 	sourceRange: [number, number], | ||||||
| 	// The tag. | 	// The tag. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -267,12 +280,16 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| }, | }, | ||||||
| 	// The to point. | 	// The to point. | ||||||
| 	to: [number, number], | 	to: [number, number], | ||||||
|  | }, | ||||||
|  | 	// Tag identifiers that have been declared in this sketch group. | ||||||
|  | 	tags: { | ||||||
| }, | }, | ||||||
| 	// The paths in the sketch group. | 	// The paths in the sketch group. | ||||||
| 	value: [{ | 	value: [{ | ||||||
| @ -280,6 +297,7 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -297,6 +315,7 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -310,6 +329,7 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -323,6 +343,7 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -338,6 +359,7 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -355,6 +377,7 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
|  | |||||||
| @ -83,6 +83,7 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	id: uuid, | 	id: uuid, | ||||||
| 	length: number, | 	length: number, | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -105,12 +106,16 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| }, | }, | ||||||
| 	// The to point. | 	// The to point. | ||||||
| 	to: [number, number], | 	to: [number, number], | ||||||
|  | }, | ||||||
|  | 	// Tag identifiers that have been declared in this sketch group. | ||||||
|  | 	tags: { | ||||||
| }, | }, | ||||||
| 	// The paths in the sketch group. | 	// The paths in the sketch group. | ||||||
| 	value: [{ | 	value: [{ | ||||||
| @ -118,6 +123,7 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -135,6 +141,7 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -148,6 +155,7 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -161,6 +169,7 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -176,6 +185,7 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -193,6 +203,7 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -214,6 +225,7 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	sourceRange: [number, number], | 	sourceRange: [number, number], | ||||||
| 	// The tag. | 	// The tag. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -229,6 +241,7 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	sourceRange: [number, number], | 	sourceRange: [number, number], | ||||||
| 	// The tag. | 	// The tag. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -266,12 +279,16 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| }, | }, | ||||||
| 	// The to point. | 	// The to point. | ||||||
| 	to: [number, number], | 	to: [number, number], | ||||||
|  | }, | ||||||
|  | 	// Tag identifiers that have been declared in this sketch group. | ||||||
|  | 	tags: { | ||||||
| }, | }, | ||||||
| 	// The paths in the sketch group. | 	// The paths in the sketch group. | ||||||
| 	value: [{ | 	value: [{ | ||||||
| @ -279,6 +296,7 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -296,6 +314,7 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -309,6 +328,7 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -322,6 +342,7 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -337,6 +358,7 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -354,6 +376,7 @@ const sketch001 = startSketchOn('XY') | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
|  | |||||||
| @ -96,6 +96,7 @@ const example = extrude(4, exampleSketch) | |||||||
| 	id: uuid, | 	id: uuid, | ||||||
| 	length: number, | 	length: number, | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -118,12 +119,16 @@ const example = extrude(4, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| }, | }, | ||||||
| 	// The to point. | 	// The to point. | ||||||
| 	to: [number, number], | 	to: [number, number], | ||||||
|  | }, | ||||||
|  | 	// Tag identifiers that have been declared in this sketch group. | ||||||
|  | 	tags: { | ||||||
| }, | }, | ||||||
| 	// The paths in the sketch group. | 	// The paths in the sketch group. | ||||||
| 	value: [{ | 	value: [{ | ||||||
| @ -131,6 +136,7 @@ const example = extrude(4, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -148,6 +154,7 @@ const example = extrude(4, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -161,6 +168,7 @@ const example = extrude(4, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -174,6 +182,7 @@ const example = extrude(4, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -189,6 +198,7 @@ const example = extrude(4, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -206,6 +216,7 @@ const example = extrude(4, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -227,6 +238,7 @@ const example = extrude(4, exampleSketch) | |||||||
| 	sourceRange: [number, number], | 	sourceRange: [number, number], | ||||||
| 	// The tag. | 	// The tag. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -242,6 +254,7 @@ const example = extrude(4, exampleSketch) | |||||||
| 	sourceRange: [number, number], | 	sourceRange: [number, number], | ||||||
| 	// The tag. | 	// The tag. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -279,12 +292,16 @@ const example = extrude(4, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| }, | }, | ||||||
| 	// The to point. | 	// The to point. | ||||||
| 	to: [number, number], | 	to: [number, number], | ||||||
|  | }, | ||||||
|  | 	// Tag identifiers that have been declared in this sketch group. | ||||||
|  | 	tags: { | ||||||
| }, | }, | ||||||
| 	// The paths in the sketch group. | 	// The paths in the sketch group. | ||||||
| 	value: [{ | 	value: [{ | ||||||
| @ -292,6 +309,7 @@ const example = extrude(4, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -309,6 +327,7 @@ const example = extrude(4, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -322,6 +341,7 @@ const example = extrude(4, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -335,6 +355,7 @@ const example = extrude(4, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -350,6 +371,7 @@ const example = extrude(4, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -367,6 +389,7 @@ const example = extrude(4, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
|  | |||||||
| @ -95,6 +95,7 @@ const example = extrude(5, exampleSketch) | |||||||
| 	id: uuid, | 	id: uuid, | ||||||
| 	length: number, | 	length: number, | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -117,12 +118,16 @@ const example = extrude(5, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| }, | }, | ||||||
| 	// The to point. | 	// The to point. | ||||||
| 	to: [number, number], | 	to: [number, number], | ||||||
|  | }, | ||||||
|  | 	// Tag identifiers that have been declared in this sketch group. | ||||||
|  | 	tags: { | ||||||
| }, | }, | ||||||
| 	// The paths in the sketch group. | 	// The paths in the sketch group. | ||||||
| 	value: [{ | 	value: [{ | ||||||
| @ -130,6 +135,7 @@ const example = extrude(5, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -147,6 +153,7 @@ const example = extrude(5, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -160,6 +167,7 @@ const example = extrude(5, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -173,6 +181,7 @@ const example = extrude(5, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -188,6 +197,7 @@ const example = extrude(5, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -205,6 +215,7 @@ const example = extrude(5, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -226,6 +237,7 @@ const example = extrude(5, exampleSketch) | |||||||
| 	sourceRange: [number, number], | 	sourceRange: [number, number], | ||||||
| 	// The tag. | 	// The tag. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -241,6 +253,7 @@ const example = extrude(5, exampleSketch) | |||||||
| 	sourceRange: [number, number], | 	sourceRange: [number, number], | ||||||
| 	// The tag. | 	// The tag. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -278,12 +291,16 @@ const example = extrude(5, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| }, | }, | ||||||
| 	// The to point. | 	// The to point. | ||||||
| 	to: [number, number], | 	to: [number, number], | ||||||
|  | }, | ||||||
|  | 	// Tag identifiers that have been declared in this sketch group. | ||||||
|  | 	tags: { | ||||||
| }, | }, | ||||||
| 	// The paths in the sketch group. | 	// The paths in the sketch group. | ||||||
| 	value: [{ | 	value: [{ | ||||||
| @ -291,6 +308,7 @@ const example = extrude(5, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -308,6 +326,7 @@ const example = extrude(5, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -321,6 +340,7 @@ const example = extrude(5, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -334,6 +354,7 @@ const example = extrude(5, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -349,6 +370,7 @@ const example = extrude(5, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
| @ -366,6 +388,7 @@ const example = extrude(5, exampleSketch) | |||||||
| 	from: [number, number], | 	from: [number, number], | ||||||
| 	// The tag of the path. | 	// The tag of the path. | ||||||
| 	tag: { | 	tag: { | ||||||
|  | 	digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], | ||||||
| 	end: number, | 	end: number, | ||||||
| 	start: number, | 	start: number, | ||||||
| 	value: string, | 	value: string, | ||||||
|  | |||||||
							
								
								
									
										20571
									
								
								docs/kcl/std.json
									
									
									
									
									
								
							
							
						
						| @ -74,6 +74,107 @@ You can nest expressions in parenthesis as well: | |||||||
| let myMathExpression = 3 + (1 * 2 / (3 - 7)) | let myMathExpression = 3 + (1 * 2 / (3 - 7)) | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| Please if you find any issues using any of the above expressions or syntax | ## Tags | ||||||
|  |  | ||||||
|  | Tags are used to give a name (tag) to a specific path. | ||||||
|  |  | ||||||
|  | ### Tag Declaration | ||||||
|  |  | ||||||
|  | The syntax for declaring a tag is `$myTag` you would use it in the following | ||||||
|  | way: | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | startSketchOn('XZ') | ||||||
|  |   |> startProfileAt(origin, %) | ||||||
|  |   |> angledLine([0, 191.26], %, $rectangleSegmentA001) | ||||||
|  |   |> angledLine([ | ||||||
|  |        segAng(rectangleSegmentA001, %) - 90, | ||||||
|  |        196.99 | ||||||
|  |      ], %, $rectangleSegmentB001) | ||||||
|  |   |> angledLine([ | ||||||
|  |        segAng(rectangleSegmentA001, %), | ||||||
|  |        -segLen(rectangleSegmentA001, %) | ||||||
|  |      ], %, $rectangleSegmentC001) | ||||||
|  |   |> lineTo([profileStartX(%), profileStartY(%)], %) | ||||||
|  |   |> close(%) | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ### Tag Identifier | ||||||
|  |  | ||||||
|  | As per the example above you can use the tag identifier to get a reference to the  | ||||||
|  | tagged object. The syntax for this is `myTag`. | ||||||
|  |  | ||||||
|  | In the example above we use the tag identifier to get the angle of the segment | ||||||
|  | `segAng(rectangleSegmentA001, %)`. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ### Tag Scope | ||||||
|  |  | ||||||
|  | Tags are scoped globally if in the root context meaning in this example you can  | ||||||
|  | use the tag `rectangleSegmentA001` in any function or expression in the file. | ||||||
|  |  | ||||||
|  | However if the code was written like this: | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | fn rect = (origin) => { | ||||||
|  |   return startSketchOn('XZ') | ||||||
|  |   |> startProfileAt(origin, %) | ||||||
|  |   |> angledLine([0, 191.26], %, $rectangleSegmentA001) | ||||||
|  |   |> angledLine([ | ||||||
|  |        segAng(rectangleSegmentA001, %) - 90, | ||||||
|  |        196.99 | ||||||
|  |      ], %, $rectangleSegmentB001) | ||||||
|  |   |> angledLine([ | ||||||
|  |        segAng(rectangleSegmentA001, %), | ||||||
|  |        -segLen(rectangleSegmentA001, %) | ||||||
|  |      ], %, $rectangleSegmentC001) | ||||||
|  |   |> lineTo([profileStartX(%), profileStartY(%)], %) | ||||||
|  |   |> close(%) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | rect([0, 0]) | ||||||
|  | rect([20, 0]) | ||||||
|  | ```  | ||||||
|  |  | ||||||
|  | Those tags would only be available in the `rect` function and not globally. | ||||||
|  |  | ||||||
|  | However you likely want to use those tags somewhere outside the `rect` function. | ||||||
|  |  | ||||||
|  | Tags are accessible through the sketch group they are declared in. | ||||||
|  | For example the following code works. | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | fn rect = (origin) => { | ||||||
|  |   return startSketchOn('XZ') | ||||||
|  |   |> startProfileAt(origin, %) | ||||||
|  |   |> angledLine([0, 191.26], %, $rectangleSegmentA001) | ||||||
|  |   |> angledLine([ | ||||||
|  |        segAng(rectangleSegmentA001, %) - 90, | ||||||
|  |        196.99 | ||||||
|  |      ], %, $rectangleSegmentB001) | ||||||
|  |   |> angledLine([ | ||||||
|  |        segAng(rectangleSegmentA001, %), | ||||||
|  |        -segLen(rectangleSegmentA001, %) | ||||||
|  |      ], %, $rectangleSegmentC001) | ||||||
|  |   |> lineTo([profileStartX(%), profileStartY(%)], %) | ||||||
|  |   |> close(%) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | rect([0, 0]) | ||||||
|  | const myRect = rect([20, 0]) | ||||||
|  |  | ||||||
|  | myRect  | ||||||
|  |   |> extrude(10, %) | ||||||
|  |   |> fillet({radius: 0.5, tags: [myRect.tags.rectangleSegmentA001]}, %) | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | See how we use the tag `rectangleSegmentA001` in the `fillet` function outside | ||||||
|  | the `rect` function. This is because the `rect` function is returning the | ||||||
|  | sketch group that contains the tags. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | If you find any issues using any of the above expressions or syntax, | ||||||
| please file an issue with the `ast` label on the [modeling-app | please file an issue with the `ast` label on the [modeling-app | ||||||
| repo](https://github.com/KittyCAD/modeling-app/issues/new). | repo](https://github.com/KittyCAD/modeling-app/issues/new). | ||||||
|  | |||||||
| Before Width: | Height: | Size: 249 KiB After Width: | Height: | Size: 249 KiB | 
| Before Width: | Height: | Size: 249 KiB After Width: | Height: | Size: 249 KiB | 
| Before Width: | Height: | Size: 249 KiB After Width: | Height: | Size: 249 KiB | 
| Before Width: | Height: | Size: 171 KiB After Width: | Height: | Size: 171 KiB | 
| Before Width: | Height: | Size: 171 KiB After Width: | Height: | Size: 171 KiB | 
| Before Width: | Height: | Size: 171 KiB After Width: | Height: | Size: 171 KiB | 
| Before Width: | Height: | Size: 171 KiB After Width: | Height: | Size: 171 KiB | 
| Before Width: | Height: | Size: 249 KiB After Width: | Height: | Size: 249 KiB | 
| Before Width: | Height: | Size: 171 KiB After Width: | Height: | Size: 171 KiB | 
| Before Width: | Height: | Size: 171 KiB After Width: | Height: | Size: 171 KiB | 
| @ -91,8 +91,9 @@ const part001 = startSketchOn('-XZ') | |||||||
|     ) |     ) | ||||||
|   }) |   }) | ||||||
|   await page.setViewportSize({ width: 1200, height: 500 }) |   await page.setViewportSize({ width: 1200, height: 500 }) | ||||||
|   await page.goto('/') |  | ||||||
|   await u.waitForAuthSkipAppStart() |   await u.waitForAuthSkipAppStart() | ||||||
|  |  | ||||||
|   await u.openDebugPanel() |   await u.openDebugPanel() | ||||||
|   await u.expectCmdLog('[data-message-type="execution-done"]') |   await u.expectCmdLog('[data-message-type="execution-done"]') | ||||||
|   await u.waitForCmdReceive('extrude') |   await u.waitForCmdReceive('extrude') | ||||||
| @ -330,7 +331,7 @@ const extrudeDefaultPlane = async (context: any, page: any, plane: string) => { | |||||||
|  |  | ||||||
|   const u = await getUtils(page) |   const u = await getUtils(page) | ||||||
|   await page.setViewportSize({ width: 1200, height: 500 }) |   await page.setViewportSize({ width: 1200, height: 500 }) | ||||||
|   await page.goto('/') |  | ||||||
|   await u.waitForAuthSkipAppStart() |   await u.waitForAuthSkipAppStart() | ||||||
|  |  | ||||||
|   // wait for execution done |   // wait for execution done | ||||||
| @ -386,8 +387,8 @@ test('Draft segments should look right', async ({ page, context }) => { | |||||||
|   const u = await getUtils(page) |   const u = await getUtils(page) | ||||||
|   await page.setViewportSize({ width: 1200, height: 500 }) |   await page.setViewportSize({ width: 1200, height: 500 }) | ||||||
|   const PUR = 400 / 37.5 //pixeltoUnitRatio |   const PUR = 400 / 37.5 //pixeltoUnitRatio | ||||||
|   await page.goto('/') |  | ||||||
|   await u.waitForAuthSkipAppStart() |   await u.waitForAuthSkipAppStart() | ||||||
|  |  | ||||||
|   await u.openDebugPanel() |   await u.openDebugPanel() | ||||||
|  |  | ||||||
|   await expect( |   await expect( | ||||||
| @ -434,6 +435,8 @@ test('Draft segments should look right', async ({ page, context }) => { | |||||||
|  |  | ||||||
|   await page.mouse.move(startXPx + PUR * 30, 500 - PUR * 20, { steps: 10 }) |   await page.mouse.move(startXPx + PUR * 30, 500 - PUR * 20, { steps: 10 }) | ||||||
|  |  | ||||||
|  |   await page.waitForTimeout(300) | ||||||
|  |  | ||||||
|   await expect(page).toHaveScreenshot({ |   await expect(page).toHaveScreenshot({ | ||||||
|     maxDiffPixels: 100, |     maxDiffPixels: 100, | ||||||
|   }) |   }) | ||||||
| @ -443,7 +446,7 @@ test('Draft rectangles should look right', async ({ page, context }) => { | |||||||
|   const u = await getUtils(page) |   const u = await getUtils(page) | ||||||
|   await page.setViewportSize({ width: 1200, height: 500 }) |   await page.setViewportSize({ width: 1200, height: 500 }) | ||||||
|   const PUR = 400 / 37.5 //pixeltoUnitRatio |   const PUR = 400 / 37.5 //pixeltoUnitRatio | ||||||
|   await page.goto('/') |  | ||||||
|   await u.waitForAuthSkipAppStart() |   await u.waitForAuthSkipAppStart() | ||||||
|   await u.openDebugPanel() |   await u.openDebugPanel() | ||||||
|  |  | ||||||
| @ -490,7 +493,7 @@ test.describe('Client side scene scale should match engine scale', () => { | |||||||
|     const u = await getUtils(page) |     const u = await getUtils(page) | ||||||
|     await page.setViewportSize({ width: 1200, height: 500 }) |     await page.setViewportSize({ width: 1200, height: 500 }) | ||||||
|     const PUR = 400 / 37.5 //pixeltoUnitRatio |     const PUR = 400 / 37.5 //pixeltoUnitRatio | ||||||
|     await page.goto('/') |  | ||||||
|     await u.waitForAuthSkipAppStart() |     await u.waitForAuthSkipAppStart() | ||||||
|     await u.openDebugPanel() |     await u.openDebugPanel() | ||||||
|  |  | ||||||
| @ -589,7 +592,7 @@ test.describe('Client side scene scale should match engine scale', () => { | |||||||
|     const u = await getUtils(page) |     const u = await getUtils(page) | ||||||
|     await page.setViewportSize({ width: 1200, height: 500 }) |     await page.setViewportSize({ width: 1200, height: 500 }) | ||||||
|     const PUR = 400 / 37.5 //pixeltoUnitRatio |     const PUR = 400 / 37.5 //pixeltoUnitRatio | ||||||
|     await page.goto('/') |  | ||||||
|     await u.waitForAuthSkipAppStart() |     await u.waitForAuthSkipAppStart() | ||||||
|     await u.openDebugPanel() |     await u.openDebugPanel() | ||||||
|  |  | ||||||
| @ -689,7 +692,7 @@ const part002 = startSketchOn(part001, 'seg01') | |||||||
|   }, KCL_DEFAULT_LENGTH) |   }, KCL_DEFAULT_LENGTH) | ||||||
|  |  | ||||||
|   await page.setViewportSize({ width: 1200, height: 500 }) |   await page.setViewportSize({ width: 1200, height: 500 }) | ||||||
|   await page.goto('/') |  | ||||||
|   await u.waitForAuthSkipAppStart() |   await u.waitForAuthSkipAppStart() | ||||||
|  |  | ||||||
|   await u.openDebugPanel() |   await u.openDebugPanel() | ||||||
| @ -739,7 +742,7 @@ test('Zoom to fit on load - solid 2d', async ({ page, context }) => { | |||||||
|   }, KCL_DEFAULT_LENGTH) |   }, KCL_DEFAULT_LENGTH) | ||||||
|  |  | ||||||
|   await page.setViewportSize({ width: 1200, height: 500 }) |   await page.setViewportSize({ width: 1200, height: 500 }) | ||||||
|   await page.goto('/') |  | ||||||
|   await u.waitForAuthSkipAppStart() |   await u.waitForAuthSkipAppStart() | ||||||
|  |  | ||||||
|   await u.openDebugPanel() |   await u.openDebugPanel() | ||||||
| @ -776,7 +779,7 @@ test('Zoom to fit on load - solid 3d', async ({ page, context }) => { | |||||||
|   }, KCL_DEFAULT_LENGTH) |   }, KCL_DEFAULT_LENGTH) | ||||||
|  |  | ||||||
|   await page.setViewportSize({ width: 1200, height: 500 }) |   await page.setViewportSize({ width: 1200, height: 500 }) | ||||||
|   await page.goto('/') |  | ||||||
|   await u.waitForAuthSkipAppStart() |   await u.waitForAuthSkipAppStart() | ||||||
|  |  | ||||||
|   await u.openDebugPanel() |   await u.openDebugPanel() | ||||||
| @ -795,3 +798,83 @@ test('Zoom to fit on load - solid 3d', async ({ page, context }) => { | |||||||
|     maxDiffPixels: 100, |     maxDiffPixels: 100, | ||||||
|   }) |   }) | ||||||
| }) | }) | ||||||
|  |  | ||||||
|  | test.describe('Grid visibility', () => { | ||||||
|  |   test('Grid turned off', async ({ page }) => { | ||||||
|  |     const u = await getUtils(page) | ||||||
|  |     const stream = page.getByTestId('stream') | ||||||
|  |     const mask = [ | ||||||
|  |       page.locator('#app-header'), | ||||||
|  |       page.locator('#sidebar-top-ribbon'), | ||||||
|  |       page.locator('#sidebar-bottom-ribbon'), | ||||||
|  |     ] | ||||||
|  |  | ||||||
|  |     await page.setViewportSize({ width: 1200, height: 500 }) | ||||||
|  |     await page.goto('/') | ||||||
|  |     await u.waitForAuthSkipAppStart() | ||||||
|  |  | ||||||
|  |     await u.openDebugPanel() | ||||||
|  |     // wait for execution done | ||||||
|  |     await expect( | ||||||
|  |       page.locator('[data-message-type="execution-done"]') | ||||||
|  |     ).toHaveCount(2) | ||||||
|  |     await u.closeDebugPanel() | ||||||
|  |     await u.closeKclCodePanel() | ||||||
|  |     // TODO: Find a way to truly know that the objects have finished | ||||||
|  |     // rendering, because an execution-done message is not sufficient. | ||||||
|  |     await page.waitForTimeout(1000) | ||||||
|  |  | ||||||
|  |     await expect(stream).toHaveScreenshot({ | ||||||
|  |       maxDiffPixels: 100, | ||||||
|  |       mask, | ||||||
|  |     }) | ||||||
|  |   }) | ||||||
|  |  | ||||||
|  |   test('Grid turned on', async ({ page }) => { | ||||||
|  |     await page.addInitScript( | ||||||
|  |       async ({ settingsKey, settings }) => { | ||||||
|  |         localStorage.setItem(settingsKey, settings) | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         settingsKey: TEST_SETTINGS_KEY, | ||||||
|  |         settings: TOML.stringify({ | ||||||
|  |           settings: { | ||||||
|  |             ...TEST_SETTINGS, | ||||||
|  |             modeling: { | ||||||
|  |               ...TEST_SETTINGS.modeling, | ||||||
|  |               showScaleGrid: true, | ||||||
|  |             }, | ||||||
|  |           }, | ||||||
|  |         }), | ||||||
|  |       } | ||||||
|  |     ) | ||||||
|  |  | ||||||
|  |     const u = await getUtils(page) | ||||||
|  |     const stream = page.getByTestId('stream') | ||||||
|  |     const mask = [ | ||||||
|  |       page.locator('#app-header'), | ||||||
|  |       page.locator('#sidebar-top-ribbon'), | ||||||
|  |       page.locator('#sidebar-bottom-ribbon'), | ||||||
|  |     ] | ||||||
|  |  | ||||||
|  |     await page.setViewportSize({ width: 1200, height: 500 }) | ||||||
|  |     await page.goto('/') | ||||||
|  |     await u.waitForAuthSkipAppStart() | ||||||
|  |  | ||||||
|  |     await u.openDebugPanel() | ||||||
|  |     // wait for execution done | ||||||
|  |     await expect( | ||||||
|  |       page.locator('[data-message-type="execution-done"]') | ||||||
|  |     ).toHaveCount(2) | ||||||
|  |     await u.closeDebugPanel() | ||||||
|  |     await u.closeKclCodePanel() | ||||||
|  |     // TODO: Find a way to truly know that the objects have finished | ||||||
|  |     // rendering, because an execution-done message is not sufficient. | ||||||
|  |     await page.waitForTimeout(1000) | ||||||
|  |  | ||||||
|  |     await expect(stream).toHaveScreenshot({ | ||||||
|  |       maxDiffPixels: 100, | ||||||
|  |       mask, | ||||||
|  |     }) | ||||||
|  |   }) | ||||||
|  | }) | ||||||
|  | |||||||
| Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 45 KiB | 
| Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 45 KiB | 
| Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 51 KiB | 
| Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 46 KiB | 
| Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 36 KiB | 
| Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 37 KiB | 
| Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 40 KiB | 
| After Width: | Height: | Size: 13 KiB | 
| After Width: | Height: | Size: 29 KiB | 
| Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 72 KiB | 
| Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 45 KiB | 
| Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 62 KiB | 
| Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 30 KiB | 
| Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 33 KiB | 
