Compare commits
1 Commits
v0.41.0
...
jtran/offs
Author | SHA1 | Date | |
---|---|---|---|
4391a286ce |
@ -29,13 +29,6 @@
|
|||||||
{
|
{
|
||||||
"name": "isNaN",
|
"name": "isNaN",
|
||||||
"message": "Use Number.isNaN() instead."
|
"message": "Use Number.isNaN() instead."
|
||||||
},
|
|
||||||
],
|
|
||||||
"no-restricted-syntax": [
|
|
||||||
"error",
|
|
||||||
{
|
|
||||||
"selector": "CallExpression[callee.object.name='Array'][callee.property.name='isArray']",
|
|
||||||
"message": "Use isArray() in lib/utils.ts instead of Array.isArray()."
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"semi": [
|
"semi": [
|
||||||
|
64
.github/workflows/e2e-tests.yml
vendored
64
.github/workflows/e2e-tests.yml
vendored
@ -46,15 +46,7 @@ jobs:
|
|||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
needs: check-rust-changes
|
needs: check-rust-changes
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/create-github-app-token@v1
|
|
||||||
id: app-token
|
|
||||||
with:
|
|
||||||
app-id: ${{ secrets.MODELING_APP_GH_APP_ID }}
|
|
||||||
private-key: ${{ secrets.MODELING_APP_GH_APP_PRIVATE_KEY }}
|
|
||||||
owner: ${{ github.repository_owner }}
|
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with:
|
|
||||||
token: ${{ steps.app-token.outputs.token }}
|
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version-file: '.nvmrc'
|
node-version-file: '.nvmrc'
|
||||||
@ -134,20 +126,20 @@ jobs:
|
|||||||
- name: build web
|
- name: build web
|
||||||
shell: bash
|
shell: bash
|
||||||
run: yarn tronb:vite:dev
|
run: yarn tronb:vite:dev
|
||||||
- name: Run ubuntu/chrome snapshots
|
# - name: Run ubuntu/chrome snapshots
|
||||||
if: ${{ matrix.os == 'namespace-profile-ubuntu-8-cores' && matrix.shardIndex == 1 }}
|
# if: ${{ matrix.os == 'namespace-profile-ubuntu-8-cores' && matrix.shardIndex == 1 }}
|
||||||
shell: bash
|
# shell: bash
|
||||||
# TODO: break this in its own job, for now it's not slowing down the overall execution as ubuntu is the quickest,
|
# # TODO: break this in its own job, for now it's not slowing down the overall execution as ubuntu is the quickest,
|
||||||
# but we could do better. This forces a large 1/1 shard of all 20 snapshot tests that runs in about 3 minutes.
|
# # but we could do better. This forces a large 1/1 shard of all 20 snapshot tests that runs in about 3 minutes.
|
||||||
run: |
|
# run: |
|
||||||
PLATFORM=web yarn playwright test --config=playwright.config.ts --retries="3" --update-snapshots --grep=@snapshot --shard=1/1
|
# PLATFORM=web yarn playwright test --config=playwright.config.ts --retries="3" --update-snapshots --grep=@snapshot --shard=1/1
|
||||||
env:
|
# env:
|
||||||
CI: true
|
# CI: true
|
||||||
NODE_ENV: development
|
# NODE_ENV: development
|
||||||
VITE_KC_DEV_TOKEN: ${{ secrets.KITTYCAD_API_TOKEN_DEV }}
|
# VITE_KC_DEV_TOKEN: ${{ secrets.KITTYCAD_API_TOKEN_DEV }}
|
||||||
VITE_KC_SKIP_AUTH: true
|
# VITE_KC_SKIP_AUTH: true
|
||||||
token: ${{ secrets.KITTYCAD_API_TOKEN_DEV }}
|
# token: ${{ secrets.KITTYCAD_API_TOKEN_DEV }}
|
||||||
snapshottoken: ${{ secrets.KITTYCAD_API_TOKEN }}
|
# snapshottoken: ${{ secrets.KITTYCAD_API_TOKEN }}
|
||||||
- uses: actions/upload-artifact@v4
|
- uses: actions/upload-artifact@v4
|
||||||
if: ${{ !cancelled() && (success() || failure()) }}
|
if: ${{ !cancelled() && (success() || failure()) }}
|
||||||
with:
|
with:
|
||||||
@ -170,20 +162,20 @@ jobs:
|
|||||||
then echo "modified=true" >> $GITHUB_OUTPUT
|
then echo "modified=true" >> $GITHUB_OUTPUT
|
||||||
else echo "modified=false" >> $GITHUB_OUTPUT
|
else echo "modified=false" >> $GITHUB_OUTPUT
|
||||||
fi
|
fi
|
||||||
- name: Commit changes, if any
|
# - name: Commit changes, if any
|
||||||
if: steps.git-check.outputs.modified == 'true'
|
# if: steps.git-check.outputs.modified == 'true'
|
||||||
shell: bash
|
# shell: bash
|
||||||
run: |
|
# run: |
|
||||||
git add .
|
# git add .
|
||||||
git config --local user.email "github-actions[bot]@users.noreply.github.com"
|
# git config --local user.email "github-actions[bot]@users.noreply.github.com"
|
||||||
git config --local user.name "github-actions[bot]"
|
# git config --local user.name "github-actions[bot]"
|
||||||
git remote set-url origin https://${{ github.actor }}:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git
|
# git remote set-url origin https://${{ github.actor }}:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git
|
||||||
git fetch origin
|
# git fetch origin
|
||||||
echo ${{ github.head_ref }}
|
# echo ${{ github.head_ref }}
|
||||||
git checkout ${{ github.head_ref }}
|
# git checkout ${{ github.head_ref }}
|
||||||
git commit -am "A snapshot a day keeps the bugs away! 📷🐛 (OS: ${{matrix.os}})" || true
|
# git commit -am "A snapshot a day keeps the bugs away! 📷🐛 (OS: ${{matrix.os}})" || true
|
||||||
git push
|
# git push
|
||||||
git push origin ${{ github.head_ref }}
|
# git push origin ${{ github.head_ref }}
|
||||||
# only upload artifacts if there's actually changes
|
# only upload artifacts if there's actually changes
|
||||||
- uses: actions/upload-artifact@v4
|
- uses: actions/upload-artifact@v4
|
||||||
if: steps.git-check.outputs.modified == 'true'
|
if: steps.git-check.outputs.modified == 'true'
|
||||||
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -25,7 +25,6 @@ yarn-error.log*
|
|||||||
|
|
||||||
.idea
|
.idea
|
||||||
.vscode
|
.vscode
|
||||||
.helix
|
|
||||||
src/wasm-lib/.idea
|
src/wasm-lib/.idea
|
||||||
src/wasm-lib/.vscode
|
src/wasm-lib/.vscode
|
||||||
|
|
||||||
|
@ -1,2 +0,0 @@
|
|||||||
[editor]
|
|
||||||
auto-format = true
|
|
@ -1,10 +0,0 @@
|
|||||||
[language-server.eslint]
|
|
||||||
args = ["--stdio"]
|
|
||||||
command = "vscode-eslint-language-server"
|
|
||||||
|
|
||||||
[[language]]
|
|
||||||
name = "typescript"
|
|
||||||
auto-format = true
|
|
||||||
formatter = { command = "node_modules/.bin/prettier", args = ["--parser", "typescript"] }
|
|
||||||
language-servers = [ { name = "eslint", only-features = [ "diagnostics" ] }, "typescript-language-server" ]
|
|
||||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -31,12 +31,12 @@ appearance(data: AppearanceData, solid_set: SolidSet) -> SolidSet
|
|||||||
// Add color to an extruded solid.
|
// Add color to an extruded solid.
|
||||||
exampleSketch = startSketchOn("XZ")
|
exampleSketch = startSketchOn("XZ")
|
||||||
|> startProfileAt([0, 0], %)
|
|> startProfileAt([0, 0], %)
|
||||||
|> line(endAbsolute = [10, 0])
|
|> lineTo([10, 0], %)
|
||||||
|> line(endAbsolute = [0, 10])
|
|> lineTo([0, 10], %)
|
||||||
|> line(endAbsolute = [-10, 0])
|
|> lineTo([-10, 0], %)
|
||||||
|> close()
|
|> close(%)
|
||||||
|
|
||||||
example = extrude(exampleSketch, length = 5)
|
example = extrude(5, exampleSketch)
|
||||||
|> appearance({
|
|> appearance({
|
||||||
color = '#ff0000',
|
color = '#ff0000',
|
||||||
metalness = 50,
|
metalness = 50,
|
||||||
@ -65,11 +65,11 @@ sketch001 = startSketchOn('XY')
|
|||||||
fn cube(center) {
|
fn cube(center) {
|
||||||
return startSketchOn('XY')
|
return startSketchOn('XY')
|
||||||
|> startProfileAt([center[0] - 10, center[1] - 10], %)
|
|> startProfileAt([center[0] - 10, center[1] - 10], %)
|
||||||
|> line(endAbsolute = [center[0] + 10, center[1] - 10])
|
|> lineTo([center[0] + 10, center[1] - 10], %)
|
||||||
|> line(endAbsolute = [center[0] + 10, center[1] + 10])
|
|> lineTo([center[0] + 10, center[1] + 10], %)
|
||||||
|> line(endAbsolute = [center[0] - 10, center[1] + 10])
|
|> lineTo([center[0] - 10, center[1] + 10], %)
|
||||||
|> close()
|
|> close(%)
|
||||||
|> extrude(length = 10)
|
|> extrude(10, %)
|
||||||
}
|
}
|
||||||
|
|
||||||
example0 = cube([0, 0])
|
example0 = cube([0, 0])
|
||||||
@ -95,11 +95,11 @@ appearance({
|
|||||||
// This example shows setting the appearance _after_ the shell.
|
// This example shows setting the appearance _after_ the shell.
|
||||||
firstSketch = startSketchOn('XY')
|
firstSketch = startSketchOn('XY')
|
||||||
|> startProfileAt([-12, 12], %)
|
|> startProfileAt([-12, 12], %)
|
||||||
|> line(end = [24, 0])
|
|> line([24, 0], %)
|
||||||
|> line(end = [0, -24])
|
|> line([0, -24], %)
|
||||||
|> line(end = [-24, 0])
|
|> line([-24, 0], %)
|
||||||
|> close()
|
|> close(%)
|
||||||
|> extrude(length = 6)
|
|> extrude(6, %)
|
||||||
|
|
||||||
shell({ faces = ['end'], thickness = 0.25 }, firstSketch)
|
shell({ faces = ['end'], thickness = 0.25 }, firstSketch)
|
||||||
|> appearance({
|
|> appearance({
|
||||||
@ -116,11 +116,11 @@ shell({ faces = ['end'], thickness = 0.25 }, firstSketch)
|
|||||||
// This example shows setting the appearance _before_ the shell.
|
// This example shows setting the appearance _before_ the shell.
|
||||||
firstSketch = startSketchOn('XY')
|
firstSketch = startSketchOn('XY')
|
||||||
|> startProfileAt([-12, 12], %)
|
|> startProfileAt([-12, 12], %)
|
||||||
|> line(end = [24, 0])
|
|> line([24, 0], %)
|
||||||
|> line(end = [0, -24])
|
|> line([0, -24], %)
|
||||||
|> line(end = [-24, 0])
|
|> line([-24, 0], %)
|
||||||
|> close()
|
|> close(%)
|
||||||
|> extrude(length = 6)
|
|> extrude(6, %)
|
||||||
|> appearance({
|
|> appearance({
|
||||||
color = '#ff0000',
|
color = '#ff0000',
|
||||||
metalness = 90,
|
metalness = 90,
|
||||||
@ -137,12 +137,12 @@ shell({ faces = ['end'], thickness = 0.25 }, firstSketch)
|
|||||||
// This example shows _before_ the pattern.
|
// This example shows _before_ the pattern.
|
||||||
exampleSketch = startSketchOn('XZ')
|
exampleSketch = startSketchOn('XZ')
|
||||||
|> startProfileAt([0, 0], %)
|
|> startProfileAt([0, 0], %)
|
||||||
|> line(end = [0, 2])
|
|> line([0, 2], %)
|
||||||
|> line(end = [3, 1])
|
|> line([3, 1], %)
|
||||||
|> line(end = [0, -4])
|
|> line([0, -4], %)
|
||||||
|> close()
|
|> close(%)
|
||||||
|
|
||||||
example = extrude(exampleSketch, length = 1)
|
example = extrude(1, exampleSketch)
|
||||||
|> appearance({
|
|> appearance({
|
||||||
color = '#ff0000',
|
color = '#ff0000',
|
||||||
metalness = 90,
|
metalness = 90,
|
||||||
@ -162,12 +162,12 @@ example = extrude(exampleSketch, length = 1)
|
|||||||
// This example shows _after_ the pattern.
|
// This example shows _after_ the pattern.
|
||||||
exampleSketch = startSketchOn('XZ')
|
exampleSketch = startSketchOn('XZ')
|
||||||
|> startProfileAt([0, 0], %)
|
|> startProfileAt([0, 0], %)
|
||||||
|> line(end = [0, 2])
|
|> line([0, 2], %)
|
||||||
|> line(end = [3, 1])
|
|> line([3, 1], %)
|
||||||
|> line(end = [0, -4])
|
|> line([0, -4], %)
|
||||||
|> close()
|
|> close(%)
|
||||||
|
|
||||||
example = extrude(exampleSketch, length = 1)
|
example = extrude(1, exampleSketch)
|
||||||
|> patternLinear3d({
|
|> patternLinear3d({
|
||||||
axis = [1, 0, 1],
|
axis = [1, 0, 1],
|
||||||
instances = 7,
|
instances = 7,
|
||||||
@ -186,10 +186,10 @@ example = extrude(exampleSketch, length = 1)
|
|||||||
// Color the result of a 2D pattern that was extruded.
|
// Color the result of a 2D pattern that was extruded.
|
||||||
exampleSketch = startSketchOn('XZ')
|
exampleSketch = startSketchOn('XZ')
|
||||||
|> startProfileAt([.5, 25], %)
|
|> startProfileAt([.5, 25], %)
|
||||||
|> line(end = [0, 5])
|
|> line([0, 5], %)
|
||||||
|> line(end = [-1, 0])
|
|> line([-1, 0], %)
|
||||||
|> line(end = [0, -5])
|
|> line([0, -5], %)
|
||||||
|> close()
|
|> close(%)
|
||||||
|> patternCircular2d({
|
|> patternCircular2d({
|
||||||
center = [0, 0],
|
center = [0, 0],
|
||||||
instances = 13,
|
instances = 13,
|
||||||
@ -197,7 +197,7 @@ exampleSketch = startSketchOn('XZ')
|
|||||||
rotateDuplicates = true
|
rotateDuplicates = true
|
||||||
}, %)
|
}, %)
|
||||||
|
|
||||||
example = extrude(exampleSketch, length = 1)
|
example = extrude(1, exampleSketch)
|
||||||
|> appearance({
|
|> appearance({
|
||||||
color = '#ff0000',
|
color = '#ff0000',
|
||||||
metalness = 90,
|
metalness = 90,
|
||||||
@ -214,11 +214,11 @@ example = extrude(exampleSketch, length = 1)
|
|||||||
// Create a path for the sweep.
|
// Create a path for the sweep.
|
||||||
sweepPath = startSketchOn('XZ')
|
sweepPath = startSketchOn('XZ')
|
||||||
|> startProfileAt([0.05, 0.05], %)
|
|> startProfileAt([0.05, 0.05], %)
|
||||||
|> line(end = [0, 7])
|
|> line([0, 7], %)
|
||||||
|> tangentialArc({ offset = 90, radius = 5 }, %)
|
|> tangentialArc({ offset = 90, radius = 5 }, %)
|
||||||
|> line(end = [-3, 0])
|
|> line([-3, 0], %)
|
||||||
|> tangentialArc({ offset = -90, radius = 5 }, %)
|
|> tangentialArc({ offset = -90, radius = 5 }, %)
|
||||||
|> line(end = [0, 7])
|
|> line([0, 7], %)
|
||||||
|
|
||||||
pipeHole = startSketchOn('XY')
|
pipeHole = startSketchOn('XY')
|
||||||
|> circle({ center = [0, 0], radius = 1.5 }, %)
|
|> circle({ center = [0, 0], radius = 1.5 }, %)
|
||||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -36,12 +36,12 @@ filletRadius = 2
|
|||||||
|
|
||||||
mountingPlateSketch = startSketchOn("XY")
|
mountingPlateSketch = startSketchOn("XY")
|
||||||
|> startProfileAt([-width / 2, -length / 2], %)
|
|> startProfileAt([-width / 2, -length / 2], %)
|
||||||
|> line(endAbsolute = [width / 2, -length / 2], tag = $edge1)
|
|> lineTo([width / 2, -length / 2], %, $edge1)
|
||||||
|> line(endAbsolute = [width / 2, length / 2], tag = $edge2)
|
|> lineTo([width / 2, length / 2], %, $edge2)
|
||||||
|> line(endAbsolute = [-width / 2, length / 2], tag = $edge3)
|
|> lineTo([-width / 2, length / 2], %, $edge3)
|
||||||
|> close(tag = $edge4)
|
|> close(%, $edge4)
|
||||||
|
|
||||||
mountingPlate = extrude(mountingPlateSketch, length = thickness)
|
mountingPlate = extrude(thickness, mountingPlateSketch)
|
||||||
|> fillet({
|
|> fillet({
|
||||||
radius = filletRadius,
|
radius = filletRadius,
|
||||||
tags = [
|
tags = [
|
||||||
@ -63,12 +63,12 @@ filletRadius = 1
|
|||||||
|
|
||||||
mountingPlateSketch = startSketchOn("XY")
|
mountingPlateSketch = startSketchOn("XY")
|
||||||
|> startProfileAt([-width / 2, -length / 2], %)
|
|> startProfileAt([-width / 2, -length / 2], %)
|
||||||
|> line(endAbsolute = [width / 2, -length / 2], tag = $edge1)
|
|> lineTo([width / 2, -length / 2], %, $edge1)
|
||||||
|> line(endAbsolute = [width / 2, length / 2], tag = $edge2)
|
|> lineTo([width / 2, length / 2], %, $edge2)
|
||||||
|> line(endAbsolute = [-width / 2, length / 2], tag = $edge3)
|
|> lineTo([-width / 2, length / 2], %, $edge3)
|
||||||
|> close(tag = $edge4)
|
|> close(%, $edge4)
|
||||||
|
|
||||||
mountingPlate = extrude(mountingPlateSketch, length = thickness)
|
mountingPlate = extrude(thickness, mountingPlateSketch)
|
||||||
|> fillet({
|
|> fillet({
|
||||||
radius = filletRadius,
|
radius = filletRadius,
|
||||||
tolerance = 0.000001,
|
tolerance = 0.000001,
|
||||||
|
File diff suppressed because one or more lines are too long
@ -29,14 +29,14 @@ getNextAdjacentEdge(tag: TagIdentifier) -> Uuid
|
|||||||
```js
|
```js
|
||||||
exampleSketch = startSketchOn('XZ')
|
exampleSketch = startSketchOn('XZ')
|
||||||
|> startProfileAt([0, 0], %)
|
|> startProfileAt([0, 0], %)
|
||||||
|> line(end = [10, 0])
|
|> line([10, 0], %)
|
||||||
|> angledLine({ angle = 60, length = 10 }, %)
|
|> angledLine({ angle = 60, length = 10 }, %)
|
||||||
|> angledLine({ angle = 120, length = 10 }, %)
|
|> angledLine({ angle = 120, length = 10 }, %)
|
||||||
|> line(end = [-10, 0])
|
|> line([-10, 0], %)
|
||||||
|> angledLine({ angle = 240, length = 10 }, %, $referenceEdge)
|
|> angledLine({ angle = 240, length = 10 }, %, $referenceEdge)
|
||||||
|> close()
|
|> close(%)
|
||||||
|
|
||||||
example = extrude(exampleSketch, length = 5)
|
example = extrude(5, exampleSketch)
|
||||||
|> fillet({
|
|> fillet({
|
||||||
radius = 3,
|
radius = 3,
|
||||||
tags = [getNextAdjacentEdge(referenceEdge)]
|
tags = [getNextAdjacentEdge(referenceEdge)]
|
||||||
|
@ -29,14 +29,14 @@ getOppositeEdge(tag: TagIdentifier) -> Uuid
|
|||||||
```js
|
```js
|
||||||
exampleSketch = startSketchOn('XZ')
|
exampleSketch = startSketchOn('XZ')
|
||||||
|> startProfileAt([0, 0], %)
|
|> startProfileAt([0, 0], %)
|
||||||
|> line(end = [10, 0])
|
|> line([10, 0], %)
|
||||||
|> angledLine({ angle = 60, length = 10 }, %)
|
|> angledLine({ angle = 60, length = 10 }, %)
|
||||||
|> angledLine({ angle = 120, length = 10 }, %)
|
|> angledLine({ angle = 120, length = 10 }, %)
|
||||||
|> line(end = [-10, 0])
|
|> line([-10, 0], %)
|
||||||
|> angledLine({ angle = 240, length = 10 }, %, $referenceEdge)
|
|> angledLine({ angle = 240, length = 10 }, %, $referenceEdge)
|
||||||
|> close()
|
|> close(%)
|
||||||
|
|
||||||
example = extrude(exampleSketch, length = 5)
|
example = extrude(5, exampleSketch)
|
||||||
|> fillet({
|
|> fillet({
|
||||||
radius = 3,
|
radius = 3,
|
||||||
tags = [getOppositeEdge(referenceEdge)]
|
tags = [getOppositeEdge(referenceEdge)]
|
||||||
|
@ -29,14 +29,14 @@ getPreviousAdjacentEdge(tag: TagIdentifier) -> Uuid
|
|||||||
```js
|
```js
|
||||||
exampleSketch = startSketchOn('XZ')
|
exampleSketch = startSketchOn('XZ')
|
||||||
|> startProfileAt([0, 0], %)
|
|> startProfileAt([0, 0], %)
|
||||||
|> line(end = [10, 0])
|
|> line([10, 0], %)
|
||||||
|> angledLine({ angle = 60, length = 10 }, %)
|
|> angledLine({ angle = 60, length = 10 }, %)
|
||||||
|> angledLine({ angle = 120, length = 10 }, %)
|
|> angledLine({ angle = 120, length = 10 }, %)
|
||||||
|> line(end = [-10, 0])
|
|> line([-10, 0], %)
|
||||||
|> angledLine({ angle = 240, length = 10 }, %, $referenceEdge)
|
|> angledLine({ angle = 240, length = 10 }, %, $referenceEdge)
|
||||||
|> close()
|
|> close(%)
|
||||||
|
|
||||||
example = extrude(exampleSketch, length = 5)
|
example = extrude(5, exampleSketch)
|
||||||
|> fillet({
|
|> fillet({
|
||||||
radius = 3,
|
radius = 3,
|
||||||
tags = [getPreviousAdjacentEdge(referenceEdge)]
|
tags = [getPreviousAdjacentEdge(referenceEdge)]
|
||||||
|
@ -49,7 +49,7 @@ springSketch = startSketchOn('YZ')
|
|||||||
// Create a helix around an edge.
|
// Create a helix around an edge.
|
||||||
helper001 = startSketchOn('XZ')
|
helper001 = startSketchOn('XZ')
|
||||||
|> startProfileAt([0, 0], %)
|
|> startProfileAt([0, 0], %)
|
||||||
|> line(end = [0, 10], tag = $edge001)
|
|> line([0, 10], %, $edge001)
|
||||||
|
|
||||||
helixPath = helix({
|
helixPath = helix({
|
||||||
angleStart = 0,
|
angleStart = 0,
|
||||||
|
@ -30,7 +30,7 @@ helixRevolutions(data: HelixRevolutionsData, solid: Solid) -> Solid
|
|||||||
```js
|
```js
|
||||||
part001 = startSketchOn('XY')
|
part001 = startSketchOn('XY')
|
||||||
|> circle({ center = [5, 5], radius = 10 }, %)
|
|> circle({ center = [5, 5], radius = 10 }, %)
|
||||||
|> extrude(length = 10)
|
|> extrude(10, %)
|
||||||
|> helixRevolutions({
|
|> helixRevolutions({
|
||||||
angleStart = 0,
|
angleStart = 0,
|
||||||
ccw = true,
|
ccw = true,
|
||||||
|
File diff suppressed because one or more lines are too long
@ -31,11 +31,11 @@ hollow(thickness: number, solid: Solid) -> Solid
|
|||||||
// Hollow a basic sketch.
|
// Hollow a basic sketch.
|
||||||
firstSketch = startSketchOn('XY')
|
firstSketch = startSketchOn('XY')
|
||||||
|> startProfileAt([-12, 12], %)
|
|> startProfileAt([-12, 12], %)
|
||||||
|> line(end = [24, 0])
|
|> line([24, 0], %)
|
||||||
|> line(end = [0, -24])
|
|> line([0, -24], %)
|
||||||
|> line(end = [-24, 0])
|
|> line([-24, 0], %)
|
||||||
|> close()
|
|> close(%)
|
||||||
|> extrude(length = 6)
|
|> extrude(6, %)
|
||||||
|> hollow(0.25, %)
|
|> hollow(0.25, %)
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -45,11 +45,11 @@ firstSketch = startSketchOn('XY')
|
|||||||
// Hollow a basic sketch.
|
// Hollow a basic sketch.
|
||||||
firstSketch = startSketchOn('-XZ')
|
firstSketch = startSketchOn('-XZ')
|
||||||
|> startProfileAt([-12, 12], %)
|
|> startProfileAt([-12, 12], %)
|
||||||
|> line(end = [24, 0])
|
|> line([24, 0], %)
|
||||||
|> line(end = [0, -24])
|
|> line([0, -24], %)
|
||||||
|> line(end = [-24, 0])
|
|> line([-24, 0], %)
|
||||||
|> close()
|
|> close(%)
|
||||||
|> extrude(length = 6)
|
|> extrude(6, %)
|
||||||
|> hollow(0.5, %)
|
|> hollow(0.5, %)
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -60,25 +60,25 @@ firstSketch = startSketchOn('-XZ')
|
|||||||
size = 100
|
size = 100
|
||||||
case = startSketchOn('-XZ')
|
case = startSketchOn('-XZ')
|
||||||
|> startProfileAt([-size, -size], %)
|
|> startProfileAt([-size, -size], %)
|
||||||
|> line(end = [2 * size, 0])
|
|> line([2 * size, 0], %)
|
||||||
|> line(end = [0, 2 * size])
|
|> line([0, 2 * size], %)
|
||||||
|> tangentialArcTo([-size, size], %)
|
|> tangentialArcTo([-size, size], %)
|
||||||
|> close()
|
|> close(%)
|
||||||
|> extrude(length = 65)
|
|> extrude(65, %)
|
||||||
|
|
||||||
thing1 = startSketchOn(case, 'end')
|
thing1 = startSketchOn(case, 'end')
|
||||||
|> circle({
|
|> circle({
|
||||||
center = [-size / 2, -size / 2],
|
center = [-size / 2, -size / 2],
|
||||||
radius = 25
|
radius = 25
|
||||||
}, %)
|
}, %)
|
||||||
|> extrude(length = 50)
|
|> extrude(50, %)
|
||||||
|
|
||||||
thing2 = startSketchOn(case, 'end')
|
thing2 = startSketchOn(case, 'end')
|
||||||
|> circle({
|
|> circle({
|
||||||
center = [size / 2, -size / 2],
|
center = [size / 2, -size / 2],
|
||||||
radius = 25
|
radius = 25
|
||||||
}, %)
|
}, %)
|
||||||
|> extrude(length = 50)
|
|> extrude(50, %)
|
||||||
|
|
||||||
hollow(0.5, case)
|
hollow(0.5, case)
|
||||||
```
|
```
|
||||||
|
@ -58,6 +58,7 @@ layout: manual
|
|||||||
* [`legAngY`](kcl/legAngY)
|
* [`legAngY`](kcl/legAngY)
|
||||||
* [`legLen`](kcl/legLen)
|
* [`legLen`](kcl/legLen)
|
||||||
* [`line`](kcl/line)
|
* [`line`](kcl/line)
|
||||||
|
* [`lineTo`](kcl/lineTo)
|
||||||
* [`ln`](kcl/ln)
|
* [`ln`](kcl/ln)
|
||||||
* [`loft`](kcl/loft)
|
* [`loft`](kcl/loft)
|
||||||
* [`log`](kcl/log)
|
* [`log`](kcl/log)
|
||||||
|
@ -38,7 +38,7 @@ assertEqual(n, 3, 0.0001, "5/2 = 2.5, rounded up makes 3")
|
|||||||
// Draw n cylinders.
|
// Draw n cylinders.
|
||||||
startSketchOn('XZ')
|
startSketchOn('XZ')
|
||||||
|> circle({ center = [0, 0], radius = 2 }, %)
|
|> circle({ center = [0, 0], radius = 2 }, %)
|
||||||
|> extrude(length = 5)
|
|> extrude(5, %)
|
||||||
|> patternTransform(n, fn(id) {
|
|> patternTransform(n, fn(id) {
|
||||||
return { translate = [4 * id, 0, 0] }
|
return { translate = [4 * id, 0, 0] }
|
||||||
}, %)
|
}, %)
|
||||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -34,18 +34,18 @@ loft(sketches: [Sketch], v_degree: NonZeroU32, bez_approximate_rational: bool, b
|
|||||||
// Loft a square and a triangle.
|
// Loft a square and a triangle.
|
||||||
squareSketch = startSketchOn('XY')
|
squareSketch = startSketchOn('XY')
|
||||||
|> startProfileAt([-100, 200], %)
|
|> startProfileAt([-100, 200], %)
|
||||||
|> line(end = [200, 0])
|
|> line([200, 0], %)
|
||||||
|> line(end = [0, -200])
|
|> line([0, -200], %)
|
||||||
|> line(end = [-200, 0])
|
|> line([-200, 0], %)
|
||||||
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
||||||
|> close()
|
|> close(%)
|
||||||
|
|
||||||
triangleSketch = startSketchOn(offsetPlane('XY', 75))
|
triangleSketch = startSketchOn(offsetPlane('XY', 75))
|
||||||
|> startProfileAt([0, 125], %)
|
|> startProfileAt([0, 125], %)
|
||||||
|> line(end = [-15, -30])
|
|> line([-15, -30], %)
|
||||||
|> line(end = [30, 0])
|
|> line([30, 0], %)
|
||||||
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
||||||
|> close()
|
|> close(%)
|
||||||
|
|
||||||
loft([squareSketch, triangleSketch])
|
loft([squareSketch, triangleSketch])
|
||||||
```
|
```
|
||||||
@ -56,11 +56,11 @@ loft([squareSketch, triangleSketch])
|
|||||||
// Loft a square, a circle, and another circle.
|
// Loft a square, a circle, and another circle.
|
||||||
squareSketch = startSketchOn('XY')
|
squareSketch = startSketchOn('XY')
|
||||||
|> startProfileAt([-100, 200], %)
|
|> startProfileAt([-100, 200], %)
|
||||||
|> line(end = [200, 0])
|
|> line([200, 0], %)
|
||||||
|> line(end = [0, -200])
|
|> line([0, -200], %)
|
||||||
|> line(end = [-200, 0])
|
|> line([-200, 0], %)
|
||||||
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
||||||
|> close()
|
|> close(%)
|
||||||
|
|
||||||
circleSketch0 = startSketchOn(offsetPlane('XY', 75))
|
circleSketch0 = startSketchOn(offsetPlane('XY', 75))
|
||||||
|> circle({ center = [0, 100], radius = 50 }, %)
|
|> circle({ center = [0, 100], radius = 50 }, %)
|
||||||
@ -81,11 +81,11 @@ loft([
|
|||||||
// Loft a square, a circle, and another circle with options.
|
// Loft a square, a circle, and another circle with options.
|
||||||
squareSketch = startSketchOn('XY')
|
squareSketch = startSketchOn('XY')
|
||||||
|> startProfileAt([-100, 200], %)
|
|> startProfileAt([-100, 200], %)
|
||||||
|> line(end = [200, 0])
|
|> line([200, 0], %)
|
||||||
|> line(end = [0, -200])
|
|> line([0, -200], %)
|
||||||
|> line(end = [-200, 0])
|
|> line([-200, 0], %)
|
||||||
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
||||||
|> close()
|
|> close(%)
|
||||||
|
|
||||||
circleSketch0 = startSketchOn(offsetPlane('XY', 75))
|
circleSketch0 = startSketchOn(offsetPlane('XY', 75))
|
||||||
|> circle({ center = [0, 100], radius = 50 }, %)
|
|> circle({ center = [0, 100], radius = 50 }, %)
|
||||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -31,7 +31,7 @@ patternCircular3d(data: CircularPattern3dData, solid_set: SolidSet) -> [Solid]
|
|||||||
exampleSketch = startSketchOn('XZ')
|
exampleSketch = startSketchOn('XZ')
|
||||||
|> circle({ center = [0, 0], radius = 1 }, %)
|
|> circle({ center = [0, 0], radius = 1 }, %)
|
||||||
|
|
||||||
example = extrude(exampleSketch, length = -5)
|
example = extrude(-5, exampleSketch)
|
||||||
|> patternCircular3d({
|
|> patternCircular3d({
|
||||||
axis = [1, -1, 0],
|
axis = [1, -1, 0],
|
||||||
center = [10, -20, 0],
|
center = [10, -20, 0],
|
||||||
|
File diff suppressed because one or more lines are too long
@ -30,12 +30,12 @@ patternLinear3d(data: LinearPattern3dData, solid_set: SolidSet) -> [Solid]
|
|||||||
```js
|
```js
|
||||||
exampleSketch = startSketchOn('XZ')
|
exampleSketch = startSketchOn('XZ')
|
||||||
|> startProfileAt([0, 0], %)
|
|> startProfileAt([0, 0], %)
|
||||||
|> line(end = [0, 2])
|
|> line([0, 2], %)
|
||||||
|> line(end = [3, 1])
|
|> line([3, 1], %)
|
||||||
|> line(end = [0, -4])
|
|> line([0, -4], %)
|
||||||
|> close()
|
|> close(%)
|
||||||
|
|
||||||
example = extrude(exampleSketch, length = 1)
|
example = extrude(1, exampleSketch)
|
||||||
|> patternLinear3d({
|
|> patternLinear3d({
|
||||||
axis = [1, 0, 1],
|
axis = [1, 0, 1],
|
||||||
instances = 7,
|
instances = 7,
|
||||||
|
@ -63,7 +63,7 @@ fn transform(id) {
|
|||||||
// Sketch 4 cylinders.
|
// Sketch 4 cylinders.
|
||||||
sketch001 = startSketchOn('XZ')
|
sketch001 = startSketchOn('XZ')
|
||||||
|> circle({ center = [0, 0], radius = 2 }, %)
|
|> circle({ center = [0, 0], radius = 2 }, %)
|
||||||
|> extrude(length = 5)
|
|> extrude(5, %)
|
||||||
|> patternTransform(4, transform, %)
|
|> patternTransform(4, transform, %)
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -79,7 +79,7 @@ fn transform(id) {
|
|||||||
|
|
||||||
sketch001 = startSketchOn('XZ')
|
sketch001 = startSketchOn('XZ')
|
||||||
|> circle({ center = [0, 0], radius = 2 }, %)
|
|> circle({ center = [0, 0], radius = 2 }, %)
|
||||||
|> extrude(length = 5)
|
|> extrude(5, %)
|
||||||
|> patternTransform(4, transform, %)
|
|> patternTransform(4, transform, %)
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -97,12 +97,12 @@ fn cube(length, center) {
|
|||||||
|
|
||||||
return startSketchOn('XY')
|
return startSketchOn('XY')
|
||||||
|> startProfileAt(p0, %)
|
|> startProfileAt(p0, %)
|
||||||
|> line(endAbsolute = p1)
|
|> lineTo(p1, %)
|
||||||
|> line(endAbsolute = p2)
|
|> lineTo(p2, %)
|
||||||
|> line(endAbsolute = p3)
|
|> lineTo(p3, %)
|
||||||
|> line(endAbsolute = p0)
|
|> lineTo(p0, %)
|
||||||
|> close()
|
|> close(%)
|
||||||
|> extrude(length = length)
|
|> extrude(length, %)
|
||||||
}
|
}
|
||||||
|
|
||||||
width = 20
|
width = 20
|
||||||
@ -135,12 +135,12 @@ fn cube(length, center) {
|
|||||||
|
|
||||||
return startSketchOn('XY')
|
return startSketchOn('XY')
|
||||||
|> startProfileAt(p0, %)
|
|> startProfileAt(p0, %)
|
||||||
|> line(endAbsolute = p1)
|
|> lineTo(p1, %)
|
||||||
|> line(endAbsolute = p2)
|
|> lineTo(p2, %)
|
||||||
|> line(endAbsolute = p3)
|
|> lineTo(p3, %)
|
||||||
|> line(endAbsolute = p0)
|
|> lineTo(p0, %)
|
||||||
|> close()
|
|> close(%)
|
||||||
|> extrude(length = length)
|
|> extrude(length, %)
|
||||||
}
|
}
|
||||||
|
|
||||||
width = 20
|
width = 20
|
||||||
@ -179,7 +179,7 @@ fn layer() {
|
|||||||
return startSketchOn("XY")
|
return startSketchOn("XY")
|
||||||
// or some other plane idk
|
// or some other plane idk
|
||||||
|> circle({ center = [0, 0], radius = 1 }, %, $tag1)
|
|> circle({ center = [0, 0], radius = 1 }, %, $tag1)
|
||||||
|> extrude(length = h)
|
|> extrude(h, %)
|
||||||
}
|
}
|
||||||
// The vase is 100 layers tall.
|
// The vase is 100 layers tall.
|
||||||
// The 100 layers are replica of each other, with a slight transformation applied to each.
|
// The 100 layers are replica of each other, with a slight transformation applied to each.
|
||||||
@ -205,7 +205,7 @@ startSketchOn('XY')
|
|||||||
center = [0, 0],
|
center = [0, 0],
|
||||||
inscribed = false
|
inscribed = false
|
||||||
}, %)
|
}, %)
|
||||||
|> extrude(length = 4)
|
|> extrude(4, %)
|
||||||
|> patternTransform(3, transform, %)
|
|> patternTransform(3, transform, %)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -30,12 +30,12 @@ segEnd(tag: TagIdentifier) -> [number]
|
|||||||
w = 15
|
w = 15
|
||||||
cube = startSketchOn('XY')
|
cube = startSketchOn('XY')
|
||||||
|> startProfileAt([0, 0], %)
|
|> startProfileAt([0, 0], %)
|
||||||
|> line(end = [w, 0], tag = $line1)
|
|> line([w, 0], %, $line1)
|
||||||
|> line(end = [0, w], tag = $line2)
|
|> line([0, w], %, $line2)
|
||||||
|> line(end = [-w, 0], tag = $line3)
|
|> line([-w, 0], %, $line3)
|
||||||
|> line(end = [0, -w], tag = $line4)
|
|> line([0, -w], %, $line4)
|
||||||
|> close()
|
|> close(%)
|
||||||
|> extrude(length = 5)
|
|> extrude(5, %)
|
||||||
|
|
||||||
fn cylinder(radius, tag) {
|
fn cylinder(radius, tag) {
|
||||||
return startSketchOn('XY')
|
return startSketchOn('XY')
|
||||||
@ -44,7 +44,7 @@ fn cylinder(radius, tag) {
|
|||||||
radius = radius,
|
radius = radius,
|
||||||
center = segEnd(tag)
|
center = segEnd(tag)
|
||||||
}, %)
|
}, %)
|
||||||
|> extrude(length = radius)
|
|> extrude(radius, %)
|
||||||
}
|
}
|
||||||
|
|
||||||
cylinder(1, line1)
|
cylinder(1, line1)
|
||||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -30,12 +30,12 @@ segStart(tag: TagIdentifier) -> [number]
|
|||||||
w = 15
|
w = 15
|
||||||
cube = startSketchOn('XY')
|
cube = startSketchOn('XY')
|
||||||
|> startProfileAt([0, 0], %)
|
|> startProfileAt([0, 0], %)
|
||||||
|> line(end = [w, 0], tag = $line1)
|
|> line([w, 0], %, $line1)
|
||||||
|> line(end = [0, w], tag = $line2)
|
|> line([0, w], %, $line2)
|
||||||
|> line(end = [-w, 0], tag = $line3)
|
|> line([-w, 0], %, $line3)
|
||||||
|> line(end = [0, -w], tag = $line4)
|
|> line([0, -w], %, $line4)
|
||||||
|> close()
|
|> close(%)
|
||||||
|> extrude(length = 5)
|
|> extrude(5, %)
|
||||||
|
|
||||||
fn cylinder(radius, tag) {
|
fn cylinder(radius, tag) {
|
||||||
return startSketchOn('XY')
|
return startSketchOn('XY')
|
||||||
@ -44,7 +44,7 @@ fn cylinder(radius, tag) {
|
|||||||
radius = radius,
|
radius = radius,
|
||||||
center = segStart(tag)
|
center = segStart(tag)
|
||||||
}, %)
|
}, %)
|
||||||
|> extrude(length = radius)
|
|> extrude(radius, %)
|
||||||
}
|
}
|
||||||
|
|
||||||
cylinder(1, line1)
|
cylinder(1, line1)
|
||||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -31,11 +31,11 @@ shell(data: ShellData, solid_set: SolidSet) -> SolidSet
|
|||||||
// Remove the end face for the extrusion.
|
// Remove the end face for the extrusion.
|
||||||
firstSketch = startSketchOn('XY')
|
firstSketch = startSketchOn('XY')
|
||||||
|> startProfileAt([-12, 12], %)
|
|> startProfileAt([-12, 12], %)
|
||||||
|> line(end = [24, 0])
|
|> line([24, 0], %)
|
||||||
|> line(end = [0, -24])
|
|> line([0, -24], %)
|
||||||
|> line(end = [-24, 0])
|
|> line([-24, 0], %)
|
||||||
|> close()
|
|> close(%)
|
||||||
|> extrude(length = 6)
|
|> extrude(6, %)
|
||||||
|
|
||||||
// Remove the end face for the extrusion.
|
// Remove the end face for the extrusion.
|
||||||
shell({ faces = ['end'], thickness = 0.25 }, firstSketch)
|
shell({ faces = ['end'], thickness = 0.25 }, firstSketch)
|
||||||
@ -47,11 +47,11 @@ shell({ faces = ['end'], thickness = 0.25 }, firstSketch)
|
|||||||
// Remove the start face for the extrusion.
|
// Remove the start face for the extrusion.
|
||||||
firstSketch = startSketchOn('-XZ')
|
firstSketch = startSketchOn('-XZ')
|
||||||
|> startProfileAt([-12, 12], %)
|
|> startProfileAt([-12, 12], %)
|
||||||
|> line(end = [24, 0])
|
|> line([24, 0], %)
|
||||||
|> line(end = [0, -24])
|
|> line([0, -24], %)
|
||||||
|> line(end = [-24, 0])
|
|> line([-24, 0], %)
|
||||||
|> close()
|
|> close(%)
|
||||||
|> extrude(length = 6)
|
|> extrude(6, %)
|
||||||
|
|
||||||
// Remove the start face for the extrusion.
|
// Remove the start face for the extrusion.
|
||||||
shell({ faces = ['start'], thickness = 0.25 }, firstSketch)
|
shell({ faces = ['start'], thickness = 0.25 }, firstSketch)
|
||||||
@ -63,11 +63,11 @@ shell({ faces = ['start'], thickness = 0.25 }, firstSketch)
|
|||||||
// Remove a tagged face and the end face for the extrusion.
|
// Remove a tagged face and the end face for the extrusion.
|
||||||
firstSketch = startSketchOn('XY')
|
firstSketch = startSketchOn('XY')
|
||||||
|> startProfileAt([-12, 12], %)
|
|> startProfileAt([-12, 12], %)
|
||||||
|> line(end = [24, 0])
|
|> line([24, 0], %)
|
||||||
|> line(end = [0, -24])
|
|> line([0, -24], %)
|
||||||
|> line(end = [-24, 0], tag = $myTag)
|
|> line([-24, 0], %, $myTag)
|
||||||
|> close()
|
|> close(%)
|
||||||
|> extrude(length = 6)
|
|> extrude(6, %)
|
||||||
|
|
||||||
// Remove a tagged face for the extrusion.
|
// Remove a tagged face for the extrusion.
|
||||||
shell({ faces = [myTag], thickness = 0.25 }, firstSketch)
|
shell({ faces = [myTag], thickness = 0.25 }, firstSketch)
|
||||||
@ -79,11 +79,11 @@ shell({ faces = [myTag], thickness = 0.25 }, firstSketch)
|
|||||||
// Remove multiple faces at once.
|
// Remove multiple faces at once.
|
||||||
firstSketch = startSketchOn('XY')
|
firstSketch = startSketchOn('XY')
|
||||||
|> startProfileAt([-12, 12], %)
|
|> startProfileAt([-12, 12], %)
|
||||||
|> line(end = [24, 0])
|
|> line([24, 0], %)
|
||||||
|> line(end = [0, -24])
|
|> line([0, -24], %)
|
||||||
|> line(end = [-24, 0], tag = $myTag)
|
|> line([-24, 0], %, $myTag)
|
||||||
|> close()
|
|> close(%)
|
||||||
|> extrude(length = 6)
|
|> extrude(6, %)
|
||||||
|
|
||||||
// Remove a tagged face and the end face for the extrusion.
|
// Remove a tagged face and the end face for the extrusion.
|
||||||
shell({
|
shell({
|
||||||
@ -99,25 +99,25 @@ shell({
|
|||||||
size = 100
|
size = 100
|
||||||
case = startSketchOn('-XZ')
|
case = startSketchOn('-XZ')
|
||||||
|> startProfileAt([-size, -size], %)
|
|> startProfileAt([-size, -size], %)
|
||||||
|> line(end = [2 * size, 0])
|
|> line([2 * size, 0], %)
|
||||||
|> line(end = [0, 2 * size])
|
|> line([0, 2 * size], %)
|
||||||
|> tangentialArcTo([-size, size], %)
|
|> tangentialArcTo([-size, size], %)
|
||||||
|> close()
|
|> close(%)
|
||||||
|> extrude(length = 65)
|
|> extrude(65, %)
|
||||||
|
|
||||||
thing1 = startSketchOn(case, 'end')
|
thing1 = startSketchOn(case, 'end')
|
||||||
|> circle({
|
|> circle({
|
||||||
center = [-size / 2, -size / 2],
|
center = [-size / 2, -size / 2],
|
||||||
radius = 25
|
radius = 25
|
||||||
}, %)
|
}, %)
|
||||||
|> extrude(length = 50)
|
|> extrude(50, %)
|
||||||
|
|
||||||
thing2 = startSketchOn(case, 'end')
|
thing2 = startSketchOn(case, 'end')
|
||||||
|> circle({
|
|> circle({
|
||||||
center = [size / 2, -size / 2],
|
center = [size / 2, -size / 2],
|
||||||
radius = 25
|
radius = 25
|
||||||
}, %)
|
}, %)
|
||||||
|> extrude(length = 50)
|
|> extrude(50, %)
|
||||||
|
|
||||||
// We put "case" in the shell function to shell the entire object.
|
// We put "case" in the shell function to shell the entire object.
|
||||||
shell({ faces = ['start'], thickness = 5 }, case)
|
shell({ faces = ['start'], thickness = 5 }, case)
|
||||||
@ -130,25 +130,25 @@ shell({ faces = ['start'], thickness = 5 }, case)
|
|||||||
size = 100
|
size = 100
|
||||||
case = startSketchOn('XY')
|
case = startSketchOn('XY')
|
||||||
|> startProfileAt([-size, -size], %)
|
|> startProfileAt([-size, -size], %)
|
||||||
|> line(end = [2 * size, 0])
|
|> line([2 * size, 0], %)
|
||||||
|> line(end = [0, 2 * size])
|
|> line([0, 2 * size], %)
|
||||||
|> tangentialArcTo([-size, size], %)
|
|> tangentialArcTo([-size, size], %)
|
||||||
|> close()
|
|> close(%)
|
||||||
|> extrude(length = 65)
|
|> extrude(65, %)
|
||||||
|
|
||||||
thing1 = startSketchOn(case, 'end')
|
thing1 = startSketchOn(case, 'end')
|
||||||
|> circle({
|
|> circle({
|
||||||
center = [-size / 2, -size / 2],
|
center = [-size / 2, -size / 2],
|
||||||
radius = 25
|
radius = 25
|
||||||
}, %)
|
}, %)
|
||||||
|> extrude(length = 50)
|
|> extrude(50, %)
|
||||||
|
|
||||||
thing2 = startSketchOn(case, 'end')
|
thing2 = startSketchOn(case, 'end')
|
||||||
|> circle({
|
|> circle({
|
||||||
center = [size / 2, -size / 2],
|
center = [size / 2, -size / 2],
|
||||||
radius = 25
|
radius = 25
|
||||||
}, %)
|
}, %)
|
||||||
|> extrude(length = 50)
|
|> extrude(50, %)
|
||||||
|
|
||||||
// We put "thing1" in the shell function to shell the end face of the object.
|
// We put "thing1" in the shell function to shell the end face of the object.
|
||||||
shell({ faces = ['end'], thickness = 5 }, thing1)
|
shell({ faces = ['end'], thickness = 5 }, thing1)
|
||||||
@ -164,25 +164,25 @@ shell({ faces = ['end'], thickness = 5 }, thing1)
|
|||||||
size = 100
|
size = 100
|
||||||
case = startSketchOn('XY')
|
case = startSketchOn('XY')
|
||||||
|> startProfileAt([-size, -size], %)
|
|> startProfileAt([-size, -size], %)
|
||||||
|> line(end = [2 * size, 0])
|
|> line([2 * size, 0], %)
|
||||||
|> line(end = [0, 2 * size])
|
|> line([0, 2 * size], %)
|
||||||
|> tangentialArcTo([-size, size], %)
|
|> tangentialArcTo([-size, size], %)
|
||||||
|> close()
|
|> close(%)
|
||||||
|> extrude(length = 65)
|
|> extrude(65, %)
|
||||||
|
|
||||||
thing1 = startSketchOn(case, 'end')
|
thing1 = startSketchOn(case, 'end')
|
||||||
|> circle({
|
|> circle({
|
||||||
center = [-size / 2, -size / 2],
|
center = [-size / 2, -size / 2],
|
||||||
radius = 25
|
radius = 25
|
||||||
}, %)
|
}, %)
|
||||||
|> extrude(length = 50)
|
|> extrude(50, %)
|
||||||
|
|
||||||
thing2 = startSketchOn(case, 'end')
|
thing2 = startSketchOn(case, 'end')
|
||||||
|> circle({
|
|> circle({
|
||||||
center = [size / 2, -size / 2],
|
center = [size / 2, -size / 2],
|
||||||
radius = 25
|
radius = 25
|
||||||
}, %)
|
}, %)
|
||||||
|> extrude(length = 50)
|
|> extrude(50, %)
|
||||||
|
|
||||||
// We put "thing1" and "thing2" in the shell function to shell the end face of the object.
|
// We put "thing1" and "thing2" in the shell function to shell the end face of the object.
|
||||||
shell({ faces = ['end'], thickness = 5 }, [thing1, thing2])
|
shell({ faces = ['end'], thickness = 5 }, [thing1, thing2])
|
||||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
9320
docs/kcl/std.json
9320
docs/kcl/std.json
File diff suppressed because it is too large
Load Diff
@ -34,11 +34,11 @@ sweep(data: SweepData, sketch: Sketch) -> Solid
|
|||||||
// Create a path for the sweep.
|
// Create a path for the sweep.
|
||||||
sweepPath = startSketchOn('XZ')
|
sweepPath = startSketchOn('XZ')
|
||||||
|> startProfileAt([0.05, 0.05], %)
|
|> startProfileAt([0.05, 0.05], %)
|
||||||
|> line(end = [0, 7])
|
|> line([0, 7], %)
|
||||||
|> tangentialArc({ offset = 90, radius = 5 }, %)
|
|> tangentialArc({ offset = 90, radius = 5 }, %)
|
||||||
|> line(end = [-3, 0])
|
|> line([-3, 0], %)
|
||||||
|> tangentialArc({ offset = -90, radius = 5 }, %)
|
|> tangentialArc({ offset = -90, radius = 5 }, %)
|
||||||
|> line(end = [0, 7])
|
|> line([0, 7], %)
|
||||||
|
|
||||||
// Create a hole for the pipe.
|
// Create a hole for the pipe.
|
||||||
pipeHole = startSketchOn('XY')
|
pipeHole = startSketchOn('XY')
|
||||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -144,7 +144,7 @@ async function doBasicSketch(
|
|||||||
|> xLine(-segLen(seg01), %)`)
|
|> xLine(-segLen(seg01), %)`)
|
||||||
}
|
}
|
||||||
|
|
||||||
test.describe('Basic sketch', { tag: ['@skipWin'] }, () => {
|
test.describe('Basic sketch', () => {
|
||||||
test.fixme('code pane open at start', async ({ page, homePage }) => {
|
test.fixme('code pane open at start', async ({ page, homePage }) => {
|
||||||
await doBasicSketch(page, homePage, ['code'])
|
await doBasicSketch(page, homePage, ['code'])
|
||||||
})
|
})
|
||||||
|
@ -4,125 +4,112 @@ import { getUtils } from './test-utils'
|
|||||||
import { EngineCommand } from 'lang/std/artifactGraph'
|
import { EngineCommand } from 'lang/std/artifactGraph'
|
||||||
import { uuidv4 } from 'lib/utils'
|
import { uuidv4 } from 'lib/utils'
|
||||||
|
|
||||||
test.describe(
|
test.describe('Can create sketches on all planes and their back sides', () => {
|
||||||
'Can create sketches on all planes and their back sides',
|
const sketchOnPlaneAndBackSideTest = async (
|
||||||
{ tag: ['@skipWin'] },
|
page: Page,
|
||||||
() => {
|
homePage: HomePageFixture,
|
||||||
const sketchOnPlaneAndBackSideTest = async (
|
plane: string,
|
||||||
page: Page,
|
clickCoords: { x: number; y: number }
|
||||||
homePage: HomePageFixture,
|
) => {
|
||||||
plane: string,
|
const u = await getUtils(page)
|
||||||
clickCoords: { x: number; y: number }
|
const PUR = 400 / 37.5 //pixeltoUnitRatio
|
||||||
) => {
|
await page.setBodyDimensions({ width: 1200, height: 500 })
|
||||||
const u = await getUtils(page)
|
|
||||||
const PUR = 400 / 37.5 //pixeltoUnitRatio
|
|
||||||
await page.setBodyDimensions({ width: 1200, height: 500 })
|
|
||||||
|
|
||||||
await homePage.goToModelingScene()
|
await homePage.goToModelingScene()
|
||||||
await u.openDebugPanel()
|
await u.openDebugPanel()
|
||||||
|
|
||||||
const coord =
|
const coord =
|
||||||
plane === '-XY' || plane === '-YZ' || plane === 'XZ' ? -100 : 100
|
plane === '-XY' || plane === '-YZ' || plane === 'XZ' ? -100 : 100
|
||||||
const camCommand: EngineCommand = {
|
const camCommand: EngineCommand = {
|
||||||
type: 'modeling_cmd_req',
|
type: 'modeling_cmd_req',
|
||||||
cmd_id: uuidv4(),
|
cmd_id: uuidv4(),
|
||||||
cmd: {
|
cmd: {
|
||||||
type: 'default_camera_look_at',
|
type: 'default_camera_look_at',
|
||||||
center: { x: 0, y: 0, z: 0 },
|
center: { x: 0, y: 0, z: 0 },
|
||||||
vantage: { x: coord, y: coord, z: coord },
|
vantage: { x: coord, y: coord, z: coord },
|
||||||
up: { x: 0, y: 0, z: 1 },
|
up: { x: 0, y: 0, z: 1 },
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
const updateCamCommand: EngineCommand = {
|
const updateCamCommand: EngineCommand = {
|
||||||
type: 'modeling_cmd_req',
|
type: 'modeling_cmd_req',
|
||||||
cmd_id: uuidv4(),
|
cmd_id: uuidv4(),
|
||||||
cmd: {
|
cmd: {
|
||||||
type: 'default_camera_get_settings',
|
type: 'default_camera_get_settings',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
const code = `sketch001 = startSketchOn('${plane}')
|
const code = `sketch001 = startSketchOn('${plane}')
|
||||||
|> startProfileAt([0.9, -1.22], %)`
|
|> startProfileAt([0.9, -1.22], %)`
|
||||||
|
|
||||||
await u.openDebugPanel()
|
await u.openDebugPanel()
|
||||||
|
|
||||||
await u.clearCommandLogs()
|
await u.clearCommandLogs()
|
||||||
await page.getByRole('button', { name: 'Start Sketch' }).click()
|
await page.getByRole('button', { name: 'Start Sketch' }).click()
|
||||||
|
|
||||||
await u.sendCustomCmd(camCommand)
|
await u.sendCustomCmd(camCommand)
|
||||||
await page.waitForTimeout(100)
|
await page.waitForTimeout(100)
|
||||||
await u.sendCustomCmd(updateCamCommand)
|
await u.sendCustomCmd(updateCamCommand)
|
||||||
|
|
||||||
await u.closeDebugPanel()
|
await u.closeDebugPanel()
|
||||||
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(
|
await expect(
|
||||||
page.getByRole('button', { name: 'line Line', exact: true })
|
page.getByRole('button', { name: 'line Line', exact: true })
|
||||||
).toBeVisible()
|
).toBeVisible()
|
||||||
|
|
||||||
// draw a line
|
// draw a line
|
||||||
const startXPx = 600
|
const startXPx = 600
|
||||||
|
|
||||||
await u.closeDebugPanel()
|
await u.closeDebugPanel()
|
||||||
await page.mouse.click(startXPx + PUR * 10, 500 - PUR * 10)
|
await page.mouse.click(startXPx + PUR * 10, 500 - PUR * 10)
|
||||||
|
|
||||||
await expect(page.locator('.cm-content')).toHaveText(code)
|
await expect(page.locator('.cm-content')).toHaveText(code)
|
||||||
|
|
||||||
await page
|
await page
|
||||||
.getByRole('button', { name: 'line Line', exact: true })
|
.getByRole('button', { name: 'line Line', exact: true })
|
||||||
.first()
|
.first()
|
||||||
.click()
|
.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"]')
|
||||||
|
|
||||||
await u.clearCommandLogs()
|
await u.clearCommandLogs()
|
||||||
await u.removeCurrentCode()
|
await u.removeCurrentCode()
|
||||||
}
|
|
||||||
test('XY', async ({ page, homePage }) => {
|
|
||||||
await sketchOnPlaneAndBackSideTest(
|
|
||||||
page,
|
|
||||||
homePage,
|
|
||||||
'XY',
|
|
||||||
{ x: 600, y: 388 } // red plane
|
|
||||||
// { x: 600, y: 400 }, // red plane // clicks grid helper and that causes problems, should fix so that these coords work too.
|
|
||||||
)
|
|
||||||
})
|
|
||||||
|
|
||||||
test('YZ', async ({ page, homePage }) => {
|
|
||||||
await sketchOnPlaneAndBackSideTest(page, homePage, 'YZ', {
|
|
||||||
x: 700,
|
|
||||||
y: 250,
|
|
||||||
}) // green plane
|
|
||||||
})
|
|
||||||
|
|
||||||
test('XZ', async ({ page, homePage }) => {
|
|
||||||
await sketchOnPlaneAndBackSideTest(page, homePage, '-XZ', {
|
|
||||||
x: 700,
|
|
||||||
y: 80,
|
|
||||||
}) // blue plane
|
|
||||||
})
|
|
||||||
|
|
||||||
test('-XY', async ({ page, homePage }) => {
|
|
||||||
await sketchOnPlaneAndBackSideTest(page, homePage, '-XY', {
|
|
||||||
x: 600,
|
|
||||||
y: 118,
|
|
||||||
}) // back of red plane
|
|
||||||
})
|
|
||||||
|
|
||||||
test('-YZ', async ({ page, homePage }) => {
|
|
||||||
await sketchOnPlaneAndBackSideTest(page, homePage, '-YZ', {
|
|
||||||
x: 700,
|
|
||||||
y: 219,
|
|
||||||
}) // back of green plan
|
|
||||||
})
|
|
||||||
|
|
||||||
test('-XZ', async ({ page, homePage }) => {
|
|
||||||
await sketchOnPlaneAndBackSideTest(page, homePage, 'XZ', {
|
|
||||||
x: 700,
|
|
||||||
y: 427,
|
|
||||||
}) // back of blue plane
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
)
|
test('XY', async ({ page, homePage }) => {
|
||||||
|
await sketchOnPlaneAndBackSideTest(
|
||||||
|
page,
|
||||||
|
homePage,
|
||||||
|
'XY',
|
||||||
|
{ x: 600, y: 388 } // red plane
|
||||||
|
// { x: 600, y: 400 }, // red plane // clicks grid helper and that causes problems, should fix so that these coords work too.
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('YZ', async ({ page, homePage }) => {
|
||||||
|
await sketchOnPlaneAndBackSideTest(page, homePage, 'YZ', { x: 700, y: 250 }) // green plane
|
||||||
|
})
|
||||||
|
|
||||||
|
test('XZ', async ({ page, homePage }) => {
|
||||||
|
await sketchOnPlaneAndBackSideTest(page, homePage, '-XZ', { x: 700, y: 80 }) // blue plane
|
||||||
|
})
|
||||||
|
|
||||||
|
test('-XY', async ({ page, homePage }) => {
|
||||||
|
await sketchOnPlaneAndBackSideTest(page, homePage, '-XY', {
|
||||||
|
x: 600,
|
||||||
|
y: 118,
|
||||||
|
}) // back of red plane
|
||||||
|
})
|
||||||
|
|
||||||
|
test('-YZ', async ({ page, homePage }) => {
|
||||||
|
await sketchOnPlaneAndBackSideTest(page, homePage, '-YZ', {
|
||||||
|
x: 700,
|
||||||
|
y: 219,
|
||||||
|
}) // back of green plan
|
||||||
|
})
|
||||||
|
|
||||||
|
test('-XZ', async ({ page, homePage }) => {
|
||||||
|
await sketchOnPlaneAndBackSideTest(page, homePage, 'XZ', { x: 700, y: 427 }) // back of blue plane
|
||||||
|
})
|
||||||
|
})
|
||||||
|
@ -6,7 +6,7 @@ import { bracket } from 'lib/exampleKcl'
|
|||||||
import { TEST_CODE_LONG_WITH_ERROR_OUT_OF_VIEW } from './storageStates'
|
import { TEST_CODE_LONG_WITH_ERROR_OUT_OF_VIEW } from './storageStates'
|
||||||
import fsp from 'fs/promises'
|
import fsp from 'fs/promises'
|
||||||
|
|
||||||
test.describe('Code pane and errors', { tag: ['@skipWin'] }, () => {
|
test.describe('Code pane and errors', () => {
|
||||||
test('Typing KCL errors induces a badge on the code pane button', async ({
|
test('Typing KCL errors induces a badge on the code pane button', async ({
|
||||||
page,
|
page,
|
||||||
homePage,
|
homePage,
|
||||||
@ -20,11 +20,11 @@ test.describe('Code pane and errors', { tag: ['@skipWin'] }, () => {
|
|||||||
`// Extruded Triangle
|
`// Extruded Triangle
|
||||||
sketch001 = startSketchOn('XZ')
|
sketch001 = startSketchOn('XZ')
|
||||||
|> startProfileAt([0, 0], %)
|
|> startProfileAt([0, 0], %)
|
||||||
|> line(end = [10, 0])
|
|> line([10, 0], %)
|
||||||
|> line(end = [-5, 10])
|
|> line([-5, 10], %)
|
||||||
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
||||||
|> close()
|
|> close(%)
|
||||||
extrude001 = extrude(sketch001, length = 5)`
|
extrude001 = extrude(5, sketch001)`
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -79,10 +79,8 @@ test.describe('Code pane and errors', { tag: ['@skipWin'] }, () => {
|
|||||||
|
|
||||||
// Delete a character to break the KCL
|
// Delete a character to break the KCL
|
||||||
await editor.openPane()
|
await editor.openPane()
|
||||||
await editor.scrollToText('bracketLeg1Sketch, length = thickness)')
|
await editor.scrollToText('thickness, bracketLeg1Sketch)')
|
||||||
await page
|
await page.getByText('extrude(thickness, bracketLeg1Sketch)').click()
|
||||||
.getByText('extrude(bracketLeg1Sketch, length = thickness)')
|
|
||||||
.click()
|
|
||||||
await page.keyboard.press('Backspace')
|
await page.keyboard.press('Backspace')
|
||||||
|
|
||||||
// Ensure that a badge appears on the button
|
// Ensure that a badge appears on the button
|
||||||
@ -109,7 +107,7 @@ test.describe('Code pane and errors', { tag: ['@skipWin'] }, () => {
|
|||||||
await editor.openPane()
|
await editor.openPane()
|
||||||
|
|
||||||
// Go to our problematic code again (missing closing paren!)
|
// Go to our problematic code again (missing closing paren!)
|
||||||
await editor.scrollToText('extrude(bracketLeg1Sketch, length = thickness')
|
await editor.scrollToText('extrude(thickness, bracketLeg1Sketch')
|
||||||
|
|
||||||
// Ensure that a badge appears on the button
|
// Ensure that a badge appears on the button
|
||||||
await expect(codePaneButtonHolder).toContainText('notification')
|
await expect(codePaneButtonHolder).toContainText('notification')
|
||||||
|
@ -4,7 +4,7 @@ import { executorInputPath, getUtils } from './test-utils'
|
|||||||
import { KCL_DEFAULT_LENGTH } from 'lib/constants'
|
import { KCL_DEFAULT_LENGTH } from 'lib/constants'
|
||||||
import path from 'path'
|
import path from 'path'
|
||||||
|
|
||||||
test.describe('Command bar tests', { tag: ['@skipWin'] }, () => {
|
test.describe('Command bar tests', () => {
|
||||||
test('Extrude from command bar selects extrude line after', async ({
|
test('Extrude from command bar selects extrude line after', async ({
|
||||||
page,
|
page,
|
||||||
homePage,
|
homePage,
|
||||||
@ -14,10 +14,10 @@ test.describe('Command bar tests', { tag: ['@skipWin'] }, () => {
|
|||||||
'persistCode',
|
'persistCode',
|
||||||
`sketch001 = startSketchOn('XY')
|
`sketch001 = startSketchOn('XY')
|
||||||
|> startProfileAt([-10, -10], %)
|
|> startProfileAt([-10, -10], %)
|
||||||
|> line(end = [20, 0])
|
|> line([20, 0], %)
|
||||||
|> line(end = [0, 20])
|
|> line([0, 20], %)
|
||||||
|> xLine(-20, %)
|
|> xLine(-20, %)
|
||||||
|> close()
|
|> close(%)
|
||||||
`
|
`
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
@ -32,7 +32,7 @@ test.describe('Command bar tests', { tag: ['@skipWin'] }, () => {
|
|||||||
await u.closeDebugPanel()
|
await u.closeDebugPanel()
|
||||||
|
|
||||||
// Click the line of code for xLine.
|
// Click the line of code for xLine.
|
||||||
await page.getByText(`close()`).click() // TODO remove this and reinstate // await topHorzSegmentClick()
|
await page.getByText(`close(%)`).click() // TODO remove this and reinstate // await topHorzSegmentClick()
|
||||||
await page.waitForTimeout(100)
|
await page.waitForTimeout(100)
|
||||||
|
|
||||||
await page.getByRole('button', { name: 'Extrude' }).click()
|
await page.getByRole('button', { name: 'Extrude' }).click()
|
||||||
@ -42,47 +42,7 @@ test.describe('Command bar tests', { tag: ['@skipWin'] }, () => {
|
|||||||
await page.keyboard.press('Enter')
|
await page.keyboard.press('Enter')
|
||||||
await page.waitForTimeout(200)
|
await page.waitForTimeout(200)
|
||||||
await expect(page.locator('.cm-activeLine')).toHaveText(
|
await expect(page.locator('.cm-activeLine')).toHaveText(
|
||||||
`extrude001 = extrude(sketch001, length = ${KCL_DEFAULT_LENGTH})`
|
`extrude001 = extrude(${KCL_DEFAULT_LENGTH}, sketch001)`
|
||||||
)
|
|
||||||
})
|
|
||||||
|
|
||||||
// TODO: fix this test after the electron migration
|
|
||||||
test.fixme('Fillet from command bar', async ({ page, homePage }) => {
|
|
||||||
await page.addInitScript(async () => {
|
|
||||||
localStorage.setItem(
|
|
||||||
'persistCode',
|
|
||||||
`sketch001 = startSketchOn('XY')
|
|
||||||
|> startProfileAt([-5, -5], %)
|
|
||||||
|> line(end = [0, 10])
|
|
||||||
|> line(end = [10, 0])
|
|
||||||
|> line(end = [0, -10])
|
|
||||||
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|
|
||||||
|> close()
|
|
||||||
extrude001 = extrude(sketch001, length = -10)`
|
|
||||||
)
|
|
||||||
})
|
|
||||||
|
|
||||||
const u = await getUtils(page)
|
|
||||||
await page.setBodyDimensions({ width: 1000, height: 500 })
|
|
||||||
await homePage.goToModelingScene()
|
|
||||||
await u.openDebugPanel()
|
|
||||||
await u.expectCmdLog('[data-message-type="execution-done"]')
|
|
||||||
await u.closeDebugPanel()
|
|
||||||
|
|
||||||
const selectSegment = () => page.getByText(`line(end = [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') // skip selection
|
|
||||||
await page.waitForTimeout(100)
|
|
||||||
await page.keyboard.press('Enter') // accept default radius
|
|
||||||
await page.waitForTimeout(100)
|
|
||||||
await page.keyboard.press('Enter') // submit
|
|
||||||
await page.waitForTimeout(100)
|
|
||||||
await expect(page.locator('.cm-activeLine')).toContainText(
|
|
||||||
`fillet({ radius = ${KCL_DEFAULT_LENGTH}, tags = [seg01] }, %)`
|
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -167,54 +127,54 @@ test.describe('Command bar tests', { tag: ['@skipWin'] }, () => {
|
|||||||
await expect(commandLevelArgButton).toHaveText('level: project')
|
await expect(commandLevelArgButton).toHaveText('level: project')
|
||||||
})
|
})
|
||||||
|
|
||||||
test(
|
test('Command bar keybinding works from code editor and can change a setting', async ({
|
||||||
'Command bar keybinding works from code editor and can change a setting',
|
page,
|
||||||
{ tag: ['@skipWin'] },
|
homePage,
|
||||||
async ({ page, homePage }) => {
|
}) => {
|
||||||
await page.setBodyDimensions({ width: 1200, height: 500 })
|
await page.setBodyDimensions({ width: 1200, height: 500 })
|
||||||
await homePage.goToModelingScene()
|
await homePage.goToModelingScene()
|
||||||
|
|
||||||
await expect(
|
await expect(
|
||||||
page.getByRole('button', { name: 'Start Sketch' })
|
page.getByRole('button', { name: 'Start Sketch' })
|
||||||
).not.toBeDisabled()
|
).not.toBeDisabled()
|
||||||
|
|
||||||
// Put the cursor in the code editor
|
// Put the cursor in the code editor
|
||||||
await page.locator('.cm-content').click()
|
await page.locator('.cm-content').click()
|
||||||
|
|
||||||
// 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('ControlOrMeta+K')
|
await page.keyboard.press('ControlOrMeta+K')
|
||||||
|
|
||||||
let cmdSearchBar = page.getByPlaceholder('Search commands')
|
let 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 cmdSearchBar.fill('theme')
|
await cmdSearchBar.fill('theme')
|
||||||
const themeOption = page.getByRole('option', {
|
const themeOption = page.getByRole('option', {
|
||||||
name: 'Settings · app · theme',
|
name: 'Settings · app · theme',
|
||||||
})
|
})
|
||||||
await expect(themeOption).toBeVisible()
|
await expect(themeOption).toBeVisible()
|
||||||
await themeOption.click()
|
await themeOption.click()
|
||||||
const themeInput = page.getByPlaceholder('dark')
|
const themeInput = page.getByPlaceholder('dark')
|
||||||
await expect(themeInput).toBeVisible()
|
await expect(themeInput).toBeVisible()
|
||||||
await expect(themeInput).toBeFocused()
|
await expect(themeInput).toBeFocused()
|
||||||
// Select dark theme
|
// Select dark theme
|
||||||
await page.keyboard.press('ArrowDown')
|
await page.keyboard.press('ArrowDown')
|
||||||
await page.keyboard.press('ArrowDown')
|
await page.keyboard.press('ArrowDown')
|
||||||
await page.keyboard.press('ArrowDown')
|
await page.keyboard.press('ArrowDown')
|
||||||
await expect(
|
await expect(page.getByRole('option', { name: 'system' })).toHaveAttribute(
|
||||||
page.getByRole('option', { name: 'system' })
|
'data-headlessui-state',
|
||||||
).toHaveAttribute('data-headlessui-state', 'active')
|
'active'
|
||||||
await page.keyboard.press('Enter')
|
)
|
||||||
|
await page.keyboard.press('Enter')
|
||||||
|
|
||||||
// Check the toast appeared
|
// Check the toast appeared
|
||||||
await expect(
|
await expect(
|
||||||
page.getByText(`Set theme to "system" as a user default`)
|
page.getByText(`Set theme to "system" as a user default`)
|
||||||
).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`)
|
||||||
}
|
})
|
||||||
)
|
|
||||||
|
|
||||||
test('Can extrude from the command bar', async ({ page, homePage }) => {
|
test('Can extrude from the command bar', async ({ page, homePage }) => {
|
||||||
await page.addInitScript(async () => {
|
await page.addInitScript(async () => {
|
||||||
@ -223,10 +183,10 @@ test.describe('Command bar tests', { tag: ['@skipWin'] }, () => {
|
|||||||
`distance = sqrt(20)
|
`distance = sqrt(20)
|
||||||
sketch001 = startSketchOn('XZ')
|
sketch001 = startSketchOn('XZ')
|
||||||
|> startProfileAt([-6.95, 10.98], %)
|
|> startProfileAt([-6.95, 10.98], %)
|
||||||
|> line(end = [25.1, 0.41])
|
|> line([25.1, 0.41], %)
|
||||||
|> line(end = [0.73, -20.93])
|
|> line([0.73, -20.93], %)
|
||||||
|> line(end = [-23.44, 0.52])
|
|> line([-23.44, 0.52], %)
|
||||||
|> close()
|
|> close(%)
|
||||||
`
|
`
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
@ -291,7 +251,7 @@ test.describe('Command bar tests', { tag: ['@skipWin'] }, () => {
|
|||||||
await u.waitForCmdReceive('extrude')
|
await u.waitForCmdReceive('extrude')
|
||||||
|
|
||||||
await expect(page.locator('.cm-content')).toContainText(
|
await expect(page.locator('.cm-content')).toContainText(
|
||||||
'extrude001 = extrude(sketch001, length = distance001)'
|
'extrude001 = extrude(distance001, sketch001)'
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ test.describe('Copilot ghost text', () => {
|
|||||||
await page.keyboard.press('Enter')
|
await page.keyboard.press('Enter')
|
||||||
await expect(page.locator('.cm-ghostText').first()).toBeVisible()
|
await expect(page.locator('.cm-ghostText').first()).toBeVisible()
|
||||||
await expect(page.locator('.cm-content')).toHaveText(
|
await expect(page.locator('.cm-content')).toHaveText(
|
||||||
`fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line(end = [0, scale], %) |> line(end = [scale, 0]) |> line(end = [0, -scale]) return sg}part001 = cube([0,0], 20) |> close() |> extrude(length = 20)`
|
`fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line([0, scale], %) |> line([scale, 0], %) |> line([0, -scale], %) return sg}part001 = cube([0,0], 20) |> close(%) |> extrude(20, %)`
|
||||||
)
|
)
|
||||||
await expect(page.locator('.cm-ghostText').first()).toHaveText(
|
await expect(page.locator('.cm-ghostText').first()).toHaveText(
|
||||||
`fn cube = (pos, scale) => {`
|
`fn cube = (pos, scale) => {`
|
||||||
@ -29,7 +29,7 @@ test.describe('Copilot ghost text', () => {
|
|||||||
// We should be able to hit Tab to accept the completion.
|
// We should be able to hit Tab to accept the completion.
|
||||||
await page.keyboard.press('Tab')
|
await page.keyboard.press('Tab')
|
||||||
await expect(page.locator('.cm-content')).toHaveText(
|
await expect(page.locator('.cm-content')).toHaveText(
|
||||||
`fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line(end = [0, scale], %) |> line(end = [scale, 0]) |> line(end = [0, -scale]) return sg}part001 = cube([0,0], 20) |> close() |> extrude(length = 20)`
|
`fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line([0, scale], %) |> line([scale, 0], %) |> line([0, -scale], %) return sg}part001 = cube([0,0], 20) |> close(%) |> extrude(20, %)`
|
||||||
)
|
)
|
||||||
|
|
||||||
// Hit enter a few times.
|
// Hit enter a few times.
|
||||||
@ -37,7 +37,7 @@ test.describe('Copilot ghost text', () => {
|
|||||||
await page.keyboard.press('Enter')
|
await page.keyboard.press('Enter')
|
||||||
|
|
||||||
await expect(page.locator('.cm-content')).toHaveText(
|
await expect(page.locator('.cm-content')).toHaveText(
|
||||||
`fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line(end = [0, scale], %) |> line(end = [scale, 0]) |> line(end = [0, -scale]) return sg}part001 = cube([0,0], 20) |> close() |> extrude(length = 20) `
|
`fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line([0, scale], %) |> line([scale, 0], %) |> line([0, -scale], %) return sg}part001 = cube([0,0], 20) |> close(%) |> extrude(20, %) `
|
||||||
)
|
)
|
||||||
|
|
||||||
await expect(page.locator('.cm-ghostText')).not.toBeVisible()
|
await expect(page.locator('.cm-ghostText')).not.toBeVisible()
|
||||||
@ -80,7 +80,7 @@ test.describe('Copilot ghost text', () => {
|
|||||||
await page.keyboard.press('Enter')
|
await page.keyboard.press('Enter')
|
||||||
|
|
||||||
await expect(page.locator('.cm-content')).toHaveText(
|
await expect(page.locator('.cm-content')).toHaveText(
|
||||||
`fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line(end = [0, scale], %) |> line(end = [scale, 0]) |> line(end = [0, -scale]) return sg}part001 = cube([0,0], 20) |> close() |> extrude(length = 20)`
|
`fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line([0, scale], %) |> line([scale, 0], %) |> line([0, -scale], %) return sg}part001 = cube([0,0], 20) |> close(%) |> extrude(20, %)`
|
||||||
)
|
)
|
||||||
await expect(page.locator('.cm-ghostText').first()).toHaveText(
|
await expect(page.locator('.cm-ghostText').first()).toHaveText(
|
||||||
`fn cube = (pos, scale) => {`
|
`fn cube = (pos, scale) => {`
|
||||||
@ -89,7 +89,7 @@ test.describe('Copilot ghost text', () => {
|
|||||||
// We should be able to hit Tab to accept the completion.
|
// We should be able to hit Tab to accept the completion.
|
||||||
await page.keyboard.press('Tab')
|
await page.keyboard.press('Tab')
|
||||||
await expect(page.locator('.cm-content')).toContainText(
|
await expect(page.locator('.cm-content')).toContainText(
|
||||||
`fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line(end = [0, scale], %) |> line(end = [scale, 0]) |> line(end = [0, -scale]) return sg}part001 = cube([0,0], 20) |> close() |> extrude(length = 20)`
|
`fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line([0, scale], %) |> line([scale, 0], %) |> line([0, -scale], %) return sg}part001 = cube([0,0], 20) |> close(%) |> extrude(20, %)`
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -156,7 +156,7 @@ test.describe('Copilot ghost text', () => {
|
|||||||
await page.keyboard.press('Enter')
|
await page.keyboard.press('Enter')
|
||||||
|
|
||||||
await expect(page.locator('.cm-content')).toHaveText(
|
await expect(page.locator('.cm-content')).toHaveText(
|
||||||
`sketch001 = startSketchOn('XZ')fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line(end = [0, scale], %) |> line(end = [scale, 0]) |> line(end = [0, -scale]) return sg}part001 = cube([0,0], 20) |> close() |> extrude(length = 20)`
|
`sketch001 = startSketchOn('XZ')fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line([0, scale], %) |> line([scale, 0], %) |> line([0, -scale], %) return sg}part001 = cube([0,0], 20) |> close(%) |> extrude(20, %)`
|
||||||
)
|
)
|
||||||
await expect(page.locator('.cm-ghostText').first()).toHaveText(
|
await expect(page.locator('.cm-ghostText').first()).toHaveText(
|
||||||
`fn cube = (pos, scale) => {`
|
`fn cube = (pos, scale) => {`
|
||||||
@ -165,7 +165,7 @@ test.describe('Copilot ghost text', () => {
|
|||||||
// We should be able to hit Tab to accept the completion.
|
// We should be able to hit Tab to accept the completion.
|
||||||
await page.keyboard.press('Tab')
|
await page.keyboard.press('Tab')
|
||||||
await expect(page.locator('.cm-content')).toHaveText(
|
await expect(page.locator('.cm-content')).toHaveText(
|
||||||
`sketch001 = startSketchOn('XZ')fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line(end = [0, scale], %) |> line(end = [scale, 0]) |> line(end = [0, -scale]) return sg}part001 = cube([0,0], 20) |> close() |> extrude(length = 20)`
|
`sketch001 = startSketchOn('XZ')fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line([0, scale], %) |> line([scale, 0], %) |> line([0, -scale], %) return sg}part001 = cube([0,0], 20) |> close(%) |> extrude(20, %)`
|
||||||
)
|
)
|
||||||
|
|
||||||
// Hit enter a few times.
|
// Hit enter a few times.
|
||||||
@ -173,7 +173,7 @@ test.describe('Copilot ghost text', () => {
|
|||||||
await page.keyboard.press('Enter')
|
await page.keyboard.press('Enter')
|
||||||
|
|
||||||
await expect(page.locator('.cm-content')).toHaveText(
|
await expect(page.locator('.cm-content')).toHaveText(
|
||||||
`sketch001 = startSketchOn('XZ')fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line(end = [0, scale], %) |> line(end = [scale, 0]) |> line(end = [0, -scale]) return sg}part001 = cube([0,0], 20) |> close() |> extrude(length = 20) `
|
`sketch001 = startSketchOn('XZ')fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line([0, scale], %) |> line([scale, 0], %) |> line([0, -scale], %) return sg}part001 = cube([0,0], 20) |> close(%) |> extrude(20, %) `
|
||||||
)
|
)
|
||||||
|
|
||||||
await expect(page.locator('.cm-ghostText')).not.toBeVisible()
|
await expect(page.locator('.cm-ghostText')).not.toBeVisible()
|
||||||
@ -194,7 +194,7 @@ test.describe('Copilot ghost text', () => {
|
|||||||
await page.keyboard.press('Enter')
|
await page.keyboard.press('Enter')
|
||||||
await expect(page.locator('.cm-ghostText').first()).toBeVisible()
|
await expect(page.locator('.cm-ghostText').first()).toBeVisible()
|
||||||
await expect(page.locator('.cm-content')).toHaveText(
|
await expect(page.locator('.cm-content')).toHaveText(
|
||||||
`fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line(end = [0, scale], %) |> line(end = [scale, 0]) |> line(end = [0, -scale]) return sg}part001 = cube([0,0], 20) |> close() |> extrude(length = 20)`
|
`fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line([0, scale], %) |> line([scale, 0], %) |> line([0, -scale], %) return sg}part001 = cube([0,0], 20) |> close(%) |> extrude(20, %)`
|
||||||
)
|
)
|
||||||
await expect(page.locator('.cm-ghostText').first()).toHaveText(
|
await expect(page.locator('.cm-ghostText').first()).toHaveText(
|
||||||
`fn cube = (pos, scale) => {`
|
`fn cube = (pos, scale) => {`
|
||||||
@ -225,7 +225,7 @@ test.describe('Copilot ghost text', () => {
|
|||||||
await page.keyboard.press('Enter')
|
await page.keyboard.press('Enter')
|
||||||
await expect(page.locator('.cm-ghostText').first()).toBeVisible()
|
await expect(page.locator('.cm-ghostText').first()).toBeVisible()
|
||||||
await expect(page.locator('.cm-content')).toHaveText(
|
await expect(page.locator('.cm-content')).toHaveText(
|
||||||
`fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line(end = [0, scale], %) |> line(end = [scale, 0]) |> line(end = [0, -scale]) return sg}part001 = cube([0,0], 20) |> close() |> extrude(length = 20)`
|
`fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line([0, scale], %) |> line([scale, 0], %) |> line([0, -scale], %) return sg}part001 = cube([0,0], 20) |> close(%) |> extrude(20, %)`
|
||||||
)
|
)
|
||||||
await expect(page.locator('.cm-ghostText').first()).toHaveText(
|
await expect(page.locator('.cm-ghostText').first()).toHaveText(
|
||||||
`fn cube = (pos, scale) => {`
|
`fn cube = (pos, scale) => {`
|
||||||
@ -256,7 +256,7 @@ test.describe('Copilot ghost text', () => {
|
|||||||
await page.keyboard.press('Enter')
|
await page.keyboard.press('Enter')
|
||||||
await expect(page.locator('.cm-ghostText').first()).toBeVisible()
|
await expect(page.locator('.cm-ghostText').first()).toBeVisible()
|
||||||
await expect(page.locator('.cm-content')).toHaveText(
|
await expect(page.locator('.cm-content')).toHaveText(
|
||||||
`fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line(end = [0, scale], %) |> line(end = [scale, 0]) |> line(end = [0, -scale]) return sg}part001 = cube([0,0], 20) |> close() |> extrude(length = 20)`
|
`fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line([0, scale], %) |> line([scale, 0], %) |> line([0, -scale], %) return sg}part001 = cube([0,0], 20) |> close(%) |> extrude(20, %)`
|
||||||
)
|
)
|
||||||
await expect(page.locator('.cm-ghostText').first()).toHaveText(
|
await expect(page.locator('.cm-ghostText').first()).toHaveText(
|
||||||
`fn cube = (pos, scale) => {`
|
`fn cube = (pos, scale) => {`
|
||||||
@ -287,7 +287,7 @@ test.describe('Copilot ghost text', () => {
|
|||||||
await page.keyboard.press('Enter')
|
await page.keyboard.press('Enter')
|
||||||
await expect(page.locator('.cm-ghostText').first()).toBeVisible()
|
await expect(page.locator('.cm-ghostText').first()).toBeVisible()
|
||||||
await expect(page.locator('.cm-content')).toHaveText(
|
await expect(page.locator('.cm-content')).toHaveText(
|
||||||
`fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line(end = [0, scale], %) |> line(end = [scale, 0]) |> line(end = [0, -scale]) return sg}part001 = cube([0,0], 20) |> close() |> extrude(length = 20)`
|
`fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line([0, scale], %) |> line([scale, 0], %) |> line([0, -scale], %) return sg}part001 = cube([0,0], 20) |> close(%) |> extrude(20, %)`
|
||||||
)
|
)
|
||||||
await expect(page.locator('.cm-ghostText').first()).toHaveText(
|
await expect(page.locator('.cm-ghostText').first()).toHaveText(
|
||||||
`fn cube = (pos, scale) => {`
|
`fn cube = (pos, scale) => {`
|
||||||
@ -315,7 +315,7 @@ test.describe('Copilot ghost text', () => {
|
|||||||
await page.keyboard.press('Enter')
|
await page.keyboard.press('Enter')
|
||||||
await expect(page.locator('.cm-ghostText').first()).toBeVisible()
|
await expect(page.locator('.cm-ghostText').first()).toBeVisible()
|
||||||
await expect(page.locator('.cm-content')).toHaveText(
|
await expect(page.locator('.cm-content')).toHaveText(
|
||||||
`fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line(end = [0, scale], %) |> line(end = [scale, 0]) |> line(end = [0, -scale]) return sg}part001 = cube([0,0], 20) |> close() |> extrude(length = 20)`
|
`fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line([0, scale], %) |> line([scale, 0], %) |> line([0, -scale], %) return sg}part001 = cube([0,0], 20) |> close(%) |> extrude(20, %)`
|
||||||
)
|
)
|
||||||
await expect(page.locator('.cm-ghostText').first()).toHaveText(
|
await expect(page.locator('.cm-ghostText').first()).toHaveText(
|
||||||
`fn cube = (pos, scale) => {`
|
`fn cube = (pos, scale) => {`
|
||||||
@ -326,7 +326,7 @@ test.describe('Copilot ghost text', () => {
|
|||||||
await expect(page.locator('.cm-ghostText').first()).toBeVisible()
|
await expect(page.locator('.cm-ghostText').first()).toBeVisible()
|
||||||
|
|
||||||
await expect(page.locator('.cm-content')).toHaveText(
|
await expect(page.locator('.cm-content')).toHaveText(
|
||||||
`fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line(end = [0, scale], %) |> line(end = [scale, 0]) |> line(end = [0, -scale]) return sg}part001 = cube([0,0], 20) |> close() |> extrude(length = 20)`
|
`fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line([0, scale], %) |> line([scale, 0], %) |> line([0, -scale], %) return sg}part001 = cube([0,0], 20) |> close(%) |> extrude(20, %)`
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -348,7 +348,7 @@ test.describe('Copilot ghost text', () => {
|
|||||||
await page.keyboard.press('Enter')
|
await page.keyboard.press('Enter')
|
||||||
await expect(page.locator('.cm-ghostText').first()).toBeVisible()
|
await expect(page.locator('.cm-ghostText').first()).toBeVisible()
|
||||||
await expect(page.locator('.cm-content')).toHaveText(
|
await expect(page.locator('.cm-content')).toHaveText(
|
||||||
`fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line(end = [0, scale], %) |> line(end = [scale, 0]) |> line(end = [0, -scale]) return sg}part001 = cube([0,0], 20) |> close() |> extrude(length = 20)`
|
`fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line([0, scale], %) |> line([scale, 0], %) |> line([0, -scale], %) return sg}part001 = cube([0,0], 20) |> close(%) |> extrude(20, %)`
|
||||||
)
|
)
|
||||||
await expect(page.locator('.cm-ghostText').first()).toHaveText(
|
await expect(page.locator('.cm-ghostText').first()).toHaveText(
|
||||||
`fn cube = (pos, scale) => {`
|
`fn cube = (pos, scale) => {`
|
||||||
@ -409,7 +409,7 @@ test.describe('Copilot ghost text', () => {
|
|||||||
await page.keyboard.press('Enter')
|
await page.keyboard.press('Enter')
|
||||||
await expect(page.locator('.cm-ghostText').first()).toBeVisible()
|
await expect(page.locator('.cm-ghostText').first()).toBeVisible()
|
||||||
await expect(page.locator('.cm-content')).toHaveText(
|
await expect(page.locator('.cm-content')).toHaveText(
|
||||||
`{thing: "blah"}fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line(end = [0, scale], %) |> line(end = [scale, 0]) |> line(end = [0, -scale]) return sg}part001 = cube([0,0], 20) |> close() |> extrude(length = 20)`
|
`{thing: "blah"}fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line([0, scale], %) |> line([scale, 0], %) |> line([0, -scale], %) return sg}part001 = cube([0,0], 20) |> close(%) |> extrude(20, %)`
|
||||||
)
|
)
|
||||||
await expect(page.locator('.cm-ghostText').first()).toHaveText(
|
await expect(page.locator('.cm-ghostText').first()).toHaveText(
|
||||||
`fn cube = (pos, scale) => {`
|
`fn cube = (pos, scale) => {`
|
||||||
@ -450,7 +450,7 @@ test.describe('Copilot ghost text', () => {
|
|||||||
await page.keyboard.press('Enter')
|
await page.keyboard.press('Enter')
|
||||||
await expect(page.locator('.cm-ghostText').first()).toBeVisible()
|
await expect(page.locator('.cm-ghostText').first()).toBeVisible()
|
||||||
await expect(page.locator('.cm-content')).toHaveText(
|
await expect(page.locator('.cm-content')).toHaveText(
|
||||||
`fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line(end = [0, scale], %) |> line(end = [scale, 0]) |> line(end = [0, -scale]) return sg}part001 = cube([0,0], 20) |> close() |> extrude(length = 20)`
|
`fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line([0, scale], %) |> line([scale, 0], %) |> line([0, -scale], %) return sg}part001 = cube([0,0], 20) |> close(%) |> extrude(20, %)`
|
||||||
)
|
)
|
||||||
await expect(page.locator('.cm-ghostText').first()).toHaveText(
|
await expect(page.locator('.cm-ghostText').first()).toHaveText(
|
||||||
`fn cube = (pos, scale) => {`
|
`fn cube = (pos, scale) => {`
|
||||||
@ -483,7 +483,7 @@ test.describe('Copilot ghost text', () => {
|
|||||||
await page.keyboard.press('Enter')
|
await page.keyboard.press('Enter')
|
||||||
await expect(page.locator('.cm-ghostText').first()).toBeVisible()
|
await expect(page.locator('.cm-ghostText').first()).toBeVisible()
|
||||||
await expect(page.locator('.cm-content')).toHaveText(
|
await expect(page.locator('.cm-content')).toHaveText(
|
||||||
`fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line(end = [0, scale], %) |> line(end = [scale, 0]) |> line(end = [0, -scale]) return sg}part001 = cube([0,0], 20) |> close() |> extrude(length = 20)`
|
`fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line([0, scale], %) |> line([scale, 0], %) |> line([0, -scale], %) return sg}part001 = cube([0,0], 20) |> close(%) |> extrude(20, %)`
|
||||||
)
|
)
|
||||||
await expect(page.locator('.cm-ghostText').first()).toHaveText(
|
await expect(page.locator('.cm-ghostText').first()).toHaveText(
|
||||||
`fn cube = (pos, scale) => {`
|
`fn cube = (pos, scale) => {`
|
||||||
@ -514,7 +514,7 @@ test.describe('Copilot ghost text', () => {
|
|||||||
await page.keyboard.press('Enter')
|
await page.keyboard.press('Enter')
|
||||||
await expect(page.locator('.cm-ghostText').first()).toBeVisible()
|
await expect(page.locator('.cm-ghostText').first()).toBeVisible()
|
||||||
await expect(page.locator('.cm-content')).toHaveText(
|
await expect(page.locator('.cm-content')).toHaveText(
|
||||||
`fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line(end = [0, scale], %) |> line(end = [scale, 0]) |> line(end = [0, -scale]) return sg}part001 = cube([0,0], 20) |> close() |> extrude(length = 20)`
|
`fn cube = (pos, scale) => { sg = startSketchOn('XY') |> startProfileAt(pos, %) |> line([0, scale], %) |> line([scale, 0], %) |> line([0, -scale], %) return sg}part001 = cube([0,0], 20) |> close(%) |> extrude(20, %)`
|
||||||
)
|
)
|
||||||
await expect(page.locator('.cm-ghostText').first()).toHaveText(
|
await expect(page.locator('.cm-ghostText').first()).toHaveText(
|
||||||
`fn cube = (pos, scale) => {`
|
`fn cube = (pos, scale) => {`
|
||||||
|
@ -20,7 +20,7 @@ test.describe('Debug pane', () => {
|
|||||||
}) => {
|
}) => {
|
||||||
const code = `sketch001 = startSketchOn('XZ')
|
const code = `sketch001 = startSketchOn('XZ')
|
||||||
|> startProfileAt([0, 0], %)
|
|> startProfileAt([0, 0], %)
|
||||||
|> line(end = [1, 1])
|
|> line([1, 1], %)
|
||||||
`
|
`
|
||||||
const u = await getUtils(page)
|
const u = await getUtils(page)
|
||||||
await page.setBodyDimensions({ width: 1200, height: 500 })
|
await page.setBodyDimensions({ width: 1200, height: 500 })
|
||||||
@ -61,7 +61,7 @@ test.describe('Debug pane', () => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
await test.step('Enter a comment', async () => {
|
await test.step('Enter a comment', async () => {
|
||||||
await page.keyboard.type('|> line(end = [2, 2])', { delay: 0 })
|
await page.keyboard.type('|> line([2, 2], %)', { delay: 0 })
|
||||||
// Wait for keyboard input debounce and updated artifact graph.
|
// Wait for keyboard input debounce and updated artifact graph.
|
||||||
await page.waitForTimeout(1000)
|
await page.waitForTimeout(1000)
|
||||||
})
|
})
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user