Compare commits
68 Commits
Author | SHA1 | Date | |
---|---|---|---|
c184a7d4d8 | |||
c38e52fbb7 | |||
ea0a3ac3ba | |||
385589ddf9 | |||
22df47fa96 | |||
a68748abcf | |||
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 |
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
|
33
.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
|
||||||
@ -377,6 +384,30 @@ jobs:
|
|||||||
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:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
|
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 }}
|
||||||
|
2
.gitignore
vendored
@ -58,3 +58,5 @@ src/wasm-lib/grackle/stdlib_cube_partial.json
|
|||||||
Mac_App_Distribution.provisionprofile
|
Mac_App_Distribution.provisionprofile
|
||||||
|
|
||||||
*.tsbuildinfo
|
*.tsbuildinfo
|
||||||
|
|
||||||
|
venv
|
||||||
|
38
README.md
@ -124,20 +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 by running `./make-realease.sh` while on a fresh pull of main
|
#### 1. Bump the versions by running `./make-release.sh` and create a Cut Release PR
|
||||||
|
|
||||||
That will create the branch with the updated json files for you.
|
That will create the branch with the updated json files for you:
|
||||||
run `./make-release.sh` for a patch update
|
- run `./make-release.sh` or `./make-release.sh patch` for a patch update;
|
||||||
run `./make-release.sh "minor"` for minor
|
- run `./make-release.sh minor` for minor; or
|
||||||
run `./make-release.sh "major"` for major
|
- run `./make-release.sh major` for major.
|
||||||
|
|
||||||
After it runs you should just need to push the push the branch and open a PR (it will suggest a changelog for you too, delete any that are not user facing)
|
After it runs you should just need the push the branch and open a PR.
|
||||||
|
|
||||||
The PR may serve as a place to discuss the human-readable changelog and extra QA.
|
**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.
|
||||||
|
|
||||||
2. Merge the PR
|
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.
|
||||||
|
|
||||||
|
#### 2. Smoke test artifacts from the Cut Release 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.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
3. Profit (A new Action kicks in at https://github.com/KittyCAD/modeling-app/actions if the PR was correctly named)
|
|
||||||
|
|
||||||
## 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,6 +128,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,
|
||||||
@ -143,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,
|
||||||
@ -160,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,
|
||||||
@ -173,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,
|
||||||
@ -186,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,
|
||||||
@ -201,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,
|
||||||
@ -218,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,
|
||||||
@ -239,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,
|
||||||
@ -254,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,
|
||||||
@ -291,6 +301,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,
|
||||||
@ -307,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,
|
||||||
@ -324,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,
|
||||||
@ -337,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,
|
||||||
@ -350,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,
|
||||||
@ -365,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,
|
||||||
@ -382,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,
|
||||||
@ -395,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,
|
||||||
@ -461,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,
|
||||||
@ -483,6 +502,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,
|
||||||
@ -499,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,
|
||||||
@ -516,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,
|
||||||
@ -529,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,
|
||||||
@ -542,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,
|
||||||
@ -557,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,
|
||||||
@ -574,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,
|
||||||
@ -595,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,
|
||||||
@ -610,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,
|
||||||
@ -647,6 +675,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,
|
||||||
@ -663,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,
|
||||||
@ -680,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,
|
||||||
@ -693,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,
|
||||||
@ -706,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,
|
||||||
@ -721,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,
|
||||||
@ -738,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,6 +119,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,
|
||||||
@ -134,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,
|
||||||
@ -151,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,
|
||||||
@ -164,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,
|
||||||
@ -177,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,
|
||||||
@ -192,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,
|
||||||
@ -209,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,
|
||||||
@ -230,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,
|
||||||
@ -245,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,
|
||||||
@ -282,6 +292,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,
|
||||||
@ -298,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,
|
||||||
@ -315,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,
|
||||||
@ -328,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,
|
||||||
@ -341,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,
|
||||||
@ -356,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,
|
||||||
@ -373,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,
|
||||||
@ -386,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,
|
||||||
@ -452,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,
|
||||||
@ -474,6 +493,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,
|
||||||
@ -490,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,
|
||||||
@ -507,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,
|
||||||
@ -520,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,
|
||||||
@ -533,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,
|
||||||
@ -548,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,
|
||||||
@ -565,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,
|
||||||
@ -586,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,
|
||||||
@ -601,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,
|
||||||
@ -638,6 +666,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,
|
||||||
@ -654,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,
|
||||||
@ -671,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,
|
||||||
@ -684,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,
|
||||||
@ -697,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,
|
||||||
@ -712,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,
|
||||||
@ -729,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,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,
|
||||||
@ -160,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,
|
||||||
@ -177,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,
|
||||||
@ -190,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,
|
||||||
@ -203,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,
|
||||||
@ -218,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,
|
||||||
@ -235,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,
|
||||||
@ -256,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,
|
||||||
@ -271,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,
|
||||||
@ -308,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,
|
||||||
@ -325,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,
|
||||||
@ -342,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,
|
||||||
@ -355,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,
|
||||||
@ -368,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,
|
||||||
@ -383,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,
|
||||||
@ -400,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,
|
||||||
@ -437,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,
|
||||||
@ -504,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,
|
||||||
@ -528,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,
|
||||||
@ -543,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,
|
||||||
@ -580,6 +601,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,
|
||||||
@ -596,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,
|
||||||
@ -613,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,
|
||||||
@ -626,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,
|
||||||
@ -639,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,
|
||||||
@ -654,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,
|
||||||
@ -671,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,
|
||||||
@ -693,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,
|
||||||
@ -708,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,6 +107,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,
|
||||||
@ -122,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,
|
||||||
@ -139,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,
|
||||||
@ -152,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,
|
||||||
@ -165,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,
|
||||||
@ -180,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,
|
||||||
@ -197,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,
|
||||||
@ -218,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,
|
||||||
@ -233,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,
|
||||||
@ -270,6 +280,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,
|
||||||
@ -286,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,
|
||||||
@ -303,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,
|
||||||
@ -316,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,
|
||||||
@ -329,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,
|
||||||
@ -344,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,
|
||||||
@ -361,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,6 +106,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,
|
||||||
@ -121,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,
|
||||||
@ -138,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,
|
||||||
@ -151,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,
|
||||||
@ -164,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,
|
||||||
@ -179,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,
|
||||||
@ -196,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,
|
||||||
@ -217,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,
|
||||||
@ -232,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,
|
||||||
@ -269,6 +279,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,
|
||||||
@ -285,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,
|
||||||
@ -302,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,
|
||||||
@ -315,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,
|
||||||
@ -328,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,
|
||||||
@ -343,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,
|
||||||
@ -360,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,6 +119,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,
|
||||||
@ -134,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,
|
||||||
@ -151,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,
|
||||||
@ -164,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,
|
||||||
@ -177,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,
|
||||||
@ -192,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,
|
||||||
@ -209,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,
|
||||||
@ -230,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,
|
||||||
@ -245,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,
|
||||||
@ -282,6 +292,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,
|
||||||
@ -298,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,
|
||||||
@ -315,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,
|
||||||
@ -328,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,
|
||||||
@ -341,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,
|
||||||
@ -356,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,
|
||||||
@ -373,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,6 +118,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,
|
||||||
@ -133,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,
|
||||||
@ -150,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,
|
||||||
@ -163,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,
|
||||||
@ -176,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,
|
||||||
@ -191,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,
|
||||||
@ -208,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,
|
||||||
@ -229,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,
|
||||||
@ -244,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,
|
||||||
@ -281,6 +291,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,
|
||||||
@ -297,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,
|
||||||
@ -314,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,
|
||||||
@ -327,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,
|
||||||
@ -340,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,
|
||||||
@ -355,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,
|
||||||
@ -372,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,
|
||||||
|
14916
docs/kcl/std.json
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 |
@ -175,7 +175,7 @@ async function doBasicSketch(page: Page, openPanes: string[]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// deselect line tool
|
// deselect line tool
|
||||||
await page.getByRole('button', { name: 'Line' }).click()
|
await page.getByRole('button', { name: 'Line', exact: true }).click()
|
||||||
await page.waitForTimeout(500)
|
await page.waitForTimeout(500)
|
||||||
|
|
||||||
const line1 = await u.getSegmentBodyCoords(`[data-overlay-index="${0}"]`, 0)
|
const line1 = await u.getSegmentBodyCoords(`[data-overlay-index="${0}"]`, 0)
|
||||||
@ -203,7 +203,7 @@ async function doBasicSketch(page: Page, openPanes: string[]) {
|
|||||||
await expect(page.locator('.cm-cursor')).toHaveCount(2)
|
await expect(page.locator('.cm-cursor')).toHaveCount(2)
|
||||||
}
|
}
|
||||||
|
|
||||||
await page.getByRole('button', { name: 'Constraints' }).click()
|
await page.getByRole('button', { name: 'Length: open menu' }).click()
|
||||||
await page.getByRole('button', { name: 'Equal Length' }).click()
|
await page.getByRole('button', { name: 'Equal Length' }).click()
|
||||||
|
|
||||||
// Open the code pane.
|
// Open the code pane.
|
||||||
@ -452,7 +452,7 @@ test.describe('Testing Camera Movement', () => {
|
|||||||
// await expect(u.codeLocator).toHaveText(code)
|
// await expect(u.codeLocator).toHaveText(code)
|
||||||
|
|
||||||
// click the line button
|
// click the line button
|
||||||
await page.getByRole('button', { name: 'Line' }).click()
|
await page.getByRole('button', { name: 'Line', exact: true }).click()
|
||||||
|
|
||||||
const hoverOverNothing = async () => {
|
const hoverOverNothing = async () => {
|
||||||
// await u.canvasLocator.hover({position: {x: 700, y: 325}})
|
// await u.canvasLocator.hover({position: {x: 700, y: 325}})
|
||||||
@ -1462,7 +1462,9 @@ test.describe('Can create sketches on all planes and their back sides', () => {
|
|||||||
await page.mouse.click(clickCoords.x, clickCoords.y)
|
await page.mouse.click(clickCoords.x, clickCoords.y)
|
||||||
await page.waitForTimeout(300) // wait for animation
|
await page.waitForTimeout(300) // wait for animation
|
||||||
|
|
||||||
await expect(page.getByRole('button', { name: 'Line' })).toBeVisible()
|
await expect(
|
||||||
|
page.getByRole('button', { name: 'Line', exact: true })
|
||||||
|
).toBeVisible()
|
||||||
|
|
||||||
// draw a line
|
// draw a line
|
||||||
const startXPx = 600
|
const startXPx = 600
|
||||||
@ -1472,7 +1474,7 @@ test.describe('Can create sketches on all planes and their back sides', () => {
|
|||||||
|
|
||||||
await expect(page.locator('.cm-content')).toHaveText(code)
|
await expect(page.locator('.cm-content')).toHaveText(code)
|
||||||
|
|
||||||
await page.getByRole('button', { name: 'Line' }).click()
|
await page.getByRole('button', { name: 'Line', exact: true }).click()
|
||||||
await u.openAndClearDebugPanel()
|
await u.openAndClearDebugPanel()
|
||||||
await page.getByRole('button', { name: 'Exit Sketch' }).click()
|
await page.getByRole('button', { name: 'Exit Sketch' }).click()
|
||||||
await u.expectCmdLog('[data-message-type="execution-done"]')
|
await u.expectCmdLog('[data-message-type="execution-done"]')
|
||||||
@ -1511,6 +1513,8 @@ test.describe('Can create sketches on all planes and their back sides', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
test.describe('Copilot ghost text', () => {
|
test.describe('Copilot ghost text', () => {
|
||||||
|
test.skip(true, 'Needs to get covered again')
|
||||||
|
|
||||||
test('completes code in empty file', async ({ page }) => {
|
test('completes code in empty file', async ({ page }) => {
|
||||||
const u = await getUtils(page)
|
const u = await getUtils(page)
|
||||||
// const PUR = 400 / 37.5 //pixeltoUnitRatio
|
// const PUR = 400 / 37.5 //pixeltoUnitRatio
|
||||||
@ -1549,7 +1553,9 @@ test.describe('Copilot ghost text', () => {
|
|||||||
await expect(page.locator('.cm-ghostText')).not.toBeVisible()
|
await expect(page.locator('.cm-ghostText')).not.toBeVisible()
|
||||||
})
|
})
|
||||||
|
|
||||||
test('copilot disabled in sketch mode no select plane', async ({ page }) => {
|
test.skip('copilot disabled in sketch mode no select plane', async ({
|
||||||
|
page,
|
||||||
|
}) => {
|
||||||
const u = await getUtils(page)
|
const u = await getUtils(page)
|
||||||
// const PUR = 400 / 37.5 //pixeltoUnitRatio
|
// const PUR = 400 / 37.5 //pixeltoUnitRatio
|
||||||
await page.setViewportSize({ width: 1200, height: 500 })
|
await page.setViewportSize({ width: 1200, height: 500 })
|
||||||
@ -2096,7 +2102,7 @@ test.describe('Testing settings', () => {
|
|||||||
.hover()
|
.hover()
|
||||||
await page
|
await page
|
||||||
.getByRole('button', {
|
.getByRole('button', {
|
||||||
name: 'Roll back theme ; Has tooltip: Roll back to match default',
|
name: 'Roll back theme',
|
||||||
})
|
})
|
||||||
.click()
|
.click()
|
||||||
await expect(page.locator('select[name="app-theme"]')).toHaveValue('system')
|
await expect(page.locator('select[name="app-theme"]')).toHaveValue('system')
|
||||||
@ -2148,7 +2154,7 @@ test.describe('Testing settings', () => {
|
|||||||
.hover()
|
.hover()
|
||||||
await page
|
await page
|
||||||
.getByRole('button', {
|
.getByRole('button', {
|
||||||
name: 'Roll back theme ; Has tooltip: Roll back to match default',
|
name: 'Roll back theme',
|
||||||
})
|
})
|
||||||
.click()
|
.click()
|
||||||
await expect(page.locator('select[name="app-theme"]')).toHaveValue('system')
|
await expect(page.locator('select[name="app-theme"]')).toHaveValue('system')
|
||||||
@ -2458,6 +2464,44 @@ test.describe('Onboarding tests', () => {
|
|||||||
await expect(onboardingOverlayLocator).toBeVisible()
|
await expect(onboardingOverlayLocator).toBeVisible()
|
||||||
await expect(onboardingOverlayLocator).toContainText('the menu button')
|
await expect(onboardingOverlayLocator).toContainText('the menu button')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test("Avatar text doesn't mention avatar when no avatar", async ({
|
||||||
|
page,
|
||||||
|
}) => {
|
||||||
|
// Override beforeEach test setup
|
||||||
|
await page.addInitScript(
|
||||||
|
async ({ settingsKey, settings }) => {
|
||||||
|
localStorage.setItem(settingsKey, settings)
|
||||||
|
localStorage.setItem('FORCE_NO_IMAGE', 'FORCE_NO_IMAGE')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
settingsKey: TEST_SETTINGS_KEY,
|
||||||
|
settings: TOML.stringify({
|
||||||
|
settings: TEST_SETTINGS_ONBOARDING_USER_MENU,
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
const u = await getUtils(page)
|
||||||
|
await page.setViewportSize({ width: 1200, height: 500 })
|
||||||
|
await u.waitForAuthSkipAppStart()
|
||||||
|
|
||||||
|
await page.waitForURL('**/file/**', { waitUntil: 'domcontentloaded' })
|
||||||
|
|
||||||
|
// Test that the text in this step is correct
|
||||||
|
const avatarLocator = await page
|
||||||
|
.getByTestId('user-sidebar-toggle')
|
||||||
|
.locator('img')
|
||||||
|
const onboardingOverlayLocator = await page
|
||||||
|
.getByTestId('onboarding-content')
|
||||||
|
.locator('div')
|
||||||
|
.nth(1)
|
||||||
|
|
||||||
|
// Expect the avatar to be visible and for the text to reference it
|
||||||
|
await expect(avatarLocator).not.toBeVisible()
|
||||||
|
await expect(onboardingOverlayLocator).toBeVisible()
|
||||||
|
await expect(onboardingOverlayLocator).toContainText('the menu button')
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
test.describe('Testing selections', () => {
|
test.describe('Testing selections', () => {
|
||||||
@ -2524,7 +2568,7 @@ test.describe('Testing selections', () => {
|
|||||||
|> line([-${commonPoints.num2}, 0], %)`)
|
|> line([-${commonPoints.num2}, 0], %)`)
|
||||||
|
|
||||||
// deselect line tool
|
// deselect line tool
|
||||||
await page.getByRole('button', { name: 'Line' }).click()
|
await page.getByRole('button', { name: 'Line', exact: true }).click()
|
||||||
|
|
||||||
await u.closeDebugPanel()
|
await u.closeDebugPanel()
|
||||||
const selectionSequence = async () => {
|
const selectionSequence = async () => {
|
||||||
@ -2549,8 +2593,10 @@ test.describe('Testing selections', () => {
|
|||||||
// click a segment hold shift and click an axis, see that a relevant constraint is enabled
|
// click a segment hold shift and click an axis, see that a relevant constraint is enabled
|
||||||
await topHorzSegmentClick()
|
await topHorzSegmentClick()
|
||||||
await page.keyboard.down('Shift')
|
await page.keyboard.down('Shift')
|
||||||
const constrainButton = page.getByRole('button', { name: 'Constraints' })
|
const constrainButton = page.getByRole('button', {
|
||||||
const absYButton = page.getByRole('button', { name: 'ABS Y' })
|
name: 'Length: open menu',
|
||||||
|
})
|
||||||
|
const absYButton = page.getByRole('button', { name: 'Absolute Y' })
|
||||||
await constrainButton.click()
|
await constrainButton.click()
|
||||||
await expect(absYButton).toBeDisabled()
|
await expect(absYButton).toBeDisabled()
|
||||||
await page.waitForTimeout(100)
|
await page.waitForTimeout(100)
|
||||||
@ -3061,6 +3107,49 @@ const sketch002 = startSketchOn(extrude001, $seg01)
|
|||||||
).not.toBeDisabled()
|
).not.toBeDisabled()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('Fillet button states test', async ({ page }) => {
|
||||||
|
const u = await getUtils(page)
|
||||||
|
await page.addInitScript(async () => {
|
||||||
|
localStorage.setItem(
|
||||||
|
'persistCode',
|
||||||
|
`const sketch001 = startSketchOn('XZ')
|
||||||
|
|> startProfileAt([-5, -5], %)
|
||||||
|
|> line([0, 10], %)
|
||||||
|
|> line([10, 0], %)
|
||||||
|
|> line([0, -10], %)
|
||||||
|
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
||||||
|
|> close(%)`
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
await page.setViewportSize({ width: 1000, height: 500 })
|
||||||
|
await u.waitForAuthSkipAppStart()
|
||||||
|
await u.openDebugPanel()
|
||||||
|
await u.expectCmdLog('[data-message-type="execution-done"]')
|
||||||
|
await u.closeDebugPanel()
|
||||||
|
|
||||||
|
const selectSegment = () => page.getByText(`line([10, 0], %)`).click()
|
||||||
|
const selectClose = () => page.getByText(`close(%)`).click()
|
||||||
|
const clickEmpty = () => page.mouse.click(950, 100)
|
||||||
|
|
||||||
|
// expect fillet button without any bodies in the scene
|
||||||
|
await selectSegment()
|
||||||
|
await expect(page.getByRole('button', { name: 'Fillet' })).toBeDisabled()
|
||||||
|
await clickEmpty()
|
||||||
|
await expect(page.getByRole('button', { name: 'Fillet' })).toBeDisabled()
|
||||||
|
|
||||||
|
// test fillet button with the body in the scene
|
||||||
|
const codeToAdd = `${await u.codeLocator.allInnerTexts()}
|
||||||
|
const extrude001 = extrude(10, sketch001)`
|
||||||
|
await u.codeLocator.fill(codeToAdd)
|
||||||
|
await selectSegment()
|
||||||
|
await expect(page.getByRole('button', { name: 'Fillet' })).toBeEnabled()
|
||||||
|
await selectClose()
|
||||||
|
await expect(page.getByRole('button', { name: 'Fillet' })).toBeDisabled()
|
||||||
|
await clickEmpty()
|
||||||
|
await expect(page.getByRole('button', { name: 'Fillet' })).toBeEnabled()
|
||||||
|
})
|
||||||
|
|
||||||
const removeAfterFirstParenthesis = (inputString: string) => {
|
const removeAfterFirstParenthesis = (inputString: string) => {
|
||||||
const index = inputString.indexOf('(')
|
const index = inputString.indexOf('(')
|
||||||
if (index !== -1) {
|
if (index !== -1) {
|
||||||
@ -3331,21 +3420,6 @@ const extrude001 = extrude(50, sketch001)
|
|||||||
await expect(
|
await expect(
|
||||||
page.getByRole('button', { name: 'Edit Sketch' })
|
page.getByRole('button', { name: 'Edit Sketch' })
|
||||||
).not.toBeVisible()
|
).not.toBeVisible()
|
||||||
|
|
||||||
// selecting an editable sketch but clicking "start sketch" should start a new sketch and not edit the existing one
|
|
||||||
await page.getByText(selectionsSnippets.extrudeAndEditAllowed).click()
|
|
||||||
await page.getByRole('button', { name: 'Start Sketch' }).click()
|
|
||||||
await page.waitForTimeout(200)
|
|
||||||
await page.getByTestId('KCL Code').click()
|
|
||||||
await page.waitForTimeout(200)
|
|
||||||
await page.mouse.click(734, 134)
|
|
||||||
await page.waitForTimeout(100)
|
|
||||||
await page.getByTestId('KCL Code').click()
|
|
||||||
// expect main content to contain `sketch005` i.e. started a new sketch
|
|
||||||
await page.waitForTimeout(300)
|
|
||||||
await expect(page.locator('.cm-content')).toHaveText(
|
|
||||||
/sketch001 = startSketchOn\('XZ'\)/
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
test('Deselecting line tool should mean nothing happens on click', async ({
|
test('Deselecting line tool should mean nothing happens on click', async ({
|
||||||
@ -3382,7 +3456,7 @@ const extrude001 = extrude(50, sketch001)
|
|||||||
let previousCodeContent = await page.locator('.cm-content').innerText()
|
let previousCodeContent = await page.locator('.cm-content').innerText()
|
||||||
|
|
||||||
// deselect the line tool by clicking it
|
// deselect the line tool by clicking it
|
||||||
await page.getByRole('button', { name: 'Line' }).click()
|
await page.getByRole('button', { name: 'Line', exact: true }).click()
|
||||||
|
|
||||||
await page.mouse.click(700, 200)
|
await page.mouse.click(700, 200)
|
||||||
await page.waitForTimeout(100)
|
await page.waitForTimeout(100)
|
||||||
@ -3395,7 +3469,7 @@ const extrude001 = extrude(50, sketch001)
|
|||||||
await expect(page.locator('.cm-content')).toHaveText(previousCodeContent)
|
await expect(page.locator('.cm-content')).toHaveText(previousCodeContent)
|
||||||
|
|
||||||
// select line tool again
|
// select line tool again
|
||||||
await page.getByRole('button', { name: 'Line' }).click()
|
await page.getByRole('button', { name: 'Line', exact: true }).click()
|
||||||
|
|
||||||
await u.closeDebugPanel()
|
await u.closeDebugPanel()
|
||||||
|
|
||||||
@ -3462,11 +3536,62 @@ test.describe('Command bar tests', () => {
|
|||||||
`const extrude001 = extrude(${KCL_DEFAULT_LENGTH}, sketch001)`
|
`const extrude001 = extrude(${KCL_DEFAULT_LENGTH}, sketch001)`
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
test('Command bar works and can change a setting', async ({ page }) => {
|
|
||||||
|
test('Fillet from command bar', async ({ page }) => {
|
||||||
|
await page.addInitScript(async () => {
|
||||||
|
localStorage.setItem(
|
||||||
|
'persistCode',
|
||||||
|
`const sketch001 = startSketchOn('XY')
|
||||||
|
|> startProfileAt([-5, -5], %)
|
||||||
|
|> line([0, 10], %)
|
||||||
|
|> line([10, 0], %)
|
||||||
|
|> line([0, -10], %)
|
||||||
|
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
||||||
|
|> close(%)
|
||||||
|
const extrude001 = extrude(-10, sketch001)`
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
const u = await getUtils(page)
|
||||||
|
await page.setViewportSize({ width: 1000, height: 500 })
|
||||||
|
await u.waitForAuthSkipAppStart()
|
||||||
|
await u.openDebugPanel()
|
||||||
|
await u.expectCmdLog('[data-message-type="execution-done"]')
|
||||||
|
await u.closeDebugPanel()
|
||||||
|
|
||||||
|
const selectSegment = () => page.getByText(`line([0, -10], %)`).click()
|
||||||
|
|
||||||
|
await selectSegment()
|
||||||
|
await page.waitForTimeout(100)
|
||||||
|
await page.getByRole('button', { name: 'Fillet' }).click()
|
||||||
|
await page.waitForTimeout(100)
|
||||||
|
await page.keyboard.press('Enter')
|
||||||
|
await page.waitForTimeout(100)
|
||||||
|
await page.keyboard.press('Enter')
|
||||||
|
await page.waitForTimeout(100)
|
||||||
|
await expect(page.locator('.cm-activeLine')).toContainText(
|
||||||
|
`fillet({ radius: ${KCL_DEFAULT_LENGTH}, tags: [seg01] }, %)`
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('Command bar can change a setting, and switch back and forth between arguments', async ({
|
||||||
|
page,
|
||||||
|
}) => {
|
||||||
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 u.waitForAuthSkipAppStart()
|
await u.waitForAuthSkipAppStart()
|
||||||
|
|
||||||
|
const commandBarButton = page.getByRole('button', { name: 'Commands' })
|
||||||
|
const cmdSearchBar = page.getByPlaceholder('Search commands')
|
||||||
|
const themeOption = page.getByRole('option', {
|
||||||
|
name: 'theme',
|
||||||
|
exact: false,
|
||||||
|
})
|
||||||
|
const commandLevelArgButton = page.getByRole('button', { name: 'level' })
|
||||||
|
const commandThemeArgButton = page.getByRole('button', { name: 'value' })
|
||||||
|
// This selector changes after we set the setting
|
||||||
|
let commandOptionInput = page.getByPlaceholder('Select an option')
|
||||||
|
|
||||||
await expect(
|
await expect(
|
||||||
page.getByRole('button', { name: 'Start Sketch' })
|
page.getByRole('button', { name: 'Start Sketch' })
|
||||||
).not.toBeDisabled()
|
).not.toBeDisabled()
|
||||||
@ -3477,23 +3602,17 @@ test.describe('Command bar tests', () => {
|
|||||||
.or(page.getByRole('button', { name: '⌘K' }))
|
.or(page.getByRole('button', { name: '⌘K' }))
|
||||||
.click()
|
.click()
|
||||||
|
|
||||||
let cmdSearchBar = page.getByPlaceholder('Search commands')
|
|
||||||
await expect(cmdSearchBar).toBeVisible()
|
await expect(cmdSearchBar).toBeVisible()
|
||||||
await page.keyboard.press('Escape')
|
await page.keyboard.press('Escape')
|
||||||
cmdSearchBar = page.getByPlaceholder('Search commands')
|
|
||||||
await expect(cmdSearchBar).not.toBeVisible()
|
await expect(cmdSearchBar).not.toBeVisible()
|
||||||
|
|
||||||
// Now try the same, but with the keyboard shortcut, check focus
|
// Now try the same, but with the keyboard shortcut, check focus
|
||||||
await page.keyboard.press('Meta+K')
|
await page.keyboard.press('Meta+K')
|
||||||
cmdSearchBar = page.getByPlaceholder('Search commands')
|
|
||||||
await expect(cmdSearchBar).toBeVisible()
|
await expect(cmdSearchBar).toBeVisible()
|
||||||
await expect(cmdSearchBar).toBeFocused()
|
await expect(cmdSearchBar).toBeFocused()
|
||||||
|
|
||||||
// Try typing in the command bar
|
// Try typing in the command bar
|
||||||
await page.keyboard.type('theme')
|
await cmdSearchBar.fill('theme')
|
||||||
const themeOption = page.getByRole('option', {
|
|
||||||
name: 'Settings · app · theme',
|
|
||||||
})
|
|
||||||
await expect(themeOption).toBeVisible()
|
await expect(themeOption).toBeVisible()
|
||||||
await themeOption.click()
|
await themeOption.click()
|
||||||
const themeInput = page.getByPlaceholder('Select an option')
|
const themeInput = page.getByPlaceholder('Select an option')
|
||||||
@ -3515,6 +3634,24 @@ test.describe('Command bar tests', () => {
|
|||||||
).toBeVisible()
|
).toBeVisible()
|
||||||
// Check that the theme changed
|
// Check that the theme changed
|
||||||
await expect(page.locator('body')).not.toHaveClass(`body-bg dark`)
|
await expect(page.locator('body')).not.toHaveClass(`body-bg dark`)
|
||||||
|
|
||||||
|
commandOptionInput = page.getByPlaceholder('system')
|
||||||
|
|
||||||
|
// Test case for https://github.com/KittyCAD/modeling-app/issues/2882
|
||||||
|
await commandBarButton.click()
|
||||||
|
await cmdSearchBar.focus()
|
||||||
|
await cmdSearchBar.fill('theme')
|
||||||
|
await themeOption.click()
|
||||||
|
await expect(commandThemeArgButton).toBeDisabled()
|
||||||
|
await commandOptionInput.focus()
|
||||||
|
await commandOptionInput.fill('lig')
|
||||||
|
await commandLevelArgButton.click()
|
||||||
|
await expect(commandLevelArgButton).toBeDisabled()
|
||||||
|
|
||||||
|
// Test case for https://github.com/KittyCAD/modeling-app/issues/2881
|
||||||
|
await commandThemeArgButton.click()
|
||||||
|
await expect(commandThemeArgButton).toBeDisabled()
|
||||||
|
await expect(commandLevelArgButton).toHaveText('level: project')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('Command bar keybinding works from code editor and can change a setting', async ({
|
test('Command bar keybinding works from code editor and can change a setting', async ({
|
||||||
@ -3539,7 +3676,7 @@ test.describe('Command bar tests', () => {
|
|||||||
await expect(cmdSearchBar).toBeFocused()
|
await expect(cmdSearchBar).toBeFocused()
|
||||||
|
|
||||||
// Try typing in the command bar
|
// Try typing in the command bar
|
||||||
await page.keyboard.type('theme')
|
await cmdSearchBar.fill('theme')
|
||||||
const themeOption = page.getByRole('option', {
|
const themeOption = page.getByRole('option', {
|
||||||
name: 'Settings · app · theme',
|
name: 'Settings · app · theme',
|
||||||
})
|
})
|
||||||
@ -3610,7 +3747,9 @@ test.describe('Command bar tests', () => {
|
|||||||
await page.mouse.click(700, 200)
|
await page.mouse.click(700, 200)
|
||||||
|
|
||||||
// Assert that we're on the distance step
|
// Assert that we're on the distance step
|
||||||
await expect(page.getByRole('button', { name: 'distance' })).toBeDisabled()
|
await expect(
|
||||||
|
page.getByRole('button', { name: 'distance', exact: false })
|
||||||
|
).toBeDisabled()
|
||||||
|
|
||||||
// Assert that the an alternative variable name is chosen,
|
// Assert that the an alternative variable name is chosen,
|
||||||
// since the default variable name is already in use (distance)
|
// since the default variable name is already in use (distance)
|
||||||
@ -3625,11 +3764,12 @@ test.describe('Command bar tests', () => {
|
|||||||
|
|
||||||
// Review step and argument hotkeys
|
// Review step and argument hotkeys
|
||||||
await expect(submitButton).toBeEnabled()
|
await expect(submitButton).toBeEnabled()
|
||||||
await page.keyboard.press('Backspace')
|
await expect(submitButton).toBeFocused()
|
||||||
|
await submitButton.press('Backspace')
|
||||||
|
|
||||||
// Assert we're back on the distance step
|
// Assert we're back on the distance step
|
||||||
await expect(
|
await expect(
|
||||||
page.getByRole('button', { name: 'Distance 5', exact: false })
|
page.getByRole('button', { name: 'distance', exact: false })
|
||||||
).toBeDisabled()
|
).toBeDisabled()
|
||||||
|
|
||||||
await continueButton.click()
|
await continueButton.click()
|
||||||
@ -3653,6 +3793,58 @@ const extrude001 = extrude(distance001, sketch001)`.replace(
|
|||||||
) // remove newlines
|
) // remove newlines
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('Can switch between sketch tools via command bar', async ({ page }) => {
|
||||||
|
const u = await getUtils(page)
|
||||||
|
await page.setViewportSize({ width: 1200, height: 500 })
|
||||||
|
await u.waitForAuthSkipAppStart()
|
||||||
|
|
||||||
|
const sketchButton = page.getByRole('button', { name: 'Start Sketch' })
|
||||||
|
const cmdBarButton = page.getByRole('button', { name: 'Commands' })
|
||||||
|
const rectangleToolCommand = page.getByRole('option', {
|
||||||
|
name: 'rectangle',
|
||||||
|
})
|
||||||
|
const rectangleToolButton = page.getByRole('button', {
|
||||||
|
name: 'Corner rectangle',
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
const lineToolCommand = page.getByRole('option', {
|
||||||
|
name: 'Line',
|
||||||
|
})
|
||||||
|
const lineToolButton = page.getByRole('button', {
|
||||||
|
name: 'Line',
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
const arcToolCommand = page.getByRole('option', { name: 'Tangential Arc' })
|
||||||
|
const arcToolButton = page.getByRole('button', {
|
||||||
|
name: 'Tangential Arc',
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
|
||||||
|
// Start a sketch
|
||||||
|
await sketchButton.click()
|
||||||
|
await page.mouse.click(700, 200)
|
||||||
|
|
||||||
|
// Switch between sketch tools via the command bar
|
||||||
|
await expect(lineToolButton).toHaveAttribute('aria-pressed', 'true')
|
||||||
|
await cmdBarButton.click()
|
||||||
|
await rectangleToolCommand.click()
|
||||||
|
await expect(rectangleToolButton).toHaveAttribute('aria-pressed', 'true')
|
||||||
|
await cmdBarButton.click()
|
||||||
|
await lineToolCommand.click()
|
||||||
|
await expect(lineToolButton).toHaveAttribute('aria-pressed', 'true')
|
||||||
|
|
||||||
|
// Click in the scene a couple times to draw a line
|
||||||
|
// so tangential arc is valid
|
||||||
|
await page.mouse.click(700, 200)
|
||||||
|
await page.mouse.move(700, 300, { steps: 5 })
|
||||||
|
await page.mouse.click(700, 300)
|
||||||
|
|
||||||
|
// switch to tangential arc via command bar
|
||||||
|
await cmdBarButton.click()
|
||||||
|
await arcToolCommand.click()
|
||||||
|
await expect(arcToolButton).toHaveAttribute('aria-pressed', 'true')
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
test.describe('Regression tests', () => {
|
test.describe('Regression tests', () => {
|
||||||
@ -3674,10 +3866,7 @@ test.describe('Regression tests', () => {
|
|||||||
await u.waitForAuthSkipAppStart()
|
await u.waitForAuthSkipAppStart()
|
||||||
|
|
||||||
// expand variables section
|
// expand variables section
|
||||||
const variablesTabButton = page.getByRole('tab', {
|
const variablesTabButton = page.getByTestId('variables-pane-button')
|
||||||
name: 'Variables',
|
|
||||||
exact: false,
|
|
||||||
})
|
|
||||||
await variablesTabButton.click()
|
await variablesTabButton.click()
|
||||||
|
|
||||||
// can find sketch001 in the variables summary (pretty-json-container, makes sure we're not looking in the code editor)
|
// can find sketch001 in the variables summary (pretty-json-container, makes sure we're not looking in the code editor)
|
||||||
@ -3702,10 +3891,7 @@ test.describe('Regression tests', () => {
|
|||||||
|
|
||||||
await u.waitForAuthSkipAppStart()
|
await u.waitForAuthSkipAppStart()
|
||||||
|
|
||||||
const variablesTabButton = page.getByRole('tab', {
|
const variablesTabButton = page.getByTestId('variables-pane-button')
|
||||||
name: 'Variables',
|
|
||||||
exact: false,
|
|
||||||
})
|
|
||||||
await variablesTabButton.click()
|
await variablesTabButton.click()
|
||||||
// expect to see "myVar:5"
|
// expect to see "myVar:5"
|
||||||
await expect(
|
await expect(
|
||||||
@ -3928,6 +4114,55 @@ test.describe('Sketch tests', () => {
|
|||||||
page.getByRole('button', { name: 'Edit Sketch' })
|
page.getByRole('button', { name: 'Edit Sketch' })
|
||||||
).toBeVisible()
|
).toBeVisible()
|
||||||
})
|
})
|
||||||
|
test('Can delete most of a sketch and the line tool will still work', async ({
|
||||||
|
page,
|
||||||
|
}) => {
|
||||||
|
const u = await getUtils(page)
|
||||||
|
await page.addInitScript(async () => {
|
||||||
|
localStorage.setItem(
|
||||||
|
'persistCode',
|
||||||
|
`const sketch001 = startSketchOn('XZ')
|
||||||
|
|> startProfileAt([4.61, -14.01], %)
|
||||||
|
|> line([12.73, -0.09], %)
|
||||||
|
|> tangentialArcTo([24.95, -5.38], %)`
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
await page.setViewportSize({ width: 1200, height: 500 })
|
||||||
|
|
||||||
|
await u.waitForAuthSkipAppStart()
|
||||||
|
await page.getByText('tangentialArcTo([24.95, -5.38], %)').click()
|
||||||
|
|
||||||
|
await expect(
|
||||||
|
page.getByRole('button', { name: 'Edit Sketch' })
|
||||||
|
).toBeEnabled()
|
||||||
|
await page.getByRole('button', { name: 'Edit Sketch' }).click()
|
||||||
|
|
||||||
|
await page.waitForTimeout(600) // wait for animation
|
||||||
|
|
||||||
|
await page.getByText('tangentialArcTo([24.95, -5.38], %)').click()
|
||||||
|
await page.keyboard.press('End')
|
||||||
|
await page.keyboard.down('Shift')
|
||||||
|
await page.keyboard.press('ArrowUp')
|
||||||
|
await page.keyboard.press('Home')
|
||||||
|
await page.keyboard.up('Shift')
|
||||||
|
await page.keyboard.press('Backspace')
|
||||||
|
await u.openAndClearDebugPanel()
|
||||||
|
|
||||||
|
await u.expectCmdLog('[data-message-type="execution-done"]', 10_000)
|
||||||
|
await page.waitForTimeout(100)
|
||||||
|
|
||||||
|
await page.getByRole('button', { name: 'Line', exact: true }).click()
|
||||||
|
await page.waitForTimeout(100)
|
||||||
|
|
||||||
|
await page.mouse.click(700, 200)
|
||||||
|
|
||||||
|
await expect(page.locator('.cm-content')).toHaveText(
|
||||||
|
`const sketch001 = startSketchOn('XZ')
|
||||||
|
|> startProfileAt([4.61, -14.01], %)
|
||||||
|
|> line([0.31, 16.47], %)`
|
||||||
|
)
|
||||||
|
})
|
||||||
test('Can exit selection of face', async ({ page }) => {
|
test('Can exit selection of face', async ({ page }) => {
|
||||||
// Load the app with the code panes
|
// Load the app with the code panes
|
||||||
await page.addInitScript(async () => {
|
await page.addInitScript(async () => {
|
||||||
@ -3944,9 +4179,7 @@ test.describe('Sketch tests', () => {
|
|||||||
page.getByRole('button', { name: 'Exit Sketch' })
|
page.getByRole('button', { name: 'Exit Sketch' })
|
||||||
).toBeVisible()
|
).toBeVisible()
|
||||||
|
|
||||||
await expect(
|
await expect(page.getByText('select a plane or face')).toBeVisible()
|
||||||
page.getByText('click plane or face to sketch on')
|
|
||||||
).toBeVisible()
|
|
||||||
|
|
||||||
await page.keyboard.press('Escape')
|
await page.keyboard.press('Escape')
|
||||||
await expect(
|
await expect(
|
||||||
@ -4317,7 +4550,7 @@ test.describe('Sketch tests', () => {
|
|||||||
await expect(page.locator('.cm-content'))
|
await expect(page.locator('.cm-content'))
|
||||||
.toHaveText(`const sketch001 = startSketchOn('XZ')
|
.toHaveText(`const sketch001 = startSketchOn('XZ')
|
||||||
|> startProfileAt([6.44, -12.07], %)
|
|> startProfileAt([6.44, -12.07], %)
|
||||||
|> line([14.72, 2.01], %)
|
|> line([14.72, 1.97], %)
|
||||||
|> tangentialArcTo([24.95, -5.38], %)
|
|> tangentialArcTo([24.95, -5.38], %)
|
||||||
|> line([1.97, 2.06], %)
|
|> line([1.97, 2.06], %)
|
||||||
|> close(%)
|
|> close(%)
|
||||||
@ -4497,7 +4730,7 @@ test.describe('Sketch tests', () => {
|
|||||||
await expect(page.locator('.cm-content')).toHaveText(code)
|
await expect(page.locator('.cm-content')).toHaveText(code)
|
||||||
// Assert the tool was unequipped
|
// Assert the tool was unequipped
|
||||||
await expect(
|
await expect(
|
||||||
page.getByRole('button', { name: 'Line' })
|
page.getByRole('button', { name: 'Line', exact: true })
|
||||||
).not.toHaveAttribute('aria-pressed', 'true')
|
).not.toHaveAttribute('aria-pressed', 'true')
|
||||||
|
|
||||||
// exit sketch
|
// exit sketch
|
||||||
@ -4514,6 +4747,53 @@ test.describe('Sketch tests', () => {
|
|||||||
await doSnapAtDifferentScales(page, [0, 10000, 10000])
|
await doSnapAtDifferentScales(page, [0, 10000, 10000])
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
test('exiting a close extrude, has the extrude button enabled ready to go', async ({
|
||||||
|
page,
|
||||||
|
}) => {
|
||||||
|
// this was a regression https://github.com/KittyCAD/modeling-app/issues/2832
|
||||||
|
await page.addInitScript(async () => {
|
||||||
|
localStorage.setItem(
|
||||||
|
'persistCode',
|
||||||
|
`const sketch001 = startSketchOn('XZ')
|
||||||
|
|> startProfileAt([-0.45, 0.87], %)
|
||||||
|
|> line([1.32, 0.38], %)
|
||||||
|
|> line([1.02, -1.32], %, $seg01)
|
||||||
|
|> line([-1.01, -0.77], %)
|
||||||
|
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
||||||
|
|> close(%)
|
||||||
|
`
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
const u = await getUtils(page)
|
||||||
|
await page.setViewportSize({ width: 1200, height: 500 })
|
||||||
|
|
||||||
|
await u.waitForAuthSkipAppStart()
|
||||||
|
|
||||||
|
// click "line([1.32, 0.38], %)"
|
||||||
|
await page.getByText(`line([1.32, 0.38], %)`).click()
|
||||||
|
await page.waitForTimeout(100)
|
||||||
|
// click edit sketch
|
||||||
|
await page.getByRole('button', { name: 'Edit Sketch' }).click()
|
||||||
|
await page.waitForTimeout(600) // wait for animation
|
||||||
|
|
||||||
|
// exit sketch
|
||||||
|
await page.getByRole('button', { name: 'Exit Sketch' }).click()
|
||||||
|
|
||||||
|
// expect extrude button to be enabled
|
||||||
|
await expect(
|
||||||
|
page.getByRole('button', { name: 'Extrude' })
|
||||||
|
).not.toBeDisabled()
|
||||||
|
|
||||||
|
// click extrude
|
||||||
|
await page.getByRole('button', { name: 'Extrude' }).click()
|
||||||
|
|
||||||
|
// sketch selection should already have been made. "Selection: 1 face" only show up when the selection has been made already
|
||||||
|
// otherwise the cmdbar would be waiting for a selection.
|
||||||
|
await expect(
|
||||||
|
page.getByRole('button', { name: 'selection : 1 face', exact: false })
|
||||||
|
).toBeVisible()
|
||||||
|
})
|
||||||
test("Existing sketch with bad code delete user's code", async ({ page }) => {
|
test("Existing sketch with bad code delete user's code", async ({ page }) => {
|
||||||
// this was a regression https://github.com/KittyCAD/modeling-app/issues/2832
|
// this was a regression https://github.com/KittyCAD/modeling-app/issues/2832
|
||||||
await page.addInitScript(async () => {
|
await page.addInitScript(async () => {
|
||||||
@ -4612,8 +4892,7 @@ test.describe('Testing constraints', () => {
|
|||||||
await page.mouse.click(834, 244)
|
await page.mouse.click(834, 244)
|
||||||
await page.keyboard.up('Shift')
|
await page.keyboard.up('Shift')
|
||||||
|
|
||||||
await page.getByRole('button', { name: 'Constraints', exact: true }).click()
|
await page.getByRole('button', { name: 'Length', exact: true }).click()
|
||||||
await page.getByRole('button', { name: 'length', exact: true }).click()
|
|
||||||
await page.getByText('Add constraining value').click()
|
await page.getByText('Add constraining value').click()
|
||||||
|
|
||||||
await expect(page.locator('.cm-content')).toHaveText(
|
await expect(page.locator('.cm-content')).toHaveText(
|
||||||
@ -4667,12 +4946,10 @@ const part002 = startSketchOn('XZ')
|
|||||||
await page.waitForTimeout(100) // this wait is needed for webkit - not sure why
|
await page.waitForTimeout(100) // this wait is needed for webkit - not sure why
|
||||||
await page
|
await page
|
||||||
.getByRole('button', {
|
.getByRole('button', {
|
||||||
name: 'Constraints',
|
name: 'Length: open menu',
|
||||||
})
|
})
|
||||||
.click()
|
.click()
|
||||||
await page
|
await page.getByRole('button', { name: 'remove constraints' }).click()
|
||||||
.getByRole('button', { name: 'remove constraints', exact: true })
|
|
||||||
.click()
|
|
||||||
|
|
||||||
await page.getByText('line([39.13, 68.63], %)').click()
|
await page.getByText('line([39.13, 68.63], %)').click()
|
||||||
const activeLinesContent = await page.locator('.cm-activeLine').all()
|
const activeLinesContent = await page.locator('.cm-activeLine').all()
|
||||||
@ -4733,11 +5010,11 @@ const part002 = startSketchOn('XZ')
|
|||||||
await page.keyboard.up('Shift')
|
await page.keyboard.up('Shift')
|
||||||
await page
|
await page
|
||||||
.getByRole('button', {
|
.getByRole('button', {
|
||||||
name: 'Constraints',
|
name: 'Length: open menu',
|
||||||
})
|
})
|
||||||
.click()
|
.click()
|
||||||
await page
|
await page
|
||||||
.getByRole('button', { name: 'perpendicular distance', exact: true })
|
.getByRole('button', { name: 'Perpendicular Distance' })
|
||||||
.click()
|
.click()
|
||||||
|
|
||||||
const createNewVariableCheckbox = page.getByTestId(
|
const createNewVariableCheckbox = page.getByTestId(
|
||||||
@ -4832,12 +5109,10 @@ const part002 = startSketchOn('XZ')
|
|||||||
await page.keyboard.up('Shift')
|
await page.keyboard.up('Shift')
|
||||||
await page
|
await page
|
||||||
.getByRole('button', {
|
.getByRole('button', {
|
||||||
name: 'Constraints',
|
name: 'Length: open menu',
|
||||||
})
|
})
|
||||||
.click()
|
.click()
|
||||||
await page
|
await page.getByRole('button', { name: constraint }).click()
|
||||||
.getByRole('button', { name: constraint, exact: true })
|
|
||||||
.click()
|
|
||||||
|
|
||||||
const createNewVariableCheckbox = page.getByTestId(
|
const createNewVariableCheckbox = page.getByTestId(
|
||||||
'create-new-variable-checkbox'
|
'create-new-variable-checkbox'
|
||||||
@ -4878,25 +5153,25 @@ const part002 = startSketchOn('XZ')
|
|||||||
{
|
{
|
||||||
testName: 'Add variable',
|
testName: 'Add variable',
|
||||||
addVariable: true,
|
addVariable: true,
|
||||||
constraint: 'ABS X',
|
constraint: 'Absolute X',
|
||||||
value: 'xDis001, 61.34',
|
value: 'xDis001, 61.34',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: 'No variable',
|
testName: 'No variable',
|
||||||
addVariable: false,
|
addVariable: false,
|
||||||
constraint: 'ABS X',
|
constraint: 'Absolute X',
|
||||||
value: '154.9, 61.34',
|
value: '154.9, 61.34',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: 'Add variable',
|
testName: 'Add variable',
|
||||||
addVariable: true,
|
addVariable: true,
|
||||||
constraint: 'ABS Y',
|
constraint: 'Absolute Y',
|
||||||
value: '154.9, yDis001',
|
value: '154.9, yDis001',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: 'No variable',
|
testName: 'No variable',
|
||||||
addVariable: false,
|
addVariable: false,
|
||||||
constraint: 'ABS Y',
|
constraint: 'Absolute Y',
|
||||||
value: '154.9, 61.34',
|
value: '154.9, 61.34',
|
||||||
},
|
},
|
||||||
] as const
|
] as const
|
||||||
@ -4932,7 +5207,7 @@ const part002 = startSketchOn('XZ')
|
|||||||
u.getSegmentBodyCoords(`[data-overlay-index="${2}"]`),
|
u.getSegmentBodyCoords(`[data-overlay-index="${2}"]`),
|
||||||
])
|
])
|
||||||
|
|
||||||
if (constraint === 'ABS X') {
|
if (constraint === 'Absolute X') {
|
||||||
await page.mouse.click(600, 130)
|
await page.mouse.click(600, 130)
|
||||||
} else {
|
} else {
|
||||||
await page.mouse.click(900, 250)
|
await page.mouse.click(900, 250)
|
||||||
@ -4943,7 +5218,7 @@ const part002 = startSketchOn('XZ')
|
|||||||
await page.keyboard.up('Shift')
|
await page.keyboard.up('Shift')
|
||||||
await page
|
await page
|
||||||
.getByRole('button', {
|
.getByRole('button', {
|
||||||
name: 'Constraints',
|
name: 'Length: open menu',
|
||||||
})
|
})
|
||||||
.click()
|
.click()
|
||||||
await page
|
await page
|
||||||
@ -5051,10 +5326,10 @@ const part002 = startSketchOn('XZ')
|
|||||||
await page.keyboard.up('Shift')
|
await page.keyboard.up('Shift')
|
||||||
await page
|
await page
|
||||||
.getByRole('button', {
|
.getByRole('button', {
|
||||||
name: 'Constraints',
|
name: 'Length: open menu',
|
||||||
})
|
})
|
||||||
.click()
|
.click()
|
||||||
await page.getByTestId('angle').click()
|
await page.getByTestId('dropdown-constraint-angle').click()
|
||||||
|
|
||||||
const createNewVariableCheckbox = page.getByTestId(
|
const createNewVariableCheckbox = page.getByTestId(
|
||||||
'create-new-variable-checkbox'
|
'create-new-variable-checkbox'
|
||||||
@ -5152,10 +5427,10 @@ const part002 = startSketchOn('XZ')
|
|||||||
await page.mouse.click(line3.x, line3.y)
|
await page.mouse.click(line3.x, line3.y)
|
||||||
await page
|
await page
|
||||||
.getByRole('button', {
|
.getByRole('button', {
|
||||||
name: 'Constraints',
|
name: 'Length: open menu',
|
||||||
})
|
})
|
||||||
.click()
|
.click()
|
||||||
await page.getByTestId(constraint).click()
|
await page.getByTestId('dropdown-constraint-' + constraint).click()
|
||||||
|
|
||||||
if (!addVariable) {
|
if (!addVariable) {
|
||||||
await page.getByTestId('create-new-variable-checkbox').click()
|
await page.getByTestId('create-new-variable-checkbox').click()
|
||||||
@ -5243,7 +5518,7 @@ const part002 = startSketchOn('XZ')
|
|||||||
await expect(activeLinesContent).toHaveLength(codeAfter.length)
|
await expect(activeLinesContent).toHaveLength(codeAfter.length)
|
||||||
|
|
||||||
const constraintMenuButton = page.getByRole('button', {
|
const constraintMenuButton = page.getByRole('button', {
|
||||||
name: 'Constraints',
|
name: 'Length: open menu',
|
||||||
})
|
})
|
||||||
const constraintButton = page
|
const constraintButton = page
|
||||||
.getByRole('button', {
|
.getByRole('button', {
|
||||||
@ -5326,7 +5601,7 @@ const part002 = startSketchOn('XZ')
|
|||||||
await page.mouse.click(line3.x - 3, line3.y + 20)
|
await page.mouse.click(line3.x - 3, line3.y + 20)
|
||||||
await page.keyboard.up('Shift')
|
await page.keyboard.up('Shift')
|
||||||
const constraintMenuButton = page.getByRole('button', {
|
const constraintMenuButton = page.getByRole('button', {
|
||||||
name: 'Constraints',
|
name: 'Length: open menu',
|
||||||
})
|
})
|
||||||
const constraintButton = page.getByRole('button', {
|
const constraintButton = page.getByRole('button', {
|
||||||
name: constraintName,
|
name: constraintName,
|
||||||
@ -5403,7 +5678,7 @@ const part002 = startSketchOn('XZ')
|
|||||||
await page.mouse.click(axisClick.x, axisClick.y)
|
await page.mouse.click(axisClick.x, axisClick.y)
|
||||||
await page.keyboard.up('Shift')
|
await page.keyboard.up('Shift')
|
||||||
const constraintMenuButton = page.getByRole('button', {
|
const constraintMenuButton = page.getByRole('button', {
|
||||||
name: 'Constraints',
|
name: 'Length: open menu',
|
||||||
})
|
})
|
||||||
const constraintButton = page.getByRole('button', {
|
const constraintButton = page.getByRole('button', {
|
||||||
name: constraintName,
|
name: constraintName,
|
||||||
@ -5462,10 +5737,10 @@ const part002 = startSketchOn('XZ')
|
|||||||
|
|
||||||
await page
|
await page
|
||||||
.getByRole('button', {
|
.getByRole('button', {
|
||||||
name: 'Constraints',
|
name: 'Length: open menu',
|
||||||
})
|
})
|
||||||
.click()
|
.click()
|
||||||
await page.getByRole('button', { name: 'horizontal', exact: true }).click()
|
await page.getByRole('button', { name: 'Horizontal', exact: true }).click()
|
||||||
|
|
||||||
let activeLinesContent = await page.locator('.cm-activeLine').all()
|
let activeLinesContent = await page.locator('.cm-activeLine').all()
|
||||||
await expect(activeLinesContent[0]).toHaveText(`|> xLine(3.13, %)`)
|
await expect(activeLinesContent[0]).toHaveText(`|> xLine(3.13, %)`)
|
||||||
@ -5486,13 +5761,13 @@ const part002 = startSketchOn('XZ')
|
|||||||
await page.waitForTimeout(300)
|
await page.waitForTimeout(300)
|
||||||
await page
|
await page
|
||||||
.getByRole('button', {
|
.getByRole('button', {
|
||||||
name: 'Constraints',
|
name: 'Length: open menu',
|
||||||
})
|
})
|
||||||
.click()
|
.click()
|
||||||
// await expect(page.getByRole('button', { name: 'length', exact: true })).toBeVisible()
|
// await expect(page.getByRole('button', { name: 'length', exact: true })).toBeVisible()
|
||||||
await page.waitForTimeout(200)
|
await page.waitForTimeout(200)
|
||||||
// await page.getByRole('button', { name: 'length', exact: true }).click()
|
// await page.getByRole('button', { name: 'length', exact: true }).click()
|
||||||
await page.locator('[data-testid="length"]').click()
|
await page.getByTestId('dropdown-constraint-length').click()
|
||||||
|
|
||||||
await page.getByLabel('length Value').fill('10')
|
await page.getByLabel('length Value').fill('10')
|
||||||
await page.getByRole('button', { name: 'Add constraining value' }).click()
|
await page.getByRole('button', { name: 'Add constraining value' }).click()
|
||||||
@ -6784,6 +7059,8 @@ test.describe('Test network and connection issues', () => {
|
|||||||
|
|
||||||
await u.waitForAuthSkipAppStart()
|
await u.waitForAuthSkipAppStart()
|
||||||
|
|
||||||
|
const networkToggle = page.getByTestId('network-toggle')
|
||||||
|
|
||||||
// This is how we wait until the stream is online
|
// This is how we wait until the stream is online
|
||||||
await expect(
|
await expect(
|
||||||
page.getByRole('button', { name: 'Start Sketch' })
|
page.getByRole('button', { name: 'Start Sketch' })
|
||||||
@ -6797,7 +7074,7 @@ test.describe('Test network and connection issues', () => {
|
|||||||
await expect(networkPopover).not.toBeVisible()
|
await expect(networkPopover).not.toBeVisible()
|
||||||
|
|
||||||
// (First check) Expect the network to be up
|
// (First check) Expect the network to be up
|
||||||
await expect(page.getByText('Network Health (Connected)')).toBeVisible()
|
await expect(networkToggle).toContainText('Connected')
|
||||||
|
|
||||||
// Click the network widget
|
// Click the network widget
|
||||||
await networkWidget.click()
|
await networkWidget.click()
|
||||||
@ -6819,7 +7096,7 @@ test.describe('Test network and connection issues', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
// Expect the network to be down
|
// Expect the network to be down
|
||||||
await expect(page.getByText('Network Health (Offline)')).toBeVisible()
|
await expect(networkToggle).toContainText('Offline')
|
||||||
|
|
||||||
// Click the network widget
|
// Click the network widget
|
||||||
await networkWidget.click()
|
await networkWidget.click()
|
||||||
@ -6845,7 +7122,7 @@ test.describe('Test network and connection issues', () => {
|
|||||||
).not.toBeDisabled({ timeout: 15000 })
|
).not.toBeDisabled({ timeout: 15000 })
|
||||||
|
|
||||||
// (Second check) expect the network to be up
|
// (Second check) expect the network to be up
|
||||||
await expect(page.getByText('Network Health (Connected)')).toBeVisible()
|
await expect(networkToggle).toContainText('Connected')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('Engine disconnect & reconnect in sketch mode', async ({
|
test('Engine disconnect & reconnect in sketch mode', async ({
|
||||||
@ -6857,6 +7134,8 @@ test.describe('Test network and connection issues', () => {
|
|||||||
browserName === 'webkit',
|
browserName === 'webkit',
|
||||||
'Skip on Safari until `window.tearDown` is working there'
|
'Skip on Safari until `window.tearDown` is working there'
|
||||||
)
|
)
|
||||||
|
const networkToggle = page.getByTestId('network-toggle')
|
||||||
|
|
||||||
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
|
||||||
@ -6899,7 +7178,7 @@ test.describe('Test network and connection issues', () => {
|
|||||||
|> line([${commonPoints.num1}, 0], %)`)
|
|> line([${commonPoints.num1}, 0], %)`)
|
||||||
|
|
||||||
// Expect the network to be up
|
// Expect the network to be up
|
||||||
await expect(page.getByText('Network Health (Connected)')).toBeVisible()
|
await expect(networkToggle).toContainText('Connected')
|
||||||
|
|
||||||
// simulate network down
|
// simulate network down
|
||||||
await u.emulateNetworkConditions({
|
await u.emulateNetworkConditions({
|
||||||
@ -6911,7 +7190,7 @@ test.describe('Test network and connection issues', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
// Expect the network to be down
|
// Expect the network to be down
|
||||||
await expect(page.getByText('Network Health (Offline)')).toBeVisible()
|
await expect(networkToggle).toContainText('Offline')
|
||||||
|
|
||||||
// Ensure we are not in sketch mode
|
// Ensure we are not in sketch mode
|
||||||
await expect(
|
await expect(
|
||||||
@ -6936,7 +7215,8 @@ test.describe('Test network and connection issues', () => {
|
|||||||
).not.toBeDisabled({ timeout: 15000 })
|
).not.toBeDisabled({ timeout: 15000 })
|
||||||
|
|
||||||
// Expect the network to be up
|
// Expect the network to be up
|
||||||
await expect(page.getByText('Network Health (Connected)')).toBeVisible()
|
await expect(networkToggle).toContainText('Connected')
|
||||||
|
await expect(page.getByTestId('loading-stream')).not.toBeAttached()
|
||||||
|
|
||||||
// Click off the code pane.
|
// Click off the code pane.
|
||||||
await page.mouse.click(100, 100)
|
await page.mouse.click(100, 100)
|
||||||
@ -6952,7 +7232,7 @@ test.describe('Test network and connection issues', () => {
|
|||||||
await page.waitForTimeout(150)
|
await page.waitForTimeout(150)
|
||||||
|
|
||||||
// Click the line tool
|
// Click the line tool
|
||||||
await page.getByRole('button', { name: 'Line' }).click()
|
await page.getByRole('button', { name: 'Line', exact: true }).click()
|
||||||
|
|
||||||
await page.waitForTimeout(150)
|
await page.waitForTimeout(150)
|
||||||
|
|
||||||
@ -6979,7 +7259,7 @@ test.describe('Test network and connection issues', () => {
|
|||||||
page.getByRole('button', { name: 'Exit Sketch' })
|
page.getByRole('button', { name: 'Exit Sketch' })
|
||||||
).toBeVisible()
|
).toBeVisible()
|
||||||
await expect(
|
await expect(
|
||||||
page.getByRole('button', { name: 'Line' })
|
page.getByRole('button', { name: 'Line', exact: true })
|
||||||
).not.toHaveAttribute('aria-pressed', 'true')
|
).not.toHaveAttribute('aria-pressed', 'true')
|
||||||
|
|
||||||
// Exit sketch
|
// Exit sketch
|
||||||
@ -7384,7 +7664,7 @@ test('Keyboard shortcuts can be viewed through the help menu', async ({
|
|||||||
.waitFor({ state: 'visible' })
|
.waitFor({ state: 'visible' })
|
||||||
|
|
||||||
// Open the help menu
|
// Open the help menu
|
||||||
await page.getByRole('button', { name: 'Help', exact: false }).click()
|
await page.getByRole('button', { name: 'Help and resources' }).click()
|
||||||
|
|
||||||
// Open the keyboard shortcuts
|
// Open the keyboard shortcuts
|
||||||
await page.getByRole('button', { name: 'Keyboard Shortcuts' }).click()
|
await page.getByRole('button', { name: 'Keyboard Shortcuts' }).click()
|
||||||
@ -7408,8 +7688,11 @@ test('First escape in tool pops you out of tool, second exits sketch mode', asyn
|
|||||||
await u.expectCmdLog('[data-message-type="execution-done"]')
|
await u.expectCmdLog('[data-message-type="execution-done"]')
|
||||||
await u.closeDebugPanel()
|
await u.closeDebugPanel()
|
||||||
|
|
||||||
const lineButton = page.getByRole('button', { name: 'Line' })
|
const lineButton = page.getByRole('button', { name: 'Line', exact: true })
|
||||||
const arcButton = page.getByRole('button', { name: 'Tangential Arc' })
|
const arcButton = page.getByRole('button', {
|
||||||
|
name: 'Tangential Arc',
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
|
||||||
// Test these hotkeys perform actions when
|
// Test these hotkeys perform actions when
|
||||||
// focus is on the canvas
|
// focus is on the canvas
|
||||||
@ -7421,6 +7704,7 @@ test('First escape in tool pops you out of tool, second exits sketch mode', asyn
|
|||||||
await page.mouse.move(800, 300)
|
await page.mouse.move(800, 300)
|
||||||
await page.mouse.click(800, 300)
|
await page.mouse.click(800, 300)
|
||||||
await page.waitForTimeout(1000)
|
await page.waitForTimeout(1000)
|
||||||
|
await expect(lineButton).toBeVisible()
|
||||||
await expect(lineButton).toHaveAttribute('aria-pressed', 'true')
|
await expect(lineButton).toHaveAttribute('aria-pressed', 'true')
|
||||||
|
|
||||||
// Draw a line
|
// Draw a line
|
||||||
@ -7490,9 +7774,12 @@ test('Basic default modeling and sketch hotkeys work', async ({ page }) => {
|
|||||||
await u.closeDebugPanel()
|
await u.closeDebugPanel()
|
||||||
|
|
||||||
const codePane = page.getByRole('textbox').locator('div')
|
const codePane = page.getByRole('textbox').locator('div')
|
||||||
const codePaneButton = page.getByRole('tab', { name: 'KCL Code' })
|
const codePaneButton = page.getByTestId('code-pane-button')
|
||||||
const lineButton = page.getByRole('button', { name: 'Line' })
|
const lineButton = page.getByRole('button', { name: 'Line', exact: true })
|
||||||
const arcButton = page.getByRole('button', { name: 'Tangential Arc' })
|
const arcButton = page.getByRole('button', {
|
||||||
|
name: 'Tangential Arc',
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
const extrudeButton = page.getByRole('button', { name: 'Extrude' })
|
const extrudeButton = page.getByRole('button', { name: 'Extrude' })
|
||||||
|
|
||||||
// Test that the hotkeys do nothing when
|
// Test that the hotkeys do nothing when
|
||||||
@ -7506,17 +7793,25 @@ test('Basic default modeling and sketch hotkeys work', async ({ page }) => {
|
|||||||
await page.keyboard.press('e')
|
await page.keyboard.press('e')
|
||||||
await expect(page.locator('.cm-content')).toHaveText('//slae')
|
await expect(page.locator('.cm-content')).toHaveText('//slae')
|
||||||
await page.keyboard.press('Meta+/')
|
await page.keyboard.press('Meta+/')
|
||||||
await page.waitForTimeout(2000)
|
await page.waitForTimeout(1000)
|
||||||
// Test these hotkeys perform actions when
|
// Test these hotkeys perform actions when
|
||||||
// focus is on the canvas
|
// focus is on the canvas
|
||||||
await page.mouse.move(600, 250)
|
await page.mouse.move(600, 250)
|
||||||
await page.mouse.click(600, 250)
|
await page.mouse.click(600, 250)
|
||||||
|
|
||||||
|
// work-around: to stop "keyboard.press('s')" from typing in the editor even when it should be blurred
|
||||||
|
await page.getByRole('button', { name: 'Commands' }).click()
|
||||||
|
await page.waitForTimeout(100)
|
||||||
|
await page.keyboard.press('Escape')
|
||||||
|
await page.waitForTimeout(100)
|
||||||
|
// end work-around
|
||||||
|
|
||||||
// Start a sketch
|
// Start a sketch
|
||||||
await page.keyboard.press('s')
|
await page.keyboard.press('s')
|
||||||
await page.waitForTimeout(2000)
|
await page.waitForTimeout(1000)
|
||||||
await page.mouse.move(800, 300, { steps: 5 })
|
await page.mouse.move(800, 300, { steps: 5 })
|
||||||
await page.mouse.click(800, 300)
|
await page.mouse.click(800, 300)
|
||||||
await page.waitForTimeout(2000)
|
await page.waitForTimeout(1000)
|
||||||
await expect(lineButton).toHaveAttribute('aria-pressed', 'true', {
|
await expect(lineButton).toHaveAttribute('aria-pressed', 'true', {
|
||||||
timeout: 15_000,
|
timeout: 15_000,
|
||||||
})
|
})
|
||||||
@ -7584,6 +7879,31 @@ test('Basic default modeling and sketch hotkeys work', async ({ page }) => {
|
|||||||
await expect(page.locator('.cm-content')).toContainText('extrude(')
|
await expect(page.locator('.cm-content')).toContainText('extrude(')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('Delete key does not navigate back', async ({ page }) => {
|
||||||
|
await page.setViewportSize({ width: 1200, height: 500 })
|
||||||
|
await page.goto('/')
|
||||||
|
await page.waitForURL('**/file/**', { waitUntil: 'domcontentloaded' })
|
||||||
|
|
||||||
|
const settingsButton = page.getByRole('link', {
|
||||||
|
name: 'Settings',
|
||||||
|
exact: false,
|
||||||
|
})
|
||||||
|
const settingsCloseButton = page.getByTestId('settings-close-button')
|
||||||
|
|
||||||
|
await settingsButton.click()
|
||||||
|
await expect(page.url()).toContain('/settings')
|
||||||
|
|
||||||
|
// Make sure that delete doesn't go back from settings
|
||||||
|
await page.keyboard.press('Delete')
|
||||||
|
await expect(page.url()).toContain('/settings')
|
||||||
|
|
||||||
|
// Now close the settings and try delete again,
|
||||||
|
// make sure it doesn't go back to settings
|
||||||
|
await settingsCloseButton.click()
|
||||||
|
await page.keyboard.press('Delete')
|
||||||
|
await expect(page.url()).not.toContain('/settings')
|
||||||
|
})
|
||||||
|
|
||||||
test('Sketch on face', async ({ page }) => {
|
test('Sketch on face', async ({ page }) => {
|
||||||
test.setTimeout(90_000)
|
test.setTimeout(90_000)
|
||||||
const u = await getUtils(page)
|
const u = await getUtils(page)
|
||||||
|
@ -431,7 +431,9 @@ test('Draft segments should look right', async ({ page, context }) => {
|
|||||||
|> line([7.25, 0], %)`
|
|> line([7.25, 0], %)`
|
||||||
await expect(page.locator('.cm-content')).toHaveText(code)
|
await expect(page.locator('.cm-content')).toHaveText(code)
|
||||||
|
|
||||||
await page.getByRole('button', { name: 'Tangential Arc' }).click()
|
await page
|
||||||
|
.getByRole('button', { name: 'Tangential Arc', exact: true })
|
||||||
|
.click()
|
||||||
|
|
||||||
await page.mouse.move(startXPx + PUR * 30, 500 - PUR * 20, { steps: 10 })
|
await page.mouse.move(startXPx + PUR * 30, 500 - PUR * 20, { steps: 10 })
|
||||||
|
|
||||||
@ -475,8 +477,10 @@ test('Draft rectangles should look right', async ({ page, context }) => {
|
|||||||
const startXPx = 600
|
const startXPx = 600
|
||||||
|
|
||||||
// Equip the rectangle tool
|
// Equip the rectangle tool
|
||||||
await page.getByRole('button', { name: 'Line' }).click()
|
await page.getByRole('button', { name: 'Line', exact: true }).click()
|
||||||
await page.getByRole('button', { name: 'Rectangle' }).click()
|
await page
|
||||||
|
.getByRole('button', { name: 'Corner rectangle', exact: true })
|
||||||
|
.click()
|
||||||
|
|
||||||
// Draw the rectangle
|
// Draw the rectangle
|
||||||
await page.mouse.click(startXPx + PUR * 20, 500 - PUR * 30)
|
await page.mouse.click(startXPx + PUR * 20, 500 - PUR * 30)
|
||||||
@ -535,7 +539,9 @@ test.describe('Client side scene scale should match engine scale', () => {
|
|||||||
|> line([7.25, 0], %)`
|
|> line([7.25, 0], %)`
|
||||||
await expect(u.codeLocator).toHaveText(code)
|
await expect(u.codeLocator).toHaveText(code)
|
||||||
|
|
||||||
await page.getByRole('button', { name: 'Tangential Arc' }).click()
|
await page
|
||||||
|
.getByRole('button', { name: 'Tangential Arc', exact: true })
|
||||||
|
.click()
|
||||||
await page.waitForTimeout(100)
|
await page.waitForTimeout(100)
|
||||||
|
|
||||||
await page.mouse.click(startXPx + PUR * 30, 500 - PUR * 20)
|
await page.mouse.click(startXPx + PUR * 30, 500 - PUR * 20)
|
||||||
@ -545,7 +551,9 @@ test.describe('Client side scene scale should match engine scale', () => {
|
|||||||
await expect(u.codeLocator).toHaveText(code)
|
await expect(u.codeLocator).toHaveText(code)
|
||||||
|
|
||||||
// click tangential arc tool again to unequip it
|
// click tangential arc tool again to unequip it
|
||||||
await page.getByRole('button', { name: 'Tangential Arc' }).click()
|
await page
|
||||||
|
.getByRole('button', { name: 'Tangential Arc', exact: true })
|
||||||
|
.click()
|
||||||
await page.waitForTimeout(100)
|
await page.waitForTimeout(100)
|
||||||
|
|
||||||
// screen shot should show the sketch
|
// screen shot should show the sketch
|
||||||
@ -634,7 +642,9 @@ test.describe('Client side scene scale should match engine scale', () => {
|
|||||||
|> line([184.3, 0], %)`
|
|> line([184.3, 0], %)`
|
||||||
await expect(u.codeLocator).toHaveText(code)
|
await expect(u.codeLocator).toHaveText(code)
|
||||||
|
|
||||||
await page.getByRole('button', { name: 'Tangential Arc' }).click()
|
await page
|
||||||
|
.getByRole('button', { name: 'Tangential Arc', exact: true })
|
||||||
|
.click()
|
||||||
await page.waitForTimeout(100)
|
await page.waitForTimeout(100)
|
||||||
|
|
||||||
await page.mouse.click(startXPx + PUR * 30, 500 - PUR * 20)
|
await page.mouse.click(startXPx + PUR * 30, 500 - PUR * 20)
|
||||||
@ -643,7 +653,9 @@ test.describe('Client side scene scale should match engine scale', () => {
|
|||||||
|> tangentialArcTo([551.2, -62.01], %)`
|
|> tangentialArcTo([551.2, -62.01], %)`
|
||||||
await expect(u.codeLocator).toHaveText(code)
|
await expect(u.codeLocator).toHaveText(code)
|
||||||
|
|
||||||
await page.getByRole('button', { name: 'Tangential Arc' }).click()
|
await page
|
||||||
|
.getByRole('button', { name: 'Tangential Arc', exact: true })
|
||||||
|
.click()
|
||||||
await page.waitForTimeout(100)
|
await page.waitForTimeout(100)
|
||||||
|
|
||||||
// screen shot should show the sketch
|
// screen shot should show the sketch
|
||||||
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 54 KiB |
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 72 KiB |
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 45 KiB |
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 63 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 37 KiB |