Compare commits

...

36 Commits

Author SHA1 Message Date
a5daa38ea7 Trying to add units parsing, but getting shift/reduce conflict 2025-05-16 19:33:18 -04:00
744da59a4b wip: Add parsing ascription 2025-05-16 00:00:48 -04:00
1506de92f5 ML commands green branding and experimental badge (#6989)
* Remove tan warning from ml commands, move to experimental green branding

* Oops

* Removed unused var

---------

Co-authored-by: Frank Noirot <frankjohnson1993@gmail.com>
2025-05-16 03:42:35 +00:00
8a03413643 Deflake onboarding test (#6996)
1. Remove all `waitFor` hidden states for the post-dismiss toast:
something about Playwright is making toasts hang in a way I've never
seen in real use. Not something I'm worried about, and we still test
that the toast fires the first time we dismiss.
2. Remove all `scene.connectionEstablished()` calls. This has me more
worried because some of the flakiness on this front seems like we're not
able to handle the rapid machine-speed navigation and overwriting that
this test does when it doesn't have to `waitFor` toasts to disappear.
But that is not the point of this test, which is just to ensure the
onboarding plays correctly and initiates correctly.
2025-05-15 23:27:58 -04:00
f59b806a88 Fix to display warnings when there's a fatal error (#6995)
* Fix to display warnings when there's a fatal error

* Fix JSON test
2025-05-16 03:22:21 +00:00
23a0085c78 Change runtime assert to runtime error and debug assert (#6987) 2025-05-15 22:55:16 -04:00
a280a8c3f0 Nickmccleery/i have no idea what im doing (#6967)
* Yeet in alt param structure.

* updates

Signed-off-by: Jess Frazelle <github@jessfraz.com>

---------

Signed-off-by: Jess Frazelle <github@jessfraz.com>
Co-authored-by: Jess Frazelle <github@jessfraz.com>
2025-05-16 02:16:32 +00:00
11620dfa6b Fix to display errors at the call site (#6991) 2025-05-15 22:11:37 -04:00
f6e26e0bab test: Add face_code_ref to the mermaid output (#6985)
* Add face_code_ref to the mermaid output

* Update output
2025-05-15 20:14:31 -04:00
f6b3a55cbf fix link (#6990) 2025-05-16 00:04:23 +00:00
74939e5cd6 Fix execution caching to cache artifact graph NodePath (#6978)
* Fix to add NodePaths to SketchOnFace and SketchOnPlane artifacts

* Fix to only compute the new part of the artifact graph

* Change to early-return sooner when in mock mode

* Add another test

* Fix to propagate NodePath for sketch on face

* Update output
2025-05-15 19:18:03 -04:00
9906c9947a Do not coerce unknown numbers and preserve known units if present (#6961)
Signed-off-by: Nick Cameron <nrc@ncameron.org>
2025-05-16 10:58:21 +12:00
48d6a21f0a Accept multiple export toast messages to be visible (#6979)
* Accept multiple export toast messages to be visible

* Wait for the toast to appear

* Wait before counting toasts
2025-05-15 22:48:15 +00:00
dd6a980915 Helix can't be selected as path arg in point-and-click sweep (#6968)
* Helix can't be selected as path arg in point-and-click sweep
Fixes #6966

* Remove old dry-run validations on Sweep, Loft, Revolve, and Shell

* Base on dry-run validation remove branch

* Add test
2025-05-15 15:42:38 -05:00
2516df3a39 fix my insta test fubar (#6981)
* fix my insta test fubar

Signed-off-by: Jess Frazelle <github@jessfraz.com>

* more python tests

Signed-off-by: Jess Frazelle <github@jessfraz.com>

* more python tests

Signed-off-by: Jess Frazelle <github@jessfraz.com>

---------

Signed-off-by: Jess Frazelle <github@jessfraz.com>
2025-05-15 13:37:12 -07:00
52125f0566 Change IS_NIGHTLY_OR_DEBUG to not include playwright version (#6982) 2025-05-15 20:23:06 +00:00
e489222b6a expose mock executing to python library; (#6980)
* expose mock executing to python library;

Signed-off-by: Jess Frazelle <github@jessfraz.com>

* bump

Signed-off-by: Jess Frazelle <github@jessfraz.com>

* Update rust/kcl-python-bindings/src/lib.rs

Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>

---------

Signed-off-by: Jess Frazelle <github@jessfraz.com>
Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
2025-05-15 12:35:29 -07:00
d93a57d7bf more lsp tests / pass python a bool on parse (#6975)
* updates

Signed-off-by: Jess Frazelle <github@jessfraz.com>

* parse returns bool for python

Signed-off-by: Jess Frazelle <github@jessfraz.com>

---------

Signed-off-by: Jess Frazelle <github@jessfraz.com>
2025-05-15 11:04:53 -07:00
d34aea345b #6548 Fix autocomplete for offsetPlane (#6940)
* handle Plane in get_autocomplete_snippet to fix missing default plane value for offsetPlane

* adds test for offsetPlane default plane value

* cleanup test

* use XY instead of XZ for default plane

* add rust test for offsetplane autocomplete

* remove playwright test for offestPlane, as it has rust test now and there are autocomplete tests already
2025-05-15 19:53:35 +02:00
0b6102b0ac #6214 Fix center circle radius issues (#6971)
* add missing radius line for center circle

* remove some duplication by introducing createLineShape
2025-05-15 13:30:25 -04:00
9e0873ed84 Remove updater-test builds (#6962)
Remove updater-test
2025-05-15 13:25:40 -04:00
8587eb5fea Make idle sestting 30sec in nightly (#6972) 2025-05-15 17:17:59 +00:00
b898c27e74 Add KCL constants for sweep relativeTo strings (#6974)
* Add KCL constants for sweep relativeTo strings

Before:

```
sweep(pill, path = sweepPath, relativeTo = "trajectoryCurve")
```

After:

```
sweep(pill, path = sweepPath, relativeTo = sweep::TRAJECTORY)
```

* Update docs
2025-05-15 10:13:04 -07:00
3026866a16 Remove old dry-run validations on Sweep, Loft, Revolve, and Shell (#6969) 2025-05-15 12:11:40 -05:00
92fc294eae Update mesh clone test (#6597) 2025-05-15 16:46:37 +00:00
21e967ea7f More consistent error handling in modelingMachine codemods (#6910)
* First pass at consistency in modelingMachine codemods

* Add 'no kcl errors' guard instead of if check for all the existing ones

* Add more commands and improve consistency

* Add comments

* Fix test with old kcl that was showcasing the very behavior we're trying to fix
https://kittycadworkspace.slack.com/archives/C07A80B83FS/p1747231832870739?thread_ts=1747231178.515289&cid=C07A80B83FS

* Add test for sketch and helix

* Remove guard use and move hasErrors check closer to updateAst calls

* Revert "Remove guard use and move hasErrors check closer to updateAst calls"

This reverts commit 868ea4b605.

* Remove toasts from guards

* Remove some scene.settled calls

* Lint

* More shaky fixes

* Clean up and more test fixes

---------

Co-authored-by: Frank Noirot <frankjohnson1993@gmail.com>
2025-05-15 12:26:20 -04:00
3f00e7186c Backoff Reconnect (#6358)
* Add a Stop command that does a bit of cleanup in the engineStateMachine

* Major network code startup refactor; backoff reconnect; many more logs for us

* Save camera state after every user interaction in case of disconnection and restoral

* Translate basic WebSocket error numbers into useful text

* Add a RestartRequest event to the engineCommandManager

* Adjust for a rebase

* Add E2E test for stream pause behavior

* Fix snapshot test

* fmt, lint

* small issue

* Fix tests

* Fix up idle test

* One last fix

* fixes

* Remove circ dep

* fix test

* use a const for time

* TEST -> isPlaywright instead

* whoops
2025-05-15 11:58:00 -04:00
d3a4fd8b55 Raw dog parse for python bindings (#6970)
* raw dog parse python

Signed-off-by: Jess Frazelle <github@jessfraz.com>

* add tests

Signed-off-by: Jess Frazelle <github@jessfraz.com>

---------

Signed-off-by: Jess Frazelle <github@jessfraz.com>
2025-05-15 15:39:28 +00:00
2be7107cca External: Fix: symbol replace text box dark mode contrast (#6827) (#6927)
* fix: symbol replace text box dark mode contrast (#6827)

* fix: symbol replace text box dark mode contrast (#6827)

* correct fix for rename popup white text on white background #6827

* correct fix for rename popup white text on white background #6827

* added comments explaining the change

---------

Co-authored-by: rajgandhi1 <rajgandhi9952@gmail.com>
2025-05-15 12:57:39 +00:00
94f194a984 new sweep default (#6965)
snaps

Signed-off-by: Jess Frazelle <github@jessfraz.com>
2025-05-15 11:50:55 +00:00
4fe880a970 Revert "fixes"
This reverts commit 8f5fbfc273.
2025-05-15 04:28:20 -07:00
8f5fbfc273 fixes
Signed-off-by: Jess Frazelle <github@jessfraz.com>
2025-05-15 04:27:59 -07:00
e660f52bb0 Restore automated snapshot commits (#6960)
* Restore automated snapshot commits

* Update snapshots

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-15 03:28:42 +00:00
d74fdd9369 Color picker goober works w single quotes (#6957)
* lsp stuffs

Signed-off-by: Jess Frazelle <github@jessfraz.com>

* updates

Signed-off-by: Jess Frazelle <github@jessfraz.com>

---------

Signed-off-by: Jess Frazelle <github@jessfraz.com>
2025-05-15 12:37:14 +10:00
334145f0be fix sketch on face of union (#6949)
* fix sketch on face of union

Signed-off-by: Jess Frazelle <github@jessfraz.com>

* rotate the model

Signed-off-by: Jess Frazelle <github@jessfraz.com>

* updates

Signed-off-by: Jess Frazelle <github@jessfraz.com>

---------

Signed-off-by: Jess Frazelle <github@jessfraz.com>
2025-05-14 23:25:12 +00:00
c24073b6ae Sensible parser error when using keyword as arg label (#6948)
Closes <https://github.com/KittyCAD/modeling-app/issues/6924>
2025-05-14 22:29:31 +00:00
251 changed files with 30314 additions and 10391 deletions

View File

@ -123,18 +123,6 @@ jobs:
- id: export_notes
run: echo "notes=`cat release-notes.md`" >> "$GITHUB_OUTPUT"
- name: Prepare electron-builder.yml file for updater test
if: ${{ env.IS_RELEASE == 'true' }}
run: |
yq -i '.publish[0].url = "https://dl.zoo.dev/releases/modeling-app/updater-test"' electron-builder.yml
- uses: actions/upload-artifact@v4
if: ${{ env.IS_RELEASE == 'true' }}
with:
name: prepared-files-updater-test
path: |
electron-builder.yml
build-apps:
needs: [prepare-files]
@ -259,49 +247,6 @@ jobs:
# TODO: add the 'Build for Mac TestFlight (nightly)' stage back
# The steps below are for updater-test builds, only on release
- uses: actions/download-artifact@v4
if: ${{ env.IS_RELEASE == 'true' }}
name: prepared-files-updater-test
- name: Copy updated electron-builder.yml file for updater test
if: ${{ env.IS_RELEASE == 'true' }}
run: |
ls -R prepared-files-updater-test
cp prepared-files-updater-test/electron-builder.yml electron-builder.yml
- name: Build the app (updater-test)
if: ${{ env.IS_RELEASE == 'true' }}
env:
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
CSC_LINK: ${{ secrets.APPLE_CERTIFICATE }}
CSC_KEY_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
CSC_KEYCHAIN: ${{ secrets.APPLE_SIGNING_IDENTITY }}
WINDOWS_CERTIFICATE_THUMBPRINT: ${{ secrets.WINDOWS_CERTIFICATE_THUMBPRINT }}
run: npm run tronb:package:prod
- uses: actions/upload-artifact@v4
if: ${{ env.IS_RELEASE == 'true' }}
with:
name: updater-test-arm64-${{ matrix.platform }}
path: |
out/*-arm64-win.exe
out/*-arm64-mac.dmg
out/*-arm64-linux.AppImage
- uses: actions/upload-artifact@v4
if: ${{ env.IS_RELEASE == 'true' }}
with:
name: updater-test-x64-${{ matrix.platform }}
path: |
out/*-x64-win.exe
out/*-x64-mac.dmg
out/*-x86_64-linux.AppImage
upload-apps-release:
runs-on: ubuntu-22.04

View File

@ -40,7 +40,7 @@ jobs:
- name: Install dependencies
run: npm install
- name: Download Wasm Cache
- name: Download Wasm cache
id: download-wasm
if: ${{ github.event_name != 'schedule' && steps.filter.outputs.rust == 'false' }}
uses: dawidd6/action-download-artifact@v7
@ -52,7 +52,7 @@ jobs:
branch: main
path: rust/kcl-wasm-lib/pkg
- name: Build WASM condition
- name: Build Wasm condition
id: wasm
run: |
set -euox pipefail
@ -70,7 +70,7 @@ jobs:
run: |
[ -e rust-toolchain.toml ] || cp rust/rust-toolchain.toml ./
- name: Install rust
- name: Install Rust
if: ${{ steps.wasm.outputs.should-build-wasm == 'true' }}
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
@ -81,7 +81,7 @@ jobs:
with:
tool: wasm-pack
- name: Rust Cache
- name: Use Rust cache
if: ${{ steps.wasm.outputs.should-build-wasm == 'true' }}
uses: Swatinem/rust-cache@v2
with:
@ -117,7 +117,7 @@ jobs:
- uses: actions/download-artifact@v4
name: prepared-wasm
- name: Copy prepared wasm
- name: Copy prepared Wasm
run: |
ls -R prepared-wasm
cp prepared-wasm/kcl_wasm_lib_bg.wasm public
@ -133,20 +133,17 @@ jobs:
id: deps-install
run: npm install
- name: Cache Playwright Browsers
- name: Cache browsers
uses: actions/cache@v4
with:
path: |
~/.cache/ms-playwright/
key: ${{ runner.os }}-playwright-${{ hashFiles('package-lock.json') }}
- name: Install Playwright Browsers
- name: Install browsers
run: npm run playwright install --with-deps
- name: build web
run: npm run tronb:vite:dev
- name: Run ubuntu/chrome snapshots
- name: Capture snapshots
uses: nick-fields/retry@v3.0.2
with:
shell: bash
@ -170,7 +167,7 @@ jobs:
retention-days: 30
overwrite: true
- name: Check for changes
- name: Check diff
if: ${{ github.ref != 'refs/heads/main' }}
shell: bash
id: git-check
@ -181,9 +178,8 @@ jobs:
else echo "modified=false" >> $GITHUB_OUTPUT
fi
- name: Commit changes, if any
# TODO: find a more reliable way to detect visual changes
if: ${{ false && steps.git-check.outputs.modified == 'true' }}
- name: Commit changes
if: ${{ steps.git-check.outputs.modified == 'true' }}
shell: bash
run: |
git add e2e/playwright/snapshot-tests.spec.ts-snapshots e2e/playwright/snapshots
@ -193,7 +189,7 @@ jobs:
git fetch origin
echo ${{ github.head_ref }}
git checkout ${{ github.head_ref }}
git commit -m "A snapshot a day keeps the bugs away! 📷🐛" || true
git commit --message "Update snapshots" || true
git push
git push origin ${{ github.head_ref }}

View File

@ -130,7 +130,7 @@ git tag $VERSION
git push origin --tags
```
This will trigger the `build-apps` workflow, set the version, build & sign the apps, and generate release files as well as updater-test artifacts.
This will trigger the `build-apps` workflow, set the version, build & sign the apps, and generate release files.
The workflow should be listed right away [in this list](https://github.com/KittyCAD/modeling-app/actions/workflows/build-apps.yml?query=event%3Apush)).
@ -142,13 +142,10 @@ The release builds can be found under the `out-{arch}-{platform}` zip files, at
Manually test against this [list](https://github.com/KittyCAD/modeling-app/issues/3588) across Windows, MacOS, Linux and posting results as comments in the issue.
##### Updater-test builds
The other `build-apps` output in the release `build-apps` workflow (triggered by 2.) is `updater-test-{arch}-{platform}`. It's a semi-automated process: for macOS, Windows, and Linux, download the corresponding updater-test artifact file, install the app, run it, expect an updater prompt to a dummy v0.255.255, install it and check that the app comes back at that version.
The only difference with these builds is that they point to a different update location on the release bucket, with this dummy v0.255.255 always available. This helps ensuring that the version we release will be able to update to the next one available.
If the prompt doesn't show up, start the app in command line to grab the electron-updater logs. This is likely an issue with the current build that needs addressing (or the updater-test location in the storage bucket).
A prompt should show up asking for a downgrade to the last release version. Running through that at the end of testing
and making sure the current release candidate has the ability to be updated to what electron-updater points to is critical,
but what is actually being downloaded and installed isn't.
If the prompt doesn't show up, start the app in command line to grab the electron-updater logs. This is likely an issue with the current build that needs addressing.
```
# Windows (PowerShell)

View File

@ -0,0 +1,16 @@
---
title: "sweep::SKETCH_PLANE"
subtitle: "Constant in std::sweep"
excerpt: "Local/relative to a position centered within the plane being sketched on"
layout: manual
---
Local/relative to a position centered within the plane being sketched on
```kcl
sweep::SKETCH_PLANE: string = 'sketchPlane'
```

View File

@ -0,0 +1,16 @@
---
title: "sweep::TRAJECTORY"
subtitle: "Constant in std::sweep"
excerpt: "Local/relative to the trajectory curve"
layout: manual
---
Local/relative to the trajectory curve
```kcl
sweep::TRAJECTORY: string = 'trajectoryCurve'
```

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -128,6 +128,9 @@ layout: manual
* [`E`](/docs/kcl-std/consts/std-math-E)
* [`PI`](/docs/kcl-std/consts/std-math-PI)
* [`TAU`](/docs/kcl-std/consts/std-math-TAU)
* [**std::sweep**](/docs/kcl-std/modules/std-sweep)
* [`sweep::SKETCH_PLANE`](/docs/kcl-std/consts/std-sweep-SKETCH_PLANE)
* [`sweep::TRAJECTORY`](/docs/kcl-std/consts/std-sweep-TRAJECTORY)
* [**std::turns**](/docs/kcl-std/modules/std-turns)
* [`turns::HALF_TURN`](/docs/kcl-std/consts/std-turns-HALF_TURN)
* [`turns::QUARTER_TURN`](/docs/kcl-std/consts/std-turns-QUARTER_TURN)

View File

@ -0,0 +1,17 @@
---
title: "sweep"
subtitle: "Module in std"
excerpt: ""
layout: manual
---
## Functions and constants
* [`sweep::SKETCH_PLANE`](/docs/kcl-std/consts/std-sweep-SKETCH_PLANE)
* [`sweep::TRAJECTORY`](/docs/kcl-std/consts/std-sweep-TRAJECTORY)

View File

@ -19,6 +19,7 @@ You might also want the [KCL language reference](/docs/kcl-lang) or the [KCL gui
* [`math`](/docs/kcl-std/modules/std-math)
* [`sketch`](/docs/kcl-std/modules/std-sketch)
* [`solid`](/docs/kcl-std/modules/std-solid)
* [`sweep::sweep`](/docs/kcl-std/modules/std-sweep)
* [`transform`](/docs/kcl-std/modules/std-transform)
* [`turns::turns`](/docs/kcl-std/modules/std-turns)
* [`types`](/docs/kcl-std/modules/std-types)

View File

@ -251786,7 +251786,7 @@
}
},
"required": false,
"description": "What is the sweep relative to? Can be either 'sketchPlane' or 'trajectoryCurve'. Defaults to sketchPlane.",
"description": "What is the sweep relative to? Can be either 'sketchPlane' or 'trajectoryCurve'. Defaults to trajectoryCurve.",
"labelRequired": true
},
{
@ -256720,7 +256720,7 @@
false
],
[
"// Create a spring by sweeping around a helix path.\n\n// Create a helix around the Z axis.\nhelixPath = helix(\n angleStart = 0,\n ccw = true,\n revolutions = 4,\n length = 10,\n radius = 5,\n axis = Z,\n)\n\n// Create a spring by sweeping around the helix path.\nspringSketch = startSketchOn(YZ)\n |> circle(center = [0, 0], radius = 1)\n |> sweep(path = helixPath)",
"// Create a spring by sweeping around a helix path.\n\n// Create a helix around the Z axis.\nhelixPath = helix(\n angleStart = 0,\n ccw = true,\n revolutions = 4,\n length = 10,\n radius = 5,\n axis = Z,\n)\n\n// Create a spring by sweeping around the helix path.\nspringSketch = startSketchOn(XZ)\n |> circle(center = [5, 0], radius = 1)\n |> sweep(path = helixPath)",
false
],
[

File diff suppressed because one or more lines are too long

View File

@ -134,8 +134,6 @@ extrude001 = extrude(sketch001, length = 5)`
await page.setBodyDimensions({ width: 1200, height: 500 })
await homePage.goToModelingScene()
await page.waitForTimeout(1000)
// Ensure badge is present
const codePaneButtonHolder = page.locator('#code-button-holder')
await expect(codePaneButtonHolder).toContainText('notification', {
@ -183,7 +181,7 @@ extrude001 = extrude(sketch001, length = 5)`
await page.setBodyDimensions({ width: 1200, height: 500 })
await homePage.goToModelingScene()
await scene.settled(cmdBar)
// await scene.settled(cmdBar)
// Ensure badge is present
const codePaneButtonHolder = page.locator('#code-button-holder')

View File

@ -65,7 +65,9 @@ test(
await expect(engineErrorToastMessage).not.toBeVisible()
const successToastMessage = page.getByText(`Exported successfully`)
await expect(successToastMessage).toBeVisible()
await page.waitForTimeout(1_000)
const count = await successToastMessage.count()
await expect(count).toBeGreaterThanOrEqual(1)
// Check for the exported file
const firstFileFullPath = path.resolve(
@ -134,7 +136,9 @@ test(
await expect(engineErrorToastMessage).not.toBeVisible()
const successToastMessage = page.getByText(`Exported successfully`)
await expect(successToastMessage).toBeVisible()
await page.waitForTimeout(1_000)
const count = await successToastMessage.count()
await expect(count).toBeGreaterThanOrEqual(1)
await expect(exportingToastMessage).not.toBeVisible()
// Check for the exported file=

View File

@ -1533,7 +1533,6 @@ sketch001 = startSketchOn(XZ)
await homePage.goToModelingScene()
await scene.connectionEstablished()
await scene.settled(cmdBar)
await scene.expectPixelColor(
TEST_COLORS.DARK_MODE_BKGD,

View File

@ -6,7 +6,6 @@ test.describe('Onboarding tests', () => {
homePage,
toolbar,
editor,
scene,
tronApp,
}) => {
if (!tronApp) {
@ -62,7 +61,6 @@ test.describe('Onboarding tests', () => {
await editor.expectEditor.toContain('@settings(defaultLengthUnit = in)', {
shouldNormalise: true,
})
await scene.connectionEstablished()
})
await test.step('Go home and verify we still see the tutorial button, then begin it.', async () => {
@ -132,9 +130,7 @@ test.describe('Onboarding tests', () => {
})
await test.step('Dismiss the onboarding', async () => {
await postDismissToast.waitFor({ state: 'hidden' })
await page.keyboard.press('Escape')
await expect(postDismissToast).toBeVisible()
await expect(page.getByTestId('onboarding-content')).not.toBeVisible()
await expect.poll(() => page.url()).not.toContain('/onboarding')
})
@ -162,13 +158,10 @@ test.describe('Onboarding tests', () => {
await test.step('Gets to the onboarding start', async () => {
await expect(toolbar.projectName).toContainText('tutorial-project')
await expect(tutorialWelcomeHeading).toBeVisible()
await scene.connectionEstablished()
})
await test.step('Dismiss the onboarding', async () => {
await postDismissToast.waitFor({ state: 'hidden' })
await page.keyboard.press('Escape')
await expect(postDismissToast).toBeVisible()
await expect(page.getByTestId('onboarding-content')).not.toBeVisible()
await expect.poll(() => page.url()).not.toContain('/onboarding')
})

View File

@ -1931,50 +1931,37 @@ sketch002 = startSketchOn(XZ)
})
})
test(`Sweep point-and-click failing validation`, async ({
test(`Sweep point-and-click helix`, async ({
context,
page,
homePage,
scene,
editor,
toolbar,
cmdBar,
}) => {
const initialCode = `@settings(defaultLengthUnit = in)
sketch001 = startSketchOn(YZ)
|> circle(
center = [0, 0],
radius = 500
)
sketch002 = startSketchOn(XZ)
|> startProfile(at = [0, 0])
|> xLine(length = -500)
|> line(endAbsolute = [-2000, 500])
`
const circleCode = `circle(sketch001, center = [0, -1], radius = .1)`
const initialCode = `helix001 = helix(
axis = X,
radius = 1,
length = 10,
revolutions = 10,
angleStart = 0,
ccw = false,
)
sketch001 = startSketchOn(XZ)
profile001 = ${circleCode}`
const sweepDeclaration = 'sweep001 = sweep(profile001, path = helix001)'
await context.addInitScript((initialCode) => {
localStorage.setItem('persistCode', initialCode)
}, initialCode)
await page.setBodyDimensions({ width: 1000, height: 500 })
await homePage.goToModelingScene()
await scene.settled(cmdBar)
// One dumb hardcoded screen pixel value
const testPoint = { x: 700, y: 250 }
const [clickOnSketch1] = scene.makeMouseHelpers(testPoint.x, testPoint.y)
const [clickOnSketch2] = scene.makeMouseHelpers(
testPoint.x - 50,
testPoint.y
)
await test.step(`Look for sketch001`, async () => {
await toolbar.closePane('code')
await scene.expectPixelColor([53, 53, 53], testPoint, 15)
})
await test.step(`Go through the command bar flow and fail validation with a toast`, async () => {
await test.step(`Add sweep through the command bar flow`, async () => {
await toolbar.openPane('feature-tree')
await toolbar.sweepButton.click()
await expect
.poll(() => page.getByText('Please select one').count())
.toBe(1)
await cmdBar.expectState({
commandName: 'Sweep',
currentArgKey: 'sketches',
@ -1987,7 +1974,8 @@ sketch002 = startSketchOn(XZ)
highlightedHeaderArg: 'sketches',
stage: 'arguments',
})
await clickOnSketch1()
await editor.scrollToText(circleCode)
await page.getByText(circleCode).click()
await cmdBar.progressCmdBar()
await cmdBar.expectState({
commandName: 'Sweep',
@ -2001,11 +1989,39 @@ sketch002 = startSketchOn(XZ)
highlightedHeaderArg: 'path',
stage: 'arguments',
})
await clickOnSketch2()
const helix = await toolbar.getFeatureTreeOperation('Helix', 0)
await helix.click()
await cmdBar.expectState({
commandName: 'Sweep',
currentArgKey: 'path',
currentArgValue: '',
headerArguments: {
Sectional: '',
Sketches: '1 face',
Path: '',
},
highlightedHeaderArg: 'path',
stage: 'arguments',
})
await cmdBar.progressCmdBar()
await expect(
page.getByText('Unable to sweep with the current selection. Reason:')
).toBeVisible()
await cmdBar.expectState({
commandName: 'Sweep',
headerArguments: {
Sketches: '1 face',
Path: '1 helix',
Sectional: '',
},
stage: 'review',
})
await cmdBar.progressCmdBar()
await editor.expectEditor.toContain(sweepDeclaration)
})
await test.step('Delete sweep via feature tree selection', async () => {
const sweep = await toolbar.getFeatureTreeOperation('Sweep', 0)
await sweep.click()
await page.keyboard.press('Delete')
await editor.expectEditor.not.toContain(sweepDeclaration)
})
})
@ -3627,67 +3643,6 @@ profile001 = startProfile(sketch001, at = [-20, 20])
})
})
test(`Shell dry-run validation rejects sweeps`, async ({
context,
page,
homePage,
scene,
editor,
toolbar,
cmdBar,
}) => {
const initialCode = `sketch001 = startSketchOn(YZ)
|> circle(
center = [0, 0],
radius = 500
)
sketch002 = startSketchOn(XZ)
|> startProfile(at = [0, 0])
|> xLine(length = -2000)
sweep001 = sweep(sketch001, path = sketch002)
`
await context.addInitScript((initialCode) => {
localStorage.setItem('persistCode', initialCode)
}, initialCode)
await page.setBodyDimensions({ width: 1000, height: 500 })
await homePage.goToModelingScene()
await scene.settled(cmdBar)
// One dumb hardcoded screen pixel value
const testPoint = { x: 500, y: 250 }
const [clickOnSweep] = scene.makeMouseHelpers(testPoint.x, testPoint.y)
await test.step(`Confirm sweep exists`, async () => {
await toolbar.closePane('code')
await scene.expectPixelColor([231, 231, 231], testPoint, 15)
})
await test.step(`Go through the Shell flow and fail validation with a toast`, async () => {
await toolbar.shellButton.click()
await expect
.poll(() => page.getByText('Please select one').count())
.toBe(1)
await cmdBar.expectState({
stage: 'arguments',
currentArgKey: 'selection',
currentArgValue: '',
headerArguments: {
Selection: '',
Thickness: '',
},
highlightedHeaderArg: 'selection',
commandName: 'Shell',
})
await clickOnSweep()
await page.waitForTimeout(500)
await cmdBar.progressCmdBar()
await expect(
page.getByText('Unable to shell with the current selection. Reason:')
).toBeVisible()
await page.waitForTimeout(1000)
})
})
test.describe('Revolve point and click workflows', () => {
test('Base case workflow, auto spam continue in command bar', async ({
context,
@ -4943,4 +4898,34 @@ path001 = startProfile(sketch001, at = [0, 0])
)
})
})
test(`Point and click codemods can't run on KCL errors`, async ({
context,
page,
homePage,
scene,
editor,
toolbar,
cmdBar,
}) => {
const badCode = `sketch001 = startSketchOn(XZ)
profile001 = circle(sketch001, center = [0, 0], radius = 1)
extrude001 = extrude(profile001 length = 1)`
await context.addInitScript((initialCode) => {
localStorage.setItem('persistCode', initialCode)
}, badCode)
await page.setBodyDimensions({ width: 1000, height: 500 })
await homePage.goToModelingScene()
await scene.connectionEstablished()
await test.step(`Start Sketch is disabled`, async () => {
await expect(toolbar.startSketchBtn).not.toBeEnabled()
await editor.expectEditor.toContain(badCode, { shouldNormalise: true })
})
await test.step(`Helix is disabled`, async () => {
await expect(toolbar.helixButton).not.toBeEnabled()
await editor.expectEditor.toContain(badCode, { shouldNormalise: true })
})
})
})

View File

@ -19,11 +19,12 @@ test.describe('Regression tests', () => {
context,
page,
homePage,
scene,
}) => {
// because the model has `line([0,0]..` it is valid code, but the model is invalid
// regression test for https://github.com/KittyCAD/modeling-app/issues/3251
// Since the bad model also found as issue with the artifact graph, which in tern blocked the editor diognostics
const u = await getUtils(page)
// const u = await getUtils(page)
await context.addInitScript(async () => {
localStorage.setItem(
'persistCode',
@ -40,7 +41,8 @@ test.describe('Regression tests', () => {
await page.setBodyDimensions({ width: 1000, height: 500 })
await homePage.goToModelingScene()
await u.waitForPageLoad()
await scene.connectionEstablished()
// await u.waitForPageLoad()
// error in guter
await expect(page.locator('.cm-lint-marker-error')).toBeVisible()
@ -188,8 +190,8 @@ extrude001 = extrude(sketch001, length = 50)
page.locator('.pretty-json-container >> text=myVar:"67')
).toBeVisible()
})
test('ProgramMemory can be serialised', async ({ page, homePage }) => {
const u = await getUtils(page)
test('ProgramMemory can be serialised', async ({ page, homePage, scene }) => {
// const u = await getUtils(page)
await page.addInitScript(async () => {
localStorage.setItem(
'persistCode',
@ -214,11 +216,12 @@ extrude001 = extrude(sketch001, length = 50)
// Listen for all console events and push the message text to an array
page.on('console', (message) => messages.push(message.text()))
await homePage.goToModelingScene()
await u.waitForPageLoad()
// await u.waitForPageLoad()
await scene.connectionEstablished()
// wait for execution done
await u.openDebugPanel()
await u.expectCmdLog('[data-message-type="execution-done"]')
// await u.openDebugPanel()
// await u.expectCmdLog('[data-message-type="execution-done"]')
const forbiddenMessages = ['cannot serialize tagged newtype variant']
forbiddenMessages.forEach((forbiddenMessage) => {
@ -232,6 +235,7 @@ extrude001 = extrude(sketch001, length = 50)
context,
page,
homePage,
scene,
}) => {
const u = await getUtils(page)
// const PUR = 400 / 37.5 //pixeltoUnitRatio
@ -250,11 +254,10 @@ extrude001 = extrude(sketch001, length = 50)
shell(exampleSketch, faces = ['end'], thickness = 0.25)`
)
})
await homePage.goToModelingScene()
await scene.connectionEstablished()
await expect(async () => {
await homePage.goToModelingScene()
await u.waitForPageLoad()
// error in guter
await expect(page.locator('.cm-lint-marker-error')).toBeVisible({
timeout: 1_000,
@ -455,12 +458,10 @@ extrude002 = extrude(profile002, length = 150)
// Click the stl.
await expect(stlOption).toBeVisible()
await page.keyboard.press('Enter')
// Click the checkbox
await expect(submitButton).toBeVisible()
await page.keyboard.press('Enter')
// Find the toast.
@ -468,11 +469,13 @@ extrude002 = extrude(profile002, length = 150)
await expect(exportingToastMessage).toBeVisible()
// Expect it to succeed.
await expect(exportingToastMessage).not.toBeVisible({ timeout: 15_000 })
await expect(exportingToastMessage).not.toBeVisible()
await expect(engineErrorToastMessage).not.toBeVisible()
const successToastMessage = page.getByText(`Exported successfully`)
await expect(successToastMessage).toBeVisible()
await page.waitForTimeout(1_000)
const count = await successToastMessage.count()
await expect(count).toBeGreaterThanOrEqual(1)
}
)
// We updated this test such that you can have multiple exports going at once.

View File

@ -1365,18 +1365,18 @@ solid001 = subtract([extrude001], tools = [extrude002])
await page.addInitScript(async () => {
localStorage.setItem(
'persistCode',
`fn in2mm = (inches) => {
`fn in2mm(@inches) {
return inches * 25.4
}
const railTop = in2mm(.748)
const railSide = in2mm(.024)
const railBaseWidth = in2mm(.612)
const railWideWidth = in2mm(.835)
const railBaseLength = in2mm(.200)
const railClampable = in2mm(.200)
railTop = in2mm(.748)
railSide = in2mm(.024)
railBaseWidth = in2mm(.612)
railWideWidth = in2mm(.835)
railBaseLength = in2mm(.200)
railClampable = in2mm(.200)
const rail = startSketchOn(XZ)
rail = startSketchOn(XZ)
|> startProfile(at = [-railTop / 2, railClampable + railBaseLength])
|> line(endAbsolute = [
railTop / 2,
@ -3540,7 +3540,6 @@ profile001 = startProfile(sketch001, at = [127.56, 179.02])
await homePage.openProject('multi-file-sketch-test')
await scene.connectionEstablished()
await scene.settled(cmdBar)
await u.closeDebugPanel()
@ -3555,9 +3554,6 @@ profile001 = startProfile(sketch001, at = [127.56, 179.02])
await toolbar.openFile('error.kcl')
// Ensure filetree is populated
await scene.settled(cmdBar)
await expect(
toolbar.featureTreePane.getByRole('button', { name: 'Sketch' })
).toHaveCount(0)

View File

@ -1,4 +1,3 @@
import { KCL_DEFAULT_LENGTH } from '@src/lib/constants'
import type { CmdBarFixture } from '@e2e/playwright/fixtures/cmdBarFixture'
import type { SceneFixture } from '@e2e/playwright/fixtures/sceneFixture'
import { TEST_SETTINGS, TEST_SETTINGS_KEY } from '@e2e/playwright/storageStates'
@ -9,6 +8,7 @@ import {
settingsToToml,
} from '@e2e/playwright/test-utils'
import { expect, test } from '@e2e/playwright/zoo-test'
import { KCL_DEFAULT_LENGTH } from '@src/lib/constants'
test.beforeEach(async ({ page, context }) => {
// Make the user avatar image always 404
@ -766,7 +766,7 @@ test.describe('Grid visibility', { tag: '@snapshot' }, () => {
})
})
test('theme persists', async ({ page, context }) => {
test('theme persists', async ({ page, context, homePage }) => {
const u = await getUtils(page)
await context.addInitScript(async () => {
localStorage.setItem(
@ -784,7 +784,7 @@ test('theme persists', async ({ page, context }) => {
await page.setViewportSize({ width: 1200, height: 500 })
await u.waitForAuthSkipAppStart()
await homePage.goToModelingScene()
await page.waitForTimeout(500)
// await page.getByRole('link', { name: 'Settings Settings (tooltip)' }).click()
@ -812,7 +812,7 @@ test('theme persists', async ({ page, context }) => {
// Disconnect and reconnect to check the theme persists through a reload
// Expect the network to be down
await expect(networkToggle).toContainText('Offline')
await expect(networkToggle).toContainText('Problem')
// simulate network up
await u.emulateNetworkConditions({
@ -873,6 +873,50 @@ sweepSketch = startSketchOn(XY)
mask: lowerRightMasks(page),
})
})
test('code color goober works with single quotes', async ({
page,
context,
scene,
cmdBar,
}) => {
const u = await getUtils(page)
await context.addInitScript(async () => {
localStorage.setItem(
'persistCode',
`// Create a pipe using a sweep.
// Create a path for the sweep.
sweepPath = startSketchOn(XZ)
|> startProfile(at = [0.05, 0.05])
|> line(end = [0, 7])
|> tangentialArc(angle = 90, radius = 5)
|> line(end = [-3, 0])
|> tangentialArc(angle = -90, radius = 5)
|> line(end = [0, 7])
sweepSketch = startSketchOn(XY)
|> startProfile(at = [2, 0])
|> arc(angleStart = 0, angleEnd = 360, radius = 2)
|> sweep(path = sweepPath)
|> appearance(
color = '#bb00ff',
metalness = 90,
roughness = 90
)
`
)
})
await page.setViewportSize({ width: 1200, height: 1000 })
await u.waitForAuthSkipAppStart()
await scene.settled(cmdBar)
await expect(page, 'expect small color widget').toHaveScreenshot({
maxDiffPixels: 100,
mask: lowerRightMasks(page),
})
})
test('code color goober opening window', async ({
page,

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

View File

@ -1,19 +1,22 @@
import type { EngineCommand } from '@src/lang/std/artifactGraph'
import { uuidv4 } from '@src/lib/utils'
import { commonPoints, getUtils } from '@e2e/playwright/test-utils'
import {
commonPoints,
getUtils,
TEST_COLORS,
circleMove,
} from '@e2e/playwright/test-utils'
import { expect, test } from '@e2e/playwright/zoo-test'
test.describe(
'Test network and connection issues',
{
tag: ['@macos', '@windows'],
},
() => {
test.describe('Test network related behaviors', () => {
test(
'simulate network down and network little widget',
{ tag: '@skipLocalEngine' },
async ({ page, homePage }) => {
const networkToggleConnectedText = page.getByText('Connected')
const networkToggleWeakText = page.getByText('Network health (Weak)')
const u = await getUtils(page)
await page.setBodyDimensions({ width: 1200, height: 500 })
@ -34,7 +37,9 @@ test.describe(
await expect(networkPopover).not.toBeVisible()
// (First check) Expect the network to be up
await expect(networkToggle).toContainText('Connected')
await expect(
networkToggleConnectedText.or(networkToggleWeakText)
).toBeVisible()
// Click the network widget
await networkWidget.click()
@ -82,7 +87,9 @@ test.describe(
).not.toBeDisabled({ timeout: 15000 })
// (Second check) expect the network to be up
await expect(networkToggle).toContainText('Connected')
await expect(
networkToggleConnectedText.or(networkToggleWeakText)
).toBeVisible()
}
)
@ -91,6 +98,8 @@ test.describe(
{ tag: '@skipLocalEngine' },
async ({ page, homePage, toolbar, scene, cmdBar }) => {
const networkToggle = page.getByTestId('network-toggle')
const networkToggleConnectedText = page.getByText('Connected')
const networkToggleWeakText = page.getByText('Network health (Weak)')
const u = await getUtils(page)
await page.setBodyDimensions({ width: 1200, height: 500 })
@ -109,7 +118,7 @@ test.describe(
await page.mouse.click(700, 200)
await expect(page.locator('.cm-content')).toHaveText(
`sketch001 = startSketchOn(XZ)`
`@settings(defaultLengthUnit = in)sketch001 = startSketchOn(XZ)`
)
await u.closeDebugPanel()
@ -118,7 +127,7 @@ test.describe(
const startXPx = 600
await page.mouse.click(startXPx + PUR * 10, 500 - PUR * 10)
await expect(page.locator('.cm-content')).toHaveText(
`sketch001 = startSketchOn(XZ)profile001 = startProfile(sketch001, at = ${commonPoints.startAt})`
`@settings(defaultLengthUnit = in)sketch001 = startSketchOn(XZ)profile001 = startProfile(sketch001, at = ${commonPoints.startAt})`
)
await page.waitForTimeout(100)
@ -127,11 +136,14 @@ test.describe(
await expect(
page.locator('.cm-content')
).toHaveText(`sketch001 = startSketchOn(XZ)profile001 = startProfile(sketch001, at = ${commonPoints.startAt})
).toHaveText(`@settings(defaultLengthUnit = in)sketch001 = startSketchOn(XZ)profile001 = startProfile(sketch001, at = ${commonPoints.startAt})
|> xLine(length = ${commonPoints.num1})`)
// Expect the network to be up
await expect(networkToggle).toContainText('Connected')
await networkToggle.hover()
await expect(
networkToggleConnectedText.or(networkToggleWeakText)
).toBeVisible()
// simulate network down
await u.emulateNetworkConditions({
@ -143,6 +155,7 @@ test.describe(
})
// Expect the network to be down
await networkToggle.hover()
await expect(networkToggle).toContainText('Problem')
// Ensure we are not in sketch mode
@ -168,7 +181,11 @@ test.describe(
).not.toBeDisabled({ timeout: 15000 })
// Expect the network to be up
await expect(networkToggle).toContainText('Connected')
await networkToggle.hover()
await expect(
networkToggleConnectedText.or(networkToggleWeakText)
).toBeVisible()
await scene.settled(cmdBar)
// Click off the code pane.
@ -183,9 +200,7 @@ test.describe(
await toolbar.editSketch()
// Click the line tool
await page
.getByRole('button', { name: 'line Line', exact: true })
.click()
await page.getByRole('button', { name: 'line Line', exact: true }).click()
await page.waitForTimeout(150)
@ -219,7 +234,10 @@ test.describe(
await page.mouse.click(startXPx + PUR * 20, 500 - PUR * 20)
await expect
.poll(u.normalisedEditorCode)
.toBe(`sketch001 = startSketchOn(XZ)
.toBe(`@settings(defaultLengthUnit = in)
sketch001 = startSketchOn(XZ)
profile001 = startProfile(sketch001, at = [12.34, -12.34])
|> xLine(length = 12.34)
|> line(end = [-12.34, 12.34])
@ -230,7 +248,10 @@ profile001 = startProfile(sketch001, at = [12.34, -12.34])
await expect
.poll(u.normalisedEditorCode)
.toBe(`sketch001 = startSketchOn(XZ)
.toBe(`@settings(defaultLengthUnit = in)
sketch001 = startSketchOn(XZ)
profile001 = startProfile(sketch001, at = [12.34, -12.34])
|> xLine(length = 12.34)
|> line(end = [-12.34, 12.34])
@ -255,5 +276,88 @@ profile001 = startProfile(sketch001, at = [12.34, -12.34])
).not.toBeVisible()
}
)
test(
'Paused stream freezes view frame, unpause reconnect is seamless to user',
{ tag: ['@electron', '@skipLocalEngine'] },
async ({ page, homePage, scene, cmdBar, toolbar, tronApp }) => {
const networkToggle = page.getByTestId('network-toggle')
const networkToggleConnectedText = page.getByText('Connected')
const networkToggleWeakText = page.getByText('Network health (Weak)')
if (!tronApp) {
fail()
}
)
await tronApp.cleanProjectDir({
app: {
stream_idle_mode: 5000,
},
})
await page.addInitScript(async () => {
localStorage.setItem(
'persistCode',
`sketch001 = startSketchOn(XY)
profile001 = startProfile(sketch001, at = [0.0, 0.0])
|> line(end = [10.0, 0])
|> line(end = [0, 10.0])
|> close()`
)
})
const dim = { width: 1200, height: 500 }
await page.setBodyDimensions(dim)
await test.step('Go to modeling scene', async () => {
await homePage.goToModelingScene()
await scene.settled(cmdBar)
})
await test.step('Verify pausing behavior', async () => {
// Wait 5s + 1s to pause.
await page.waitForTimeout(6000)
// We should now be paused. To the user, it should appear we're still
// connected.
await networkToggle.hover()
await expect(
networkToggleConnectedText.or(networkToggleWeakText)
).toBeVisible()
const center = {
x: dim.width / 2,
y: dim.height / 2,
}
let probe = { x: 0, y: 0 }
// ... and the model's still visibly there
probe.x = center.x + dim.width / 100
probe.y = center.y
await scene.expectPixelColor(TEST_COLORS.GREY, probe, 15)
probe = { ...center }
// Now move the mouse around to unpause!
await circleMove(page, probe.x, probe.y, 20, 10)
// ONCE AGAIN! Check the view area hasn't changed at all.
// Check the pixel a couple times as it reconnects.
// NOTE: Remember, idle behavior is still on at this point -
// if this test takes longer than 5s shit WILL go south!
probe.x = center.x + dim.width / 100
probe.y = center.y
await scene.expectPixelColor(TEST_COLORS.GREY, probe, 15)
await page.waitForTimeout(1000)
await scene.expectPixelColor(TEST_COLORS.GREY, probe, 15)
probe = { ...center }
// Ensure we're still connected
await networkToggle.hover()
await expect(
networkToggleConnectedText.or(networkToggleWeakText)
).toBeVisible()
})
}
)
})

View File

@ -44,6 +44,8 @@ export const lowerRightMasks = (page: Page) => [
export type TestColor = [number, number, number]
export const TEST_COLORS: { [key: string]: TestColor } = {
WHITE: [249, 249, 249],
OFFWHITE: [237, 237, 237],
GREY: [142, 142, 142],
YELLOW: [255, 255, 0],
BLUE: [0, 0, 255],
DARK_MODE_BKGD: [27, 27, 27],

View File

@ -1,19 +1,22 @@
@precedence {
annotation
typeCall
member
call
exp @left
mult @left
add @left
ascription @left
comp @left
logic @left
pipe @left
range
statement
}
@top Program {
Shebang?
statement*
(statement !statement statement*)?
}
statement[@isGroup=Statement] {
@ -52,12 +55,15 @@ expression[@isGroup=Expression] {
UnaryExpression { UnaryOp expression } |
ParenthesizedExpression { "(" expression ")" } |
IfExpression { kw<"if"> expression Body kw<"else"> Body } |
CallExpression { expression !call ArgumentList } |
// We don't currently support arbitrary expressions as the callee part of a
// function call.
CallExpression { identifier !call ArgumentList } |
ArrayExpression { "[" commaSep<expression | IntegerRange { expression !range ".." expression }> "]" } |
ObjectExpression { "{" commaSep<ObjectProperty> "}" } |
MemberExpression { expression !member "." PropertyName } |
SubscriptExpression { expression !member "[" expression "]" } |
PipeExpression { expression (!pipe PipeOperator expression)+ }
PipeExpression { expression (!pipe PipeOperator expression)+ } |
AscribedExpression { expression !ascription ":" type }
}
UnaryOp { AddOp | BangOp }
@ -75,7 +81,7 @@ LabeledArgument { ArgumentLabel Equals expression }
ArgumentList { "(" commaSep<LabeledArgument | expression> ")" }
type[@isGroup=Type] {
PrimitiveType { identifier } |
PrimitiveType { identifier !typeCall ("(" identifier ")")? } |
ArrayType { "[" type !member (";" Number "+"?)? "]" } |
ObjectType { "{" commaSep<ObjectProperty { PropertyName ":" type }> "}" }
}

View File

@ -0,0 +1,13 @@
# primitive
true: bool
==>
Program(ExpressionStatement(AscribedExpression(true, ":", PrimitiveType)))
# numeric units
3.5: number(mm)
==>
Program(ExpressionStatement(AscribedExpression(3.5, ":", PrimitiveType)))

34
rust/Cargo.lock generated
View File

@ -535,7 +535,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c"
dependencies = [
"lazy_static",
"windows-sys 0.52.0",
"windows-sys 0.59.0",
]
[[package]]
@ -963,7 +963,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d"
dependencies = [
"libc",
"windows-sys 0.52.0",
"windows-sys 0.59.0",
]
[[package]]
@ -1746,7 +1746,7 @@ checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9"
dependencies = [
"hermit-abi",
"libc",
"windows-sys 0.52.0",
"windows-sys 0.59.0",
]
[[package]]
@ -1815,7 +1815,7 @@ dependencies = [
[[package]]
name = "kcl-bumper"
version = "0.1.70"
version = "0.1.73"
dependencies = [
"anyhow",
"clap",
@ -1826,7 +1826,7 @@ dependencies = [
[[package]]
name = "kcl-derive-docs"
version = "0.1.70"
version = "0.1.73"
dependencies = [
"Inflector",
"anyhow",
@ -1845,7 +1845,7 @@ dependencies = [
[[package]]
name = "kcl-directory-test-macro"
version = "0.1.70"
version = "0.1.73"
dependencies = [
"proc-macro2",
"quote",
@ -1854,7 +1854,7 @@ dependencies = [
[[package]]
name = "kcl-language-server"
version = "0.2.70"
version = "0.2.73"
dependencies = [
"anyhow",
"clap",
@ -1875,7 +1875,7 @@ dependencies = [
[[package]]
name = "kcl-language-server-release"
version = "0.1.70"
version = "0.1.73"
dependencies = [
"anyhow",
"clap",
@ -1895,7 +1895,7 @@ dependencies = [
[[package]]
name = "kcl-lib"
version = "0.2.70"
version = "0.2.73"
dependencies = [
"anyhow",
"approx 0.5.1",
@ -1971,7 +1971,7 @@ dependencies = [
[[package]]
name = "kcl-python-bindings"
version = "0.3.70"
version = "0.3.73"
dependencies = [
"anyhow",
"kcl-lib",
@ -1986,7 +1986,7 @@ dependencies = [
[[package]]
name = "kcl-test-server"
version = "0.1.70"
version = "0.1.73"
dependencies = [
"anyhow",
"hyper 0.14.32",
@ -1999,7 +1999,7 @@ dependencies = [
[[package]]
name = "kcl-to-core"
version = "0.1.70"
version = "0.1.73"
dependencies = [
"anyhow",
"async-trait",
@ -2013,7 +2013,7 @@ dependencies = [
[[package]]
name = "kcl-wasm-lib"
version = "0.1.70"
version = "0.1.73"
dependencies = [
"anyhow",
"bson",
@ -2987,7 +2987,7 @@ dependencies = [
"once_cell",
"socket2",
"tracing",
"windows-sys 0.52.0",
"windows-sys 0.59.0",
]
[[package]]
@ -3306,7 +3306,7 @@ dependencies = [
"errno",
"libc",
"linux-raw-sys",
"windows-sys 0.52.0",
"windows-sys 0.59.0",
]
[[package]]
@ -3900,7 +3900,7 @@ dependencies = [
"getrandom 0.3.1",
"once_cell",
"rustix",
"windows-sys 0.52.0",
"windows-sys 0.59.0",
]
[[package]]
@ -4753,7 +4753,7 @@ version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
dependencies = [
"windows-sys 0.52.0",
"windows-sys 0.59.0",
]
[[package]]

View File

@ -1,7 +1,7 @@
[package]
name = "kcl-bumper"
version = "0.1.70"
version = "0.1.73"
edition = "2021"
repository = "https://github.com/KittyCAD/modeling-api"
rust-version = "1.76"

View File

@ -1,7 +1,7 @@
[package]
name = "kcl-derive-docs"
description = "A tool for generating documentation from Rust derive macros"
version = "0.1.70"
version = "0.1.73"
edition = "2021"
license = "MIT"
repository = "https://github.com/KittyCAD/modeling-app"

View File

@ -1,7 +1,7 @@
[package]
name = "kcl-directory-test-macro"
description = "A tool for generating tests from a directory of kcl files"
version = "0.1.70"
version = "0.1.73"
edition = "2021"
license = "MIT"
repository = "https://github.com/KittyCAD/modeling-app"

View File

@ -1,6 +1,6 @@
[package]
name = "kcl-language-server-release"
version = "0.1.70"
version = "0.1.73"
edition = "2021"
authors = ["KittyCAD Inc <kcl@kittycad.io>"]
publish = false

View File

@ -2,7 +2,7 @@
name = "kcl-language-server"
description = "A language server for KCL."
authors = ["KittyCAD Inc <kcl@kittycad.io>"]
version = "0.2.70"
version = "0.2.73"
edition = "2021"
license = "MIT"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

View File

@ -1,7 +1,7 @@
[package]
name = "kcl-lib"
description = "KittyCAD Language implementation and tools"
version = "0.2.70"
version = "0.2.73"
edition = "2021"
license = "MIT"
repository = "https://github.com/KittyCAD/modeling-app"

View File

@ -259,18 +259,23 @@ extrude(profile001, length = 100)"#
#[tokio::test(flavor = "multi_thread")]
async fn kcl_test_cache_add_line_preserves_artifact_commands() {
let code = r#"sketch001 = startSketchOn(XY)
|> startProfile(at = [5.5229, 5.25217])
|> line(end = [10.50433, -1.19122])
|> line(end = [8.01362, -5.48731])
|> line(end = [-1.02877, -6.76825])
|> line(end = [-11.53311, 2.81559])
profile001 = startProfile(sketch001, at = [5.5, 5.25])
|> line(end = [10.5, -1.19])
|> line(end = [8, -5.5])
|> line(end = [-1.02, -6.76])
|> line(end = [-11.5, 2.8])
|> close()
plane001 = offsetPlane(XY, offset = 20)
"#;
// Use a new statement; don't extend the prior pipeline. This allows us to
// detect a prefix.
let code_with_extrude = code.to_owned()
+ r#"
extrude(sketch001, length = 4)
profile002 = startProfile(plane001, at = [0, 0])
|> line(end = [0, 10])
|> line(end = [10, 0])
|> close()
extrude001 = extrude(profile001, length = 4)
"#;
let result = cache_test(
@ -305,6 +310,24 @@ extrude(sketch001, length = 4)
first.artifact_graph.len(),
second.artifact_graph.len()
);
// Make sure we have NodePaths referring to the old code.
let graph = &second.artifact_graph;
assert!(!graph.is_empty());
for artifact in graph.values() {
assert!(!artifact.code_ref().map(|c| c.node_path.is_empty()).unwrap_or(false));
assert!(
!artifact
.face_code_ref()
// TODO: This fails, but it shouldn't.
// .map(|c| c.node_path.is_empty())
// Allowing the NodePath to be empty if the SourceRange is [0,
// 0] as a more lenient check.
.map(|c| !c.range.is_synthetic() && c.node_path.is_empty())
.unwrap_or(false),
"artifact={:?}",
artifact
);
}
}
#[tokio::test(flavor = "multi_thread")]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 48 KiB

View File

@ -788,6 +788,7 @@ impl ArgData {
Some("Axis2d | Edge") | Some("Axis3d | Edge") => Some((index, format!(r#"{label}${{{index}:X}}"#))),
Some("Edge") => Some((index, format!(r#"{label}${{{index}:tag_or_edge_fn}}"#))),
Some("[Edge; 1+]") => Some((index, format!(r#"{label}[${{{index}:tag_or_edge_fn}}]"#))),
Some("Plane") => Some((index, format!(r#"{label}${{{}:XY}}"#, index))),
Some("string") => Some((index, format!(r#"{label}${{{}:"string"}}"#, index))),
Some("bool") => Some((index, format!(r#"{label}${{{}:false}}"#, index))),

View File

@ -1167,6 +1167,16 @@ mod tests {
assert_eq!(snippet, r#"clone(${0:part001})"#);
}
#[test]
fn get_autocomplete_snippet_offset_plane() {
let data = kcl_doc::walk_prelude();
let DocData::Fn(offset_plane_fn) = data.find_by_name("offsetPlane").unwrap() else {
panic!();
};
let snippet = offset_plane_fn.to_autocomplete_snippet();
assert_eq!(snippet, r#"offsetPlane(${0:XY}, offset = ${1:3.14})"#);
}
// We want to test the snippets we compile at lsp start.
#[test]
fn get_all_stdlib_autocomplete_snippets() {

View File

@ -129,6 +129,7 @@ impl From<KclErrorWithOutputs> for KclError {
#[serde(rename_all = "camelCase")]
pub struct KclErrorWithOutputs {
pub error: KclError,
pub non_fatal: Vec<CompilationError>,
#[cfg(feature = "artifact-graph")]
pub operations: Vec<Operation>,
#[cfg(feature = "artifact-graph")]
@ -141,8 +142,10 @@ pub struct KclErrorWithOutputs {
}
impl KclErrorWithOutputs {
#[allow(clippy::too_many_arguments)]
pub fn new(
error: KclError,
non_fatal: Vec<CompilationError>,
#[cfg(feature = "artifact-graph")] operations: Vec<Operation>,
#[cfg(feature = "artifact-graph")] artifact_commands: Vec<ArtifactCommand>,
#[cfg(feature = "artifact-graph")] artifact_graph: ArtifactGraph,
@ -152,6 +155,7 @@ impl KclErrorWithOutputs {
) -> Self {
Self {
error,
non_fatal,
#[cfg(feature = "artifact-graph")]
operations,
#[cfg(feature = "artifact-graph")]
@ -166,6 +170,7 @@ impl KclErrorWithOutputs {
pub fn no_outputs(error: KclError) -> Self {
Self {
error,
non_fatal: Default::default(),
#[cfg(feature = "artifact-graph")]
operations: Default::default(),
#[cfg(feature = "artifact-graph")]

View File

@ -115,7 +115,7 @@ where
seq.end()
}
#[derive(Debug, Clone, Serialize, PartialEq, Eq, ts_rs::TS)]
#[derive(Debug, Clone, Default, Serialize, PartialEq, Eq, ts_rs::TS)]
#[ts(export_to = "Artifact.ts")]
#[serde(rename_all = "camelCase")]
pub struct CodeRef {
@ -396,7 +396,6 @@ pub enum Artifact {
Cap(Cap),
SweepEdge(SweepEdge),
EdgeCut(EdgeCut),
#[expect(unused)]
EdgeCutEdge(EdgeCutEdge),
Helix(Helix),
}
@ -550,8 +549,9 @@ impl Artifact {
}
}
#[expect(dead_code)]
pub(crate) fn code_ref(&self) -> Option<&CodeRef> {
/// The [`CodeRef`] for the artifact itself. See also
/// [`Self::face_code_ref`].
pub fn code_ref(&self) -> Option<&CodeRef> {
match self {
Artifact::CompositeSolid(a) => Some(&a.code_ref),
Artifact::Plane(a) => Some(&a.code_ref),
@ -570,6 +570,24 @@ impl Artifact {
}
}
/// The [`CodeRef`] referring to the face artifact that it's on, not the
/// artifact itself.
pub fn face_code_ref(&self) -> Option<&CodeRef> {
match self {
Artifact::CompositeSolid(_)
| Artifact::Plane(_)
| Artifact::Path(_)
| Artifact::Segment(_)
| Artifact::Solid2d(_)
| Artifact::StartSketchOnFace(_)
| Artifact::StartSketchOnPlane(_)
| Artifact::Sweep(_) => None,
Artifact::Wall(a) => Some(&a.face_code_ref),
Artifact::Cap(a) => Some(&a.face_code_ref),
Artifact::SweepEdge(_) | Artifact::EdgeCut(_) | Artifact::EdgeCutEdge(_) | Artifact::Helix(_) => None,
}
}
/// Merge the new artifact into self. If it can't because it's a different
/// type, return the new artifact which should be used as a replacement.
fn merge(&mut self, new: Artifact) -> Option<Artifact> {
@ -704,6 +722,19 @@ impl ArtifactGraph {
self.map.len()
}
pub fn is_empty(&self) -> bool {
self.map.is_empty()
}
pub fn values(&self) -> impl Iterator<Item = &Artifact> {
self.map.values()
}
/// Consume the artifact graph and return the map of artifacts.
fn into_map(self) -> IndexMap<ArtifactId, Artifact> {
self.map
}
/// Used to make the mermaid tests deterministic.
#[cfg(test)]
pub(crate) fn sort(&mut self) {
@ -712,17 +743,29 @@ impl ArtifactGraph {
}
}
/// Build the artifact graph from the artifact commands and the responses. The
/// initial graph is the graph cached from a previous execution. NodePaths of
/// `exec_artifacts` are filled in from the AST.
pub(super) fn build_artifact_graph(
artifact_commands: &[ArtifactCommand],
responses: &IndexMap<Uuid, WebSocketResponse>,
ast: &Node<Program>,
exec_artifacts: &IndexMap<ArtifactId, Artifact>,
exec_artifacts: &mut IndexMap<ArtifactId, Artifact>,
initial_graph: ArtifactGraph,
) -> Result<ArtifactGraph, KclError> {
let mut map = IndexMap::new();
let mut map = initial_graph.into_map();
let mut path_to_plane_id_map = FnvHashMap::default();
let mut current_plane_id = None;
// Fill in NodePaths for artifacts that were added directly to the map
// during execution.
for exec_artifact in exec_artifacts.values_mut() {
// Note: We only have access to the new AST. So if these artifacts
// somehow came from cached AST, this won't fill in anything.
fill_in_node_paths(exec_artifact, ast);
}
for artifact_command in artifact_commands {
if let ModelingCmd::EnableSketchMode(EnableSketchMode { entity_id, .. }) = artifact_command.command {
current_plane_id = Some(entity_id);
@ -762,6 +805,24 @@ pub(super) fn build_artifact_graph(
Ok(ArtifactGraph { map })
}
/// These may have been created with placeholder `CodeRef`s because we didn't
/// have the entire AST available. Now we fill them in.
fn fill_in_node_paths(artifact: &mut Artifact, program: &Node<Program>) {
match artifact {
Artifact::StartSketchOnFace(face) => {
if face.code_ref.node_path.is_empty() {
face.code_ref.node_path = NodePath::from_range(program, face.code_ref.range).unwrap_or_default();
}
}
Artifact::StartSketchOnPlane(plane) => {
if plane.code_ref.node_path.is_empty() {
plane.code_ref.node_path = NodePath::from_range(program, plane.code_ref.range).unwrap_or_default();
}
}
_ => {}
}
}
/// Flatten the responses into a map of command IDs to modeling command
/// responses. The raw responses from the engine contain batches.
fn flatten_modeling_command_responses(
@ -846,6 +907,12 @@ fn artifacts_to_update(
ast: &Node<Program>,
exec_artifacts: &IndexMap<ArtifactId, Artifact>,
) -> Result<Vec<Artifact>, KclError> {
let uuid = artifact_command.cmd_id;
let Some(response) = responses.get(&uuid) else {
// Response not found or not successful.
return Ok(Vec::new());
};
// TODO: Build path-to-node from artifact_command source range. Right now,
// we're serializing an empty array, and the TS wrapper fills it in with the
// correct value based on NodePath.
@ -858,14 +925,7 @@ fn artifacts_to_update(
path_to_node,
};
let uuid = artifact_command.cmd_id;
let id = ArtifactId::new(uuid);
let Some(response) = responses.get(&uuid) else {
// Response not found or not successful.
return Ok(Vec::new());
};
let cmd = &artifact_command.command;
match cmd {
@ -1100,16 +1160,19 @@ fn artifacts_to_update(
let extra_artifact = exec_artifacts.values().find(|a| {
if let Artifact::StartSketchOnFace(s) = a {
s.face_id == face_id
} else if let Artifact::StartSketchOnPlane(s) = a {
s.plane_id == face_id
} else {
false
}
});
let sketch_on_face_source_range = extra_artifact
let sketch_on_face_code_ref = extra_artifact
.and_then(|a| match a {
Artifact::StartSketchOnFace(s) => Some(s.code_ref.range),
// TODO: If we didn't find it, it's probably a bug.
Artifact::StartSketchOnFace(s) => Some(s.code_ref.clone()),
Artifact::StartSketchOnPlane(s) => Some(s.code_ref.clone()),
_ => None,
})
// TODO: If we didn't find it, it's probably a bug.
.unwrap_or_default();
return_arr.push(Artifact::Wall(Wall {
@ -1118,11 +1181,7 @@ fn artifacts_to_update(
edge_cut_edge_ids: Vec::new(),
sweep_id: path_sweep_id,
path_ids: Vec::new(),
face_code_ref: CodeRef {
range: sketch_on_face_source_range,
node_path: NodePath::from_range(ast, sketch_on_face_source_range).unwrap_or_default(),
path_to_node: Vec::new(),
},
face_code_ref: sketch_on_face_code_ref,
cmd_id: artifact_command.cmd_id,
}));
let mut new_seg = seg.clone();
@ -1155,15 +1214,19 @@ fn artifacts_to_update(
let extra_artifact = exec_artifacts.values().find(|a| {
if let Artifact::StartSketchOnFace(s) = a {
s.face_id == face_id
} else if let Artifact::StartSketchOnPlane(s) = a {
s.plane_id == face_id
} else {
false
}
});
let sketch_on_face_source_range = extra_artifact
let sketch_on_face_code_ref = extra_artifact
.and_then(|a| match a {
Artifact::StartSketchOnFace(s) => Some(s.code_ref.range),
Artifact::StartSketchOnFace(s) => Some(s.code_ref.clone()),
Artifact::StartSketchOnPlane(s) => Some(s.code_ref.clone()),
_ => None,
})
// TODO: If we didn't find it, it's probably a bug.
.unwrap_or_default();
return_arr.push(Artifact::Cap(Cap {
id: face_id,
@ -1171,11 +1234,7 @@ fn artifacts_to_update(
edge_cut_edge_ids: Vec::new(),
sweep_id: path_sweep_id,
path_ids: Vec::new(),
face_code_ref: CodeRef {
range: sketch_on_face_source_range,
node_path: NodePath::from_range(ast, sketch_on_face_source_range).unwrap_or_default(),
path_to_node: Vec::new(),
},
face_code_ref: sketch_on_face_code_ref,
cmd_id: artifact_command.cmd_id,
}));
let Some(Artifact::Sweep(sweep)) = artifacts.get(&path_sweep_id) else {

View File

@ -298,13 +298,19 @@ impl ArtifactGraph {
let range = code_ref.range;
[range.start(), range.end(), range.module_id().as_usize()]
}
fn node_path_display<W: Write>(output: &mut W, prefix: &str, code_ref: &CodeRef) -> std::fmt::Result {
fn node_path_display<W: Write>(
output: &mut W,
prefix: &str,
label: Option<&str>,
code_ref: &CodeRef,
) -> std::fmt::Result {
// %% is a mermaid comment. Prefix is increased one level since it's
// a child of the line above it.
let label = label.unwrap_or("");
if code_ref.node_path.is_empty() {
return writeln!(output, "{prefix} %% Missing NodePath");
return writeln!(output, "{prefix} %% {label}Missing NodePath");
}
writeln!(output, "{prefix} %% {:?}", code_ref.node_path.steps)
writeln!(output, "{prefix} %% {label}{:?}", code_ref.node_path.steps)
}
match artifact {
@ -315,7 +321,7 @@ impl ArtifactGraph {
composite_solid.sub_type,
code_ref_display(&composite_solid.code_ref)
)?;
node_path_display(output, prefix, &composite_solid.code_ref)?;
node_path_display(output, prefix, None, &composite_solid.code_ref)?;
}
Artifact::Plane(plane) => {
writeln!(
@ -323,7 +329,7 @@ impl ArtifactGraph {
"{prefix}{id}[\"Plane<br>{:?}\"]",
code_ref_display(&plane.code_ref)
)?;
node_path_display(output, prefix, &plane.code_ref)?;
node_path_display(output, prefix, None, &plane.code_ref)?;
}
Artifact::Path(path) => {
writeln!(
@ -331,7 +337,7 @@ impl ArtifactGraph {
"{prefix}{id}[\"Path<br>{:?}\"]",
code_ref_display(&path.code_ref)
)?;
node_path_display(output, prefix, &path.code_ref)?;
node_path_display(output, prefix, None, &path.code_ref)?;
}
Artifact::Segment(segment) => {
writeln!(
@ -339,7 +345,7 @@ impl ArtifactGraph {
"{prefix}{id}[\"Segment<br>{:?}\"]",
code_ref_display(&segment.code_ref)
)?;
node_path_display(output, prefix, &segment.code_ref)?;
node_path_display(output, prefix, None, &segment.code_ref)?;
}
Artifact::Solid2d(_solid2d) => {
writeln!(output, "{prefix}{}[Solid2d]", id)?;
@ -350,7 +356,7 @@ impl ArtifactGraph {
"{prefix}{id}[\"StartSketchOnFace<br>{:?}\"]",
code_ref_display(code_ref)
)?;
node_path_display(output, prefix, code_ref)?;
node_path_display(output, prefix, None, code_ref)?;
}
Artifact::StartSketchOnPlane(StartSketchOnPlane { code_ref, .. }) => {
writeln!(
@ -358,7 +364,7 @@ impl ArtifactGraph {
"{prefix}{id}[\"StartSketchOnPlane<br>{:?}\"]",
code_ref_display(code_ref)
)?;
node_path_display(output, prefix, code_ref)?;
node_path_display(output, prefix, None, code_ref)?;
}
Artifact::Sweep(sweep) => {
writeln!(
@ -367,13 +373,15 @@ impl ArtifactGraph {
sweep.sub_type,
code_ref_display(&sweep.code_ref)
)?;
node_path_display(output, prefix, &sweep.code_ref)?;
node_path_display(output, prefix, None, &sweep.code_ref)?;
}
Artifact::Wall(_wall) => {
Artifact::Wall(wall) => {
writeln!(output, "{prefix}{id}[Wall]")?;
node_path_display(output, prefix, Some("face_code_ref="), &wall.face_code_ref)?;
}
Artifact::Cap(cap) => {
writeln!(output, "{prefix}{id}[\"Cap {:?}\"]", cap.sub_type)?;
node_path_display(output, prefix, Some("face_code_ref="), &cap.face_code_ref)?;
}
Artifact::SweepEdge(sweep_edge) => {
writeln!(output, "{prefix}{id}[\"SweepEdge {:?}\"]", sweep_edge.sub_type)?;
@ -385,7 +393,7 @@ impl ArtifactGraph {
edge_cut.sub_type,
code_ref_display(&edge_cut.code_ref)
)?;
node_path_display(output, prefix, &edge_cut.code_ref)?;
node_path_display(output, prefix, None, &edge_cut.code_ref)?;
}
Artifact::EdgeCutEdge(_edge_cut_edge) => {
writeln!(output, "{prefix}{id}[EdgeCutEdge]")?;
@ -396,7 +404,7 @@ impl ArtifactGraph {
"{prefix}{id}[\"Helix<br>{:?}\"]",
code_ref_display(&helix.code_ref)
)?;
node_path_display(output, prefix, &helix.code_ref)?;
node_path_display(output, prefix, None, &helix.code_ref)?;
}
}
Ok(())

View File

@ -736,21 +736,35 @@ fn apply_ascription(
let ty = RuntimeType::from_parsed(ty.inner.clone(), exec_state, value.into())
.map_err(|e| KclError::Semantic(e.into()))?;
if let KclValue::Number { value, meta, .. } = value {
let mut value = value.clone();
// If the number has unknown units but the user is explicitly specifying them, treat the value as having had it's units erased,
// rather than forcing the user to explicitly erase them.
KclValue::Number {
if let KclValue::Number { value: n, meta, .. } = &value {
if let RuntimeType::Primitive(PrimitiveType::Number(num)) = &ty {
if num.is_fully_specified() {
value = KclValue::Number {
ty: NumericType::Any,
value: *value,
value: *n,
meta: meta.clone(),
};
}
.coerce(&ty, exec_state)
}
}
value.coerce(&ty, exec_state).map_err(|_| {
let suggestion = if ty == RuntimeType::length() {
", you might try coercing to a fully specified numeric type such as `number(mm)`"
} else if ty == RuntimeType::angle() {
", you might try coercing to a fully specified numeric type such as `number(deg)`"
} else {
value.coerce(&ty, exec_state)
}
.map_err(|_| {
""
};
KclError::Semantic(KclErrorDetails {
message: format!("could not coerce {} value to type {}", value.human_friendly_type(), ty),
message: format!(
"could not coerce {} value to type {ty}{suggestion}",
value.human_friendly_type()
),
source_ranges: vec![source_range],
})
})
@ -1453,7 +1467,6 @@ impl Node<CallExpressionKw> {
.await
.map_err(|e| {
// Add the call expression to the source ranges.
// TODO currently ignored by the frontend
e.add_source_ranges(vec![callsite])
})?;
@ -2767,4 +2780,29 @@ startSketchOn(XY)
// Make sure we get a useful error message and not an engine error.
assert!(e.message().contains("sqrt"), "Error message: '{}'", e.message());
}
#[tokio::test(flavor = "multi_thread")]
async fn coerce_unknown_to_length() {
let ast = r#"x = 2mm * 2mm
y = x: number(Length)"#;
let e = parse_execute(ast).await.unwrap_err();
assert!(
e.message().contains("could not coerce"),
"Error message: '{}'",
e.message()
);
let ast = r#"x = 2mm
y = x: number(Length)"#;
let result = parse_execute(ast).await.unwrap();
let mem = result.exec_state.stack();
let num = mem
.memory
.get_from("y", result.mem_env, SourceRange::default(), 0)
.unwrap()
.as_ty_f64()
.unwrap();
assert_eq!(num.n, 2.0);
assert_eq!(num.ty, NumericType::mm());
}
}

View File

@ -426,14 +426,14 @@ impl ExecutorContext {
}
#[cfg(not(target_arch = "wasm32"))]
pub async fn new_mock() -> Self {
pub async fn new_mock(settings: Option<ExecutorSettings>) -> Self {
ExecutorContext {
engine: Arc::new(Box::new(
crate::engine::conn_mock::EngineConnection::new().await.unwrap(),
)),
fs: Arc::new(FileManager::new()),
stdlib: Arc::new(StdLib::new()),
settings: Default::default(),
settings: settings.unwrap_or_default(),
context_type: ContextType::Mock,
}
}
@ -823,6 +823,7 @@ impl ExecutorContext {
KclErrorWithOutputs::new(
err,
exec_state.errors().to_vec(),
#[cfg(feature = "artifact-graph")]
exec_state.global.operations.clone(),
#[cfg(feature = "artifact-graph")]
@ -999,6 +1000,7 @@ impl ExecutorContext {
return Err(KclErrorWithOutputs::new(
e,
exec_state.errors().to_vec(),
#[cfg(feature = "artifact-graph")]
exec_state.global.operations.clone(),
#[cfg(feature = "artifact-graph")]
@ -1048,6 +1050,7 @@ impl ExecutorContext {
KclErrorWithOutputs::new(
err,
exec_state.errors().to_vec(),
#[cfg(feature = "artifact-graph")]
exec_state.global.operations.clone(),
#[cfg(feature = "artifact-graph")]
@ -1100,6 +1103,7 @@ impl ExecutorContext {
KclErrorWithOutputs::new(
e,
exec_state.errors().to_vec(),
#[cfg(feature = "artifact-graph")]
exec_state.global.operations.clone(),
#[cfg(feature = "artifact-graph")]
@ -1155,23 +1159,24 @@ impl ExecutorContext {
#[cfg(feature = "artifact-graph")]
{
// Move the artifact commands and responses to simplify cache management
// and error creation.
exec_state
.global
.artifact_commands
.extend(self.engine.take_artifact_commands().await);
exec_state
.global
.artifact_responses
.extend(self.engine.take_responses().await);
let new_commands = self.engine.take_artifact_commands().await;
let new_responses = self.engine.take_responses().await;
let initial_graph = exec_state.global.artifact_graph.clone();
// Build the artifact graph.
match build_artifact_graph(
&exec_state.global.artifact_commands,
&exec_state.global.artifact_responses,
let graph_result = build_artifact_graph(
&new_commands,
&new_responses,
program,
&exec_state.global.artifacts,
) {
&mut exec_state.global.artifacts,
initial_graph,
);
// Move the artifact commands and responses into ExecState to
// simplify cache management and error creation.
exec_state.global.artifact_commands.extend(new_commands);
exec_state.global.artifact_responses.extend(new_responses);
match graph_result {
Ok(artifact_graph) => {
exec_state.global.artifact_graph = artifact_graph;
exec_result.map(|(_, env_ref, _)| env_ref)
@ -2232,7 +2237,7 @@ w = f() + f()
let result = ctx.run_with_caching(program).await.unwrap();
assert_eq!(result.variables.get("x").unwrap().as_f64().unwrap(), 2.0);
let ctx2 = ExecutorContext::new_mock().await;
let ctx2 = ExecutorContext::new_mock(None).await;
let program2 = crate::Program::parse_no_errs("z = x + 1").unwrap();
let result = ctx2.run_mock(program2, true).await.unwrap();
assert_eq!(result.variables.get("z").unwrap().as_f64().unwrap(), 3.0);

View File

@ -664,6 +664,17 @@ impl NumericType {
)
}
pub fn is_fully_specified(&self) -> bool {
!matches!(
self,
NumericType::Unknown
| NumericType::Known(UnitType::Angle(UnitAngle::Unknown))
| NumericType::Known(UnitType::Length(UnitLen::Unknown))
| NumericType::Any
| NumericType::Default { .. }
)
}
fn example_ty(&self) -> Option<String> {
match self {
Self::Known(t) if !self.is_unknown() => Some(t.to_string()),
@ -1266,7 +1277,15 @@ impl KclValue {
.satisfied(values.len(), allow_shrink)
.ok_or(CoercionError::from(self))?;
assert!(len <= values.len());
if len > values.len() {
let message = format!(
"Internal: Expected coerced array length {len} to be less than or equal to original length {}",
values.len()
);
exec_state.err(CompilationError::err(self.into(), message.clone()));
#[cfg(debug_assertions)]
panic!("{message}");
}
values.truncate(len);
Ok(KclValue::HomArray {
@ -1460,7 +1479,7 @@ mod test {
#[tokio::test(flavor = "multi_thread")]
async fn coerce_idempotent() {
let mut exec_state = ExecState::new(&crate::ExecutorContext::new_mock().await);
let mut exec_state = ExecState::new(&crate::ExecutorContext::new_mock(None).await);
let values = values(&mut exec_state);
for v in &values {
// Identity subtype
@ -1550,7 +1569,7 @@ mod test {
#[tokio::test(flavor = "multi_thread")]
async fn coerce_none() {
let mut exec_state = ExecState::new(&crate::ExecutorContext::new_mock().await);
let mut exec_state = ExecState::new(&crate::ExecutorContext::new_mock(None).await);
let none = KclValue::KclNone {
value: crate::parsing::ast::types::KclNone::new(),
meta: Vec::new(),
@ -1608,7 +1627,7 @@ mod test {
#[tokio::test(flavor = "multi_thread")]
async fn coerce_record() {
let mut exec_state = ExecState::new(&crate::ExecutorContext::new_mock().await);
let mut exec_state = ExecState::new(&crate::ExecutorContext::new_mock(None).await);
let obj0 = KclValue::Object {
value: HashMap::new(),
@ -1690,7 +1709,7 @@ mod test {
#[tokio::test(flavor = "multi_thread")]
async fn coerce_array() {
let mut exec_state = ExecState::new(&crate::ExecutorContext::new_mock().await);
let mut exec_state = ExecState::new(&crate::ExecutorContext::new_mock(None).await);
let hom_arr = KclValue::HomArray {
value: vec![
@ -1843,7 +1862,7 @@ mod test {
#[tokio::test(flavor = "multi_thread")]
async fn coerce_union() {
let mut exec_state = ExecState::new(&crate::ExecutorContext::new_mock().await);
let mut exec_state = ExecState::new(&crate::ExecutorContext::new_mock(None).await);
// Subtyping smaller unions
assert!(RuntimeType::Union(vec![]).subtype(&RuntimeType::Union(vec![
@ -1894,7 +1913,7 @@ mod test {
#[tokio::test(flavor = "multi_thread")]
async fn coerce_axes() {
let mut exec_state = ExecState::new(&crate::ExecutorContext::new_mock().await);
let mut exec_state = ExecState::new(&crate::ExecutorContext::new_mock(None).await);
// Subtyping
assert!(RuntimeType::Primitive(PrimitiveType::Axis2d).subtype(&RuntimeType::Primitive(PrimitiveType::Axis2d)));
@ -2009,7 +2028,7 @@ mod test {
#[tokio::test(flavor = "multi_thread")]
async fn coerce_numeric() {
let mut exec_state = ExecState::new(&crate::ExecutorContext::new_mock().await);
let mut exec_state = ExecState::new(&crate::ExecutorContext::new_mock(None).await);
let count = KclValue::Number {
value: 1.0,
@ -2237,7 +2256,7 @@ d = cos(30)
#[tokio::test(flavor = "multi_thread")]
async fn coerce_nested_array() {
let mut exec_state = ExecState::new(&crate::ExecutorContext::new_mock().await);
let mut exec_state = ExecState::new(&crate::ExecutorContext::new_mock(None).await);
let mixed1 = KclValue::HomArray {
value: vec![

View File

@ -4220,8 +4220,8 @@ sketch001 = startSketchOn(XY)
result,
vec![tower_lsp::lsp_types::ColorInformation {
range: tower_lsp::lsp_types::Range {
start: tower_lsp::lsp_types::Position { line: 4, character: 24 },
end: tower_lsp::lsp_types::Position { line: 4, character: 33 },
start: tower_lsp::lsp_types::Position { line: 4, character: 25 },
end: tower_lsp::lsp_types::Position { line: 4, character: 32 },
},
color: tower_lsp::lsp_types::Color {
red: 1.0,
@ -4272,8 +4272,8 @@ sketch001 = startSketchOn(XY)
result,
vec![tower_lsp::lsp_types::ColorInformation {
range: tower_lsp::lsp_types::Range {
start: tower_lsp::lsp_types::Position { line: 4, character: 24 },
end: tower_lsp::lsp_types::Position { line: 4, character: 33 },
start: tower_lsp::lsp_types::Position { line: 4, character: 25 },
end: tower_lsp::lsp_types::Position { line: 4, character: 32 },
},
color: tower_lsp::lsp_types::Color {
red: 1.0,
@ -4291,8 +4291,8 @@ sketch001 = startSketchOn(XY)
uri: "file:///test.kcl".try_into().unwrap(),
},
range: tower_lsp::lsp_types::Range {
start: tower_lsp::lsp_types::Position { line: 4, character: 24 },
end: tower_lsp::lsp_types::Position { line: 4, character: 33 },
start: tower_lsp::lsp_types::Position { line: 4, character: 25 },
end: tower_lsp::lsp_types::Position { line: 4, character: 32 },
},
color: tower_lsp::lsp_types::Color {
red: 1.0,
@ -4316,3 +4316,64 @@ sketch001 = startSketchOn(XY)
}]
);
}
#[tokio::test(flavor = "multi_thread")]
async fn test_kcl_lsp_diagnostic_compilation_warnings() {
let server = kcl_lsp_server(false).await.unwrap();
// Send open file.
server
.did_open(tower_lsp::lsp_types::DidOpenTextDocumentParams {
text_document: tower_lsp::lsp_types::TextDocumentItem {
uri: "file:///test.kcl".try_into().unwrap(),
language_id: "kcl".to_string(),
version: 1,
text: r#"foo = 42
@settings(defaultLengthUnit = mm)"#
.to_string(),
},
})
.await;
// Send diagnostics request.
let diagnostics = server
.diagnostic(tower_lsp::lsp_types::DocumentDiagnosticParams {
text_document: tower_lsp::lsp_types::TextDocumentIdentifier {
uri: "file:///test.kcl".try_into().unwrap(),
},
partial_result_params: Default::default(),
work_done_progress_params: Default::default(),
identifier: None,
previous_result_id: None,
})
.await
.unwrap();
// Check the diagnostics.
if let tower_lsp::lsp_types::DocumentDiagnosticReportResult::Report(diagnostics) = diagnostics {
if let tower_lsp::lsp_types::DocumentDiagnosticReport::Full(diagnostics) = diagnostics {
assert_eq!(diagnostics.full_document_diagnostic_report.items.len(), 1);
assert_eq!(
diagnostics.full_document_diagnostic_report.items[0],
tower_lsp::lsp_types::Diagnostic {
range: tower_lsp::lsp_types::Range {
start: tower_lsp::lsp_types::Position { line: 0, character: 8 },
end: tower_lsp::lsp_types::Position { line: 1, character: 33 },
},
severity: Some(tower_lsp::lsp_types::DiagnosticSeverity::WARNING),
code: None,
source: Some("kcl".to_string()),
message: "Named attributes should appear before any declarations or expressions.\n\nBecause named attributes apply to the whole function or module, including code written before them, it can be confusing for readers to not have these attributes at the top of code blocks.".to_string(),
related_information: None,
tags: None,
data: None,
code_description: None,
}
);
} else {
panic!("Expected full diagnostics");
}
} else {
panic!("Expected diagnostics");
}
}

View File

@ -96,6 +96,7 @@ pub(crate) fn read_std(mod_name: &str) -> Option<&'static str> {
"solid" => Some(include_str!("../std/solid.kcl")),
"units" => Some(include_str!("../std/units.kcl")),
"array" => Some(include_str!("../std/array.kcl")),
"sweep" => Some(include_str!("../std/sweep.kcl")),
"transform" => Some(include_str!("../std/transform.kcl")),
_ => None,
}

View File

@ -438,8 +438,15 @@ impl Node<Program> {
let add_color = |literal: &Node<Literal>| {
// Check if the string is a color.
if let Some(c) = literal.value.is_color() {
let source_range = literal.as_source_range();
// We subtract 1 from either side because of the "'s in the literal.
let fixed_source_range = SourceRange::new(
source_range.start() + 1,
source_range.end() - 1,
source_range.module_id(),
);
let color = ColorInformation {
range: literal.as_source_range().to_lsp_range(code),
range: fixed_source_range.to_lsp_range(code),
color: tower_lsp::lsp_types::Color {
red: c.r,
green: c.g,
@ -498,7 +505,11 @@ impl Node<Program> {
crate::walk::walk(self, |node: crate::walk::Node<'a>| {
match node {
crate::walk::Node::Literal(literal) => {
if literal.start == pos_start && literal.end == pos_end && literal.value.is_color().is_some() {
// Account for the quotes in the literal.
if (literal.start + 1) == pos_start
&& (literal.end - 1) == pos_end
&& literal.value.is_color().is_some()
{
found.replace(true);
return Ok(true);
}

View File

@ -2729,6 +2729,17 @@ fn ty(i: &mut TokenSlice) -> PResult<Token> {
keyword(i, "type")
}
fn any_keyword(i: &mut TokenSlice) -> PResult<Token> {
any.try_map(|token: Token| match token.token_type {
TokenType::Keyword => Ok(token),
_ => Err(CompilationError::fatal(
token.as_source_range(),
"expected some reserved keyword".to_owned(),
)),
})
.parse_next(i)
}
fn keyword(i: &mut TokenSlice, expected: &str) -> PResult<Token> {
any.try_map(|token: Token| match token.token_type {
TokenType::Keyword if token.value == expected => Ok(token),
@ -3143,12 +3154,14 @@ fn fn_call_kw(i: &mut TokenSlice) -> PResult<Node<CallExpressionKw>> {
NonCode(Node<NonCodeNode>),
LabeledArg(LabeledArg),
UnlabeledArg(Expr),
Keyword(Token),
}
let initial_unlabeled_arg = opt((expression, comma, opt(whitespace)).map(|(arg, _, _)| arg)).parse_next(i)?;
let args: Vec<_> = repeat(
0..,
alt((
terminated(non_code_node.map(ArgPlace::NonCode), whitespace),
terminated(any_keyword.map(ArgPlace::Keyword), whitespace),
terminated(labeled_argument, labeled_arg_separator).map(ArgPlace::LabeledArg),
expression.map(ArgPlace::UnlabeledArg),
)),
@ -3164,6 +3177,18 @@ fn fn_call_kw(i: &mut TokenSlice) -> PResult<Node<CallExpressionKw>> {
ArgPlace::LabeledArg(x) => {
args.push(x);
}
ArgPlace::Keyword(kw) => {
return Err(ErrMode::Cut(
CompilationError::fatal(
SourceRange::from(kw.clone()),
format!(
"`{}` is not the name of an argument (it's a reserved keyword)",
kw.value
),
)
.into(),
));
}
ArgPlace::UnlabeledArg(arg) => {
let followed_by_equals = peek((opt(whitespace), equals)).parse_next(i).is_ok();
if followed_by_equals {
@ -5055,6 +5080,30 @@ bar = 1
}
}
#[test]
fn test_sensible_error_when_using_keyword_as_arg_label() {
for (i, program) in ["pow(2, fn = 8)"].into_iter().enumerate() {
let tokens = crate::parsing::token::lex(program, ModuleId::default()).unwrap();
let err = match fn_call_kw.parse(tokens.as_slice()) {
Err(e) => e,
Ok(ast) => {
eprintln!("{ast:#?}");
panic!("Expected this to error but it didn't");
}
};
let cause = err.inner().cause.as_ref().unwrap();
assert_eq!(
cause.message, "`fn` is not the name of an argument (it's a reserved keyword)",
"failed test {i}: {program}"
);
assert_eq!(
cause.source_range.start(),
program.find("fn").unwrap(),
"failed test {i}: {program}"
);
}
}
#[test]
fn test_sensible_error_when_missing_rhs_of_obj_property() {
for (i, program) in ["{x = 1, y =}"].into_iter().enumerate() {

View File

@ -314,7 +314,7 @@ fn assert_common_snapshots(
// Change the snapshot suffix so that it is rendered as a Markdown file
// in GitHub.
// Ignore the cpu cooler for now because its being a little bitch.
if test.name == "cpu_cooler" {
if test.name != "cpu-cooler" {
insta::assert_binary_snapshot!("artifact_graph_flowchart.md", flowchart.as_bytes().to_owned());
}
})
@ -2748,7 +2748,6 @@ mod import_mesh_clone {
/// Test that KCL is executed correctly.
#[tokio::test(flavor = "multi_thread")]
#[ignore = "turn on when katie fixes the mesh import"]
async fn kcl_test_execute() {
super::execute(TEST_NAME, true).await
}
@ -3092,3 +3091,24 @@ mod error_revolve_on_edge_get_edge {
super::execute(TEST_NAME, true).await
}
}
mod sketch_on_face_union {
const TEST_NAME: &str = "sketch_on_face_union";
/// Test parsing KCL.
#[test]
fn parse() {
super::parse(TEST_NAME)
}
/// Test that parsing and unparsing KCL produces the original KCL input.
#[tokio::test(flavor = "multi_thread")]
async fn unparse() {
super::unparse(TEST_NAME).await
}
/// Test that KCL is executed correctly.
#[tokio::test(flavor = "multi_thread")]
async fn kcl_test_execute() {
super::execute(TEST_NAME, true).await
}
}

View File

@ -102,7 +102,7 @@ impl TyF64 {
t => unreachable!("expected length, found {t:?}"),
};
assert_ne!(len, UnitLen::Unknown);
debug_assert_ne!(len, UnitLen::Unknown);
len.adjust_to(self.n, units).0
}
@ -114,7 +114,7 @@ impl TyF64 {
_ => unreachable!(),
};
assert_ne!(angle, UnitAngle::Unknown);
debug_assert_ne!(angle, UnitAngle::Unknown);
angle.adjust_to(self.n, UnitAngle::Degrees).0
}
@ -126,7 +126,7 @@ impl TyF64 {
_ => unreachable!(),
};
assert_ne!(angle, UnitAngle::Unknown);
debug_assert_ne!(angle, UnitAngle::Unknown);
angle.adjust_to(self.n, UnitAngle::Radians).0
}

View File

@ -14,7 +14,7 @@ use super::{args::TyF64, DEFAULT_TOLERANCE};
use crate::{
errors::{KclError, KclErrorDetails},
execution::{types::RuntimeType, ExecState, KclValue, Solid},
std::Args,
std::{patterns::GeometryTrait, Args},
};
/// Union two or more solids into a single solid.
@ -123,7 +123,7 @@ pub(crate) async fn inner_union(
let solid_out_id = exec_state.next_uuid();
let mut solid = solids[0].clone();
solid.id = solid_out_id;
solid.set_id(solid_out_id);
let mut new_solids = vec![solid.clone()];
if args.ctx.no_engine_commands().await {
@ -155,7 +155,7 @@ pub(crate) async fn inner_union(
// If we have more solids, set those as well.
if !extra_solid_ids.is_empty() {
solid.id = extra_solid_ids[0];
solid.set_id(extra_solid_ids[0]);
new_solids.push(solid.clone());
}
@ -249,7 +249,7 @@ pub(crate) async fn inner_intersect(
let solid_out_id = exec_state.next_uuid();
let mut solid = solids[0].clone();
solid.id = solid_out_id;
solid.set_id(solid_out_id);
let mut new_solids = vec![solid.clone()];
if args.ctx.no_engine_commands().await {
@ -281,7 +281,7 @@ pub(crate) async fn inner_intersect(
// If we have more solids, set those as well.
if !extra_solid_ids.is_empty() {
solid.id = extra_solid_ids[0];
solid.set_id(extra_solid_ids[0]);
new_solids.push(solid.clone());
}
@ -385,7 +385,7 @@ pub(crate) async fn inner_subtract(
let solid_out_id = exec_state.next_uuid();
let mut solid = solids[0].clone();
solid.id = solid_out_id;
solid.set_id(solid_out_id);
let mut new_solids = vec![solid.clone()];
if args.ctx.no_engine_commands().await {
@ -419,7 +419,7 @@ pub(crate) async fn inner_subtract(
// If we have more solids, set those as well.
if !extra_solid_ids.is_empty() {
solid.id = extra_solid_ids[0];
solid.set_id(extra_solid_ids[0]);
new_solids.push(solid.clone());
}

View File

@ -598,7 +598,7 @@ fn array_to_point2d(
.map(|val| val.as_point2d().unwrap())
}
trait GeometryTrait: Clone {
pub trait GeometryTrait: Clone {
type Set: Into<Vec<Self>> + Clone;
fn id(&self) -> Uuid;
fn original_id(&self) -> Uuid;
@ -608,6 +608,7 @@ trait GeometryTrait: Clone {
source_ranges: Vec<SourceRange>,
exec_state: &mut ExecState,
) -> Result<[TyF64; 3], KclError>;
#[allow(async_fn_in_trait)]
async fn flush_batch(args: &Args, exec_state: &mut ExecState, set: &Self::Set) -> Result<(), KclError>;
}
@ -641,6 +642,8 @@ impl GeometryTrait for Solid {
type Set = Vec<Solid>;
fn set_id(&mut self, id: Uuid) {
self.id = id;
// We need this for in extrude.rs when you sketch on face.
self.sketch.id = id;
}
fn id(&self) -> Uuid {
@ -671,7 +674,7 @@ mod tests {
#[tokio::test(flavor = "multi_thread")]
async fn test_array_to_point3d() {
let mut exec_state = ExecState::new(&ExecutorContext::new_mock().await);
let mut exec_state = ExecState::new(&ExecutorContext::new_mock(None).await);
let input = KclValue::HomArray {
value: vec![
KclValue::Number {
@ -703,7 +706,7 @@ mod tests {
#[tokio::test(flavor = "multi_thread")]
async fn test_tuple_to_point3d() {
let mut exec_state = ExecState::new(&ExecutorContext::new_mock().await);
let mut exec_state = ExecState::new(&ExecutorContext::new_mock(None).await);
let input = KclValue::Tuple {
value: vec![
KclValue::Number {

View File

@ -110,8 +110,8 @@ pub async fn sweep(exec_state: &mut ExecState, args: Args) -> Result<KclValue, K
///
///
/// // Create a spring by sweeping around the helix path.
/// springSketch = startSketchOn(YZ)
/// |> circle( center = [0, 0], radius = 1)
/// springSketch = startSketchOn(XZ)
/// |> circle( center = [5, 0], radius = 1)
/// |> sweep(path = helixPath)
/// ```
///
@ -167,7 +167,7 @@ pub async fn sweep(exec_state: &mut ExecState, args: Args) -> Result<KclValue, K
path = { docs = "The path to sweep the sketch along" },
sectional = { docs = "If true, the sweep will be broken up into sub-sweeps (extrusions, revolves, sweeps) based on the trajectory path components." },
tolerance = { docs = "Tolerance for this operation" },
relative_to = { docs = "What is the sweep relative to? Can be either 'sketchPlane' or 'trajectoryCurve'. Defaults to sketchPlane."},
relative_to = { docs = "What is the sweep relative to? Can be either 'sketchPlane' or 'trajectoryCurve'. Defaults to trajectoryCurve."},
tag_start = { docs = "A named tag for the face at the start of the sweep, i.e. the original sketch" },
tag_end = { docs = "A named tag for the face at the end of the sweep" },
},
@ -191,14 +191,13 @@ async fn inner_sweep(
};
let relative_to = match relative_to.as_deref() {
Some("sketchPlane") => RelativeTo::SketchPlane,
Some("trajectoryCurve") => RelativeTo::TrajectoryCurve,
Some("trajectoryCurve") | None => RelativeTo::TrajectoryCurve,
Some(_) => {
return Err(KclError::Syntax(crate::errors::KclErrorDetails {
source_ranges: vec![args.source_range],
message: "If you provide relativeTo, it must either be 'sketchPlane' or 'trajectoryCurve'".to_owned(),
}))
}
None => RelativeTo::default(),
};
let mut solids = Vec::new();

View File

@ -267,7 +267,7 @@ import \"a.kcl\"
);
modules.insert("b.kcl".to_owned(), into_module_info(b));
let ctx = ExecutorContext::new_mock().await;
let ctx = ExecutorContext::new_mock(None).await;
let order = import_graph(&modules, &ctx).unwrap();
assert_eq!(vec![vec!["a.kcl".to_owned()], vec!["b.kcl".to_owned()]], order);
}
@ -290,7 +290,7 @@ x = 1
);
modules.insert("b.kcl".to_owned(), into_module_info(b));
let ctx = ExecutorContext::new_mock().await;
let ctx = ExecutorContext::new_mock(None).await;
let order = import_graph(&modules, &ctx).unwrap();
assert_eq!(vec![vec!["a.kcl".to_owned(), "b.kcl".to_owned()]], order);
}
@ -316,7 +316,7 @@ import \"a.kcl\"
);
modules.insert("c.kcl".to_owned(), into_module_info(c));
let ctx = ExecutorContext::new_mock().await;
let ctx = ExecutorContext::new_mock(None).await;
let order = import_graph(&modules, &ctx).unwrap();
assert_eq!(
vec![vec!["a.kcl".to_owned()], vec!["b.kcl".to_owned(), "c.kcl".to_owned()]],
@ -342,7 +342,7 @@ import \"a.kcl\"
);
modules.insert("b.kcl".to_owned(), into_module_info(b));
let ctx = ExecutorContext::new_mock().await;
let ctx = ExecutorContext::new_mock(None).await;
import_graph(&modules, &ctx).unwrap_err();
}
}

View File

@ -21,6 +21,7 @@ export import * from "std::sketch"
export import * from "std::solid"
export import * from "std::transform"
export import "std::turns"
export import "std::sweep"
/// An abstract 3d plane aligned with the X and Y axes. Its normal is the positive Z axis.
export XY = {
@ -81,8 +82,8 @@ export END = 'end'
/// )
///
/// // Create a spring by sweeping around the helix path.
/// springSketch = startSketchOn(YZ)
/// |> circle( center = [0, 0], radius = 0.5)
/// springSketch = startSketchOn(XZ)
/// |> circle( center = [5, 0], radius = 0.5)
/// |> sweep(path = helixPath)
/// ```
///
@ -102,8 +103,8 @@ export END = 'end'
/// )
///
/// // Create a spring by sweeping around the helix path.
/// springSketch = startSketchOn(XY)
/// |> circle( center = [0, 0], radius = 0.5 )
/// springSketch = startSketchOn(XZ)
/// |> circle( center = [5, 0], radius = 0.5 )
/// |> sweep(path = helixPath)
/// ```
///
@ -122,8 +123,8 @@ export END = 'end'
/// )
///
/// // Create a spring by sweeping around the helix path.
/// springSketch = startSketchOn(XY)
/// |> circle( center = [0, 0], radius = 1 )
/// springSketch = startSketchOn(XZ)
/// |> circle( center = [5, 0], radius = 1 )
/// |> sweep(path = helixPath)
/// ```
///
@ -407,12 +408,12 @@ export fn offsetPlane(
/// )
///
///
/// springSketch = startSketchOn(YZ)
/// springSketch = startSketchOn(XZ)
/// |> circle( center = [0, 0], radius = 1)
///
/// // Create a spring by sweeping around the helix path.
/// sweepedSpring = clone(springSketch)
/// |> translate(x=100)
/// |> translate(x=5)
/// |> sweep(path = helixPath)
/// ```
///

View File

@ -0,0 +1,5 @@
/// Local/relative to the trajectory curve
export TRAJECTORY = 'trajectoryCurve'
/// Local/relative to a position centered within the plane being sketched on
export SKETCH_PLANE = 'sketchPlane'

View File

@ -22,13 +22,21 @@ flowchart LR
10["Sweep Extrusion<br>[279, 298, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 8 }]
11[Wall]
%% face_code_ref=Missing NodePath
12[Wall]
%% face_code_ref=Missing NodePath
13[Wall]
%% face_code_ref=Missing NodePath
14[Wall]
%% face_code_ref=Missing NodePath
15[Wall]
%% face_code_ref=Missing NodePath
16[Wall]
%% face_code_ref=Missing NodePath
17["Cap Start"]
%% face_code_ref=Missing NodePath
18["Cap End"]
%% face_code_ref=Missing NodePath
19["SweepEdge Opposite"]
20["SweepEdge Opposite"]
21["SweepEdge Opposite"]

View File

@ -31,21 +31,31 @@ flowchart LR
1["Plane<br>[12, 29, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
2["StartSketchOnFace<br>[343, 382, 0]"]
%% Missing NodePath
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
16["Sweep Extrusion<br>[258, 290, 0]"]
%% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
17["Sweep Extrusion<br>[553, 583, 0]"]
%% [ProgramBodyItem { index: 3 }, VariableDeclarationDeclaration, VariableDeclarationInit]
18[Wall]
%% face_code_ref=Missing NodePath
19[Wall]
%% face_code_ref=Missing NodePath
20[Wall]
%% face_code_ref=Missing NodePath
21[Wall]
%% face_code_ref=[ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
22[Wall]
%% face_code_ref=Missing NodePath
23[Wall]
%% face_code_ref=Missing NodePath
24[Wall]
%% face_code_ref=Missing NodePath
25["Cap Start"]
%% face_code_ref=Missing NodePath
26["Cap End"]
%% face_code_ref=Missing NodePath
27["Cap End"]
%% face_code_ref=Missing NodePath
28["SweepEdge Opposite"]
29["SweepEdge Opposite"]
30["SweepEdge Opposite"]

View File

@ -13,7 +13,7 @@ flowchart LR
3["Plane<br>[110, 138, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit]
4["StartSketchOnPlane<br>[152, 181, 0]"]
%% Missing NodePath
%% [ProgramBodyItem { index: 3 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
1 <--x 4
1 --- 5
5 --- 6

View File

@ -2,61 +2,106 @@
flowchart LR
subgraph path5 [Path]
5["Path<br>[35, 60, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
9["Segment<br>[66, 84, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
10["Segment<br>[90, 123, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
11["Segment<br>[129, 185, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
12["Segment<br>[191, 198, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
25[Solid2d]
end
subgraph path6 [Path]
6["Path<br>[300, 330, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
13["Segment<br>[336, 354, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
14["Segment<br>[360, 379, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
15["Segment<br>[385, 441, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
16["Segment<br>[447, 454, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
26[Solid2d]
end
subgraph path7 [Path]
7["Path<br>[556, 583, 0]"]
%% [ProgramBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
17["Segment<br>[589, 623, 0]"]
%% [ProgramBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
18["Segment<br>[629, 648, 0]"]
%% [ProgramBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
19["Segment<br>[654, 710, 0]"]
%% [ProgramBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
20["Segment<br>[716, 723, 0]"]
%% [ProgramBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
28[Solid2d]
end
subgraph path8 [Path]
8["Path<br>[825, 852, 0]"]
%% [ProgramBodyItem { index: 6 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
21["Segment<br>[858, 878, 0]"]
%% [ProgramBodyItem { index: 6 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
22["Segment<br>[884, 905, 0]"]
%% [ProgramBodyItem { index: 6 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
23["Segment<br>[911, 967, 0]"]
%% [ProgramBodyItem { index: 6 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
24["Segment<br>[973, 980, 0]"]
%% [ProgramBodyItem { index: 6 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
27[Solid2d]
end
1["Plane<br>[12, 29, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
2["StartSketchOnFace<br>[255, 294, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
3["StartSketchOnFace<br>[511, 550, 0]"]
%% [ProgramBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
4["StartSketchOnFace<br>[780, 819, 0]"]
%% [ProgramBodyItem { index: 6 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
29["Sweep Extrusion<br>[212, 242, 0]"]
%% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit]
30["Sweep Extrusion<br>[468, 498, 0]"]
%% [ProgramBodyItem { index: 3 }, VariableDeclarationDeclaration, VariableDeclarationInit]
31["Sweep Extrusion<br>[737, 767, 0]"]
%% [ProgramBodyItem { index: 5 }, VariableDeclarationDeclaration, VariableDeclarationInit]
32["Sweep Extrusion<br>[994, 1024, 0]"]
%% [ProgramBodyItem { index: 7 }, VariableDeclarationDeclaration, VariableDeclarationInit]
33[Wall]
%% face_code_ref=Missing NodePath
34[Wall]
%% face_code_ref=Missing NodePath
35[Wall]
%% face_code_ref=[ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
36[Wall]
%% face_code_ref=Missing NodePath
37[Wall]
%% face_code_ref=Missing NodePath
38[Wall]
%% face_code_ref=Missing NodePath
39[Wall]
%% face_code_ref=Missing NodePath
40[Wall]
%% face_code_ref=Missing NodePath
41[Wall]
%% face_code_ref=Missing NodePath
42[Wall]
%% face_code_ref=Missing NodePath
43[Wall]
%% face_code_ref=Missing NodePath
44[Wall]
%% face_code_ref=[ProgramBodyItem { index: 6 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
45["Cap Start"]
%% face_code_ref=Missing NodePath
46["Cap End"]
%% face_code_ref=[ProgramBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
47["Cap End"]
%% face_code_ref=Missing NodePath
48["Cap End"]
%% face_code_ref=Missing NodePath
49["Cap End"]
%% face_code_ref=Missing NodePath
50["SweepEdge Opposite"]
51["SweepEdge Opposite"]
52["SweepEdge Opposite"]

View File

@ -39,17 +39,29 @@ flowchart LR
18["Sweep Extrusion<br>[264, 286, 2]"]
%% Missing NodePath
19[Wall]
%% face_code_ref=Missing NodePath
20[Wall]
%% face_code_ref=Missing NodePath
21[Wall]
%% face_code_ref=Missing NodePath
22[Wall]
%% face_code_ref=Missing NodePath
23[Wall]
%% face_code_ref=Missing NodePath
24[Wall]
%% face_code_ref=Missing NodePath
25[Wall]
%% face_code_ref=Missing NodePath
26[Wall]
%% face_code_ref=Missing NodePath
27["Cap Start"]
%% face_code_ref=Missing NodePath
28["Cap Start"]
%% face_code_ref=Missing NodePath
29["Cap End"]
%% face_code_ref=Missing NodePath
30["Cap End"]
%% face_code_ref=Missing NodePath
31["SweepEdge Opposite"]
32["SweepEdge Opposite"]
33["SweepEdge Opposite"]

View File

@ -18,11 +18,17 @@ flowchart LR
8["Sweep Extrusion<br>[195, 215, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }]
9[Wall]
%% face_code_ref=Missing NodePath
10[Wall]
%% face_code_ref=Missing NodePath
11[Wall]
%% face_code_ref=Missing NodePath
12[Wall]
%% face_code_ref=Missing NodePath
13["Cap Start"]
%% face_code_ref=Missing NodePath
14["Cap End"]
%% face_code_ref=Missing NodePath
15["SweepEdge Opposite"]
16["SweepEdge Opposite"]
17["SweepEdge Opposite"]

View File

@ -18,11 +18,17 @@ flowchart LR
8["Sweep Extrusion<br>[183, 203, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }]
9[Wall]
%% face_code_ref=Missing NodePath
10[Wall]
%% face_code_ref=Missing NodePath
11[Wall]
%% face_code_ref=Missing NodePath
12[Wall]
%% face_code_ref=Missing NodePath
13["Cap Start"]
%% face_code_ref=Missing NodePath
14["Cap End"]
%% face_code_ref=Missing NodePath
15["SweepEdge Opposite"]
16["SweepEdge Opposite"]
17["SweepEdge Opposite"]

View File

@ -18,11 +18,17 @@ flowchart LR
8["Sweep Extrusion<br>[210, 230, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }]
9[Wall]
%% face_code_ref=Missing NodePath
10[Wall]
%% face_code_ref=Missing NodePath
11[Wall]
%% face_code_ref=Missing NodePath
12[Wall]
%% face_code_ref=Missing NodePath
13["Cap Start"]
%% face_code_ref=Missing NodePath
14["Cap End"]
%% face_code_ref=Missing NodePath
15["SweepEdge Opposite"]
16["SweepEdge Opposite"]
17["SweepEdge Opposite"]

View File

@ -18,11 +18,17 @@ flowchart LR
8["Sweep Extrusion<br>[210, 230, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }]
9[Wall]
%% face_code_ref=Missing NodePath
10[Wall]
%% face_code_ref=Missing NodePath
11[Wall]
%% face_code_ref=Missing NodePath
12[Wall]
%% face_code_ref=Missing NodePath
13["Cap Start"]
%% face_code_ref=Missing NodePath
14["Cap End"]
%% face_code_ref=Missing NodePath
15["SweepEdge Opposite"]
16["SweepEdge Opposite"]
17["SweepEdge Opposite"]

View File

@ -18,11 +18,17 @@ flowchart LR
8["Sweep Extrusion<br>[183, 203, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }]
9[Wall]
%% face_code_ref=Missing NodePath
10[Wall]
%% face_code_ref=Missing NodePath
11[Wall]
%% face_code_ref=Missing NodePath
12[Wall]
%% face_code_ref=Missing NodePath
13["Cap Start"]
%% face_code_ref=Missing NodePath
14["Cap End"]
%% face_code_ref=Missing NodePath
15["SweepEdge Opposite"]
16["SweepEdge Opposite"]
17["SweepEdge Opposite"]

View File

@ -2,12 +2,17 @@
flowchart LR
subgraph path2 [Path]
2["Path<br>[35, 70, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
3["Segment<br>[35, 70, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
4[Solid2d]
end
1["Plane<br>[12, 29, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
5["Sweep Revolve<br>[76, 120, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
6[Wall]
%% face_code_ref=Missing NodePath
7["SweepEdge Adjacent"]
1 --- 2
2 --- 3

View File

@ -12,8 +12,11 @@ flowchart LR
5["Sweep Extrusion<br>[102, 122, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
6[Wall]
%% face_code_ref=Missing NodePath
7["Cap Start"]
%% face_code_ref=Missing NodePath
8["Cap End"]
%% face_code_ref=Missing NodePath
9["SweepEdge Opposite"]
10["SweepEdge Adjacent"]
1 --- 2

View File

@ -18,11 +18,17 @@ flowchart LR
8["Sweep Extrusion<br>[157, 176, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }]
9[Wall]
%% face_code_ref=Missing NodePath
10[Wall]
%% face_code_ref=Missing NodePath
11[Wall]
%% face_code_ref=Missing NodePath
12[Wall]
%% face_code_ref=Missing NodePath
13["Cap Start"]
%% face_code_ref=Missing NodePath
14["Cap End"]
%% face_code_ref=Missing NodePath
15["SweepEdge Opposite"]
16["SweepEdge Opposite"]
17["SweepEdge Opposite"]

View File

@ -2,111 +2,187 @@
flowchart LR
subgraph path4 [Path]
4["Path<br>[43, 86, 0]"]
%% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
15["Segment<br>[92, 130, 0]"]
%% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
16["Segment<br>[136, 175, 0]"]
%% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
17["Segment<br>[181, 237, 0]"]
%% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
18["Segment<br>[243, 250, 0]"]
%% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
56[Solid2d]
end
subgraph path5 [Path]
5["Path<br>[362, 405, 0]"]
%% [ProgramBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
19["Segment<br>[411, 435, 0]"]
%% [ProgramBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
20["Segment<br>[441, 466, 0]"]
%% [ProgramBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
end
subgraph path6 [Path]
6["Path<br>[480, 522, 0]"]
%% [ProgramBodyItem { index: 5 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
21["Segment<br>[528, 593, 0]"]
%% [ProgramBodyItem { index: 5 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
22["Segment<br>[599, 667, 0]"]
%% [ProgramBodyItem { index: 5 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
23["Segment<br>[673, 761, 0]"]
%% [ProgramBodyItem { index: 5 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
24["Segment<br>[767, 823, 0]"]
%% [ProgramBodyItem { index: 5 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
25["Segment<br>[829, 836, 0]"]
%% [ProgramBodyItem { index: 5 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
53[Solid2d]
end
subgraph path7 [Path]
7["Path<br>[850, 892, 0]"]
%% [ProgramBodyItem { index: 6 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
26["Segment<br>[898, 918, 0]"]
%% [ProgramBodyItem { index: 6 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
27["Segment<br>[924, 950, 0]"]
%% [ProgramBodyItem { index: 6 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
28["Segment<br>[956, 1012, 0]"]
%% [ProgramBodyItem { index: 6 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
29["Segment<br>[1018, 1025, 0]"]
%% [ProgramBodyItem { index: 6 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
58[Solid2d]
end
subgraph path8 [Path]
8["Path<br>[1039, 1094, 0]"]
%% [ProgramBodyItem { index: 7 }, VariableDeclarationDeclaration, VariableDeclarationInit]
30["Segment<br>[1039, 1094, 0]"]
%% [ProgramBodyItem { index: 7 }, VariableDeclarationDeclaration, VariableDeclarationInit]
57[Solid2d]
end
subgraph path9 [Path]
9["Path<br>[1108, 1150, 0]"]
%% [ProgramBodyItem { index: 8 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
31["Segment<br>[1156, 1180, 0]"]
%% [ProgramBodyItem { index: 8 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
32["Segment<br>[1186, 1211, 0]"]
%% [ProgramBodyItem { index: 8 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
33["Segment<br>[1217, 1273, 0]"]
%% [ProgramBodyItem { index: 8 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
34["Segment<br>[1279, 1286, 0]"]
%% [ProgramBodyItem { index: 8 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
59[Solid2d]
end
subgraph path10 [Path]
10["Path<br>[1456, 1497, 0]"]
%% [ProgramBodyItem { index: 12 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
35["Segment<br>[1503, 1527, 0]"]
%% [ProgramBodyItem { index: 12 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
36["Segment<br>[1533, 1558, 0]"]
%% [ProgramBodyItem { index: 12 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
end
subgraph path11 [Path]
11["Path<br>[1572, 1614, 0]"]
%% [ProgramBodyItem { index: 13 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
37["Segment<br>[1620, 1644, 0]"]
%% [ProgramBodyItem { index: 13 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
38["Segment<br>[1650, 1675, 0]"]
%% [ProgramBodyItem { index: 13 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
39["Segment<br>[1681, 1737, 0]"]
%% [ProgramBodyItem { index: 13 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
40["Segment<br>[1743, 1750, 0]"]
%% [ProgramBodyItem { index: 13 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
51[Solid2d]
end
subgraph path12 [Path]
12["Path<br>[1764, 1806, 0]"]
%% [ProgramBodyItem { index: 14 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
41["Segment<br>[1812, 1835, 0]"]
%% [ProgramBodyItem { index: 14 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
42["Segment<br>[1841, 1866, 0]"]
%% [ProgramBodyItem { index: 14 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
43["Segment<br>[1872, 1928, 0]"]
%% [ProgramBodyItem { index: 14 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
44["Segment<br>[1934, 1941, 0]"]
%% [ProgramBodyItem { index: 14 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
52[Solid2d]
end
subgraph path13 [Path]
13["Path<br>[1955, 2011, 0]"]
%% [ProgramBodyItem { index: 15 }, VariableDeclarationDeclaration, VariableDeclarationInit]
45["Segment<br>[1955, 2011, 0]"]
%% [ProgramBodyItem { index: 15 }, VariableDeclarationDeclaration, VariableDeclarationInit]
55[Solid2d]
end
subgraph path14 [Path]
14["Path<br>[2025, 2068, 0]"]
%% [ProgramBodyItem { index: 16 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
46["Segment<br>[2074, 2139, 0]"]
%% [ProgramBodyItem { index: 16 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
47["Segment<br>[2145, 2213, 0]"]
%% [ProgramBodyItem { index: 16 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
48["Segment<br>[2219, 2307, 0]"]
%% [ProgramBodyItem { index: 16 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
49["Segment<br>[2313, 2369, 0]"]
%% [ProgramBodyItem { index: 16 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
50["Segment<br>[2375, 2382, 0]"]
%% [ProgramBodyItem { index: 16 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
54[Solid2d]
end
1["Plane<br>[12, 29, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit]
2["Plane<br>[1424, 1442, 0]"]
%% [ProgramBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit]
3["StartSketchOnFace<br>[309, 348, 0]"]
%% [ProgramBodyItem { index: 3 }, VariableDeclarationDeclaration, VariableDeclarationInit]
60["Sweep Extrusion<br>[264, 296, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit]
61["Sweep RevolveAboutEdge<br>[1300, 1366, 0]"]
%% [ProgramBodyItem { index: 9 }, VariableDeclarationDeclaration, VariableDeclarationInit]
62["Sweep Extrusion<br>[1380, 1411, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit]
63["Sweep Extrusion<br>[2396, 2429, 0]"]
%% [ProgramBodyItem { index: 17 }, VariableDeclarationDeclaration, VariableDeclarationInit]
64["Sweep RevolveAboutEdge<br>[2443, 2488, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit]
65[Wall]
%% face_code_ref=Missing NodePath
66[Wall]
%% face_code_ref=Missing NodePath
67[Wall]
%% face_code_ref=Missing NodePath
68[Wall]
%% face_code_ref=Missing NodePath
69[Wall]
%% face_code_ref=Missing NodePath
70[Wall]
%% face_code_ref=[ProgramBodyItem { index: 3 }, VariableDeclarationDeclaration, VariableDeclarationInit]
71[Wall]
%% face_code_ref=Missing NodePath
72[Wall]
%% face_code_ref=Missing NodePath
73[Wall]
%% face_code_ref=Missing NodePath
74[Wall]
%% face_code_ref=Missing NodePath
75[Wall]
%% face_code_ref=Missing NodePath
76[Wall]
%% face_code_ref=Missing NodePath
77[Wall]
%% face_code_ref=Missing NodePath
78["Cap Start"]
%% face_code_ref=Missing NodePath
79["Cap Start"]
%% face_code_ref=Missing NodePath
80["Cap Start"]
%% face_code_ref=Missing NodePath
81["Cap Start"]
%% face_code_ref=Missing NodePath
82["Cap End"]
%% face_code_ref=Missing NodePath
83["Cap End"]
%% face_code_ref=Missing NodePath
84["Cap End"]
%% face_code_ref=Missing NodePath
85["Cap End"]
%% face_code_ref=Missing NodePath
86["SweepEdge Opposite"]
87["SweepEdge Opposite"]
88["SweepEdge Opposite"]

View File

@ -20,11 +20,17 @@ flowchart LR
9["Sweep Extrusion<br>[374, 402, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 7 }, ReturnStatementArg, PipeBodyItem { index: 7 }]
10[Wall]
%% face_code_ref=Missing NodePath
11[Wall]
%% face_code_ref=Missing NodePath
12[Wall]
%% face_code_ref=Missing NodePath
13[Wall]
%% face_code_ref=Missing NodePath
14["Cap Start"]
%% face_code_ref=Missing NodePath
15["Cap End"]
%% face_code_ref=Missing NodePath
16["SweepEdge Opposite"]
17["SweepEdge Opposite"]
18["SweepEdge Opposite"]

View File

@ -20,11 +20,17 @@ flowchart LR
9["Sweep Extrusion<br>[366, 390, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 7 }, ReturnStatementArg, PipeBodyItem { index: 7 }]
10[Wall]
%% face_code_ref=Missing NodePath
11[Wall]
%% face_code_ref=Missing NodePath
12[Wall]
%% face_code_ref=Missing NodePath
13[Wall]
%% face_code_ref=Missing NodePath
14["Cap Start"]
%% face_code_ref=Missing NodePath
15["Cap End"]
%% face_code_ref=Missing NodePath
16["SweepEdge Opposite"]
17["SweepEdge Opposite"]
18["SweepEdge Opposite"]

View File

@ -0,0 +1,6 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Artifact graph flowchart error_revolve_on_edge_get_edge.kcl
extension: md
snapshot_kind: binary
---

View File

@ -0,0 +1,115 @@
```mermaid
flowchart LR
subgraph path3 [Path]
3["Path<br>[29, 54, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
5["Segment<br>[60, 79, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
6["Segment<br>[85, 104, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
7["Segment<br>[110, 150, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
8["Segment<br>[156, 163, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
13[Solid2d]
end
subgraph path4 [Path]
4["Path<br>[247, 273, 0]"]
%% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
9["Segment<br>[279, 299, 0]"]
%% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
10["Segment<br>[305, 323, 0]"]
%% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
11["Segment<br>[329, 348, 0]"]
%% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
12["Segment<br>[354, 361, 0]"]
%% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
14[Solid2d]
end
1["Plane<br>[6, 23, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
2["StartSketchOnFace<br>[203, 241, 0]"]
%% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
15["Sweep Extrusion<br>[169, 189, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }]
16[Wall]
%% face_code_ref=Missing NodePath
17[Wall]
%% face_code_ref=Missing NodePath
18[Wall]
%% face_code_ref=Missing NodePath
19[Wall]
%% face_code_ref=[ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
20["Cap Start"]
%% face_code_ref=Missing NodePath
21["Cap End"]
%% face_code_ref=Missing NodePath
22["SweepEdge Opposite"]
23["SweepEdge Opposite"]
24["SweepEdge Opposite"]
25["SweepEdge Opposite"]
26["SweepEdge Adjacent"]
27["SweepEdge Adjacent"]
28["SweepEdge Adjacent"]
29["SweepEdge Adjacent"]
1 --- 3
19 x--> 2
3 --- 5
3 --- 6
3 --- 7
3 --- 8
3 --- 13
3 ---- 15
4 --- 9
4 --- 10
4 --- 11
4 --- 12
4 --- 14
19 --- 4
5 --- 18
5 x--> 20
5 --- 25
5 --- 29
6 --- 16
6 x--> 20
6 --- 24
6 --- 28
7 --- 19
7 x--> 20
7 --- 23
7 --- 27
8 --- 17
8 x--> 20
8 --- 22
8 --- 26
15 --- 16
15 --- 17
15 --- 18
15 --- 19
15 --- 20
15 --- 21
15 --- 22
15 --- 23
15 --- 24
15 --- 25
15 --- 26
15 --- 27
15 --- 28
15 --- 29
16 --- 24
16 --- 28
29 <--x 16
17 --- 22
17 --- 26
27 <--x 17
18 --- 25
26 <--x 18
18 --- 29
19 --- 23
19 --- 27
28 <--x 19
22 <--x 21
23 <--x 21
24 <--x 21
25 <--x 21
```

View File

@ -2,101 +2,160 @@
flowchart LR
subgraph path7 [Path]
7["Path<br>[396, 467, 0]"]
%% [ProgramBodyItem { index: 16 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
21["Segment<br>[473, 564, 0]"]
%% [ProgramBodyItem { index: 16 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
22["Segment<br>[570, 661, 0]"]
%% [ProgramBodyItem { index: 16 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
23["Segment<br>[667, 760, 0]"]
%% [ProgramBodyItem { index: 16 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
24["Segment<br>[766, 774, 0]"]
%% [ProgramBodyItem { index: 16 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
42[Solid2d]
end
subgraph path8 [Path]
8["Path<br>[806, 831, 0]"]
%% [ProgramBodyItem { index: 17 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
25["Segment<br>[837, 885, 0]"]
%% [ProgramBodyItem { index: 17 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
26["Segment<br>[891, 948, 0]"]
%% [ProgramBodyItem { index: 17 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
27["Segment<br>[954, 1003, 0]"]
%% [ProgramBodyItem { index: 17 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
28["Segment<br>[1009, 1028, 0]"]
%% [ProgramBodyItem { index: 17 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
46[Solid2d]
end
subgraph path9 [Path]
9["Path<br>[1339, 1364, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
end
subgraph path10 [Path]
10["Path<br>[1339, 1364, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
end
subgraph path11 [Path]
11["Path<br>[1339, 1364, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
end
subgraph path12 [Path]
12["Path<br>[1339, 1364, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
end
subgraph path13 [Path]
13["Path<br>[1372, 1409, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
31["Segment<br>[1372, 1409, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
38[Solid2d]
end
subgraph path14 [Path]
14["Path<br>[1372, 1409, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
30["Segment<br>[1372, 1409, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
39[Solid2d]
end
subgraph path15 [Path]
15["Path<br>[1372, 1409, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
29["Segment<br>[1372, 1409, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
40[Solid2d]
end
subgraph path16 [Path]
16["Path<br>[1372, 1409, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
32["Segment<br>[1372, 1409, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
41[Solid2d]
end
subgraph path17 [Path]
17["Path<br>[1435, 1473, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }, CallKwArg { index: 0 }]
35["Segment<br>[1435, 1473, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }, CallKwArg { index: 0 }]
37[Solid2d]
end
subgraph path18 [Path]
18["Path<br>[1435, 1473, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }, CallKwArg { index: 0 }]
33["Segment<br>[1435, 1473, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }, CallKwArg { index: 0 }]
43[Solid2d]
end
subgraph path19 [Path]
19["Path<br>[1435, 1473, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }, CallKwArg { index: 0 }]
36["Segment<br>[1435, 1473, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }, CallKwArg { index: 0 }]
44[Solid2d]
end
subgraph path20 [Path]
20["Path<br>[1435, 1473, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }, CallKwArg { index: 0 }]
34["Segment<br>[1435, 1473, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }, CallKwArg { index: 0 }]
45[Solid2d]
end
1["Plane<br>[373, 390, 0]"]
%% [ProgramBodyItem { index: 16 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
2["Plane<br>[783, 800, 0]"]
%% [ProgramBodyItem { index: 17 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
3["Plane<br>[1314, 1331, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
4["Plane<br>[1314, 1331, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
5["Plane<br>[1314, 1331, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
6["Plane<br>[1314, 1331, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
47["Sweep Extrusion<br>[1034, 1062, 0]"]
%% [ProgramBodyItem { index: 17 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }]
48["Sweep Extrusion<br>[1482, 1506, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
49["Sweep Extrusion<br>[1482, 1506, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
50["Sweep Extrusion<br>[1482, 1506, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
51["Sweep Extrusion<br>[1482, 1506, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
52[Wall]
%% face_code_ref=Missing NodePath
53[Wall]
%% face_code_ref=Missing NodePath
54[Wall]
%% face_code_ref=Missing NodePath
55[Wall]
%% face_code_ref=Missing NodePath
56[Wall]
%% face_code_ref=Missing NodePath
57[Wall]
%% face_code_ref=Missing NodePath
58[Wall]
%% face_code_ref=Missing NodePath
59[Wall]
%% face_code_ref=Missing NodePath
60["Cap Start"]
%% face_code_ref=Missing NodePath
61["Cap Start"]
%% face_code_ref=Missing NodePath
62["Cap Start"]
%% face_code_ref=Missing NodePath
63["Cap Start"]
%% face_code_ref=Missing NodePath
64["Cap Start"]
%% face_code_ref=Missing NodePath
65["Cap End"]
%% face_code_ref=Missing NodePath
66["Cap End"]
%% face_code_ref=Missing NodePath
67["Cap End"]
%% face_code_ref=Missing NodePath
68["Cap End"]
%% face_code_ref=Missing NodePath
69["Cap End"]
%% face_code_ref=Missing NodePath
70["SweepEdge Opposite"]
71["SweepEdge Opposite"]
72["SweepEdge Opposite"]
@ -114,9 +173,13 @@ flowchart LR
84["SweepEdge Adjacent"]
85["SweepEdge Adjacent"]
86["EdgeCut Fillet<br>[1068, 1274, 0]"]
%% [ProgramBodyItem { index: 17 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }]
87["EdgeCut Fillet<br>[1068, 1274, 0]"]
%% [ProgramBodyItem { index: 17 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }]
88["EdgeCut Fillet<br>[1068, 1274, 0]"]
%% [ProgramBodyItem { index: 17 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }]
89["EdgeCut Fillet<br>[1068, 1274, 0]"]
%% [ProgramBodyItem { index: 17 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }]
1 --- 7
2 --- 8
3 --- 10

View File

@ -18,11 +18,17 @@ flowchart LR
8["Sweep Extrusion<br>[216, 236, 0]"]
%% [ProgramBodyItem { index: 0 }, ExpressionStatementExpr, PipeBodyItem { index: 5 }]
9[Wall]
%% face_code_ref=Missing NodePath
10[Wall]
%% face_code_ref=Missing NodePath
11[Wall]
%% face_code_ref=Missing NodePath
12[Wall]
%% face_code_ref=Missing NodePath
13["Cap Start"]
%% face_code_ref=Missing NodePath
14["Cap End"]
%% face_code_ref=Missing NodePath
15["SweepEdge Opposite"]
16["SweepEdge Opposite"]
17["SweepEdge Opposite"]

View File

@ -19,8 +19,11 @@ flowchart LR
8["Sweep Extrusion<br>[702, 739, 0]"]
%% [ProgramBodyItem { index: 7 }, VariableDeclarationDeclaration, VariableDeclarationInit]
9[Wall]
%% face_code_ref=Missing NodePath
10["Cap Start"]
%% face_code_ref=Missing NodePath
11["Cap End"]
%% face_code_ref=Missing NodePath
12["SweepEdge Opposite"]
13["SweepEdge Adjacent"]
1 --- 2

View File

@ -18,11 +18,17 @@ flowchart LR
8["Sweep Extrusion<br>[181, 200, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }]
9[Wall]
%% face_code_ref=Missing NodePath
10[Wall]
%% face_code_ref=Missing NodePath
11[Wall]
%% face_code_ref=Missing NodePath
12[Wall]
%% face_code_ref=Missing NodePath
13["Cap Start"]
%% face_code_ref=Missing NodePath
14["Cap End"]
%% face_code_ref=Missing NodePath
15["SweepEdge Opposite"]
16["SweepEdge Opposite"]
17["SweepEdge Opposite"]

View File

@ -18,11 +18,17 @@ flowchart LR
8["Sweep Extrusion<br>[179, 198, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }]
9[Wall]
%% face_code_ref=Missing NodePath
10[Wall]
%% face_code_ref=Missing NodePath
11[Wall]
%% face_code_ref=Missing NodePath
12[Wall]
%% face_code_ref=Missing NodePath
13["Cap Start"]
%% face_code_ref=Missing NodePath
14["Cap End"]
%% face_code_ref=Missing NodePath
15["SweepEdge Opposite"]
16["SweepEdge Opposite"]
17["SweepEdge Opposite"]

View File

@ -12,8 +12,11 @@ flowchart LR
5["Sweep Extrusion<br>[75, 95, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
6[Wall]
%% face_code_ref=Missing NodePath
7["Cap Start"]
%% face_code_ref=Missing NodePath
8["Cap End"]
%% face_code_ref=Missing NodePath
9["SweepEdge Opposite"]
10["SweepEdge Adjacent"]
1 --- 2

View File

@ -85,31 +85,57 @@ flowchart LR
41["Sweep Extrusion<br>[2408, 2429, 0]"]
%% [ProgramBodyItem { index: 7 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
42[Wall]
%% face_code_ref=Missing NodePath
43[Wall]
%% face_code_ref=Missing NodePath
44[Wall]
%% face_code_ref=Missing NodePath
45[Wall]
%% face_code_ref=Missing NodePath
46[Wall]
%% face_code_ref=Missing NodePath
47[Wall]
%% face_code_ref=Missing NodePath
48[Wall]
%% face_code_ref=Missing NodePath
49[Wall]
%% face_code_ref=Missing NodePath
50[Wall]
%% face_code_ref=Missing NodePath
51[Wall]
%% face_code_ref=Missing NodePath
52[Wall]
%% face_code_ref=Missing NodePath
53[Wall]
%% face_code_ref=Missing NodePath
54[Wall]
%% face_code_ref=Missing NodePath
55[Wall]
%% face_code_ref=Missing NodePath
56[Wall]
%% face_code_ref=Missing NodePath
57[Wall]
%% face_code_ref=Missing NodePath
58[Wall]
%% face_code_ref=Missing NodePath
59[Wall]
%% face_code_ref=Missing NodePath
60[Wall]
%% face_code_ref=Missing NodePath
61[Wall]
%% face_code_ref=Missing NodePath
62[Wall]
%% face_code_ref=Missing NodePath
63[Wall]
%% face_code_ref=Missing NodePath
64[Wall]
%% face_code_ref=Missing NodePath
65[Wall]
%% face_code_ref=Missing NodePath
66["Cap Start"]
%% face_code_ref=Missing NodePath
67["Cap End"]
%% face_code_ref=Missing NodePath
68["SweepEdge Opposite"]
69["SweepEdge Opposite"]
70["SweepEdge Opposite"]

View File

@ -2,51 +2,86 @@
flowchart LR
subgraph path8 [Path]
8["Path<br>[753, 859, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
12["Segment<br>[867, 894, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
13["Segment<br>[902, 930, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
14["Segment<br>[938, 966, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
15["Segment<br>[974, 1050, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
16["Segment<br>[1058, 1123, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }]
17["Segment<br>[1131, 1138, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }]
30[Solid2d]
end
subgraph path9 [Path]
9["Path<br>[1643, 1713, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
26["Segment<br>[2677, 2684, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }]
29[Solid2d]
end
subgraph path10 [Path]
10["Path<br>[1643, 1713, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
19["Segment<br>[1723, 1889, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
20["Segment<br>[1899, 1984, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
23["Segment<br>[1994, 2215, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
24["Segment<br>[2302, 2388, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
28["Segment<br>[2677, 2684, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }]
31[Solid2d]
end
subgraph path11 [Path]
11["Path<br>[1643, 1713, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
18["Segment<br>[1723, 1889, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
21["Segment<br>[1899, 1984, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
22["Segment<br>[1994, 2215, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
25["Segment<br>[2302, 2388, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
27["Segment<br>[2677, 2684, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }]
32[Solid2d]
end
1["Plane<br>[728, 745, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
2["Plane<br>[1594, 1632, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }, CallKwUnlabeledArg]
3["Plane<br>[1594, 1632, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }, CallKwUnlabeledArg]
4["Plane<br>[1594, 1632, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }, CallKwUnlabeledArg]
5["StartSketchOnPlane<br>[1580, 1633, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
6["StartSketchOnPlane<br>[1580, 1633, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
7["StartSketchOnPlane<br>[1580, 1633, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
33["Sweep Loft<br>[3201, 3268, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 15 }, VariableDeclarationDeclaration, VariableDeclarationInit]
34[Wall]
%% face_code_ref=Missing NodePath
35[Wall]
%% face_code_ref=Missing NodePath
36[Wall]
%% face_code_ref=Missing NodePath
37[Wall]
%% face_code_ref=Missing NodePath
38["Cap Start"]
%% face_code_ref=Missing NodePath
39["Cap End"]
%% face_code_ref=Missing NodePath
40["SweepEdge Opposite"]
41["SweepEdge Opposite"]
42["SweepEdge Opposite"]

View File

@ -26,13 +26,21 @@ flowchart LR
12["Sweep Revolve<br>[302, 319, 1]"]
%% Missing NodePath
13[Wall]
%% face_code_ref=Missing NodePath
14[Wall]
%% face_code_ref=Missing NodePath
15[Wall]
%% face_code_ref=Missing NodePath
16[Wall]
%% face_code_ref=Missing NodePath
17[Wall]
%% face_code_ref=Missing NodePath
18[Wall]
%% face_code_ref=Missing NodePath
19[Wall]
%% face_code_ref=Missing NodePath
20[Wall]
%% face_code_ref=Missing NodePath
21["SweepEdge Adjacent"]
22["SweepEdge Adjacent"]
23["SweepEdge Adjacent"]

View File

@ -996,10 +996,51 @@ description: Artifact commands import_mesh_clone.kcl
"direction": "positive"
}
},
"units": "mm"
"units": "m"
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "set_object_transform",
"object_id": "[uuid]",
"transforms": [
{
"translate": {
"property": {
"x": -2000.0,
"y": -2000.0,
"z": 0.0
},
"set": false,
"is_local": true
},
"rotate_rpy": null,
"rotate_angle_axis": null,
"scale": null
}
]
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "object_set_material_params_pbr",
"object_id": "[uuid]",
"color": {
"r": 1.0,
"g": 1.0,
"b": 0.0,
"a": 100.0
},
"metalness": 0.0,
"roughness": 0.0,
"ambient_occlusion": 0.0
}
},
{
"cmdId": "[uuid]",
"range": [],
@ -1008,6 +1049,22 @@ description: Artifact commands import_mesh_clone.kcl
"entity_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "entity_get_all_child_uuids",
"entity_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "entity_get_all_child_uuids",
"entity_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
@ -1018,7 +1075,7 @@ description: Artifact commands import_mesh_clone.kcl
{
"translate": {
"property": {
"x": 1020.0,
"x": 4000.0,
"y": 0.0,
"z": 0.0
},
@ -1044,8 +1101,138 @@ description: Artifact commands import_mesh_clone.kcl
"b": 0.0,
"a": 100.0
},
"metalness": 0.5,
"roughness": 0.5,
"metalness": 0.0,
"roughness": 0.0,
"ambient_occlusion": 0.0
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "entity_clone",
"entity_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "entity_get_all_child_uuids",
"entity_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "entity_get_all_child_uuids",
"entity_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "set_object_transform",
"object_id": "[uuid]",
"transforms": [
{
"translate": {
"property": {
"x": 0.0,
"y": 4000.0,
"z": 0.0
},
"set": false,
"is_local": true
},
"rotate_rpy": null,
"rotate_angle_axis": null,
"scale": null
}
]
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "object_set_material_params_pbr",
"object_id": "[uuid]",
"color": {
"r": 0.0,
"g": 1.0,
"b": 0.0,
"a": 100.0
},
"metalness": 0.0,
"roughness": 0.0,
"ambient_occlusion": 0.0
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "entity_clone",
"entity_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "entity_get_all_child_uuids",
"entity_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "entity_get_all_child_uuids",
"entity_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "set_object_transform",
"object_id": "[uuid]",
"transforms": [
{
"translate": {
"property": {
"x": 0.0,
"y": 4000.0,
"z": 0.0
},
"set": false,
"is_local": true
},
"rotate_rpy": null,
"rotate_angle_axis": null,
"scale": null
}
]
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "object_set_material_params_pbr",
"object_id": "[uuid]",
"color": {
"r": 0.0,
"g": 0.0,
"b": 1.0,
"a": 100.0
},
"metalness": 0.0,
"roughness": 0.0,
"ambient_occlusion": 0.0
}
}

View File

@ -8,6 +8,46 @@ description: Result of parsing import_mesh_clone.kcl
{
"commentStart": 0,
"end": 0,
"outerAttrs": [
{
"commentStart": 0,
"end": 0,
"name": null,
"properties": [
{
"commentStart": 0,
"end": 0,
"key": {
"commentStart": 0,
"end": 0,
"name": "lengthUnit",
"start": 0,
"type": "Identifier"
},
"start": 0,
"type": "ObjectProperty",
"value": {
"abs_path": false,
"commentStart": 0,
"end": 0,
"name": {
"commentStart": 0,
"end": 0,
"name": "m",
"start": 0,
"type": "Identifier"
},
"path": [],
"start": 0,
"type": "Name",
"type": "Name"
}
}
],
"start": 0,
"type": "Annotation"
}
],
"path": {
"type": "Foreign",
"path": "../inputs/cube.obj"
@ -17,7 +57,7 @@ description: Result of parsing import_mesh_clone.kcl
"alias": {
"commentStart": 0,
"end": 0,
"name": "cube",
"name": "yellow",
"start": 0,
"type": "Identifier"
}
@ -27,25 +67,18 @@ description: Result of parsing import_mesh_clone.kcl
"type": "ImportStatement"
},
{
"commentStart": 0,
"declaration": {
"commentStart": 0,
"end": 0,
"id": {
"commentStart": 0,
"end": 0,
"name": "model",
"start": 0,
"type": "Identifier"
},
"init": {
"expression": {
"body": [
{
"abs_path": false,
"commentStart": 0,
"end": 0,
"name": {
"commentStart": 0,
"end": 0,
"name": "cube",
"name": "yellow",
"start": 0,
"type": "Identifier"
},
@ -54,14 +87,173 @@ description: Result of parsing import_mesh_clone.kcl
"type": "Name",
"type": "Name"
},
"start": 0,
"type": "VariableDeclarator"
},
{
"arguments": [
{
"type": "LabeledArg",
"label": {
"commentStart": 0,
"end": 0,
"kind": "const",
"name": "x",
"start": 0,
"type": "VariableDeclaration",
"type": "VariableDeclaration"
"type": "Identifier"
},
"arg": {
"argument": {
"commentStart": 0,
"end": 0,
"raw": "2000",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 2000.0,
"suffix": "None"
}
},
"commentStart": 0,
"end": 0,
"operator": "-",
"start": 0,
"type": "UnaryExpression",
"type": "UnaryExpression"
}
},
{
"type": "LabeledArg",
"label": {
"commentStart": 0,
"end": 0,
"name": "y",
"start": 0,
"type": "Identifier"
},
"arg": {
"argument": {
"commentStart": 0,
"end": 0,
"raw": "2000",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 2000.0,
"suffix": "None"
}
},
"commentStart": 0,
"end": 0,
"operator": "-",
"start": 0,
"type": "UnaryExpression",
"type": "UnaryExpression"
}
}
],
"callee": {
"abs_path": false,
"commentStart": 0,
"end": 0,
"name": {
"commentStart": 0,
"end": 0,
"name": "translate",
"start": 0,
"type": "Identifier"
},
"path": [],
"start": 0,
"type": "Name"
},
"commentStart": 0,
"end": 0,
"start": 0,
"type": "CallExpressionKw",
"type": "CallExpressionKw",
"unlabeled": {
"commentStart": 0,
"end": 0,
"start": 0,
"type": "PipeSubstitution",
"type": "PipeSubstitution"
}
}
],
"commentStart": 0,
"end": 0,
"start": 0,
"type": "PipeExpression",
"type": "PipeExpression"
},
"start": 0,
"type": "ExpressionStatement",
"type": "ExpressionStatement"
},
{
"commentStart": 0,
"end": 0,
"expression": {
"arguments": [
{
"type": "LabeledArg",
"label": {
"commentStart": 0,
"end": 0,
"name": "color",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 0,
"end": 0,
"raw": "\"#ffff00\"",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": "#ffff00"
}
}
],
"callee": {
"abs_path": false,
"commentStart": 0,
"end": 0,
"name": {
"commentStart": 0,
"end": 0,
"name": "appearance",
"start": 0,
"type": "Identifier"
},
"path": [],
"start": 0,
"type": "Name"
},
"commentStart": 0,
"end": 0,
"start": 0,
"type": "CallExpressionKw",
"type": "CallExpressionKw",
"unlabeled": {
"abs_path": false,
"commentStart": 0,
"end": 0,
"name": {
"commentStart": 0,
"end": 0,
"name": "yellow",
"start": 0,
"type": "Identifier"
},
"path": [],
"start": 0,
"type": "Name",
"type": "Name"
}
},
"start": 0,
"type": "ExpressionStatement",
"type": "ExpressionStatement"
},
{
"commentStart": 0,
@ -71,7 +263,7 @@ description: Result of parsing import_mesh_clone.kcl
"id": {
"commentStart": 0,
"end": 0,
"name": "model2",
"name": "red",
"start": 0,
"type": "Identifier"
},
@ -105,7 +297,7 @@ description: Result of parsing import_mesh_clone.kcl
"name": {
"commentStart": 0,
"end": 0,
"name": "model",
"name": "yellow",
"start": 0,
"type": "Identifier"
},
@ -129,12 +321,12 @@ description: Result of parsing import_mesh_clone.kcl
"arg": {
"commentStart": 0,
"end": 0,
"raw": "1020",
"raw": "4000",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 1020.0,
"value": 4000.0,
"suffix": "None"
}
}
@ -160,9 +352,34 @@ description: Result of parsing import_mesh_clone.kcl
"start": 0,
"type": "CallExpressionKw",
"type": "CallExpressionKw",
"unlabeled": null
"unlabeled": {
"commentStart": 0,
"end": 0,
"start": 0,
"type": "PipeSubstitution",
"type": "PipeSubstitution"
}
}
],
"commentStart": 0,
"end": 0,
"start": 0,
"type": "PipeExpression",
"type": "PipeExpression"
},
"start": 0,
"type": "VariableDeclarator"
},
"end": 0,
"kind": "const",
"start": 0,
"type": "VariableDeclaration",
"type": "VariableDeclaration"
},
{
"commentStart": 0,
"end": 0,
"expression": {
"arguments": [
{
"type": "LabeledArg",
@ -182,50 +399,6 @@ description: Result of parsing import_mesh_clone.kcl
"type": "Literal",
"value": "#ff0000"
}
},
{
"type": "LabeledArg",
"label": {
"commentStart": 0,
"end": 0,
"name": "metalness",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 0,
"end": 0,
"raw": "50",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 50.0,
"suffix": "None"
}
}
},
{
"type": "LabeledArg",
"label": {
"commentStart": 0,
"end": 0,
"name": "roughness",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 0,
"end": 0,
"raw": "50",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 50.0,
"suffix": "None"
}
}
}
],
"callee": {
@ -248,7 +421,131 @@ description: Result of parsing import_mesh_clone.kcl
"start": 0,
"type": "CallExpressionKw",
"type": "CallExpressionKw",
"unlabeled": null
"unlabeled": {
"abs_path": false,
"commentStart": 0,
"end": 0,
"name": {
"commentStart": 0,
"end": 0,
"name": "red",
"start": 0,
"type": "Identifier"
},
"path": [],
"start": 0,
"type": "Name",
"type": "Name"
}
},
"start": 0,
"type": "ExpressionStatement",
"type": "ExpressionStatement"
},
{
"commentStart": 0,
"declaration": {
"commentStart": 0,
"end": 0,
"id": {
"commentStart": 0,
"end": 0,
"name": "green",
"start": 0,
"type": "Identifier"
},
"init": {
"body": [
{
"callee": {
"abs_path": false,
"commentStart": 0,
"end": 0,
"name": {
"commentStart": 0,
"end": 0,
"name": "clone",
"start": 0,
"type": "Identifier"
},
"path": [],
"start": 0,
"type": "Name"
},
"commentStart": 0,
"end": 0,
"start": 0,
"type": "CallExpressionKw",
"type": "CallExpressionKw",
"unlabeled": {
"abs_path": false,
"commentStart": 0,
"end": 0,
"name": {
"commentStart": 0,
"end": 0,
"name": "yellow",
"start": 0,
"type": "Identifier"
},
"path": [],
"start": 0,
"type": "Name",
"type": "Name"
}
},
{
"arguments": [
{
"type": "LabeledArg",
"label": {
"commentStart": 0,
"end": 0,
"name": "y",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 0,
"end": 0,
"raw": "4000",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 4000.0,
"suffix": "None"
}
}
}
],
"callee": {
"abs_path": false,
"commentStart": 0,
"end": 0,
"name": {
"commentStart": 0,
"end": 0,
"name": "translate",
"start": 0,
"type": "Identifier"
},
"path": [],
"start": 0,
"type": "Name"
},
"commentStart": 0,
"end": 0,
"start": 0,
"type": "CallExpressionKw",
"type": "CallExpressionKw",
"unlabeled": {
"commentStart": 0,
"end": 0,
"start": 0,
"type": "PipeSubstitution",
"type": "PipeSubstitution"
}
}
],
"commentStart": 0,
@ -265,6 +562,259 @@ description: Result of parsing import_mesh_clone.kcl
"start": 0,
"type": "VariableDeclaration",
"type": "VariableDeclaration"
},
{
"commentStart": 0,
"end": 0,
"expression": {
"arguments": [
{
"type": "LabeledArg",
"label": {
"commentStart": 0,
"end": 0,
"name": "color",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 0,
"end": 0,
"raw": "\"#00ff00\"",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": "#00ff00"
}
}
],
"callee": {
"abs_path": false,
"commentStart": 0,
"end": 0,
"name": {
"commentStart": 0,
"end": 0,
"name": "appearance",
"start": 0,
"type": "Identifier"
},
"path": [],
"start": 0,
"type": "Name"
},
"commentStart": 0,
"end": 0,
"start": 0,
"type": "CallExpressionKw",
"type": "CallExpressionKw",
"unlabeled": {
"abs_path": false,
"commentStart": 0,
"end": 0,
"name": {
"commentStart": 0,
"end": 0,
"name": "green",
"start": 0,
"type": "Identifier"
},
"path": [],
"start": 0,
"type": "Name",
"type": "Name"
}
},
"start": 0,
"type": "ExpressionStatement",
"type": "ExpressionStatement"
},
{
"commentStart": 0,
"declaration": {
"commentStart": 0,
"end": 0,
"id": {
"commentStart": 0,
"end": 0,
"name": "blue",
"start": 0,
"type": "Identifier"
},
"init": {
"body": [
{
"callee": {
"abs_path": false,
"commentStart": 0,
"end": 0,
"name": {
"commentStart": 0,
"end": 0,
"name": "clone",
"start": 0,
"type": "Identifier"
},
"path": [],
"start": 0,
"type": "Name"
},
"commentStart": 0,
"end": 0,
"start": 0,
"type": "CallExpressionKw",
"type": "CallExpressionKw",
"unlabeled": {
"abs_path": false,
"commentStart": 0,
"end": 0,
"name": {
"commentStart": 0,
"end": 0,
"name": "red",
"start": 0,
"type": "Identifier"
},
"path": [],
"start": 0,
"type": "Name",
"type": "Name"
}
},
{
"arguments": [
{
"type": "LabeledArg",
"label": {
"commentStart": 0,
"end": 0,
"name": "y",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 0,
"end": 0,
"raw": "4000",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 4000.0,
"suffix": "None"
}
}
}
],
"callee": {
"abs_path": false,
"commentStart": 0,
"end": 0,
"name": {
"commentStart": 0,
"end": 0,
"name": "translate",
"start": 0,
"type": "Identifier"
},
"path": [],
"start": 0,
"type": "Name"
},
"commentStart": 0,
"end": 0,
"start": 0,
"type": "CallExpressionKw",
"type": "CallExpressionKw",
"unlabeled": {
"commentStart": 0,
"end": 0,
"start": 0,
"type": "PipeSubstitution",
"type": "PipeSubstitution"
}
}
],
"commentStart": 0,
"end": 0,
"start": 0,
"type": "PipeExpression",
"type": "PipeExpression"
},
"start": 0,
"type": "VariableDeclarator"
},
"end": 0,
"kind": "const",
"start": 0,
"type": "VariableDeclaration",
"type": "VariableDeclaration"
},
{
"commentStart": 0,
"end": 0,
"expression": {
"arguments": [
{
"type": "LabeledArg",
"label": {
"commentStart": 0,
"end": 0,
"name": "color",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 0,
"end": 0,
"raw": "\"#0000ff\"",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": "#0000ff"
}
}
],
"callee": {
"abs_path": false,
"commentStart": 0,
"end": 0,
"name": {
"commentStart": 0,
"end": 0,
"name": "appearance",
"start": 0,
"type": "Identifier"
},
"path": [],
"start": 0,
"type": "Name"
},
"commentStart": 0,
"end": 0,
"start": 0,
"type": "CallExpressionKw",
"type": "CallExpressionKw",
"unlabeled": {
"abs_path": false,
"commentStart": 0,
"end": 0,
"name": {
"commentStart": 0,
"end": 0,
"name": "blue",
"start": 0,
"type": "Identifier"
},
"path": [],
"start": 0,
"type": "Name",
"type": "Name"
}
},
"start": 0,
"type": "ExpressionStatement",
"type": "ExpressionStatement"
}
],
"commentStart": 0,
@ -282,7 +832,29 @@ description: Result of parsing import_mesh_clone.kcl
}
}
],
"1": [
"2": [
{
"commentStart": 0,
"end": 0,
"start": 0,
"type": "NonCodeNode",
"value": {
"type": "newLine"
}
}
],
"4": [
{
"commentStart": 0,
"end": 0,
"start": 0,
"type": "NonCodeNode",
"value": {
"type": "newLine"
}
}
],
"6": [
{
"commentStart": 0,
"end": 0,

View File

@ -1,10 +0,0 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Error from executing import_mesh_clone.kcl
---
KCL Engine error
× engine: Modeling command failed: websocket closed early
╭────
13 │ )
╰────

View File

@ -1,13 +1,18 @@
import "../inputs/cube.obj" as cube
@(lengthUnit = m)
import "../inputs/cube.obj" as yellow
model = cube
yellow
|> translate(%, x = -2000, y = -2000)
appearance(yellow, color = "#ffff00")
model2 = clone(model)
|> translate(
x = 1020,
)
|> appearance(
color = "#ff0000",
metalness = 50,
roughness = 50
)
red = clone(yellow)
|> translate(%, x = 4000)
appearance(red, color = "#ff0000")
green = clone(yellow)
|> translate(%, y = 4000)
appearance(green, color = "#00ff00")
blue = clone(red)
|> translate(%, y = 4000)
appearance(blue, color = "#0000ff")

View File

@ -25,6 +25,32 @@ description: Operations executed import_mesh_clone.kcl
"labeledArgs": {},
"sourceRange": []
},
{
"type": "KclStdLibCall",
"name": "clone",
"unlabeledArg": {
"value": {
"type": "ImportedGeometry",
"artifact_id": "[uuid]"
},
"sourceRange": []
},
"labeledArgs": {},
"sourceRange": []
},
{
"type": "KclStdLibCall",
"name": "clone",
"unlabeledArg": {
"value": {
"type": "ImportedGeometry",
"artifact_id": "[uuid]"
},
"sourceRange": []
},
"labeledArgs": {},
"sourceRange": []
},
{
"type": "GroupEnd"
}

View File

@ -0,0 +1,31 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Variables in memory after executing import_mesh_clone.kcl
---
{
"blue": {
"type": "ImportedGeometry",
"id": "[uuid]",
"value": [
"cube.obj"
]
},
"green": {
"type": "ImportedGeometry",
"id": "[uuid]",
"value": [
"cube.obj"
]
},
"red": {
"type": "ImportedGeometry",
"id": "[uuid]",
"value": [
"cube.obj"
]
},
"yellow": {
"type": "Module",
"value": 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

View File

@ -2,10 +2,21 @@
source: kcl-lib/src/simulation_tests.rs
description: Result of unparsing import_mesh_clone.kcl
---
import "../inputs/cube.obj" as cube
@(lengthUnit = m)
import "../inputs/cube.obj" as yellow
model = cube
yellow
|> translate(%, x = -2000, y = -2000)
appearance(yellow, color = "#ffff00")
model2 = clone(model)
|> translate(x = 1020)
|> appearance(color = "#ff0000", metalness = 50, roughness = 50)
red = clone(yellow)
|> translate(%, x = 4000)
appearance(red, color = "#ff0000")
green = clone(yellow)
|> translate(%, y = 4000)
appearance(green, color = "#00ff00")
blue = clone(red)
|> translate(%, y = 4000)
appearance(blue, color = "#0000ff")

View File

@ -12,8 +12,11 @@ flowchart LR
5["Sweep Extrusion<br>[124, 144, 1]"]
%% Missing NodePath
6[Wall]
%% face_code_ref=Missing NodePath
7["Cap Start"]
%% face_code_ref=Missing NodePath
8["Cap End"]
%% face_code_ref=Missing NodePath
9["SweepEdge Opposite"]
10["SweepEdge Adjacent"]
1 --- 2

View File

@ -12,8 +12,11 @@ flowchart LR
5["Sweep Extrusion<br>[143, 163, 1]"]
%% Missing NodePath
6[Wall]
%% face_code_ref=Missing NodePath
7["Cap Start"]
%% face_code_ref=Missing NodePath
8["Cap End"]
%% face_code_ref=Missing NodePath
9["SweepEdge Opposite"]
10["SweepEdge Adjacent"]
1 --- 2

View File

@ -2,37 +2,64 @@
flowchart LR
subgraph path3 [Path]
3["Path<br>[58, 113, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 1 }]
6["Segment<br>[121, 177, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 2 }]
8["Segment<br>[185, 241, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 3 }]
9["Segment<br>[249, 305, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 4 }]
12["Segment<br>[313, 320, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 5 }]
13[Solid2d]
end
subgraph path4 [Path]
4["Path<br>[58, 113, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 1 }]
5["Segment<br>[121, 177, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 2 }]
7["Segment<br>[185, 241, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 3 }]
10["Segment<br>[249, 305, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 4 }]
11["Segment<br>[313, 320, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 5 }]
14[Solid2d]
end
1["Plane<br>[33, 50, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 0 }]
2["Plane<br>[33, 50, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 0 }]
15["Sweep Extrusion<br>[328, 354, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 6 }]
16["Sweep Extrusion<br>[328, 354, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 6 }]
17["CompositeSolid Intersect<br>[480, 509, 0]"]
%% [ProgramBodyItem { index: 3 }, VariableDeclarationDeclaration, VariableDeclarationInit]
18[Wall]
%% face_code_ref=Missing NodePath
19[Wall]
%% face_code_ref=Missing NodePath
20[Wall]
%% face_code_ref=Missing NodePath
21[Wall]
%% face_code_ref=Missing NodePath
22[Wall]
%% face_code_ref=Missing NodePath
23[Wall]
%% face_code_ref=Missing NodePath
24[Wall]
%% face_code_ref=Missing NodePath
25[Wall]
%% face_code_ref=Missing NodePath
26["Cap Start"]
%% face_code_ref=Missing NodePath
27["Cap Start"]
%% face_code_ref=Missing NodePath
28["Cap End"]
%% face_code_ref=Missing NodePath
29["Cap End"]
%% face_code_ref=Missing NodePath
30["SweepEdge Opposite"]
31["SweepEdge Opposite"]
32["SweepEdge Opposite"]

View File

@ -31,13 +31,21 @@ flowchart LR
14["Sweep Extrusion<br>[1230, 1258, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 11 }]
15[Wall]
%% face_code_ref=Missing NodePath
16[Wall]
%% face_code_ref=Missing NodePath
17[Wall]
%% face_code_ref=Missing NodePath
18[Wall]
%% face_code_ref=Missing NodePath
19[Wall]
%% face_code_ref=Missing NodePath
20[Wall]
%% face_code_ref=Missing NodePath
21["Cap Start"]
%% face_code_ref=Missing NodePath
22["Cap End"]
%% face_code_ref=Missing NodePath
23["SweepEdge Opposite"]
24["SweepEdge Opposite"]
25["SweepEdge Opposite"]

View File

@ -147,71 +147,137 @@ flowchart LR
72["Sweep Extrusion<br>[5086, 5114, 0]"]
%% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 68 }]
73[Wall]
%% face_code_ref=Missing NodePath
74[Wall]
%% face_code_ref=Missing NodePath
75[Wall]
%% face_code_ref=Missing NodePath
76[Wall]
%% face_code_ref=Missing NodePath
77[Wall]
%% face_code_ref=Missing NodePath
78[Wall]
%% face_code_ref=Missing NodePath
79[Wall]
%% face_code_ref=Missing NodePath
80[Wall]
%% face_code_ref=Missing NodePath
81[Wall]
%% face_code_ref=Missing NodePath
82[Wall]
%% face_code_ref=Missing NodePath
83[Wall]
%% face_code_ref=Missing NodePath
84[Wall]
%% face_code_ref=Missing NodePath
85[Wall]
%% face_code_ref=Missing NodePath
86[Wall]
%% face_code_ref=Missing NodePath
87[Wall]
%% face_code_ref=Missing NodePath
88[Wall]
%% face_code_ref=Missing NodePath
89[Wall]
%% face_code_ref=Missing NodePath
90[Wall]
%% face_code_ref=Missing NodePath
91[Wall]
%% face_code_ref=Missing NodePath
92[Wall]
%% face_code_ref=Missing NodePath
93[Wall]
%% face_code_ref=Missing NodePath
94[Wall]
%% face_code_ref=Missing NodePath
95[Wall]
%% face_code_ref=Missing NodePath
96[Wall]
%% face_code_ref=Missing NodePath
97[Wall]
%% face_code_ref=Missing NodePath
98[Wall]
%% face_code_ref=Missing NodePath
99[Wall]
%% face_code_ref=Missing NodePath
100[Wall]
%% face_code_ref=Missing NodePath
101[Wall]
%% face_code_ref=Missing NodePath
102[Wall]
%% face_code_ref=Missing NodePath
103[Wall]
%% face_code_ref=Missing NodePath
104[Wall]
%% face_code_ref=Missing NodePath
105[Wall]
%% face_code_ref=Missing NodePath
106[Wall]
%% face_code_ref=Missing NodePath
107[Wall]
%% face_code_ref=Missing NodePath
108[Wall]
%% face_code_ref=Missing NodePath
109[Wall]
%% face_code_ref=Missing NodePath
110[Wall]
%% face_code_ref=Missing NodePath
111[Wall]
%% face_code_ref=Missing NodePath
112[Wall]
%% face_code_ref=Missing NodePath
113[Wall]
%% face_code_ref=Missing NodePath
114[Wall]
%% face_code_ref=Missing NodePath
115[Wall]
%% face_code_ref=Missing NodePath
116[Wall]
%% face_code_ref=Missing NodePath
117[Wall]
%% face_code_ref=Missing NodePath
118[Wall]
%% face_code_ref=Missing NodePath
119[Wall]
%% face_code_ref=Missing NodePath
120[Wall]
%% face_code_ref=Missing NodePath
121[Wall]
%% face_code_ref=Missing NodePath
122[Wall]
%% face_code_ref=Missing NodePath
123[Wall]
%% face_code_ref=Missing NodePath
124[Wall]
%% face_code_ref=Missing NodePath
125[Wall]
%% face_code_ref=Missing NodePath
126[Wall]
%% face_code_ref=Missing NodePath
127[Wall]
%% face_code_ref=Missing NodePath
128[Wall]
%% face_code_ref=Missing NodePath
129[Wall]
%% face_code_ref=Missing NodePath
130[Wall]
%% face_code_ref=Missing NodePath
131[Wall]
%% face_code_ref=Missing NodePath
132[Wall]
%% face_code_ref=Missing NodePath
133[Wall]
%% face_code_ref=Missing NodePath
134[Wall]
%% face_code_ref=Missing NodePath
135[Wall]
%% face_code_ref=Missing NodePath
136[Wall]
%% face_code_ref=Missing NodePath
137["Cap Start"]
%% face_code_ref=Missing NodePath
138["Cap End"]
%% face_code_ref=Missing NodePath
139["SweepEdge Opposite"]
140["SweepEdge Opposite"]
141["SweepEdge Opposite"]

View File

@ -2,239 +2,406 @@
flowchart LR
subgraph path8 [Path]
8["Path<br>[341, 388, 1]"]
%% Missing NodePath
31["Segment<br>[394, 462, 1]"]
%% Missing NodePath
32["Segment<br>[468, 568, 1]"]
%% Missing NodePath
33["Segment<br>[574, 691, 1]"]
%% Missing NodePath
34["Segment<br>[697, 782, 1]"]
%% Missing NodePath
35["Segment<br>[788, 795, 1]"]
%% Missing NodePath
105[Solid2d]
end
subgraph path9 [Path]
9["Path<br>[819, 854, 1]"]
%% Missing NodePath
36["Segment<br>[819, 854, 1]"]
%% Missing NodePath
100[Solid2d]
end
subgraph path10 [Path]
10["Path<br>[879, 1026, 1]"]
%% Missing NodePath
37["Segment<br>[879, 1026, 1]"]
%% Missing NodePath
114[Solid2d]
end
subgraph path11 [Path]
11["Path<br>[1051, 1199, 1]"]
%% Missing NodePath
38["Segment<br>[1051, 1199, 1]"]
%% Missing NodePath
104[Solid2d]
end
subgraph path12 [Path]
12["Path<br>[1224, 1372, 1]"]
%% Missing NodePath
39["Segment<br>[1224, 1372, 1]"]
%% Missing NodePath
110[Solid2d]
end
subgraph path13 [Path]
13["Path<br>[1397, 1546, 1]"]
%% Missing NodePath
40["Segment<br>[1397, 1546, 1]"]
%% Missing NodePath
115[Solid2d]
end
subgraph path14 [Path]
14["Path<br>[1714, 1770, 1]"]
%% Missing NodePath
41["Segment<br>[1776, 1841, 1]"]
%% Missing NodePath
42["Segment<br>[1847, 1899, 1]"]
%% Missing NodePath
43["Segment<br>[1905, 1956, 1]"]
%% Missing NodePath
44["Segment<br>[1962, 2014, 1]"]
%% Missing NodePath
45["Segment<br>[2020, 2086, 1]"]
%% Missing NodePath
46["Segment<br>[2092, 2144, 1]"]
%% Missing NodePath
47["Segment<br>[2150, 2182, 1]"]
%% Missing NodePath
48["Segment<br>[2188, 2253, 1]"]
%% Missing NodePath
49["Segment<br>[2259, 2266, 1]"]
%% Missing NodePath
101[Solid2d]
end
subgraph path15 [Path]
15["Path<br>[2615, 2728, 1]"]
%% Missing NodePath
50["Segment<br>[2734, 2789, 1]"]
%% Missing NodePath
51["Segment<br>[2795, 2830, 1]"]
%% Missing NodePath
52["Segment<br>[2836, 2891, 1]"]
%% Missing NodePath
53["Segment<br>[2897, 2933, 1]"]
%% Missing NodePath
54["Segment<br>[2939, 2994, 1]"]
%% Missing NodePath
55["Segment<br>[3000, 3036, 1]"]
%% Missing NodePath
56["Segment<br>[3042, 3097, 1]"]
%% Missing NodePath
57["Segment<br>[3103, 3159, 1]"]
%% Missing NodePath
end
subgraph path16 [Path]
16["Path<br>[3308, 3359, 1]"]
%% Missing NodePath
58["Segment<br>[3308, 3359, 1]"]
%% Missing NodePath
113[Solid2d]
end
subgraph path17 [Path]
17["Path<br>[3538, 3600, 1]"]
%% Missing NodePath
59["Segment<br>[3606, 3674, 1]"]
%% Missing NodePath
60["Segment<br>[3680, 3780, 1]"]
%% Missing NodePath
61["Segment<br>[3786, 3903, 1]"]
%% Missing NodePath
62["Segment<br>[3909, 3994, 1]"]
%% Missing NodePath
63["Segment<br>[4000, 4007, 1]"]
%% Missing NodePath
107[Solid2d]
end
subgraph path18 [Path]
18["Path<br>[4031, 4082, 1]"]
%% Missing NodePath
64["Segment<br>[4031, 4082, 1]"]
%% Missing NodePath
99[Solid2d]
end
subgraph path19 [Path]
19["Path<br>[4107, 4254, 1]"]
%% Missing NodePath
65["Segment<br>[4107, 4254, 1]"]
%% Missing NodePath
108[Solid2d]
end
subgraph path20 [Path]
20["Path<br>[4279, 4427, 1]"]
%% Missing NodePath
66["Segment<br>[4279, 4427, 1]"]
%% Missing NodePath
106[Solid2d]
end
subgraph path21 [Path]
21["Path<br>[4452, 4600, 1]"]
%% Missing NodePath
67["Segment<br>[4452, 4600, 1]"]
%% Missing NodePath
103[Solid2d]
end
subgraph path22 [Path]
22["Path<br>[4625, 4774, 1]"]
%% Missing NodePath
68["Segment<br>[4625, 4774, 1]"]
%% Missing NodePath
98[Solid2d]
end
subgraph path23 [Path]
23["Path<br>[4916, 4954, 1]"]
%% Missing NodePath
69["Segment<br>[4916, 4954, 1]"]
%% Missing NodePath
118[Solid2d]
end
subgraph path24 [Path]
24["Path<br>[5027, 5063, 1]"]
%% Missing NodePath
70["Segment<br>[5027, 5063, 1]"]
%% Missing NodePath
111[Solid2d]
end
subgraph path25 [Path]
25["Path<br>[295, 345, 3]"]
%% Missing NodePath
71["Segment<br>[295, 345, 3]"]
%% Missing NodePath
102[Solid2d]
end
subgraph path26 [Path]
26["Path<br>[520, 555, 3]"]
%% Missing NodePath
72["Segment<br>[520, 555, 3]"]
%% Missing NodePath
112[Solid2d]
end
subgraph path27 [Path]
27["Path<br>[234, 273, 4]"]
%% Missing NodePath
73["Segment<br>[279, 309, 4]"]
%% Missing NodePath
74["Segment<br>[315, 354, 4]"]
%% Missing NodePath
75["Segment<br>[360, 384, 4]"]
%% Missing NodePath
76["Segment<br>[390, 414, 4]"]
%% Missing NodePath
77["Segment<br>[420, 461, 4]"]
%% Missing NodePath
78["Segment<br>[467, 505, 4]"]
%% Missing NodePath
79["Segment<br>[511, 534, 4]"]
%% Missing NodePath
80["Segment<br>[540, 557, 4]"]
%% Missing NodePath
81["Segment<br>[563, 584, 4]"]
%% Missing NodePath
82["Segment<br>[590, 677, 4]"]
%% Missing NodePath
83["Segment<br>[683, 720, 4]"]
%% Missing NodePath
84["Segment<br>[726, 763, 4]"]
%% Missing NodePath
85["Segment<br>[769, 776, 4]"]
%% Missing NodePath
109[Solid2d]
end
subgraph path28 [Path]
28["Path<br>[1131, 1221, 4]"]
%% Missing NodePath
87["Segment<br>[1229, 1298, 4]"]
%% Missing NodePath
89["Segment<br>[1306, 1606, 4]"]
%% Missing NodePath
91["Segment<br>[1614, 1916, 4]"]
%% Missing NodePath
93["Segment<br>[1924, 2143, 4]"]
%% Missing NodePath
94["Segment<br>[2151, 2158, 4]"]
%% Missing NodePath
97[Solid2d]
end
subgraph path29 [Path]
29["Path<br>[1131, 1221, 4]"]
%% Missing NodePath
96["Segment<br>[2151, 2158, 4]"]
%% Missing NodePath
116[Solid2d]
end
subgraph path30 [Path]
30["Path<br>[1131, 1221, 4]"]
%% Missing NodePath
86["Segment<br>[1229, 1298, 4]"]
%% Missing NodePath
88["Segment<br>[1306, 1606, 4]"]
%% Missing NodePath
90["Segment<br>[1614, 1916, 4]"]
%% Missing NodePath
92["Segment<br>[1924, 2143, 4]"]
%% Missing NodePath
95["Segment<br>[2151, 2158, 4]"]
%% Missing NodePath
117[Solid2d]
end
1["Plane<br>[318, 335, 1]"]
%% Missing NodePath
2["Plane<br>[222, 249, 3]"]
%% Missing NodePath
3["Plane<br>[485, 513, 3]"]
%% Missing NodePath
4["Plane<br>[211, 228, 4]"]
%% Missing NodePath
5["Plane<br>[1084, 1122, 4]"]
%% Missing NodePath
6["Plane<br>[1084, 1122, 4]"]
%% Missing NodePath
7["Plane<br>[1084, 1122, 4]"]
%% Missing NodePath
119["Sweep Extrusion<br>[1553, 1572, 1]"]
%% Missing NodePath
120["Sweep Extrusion<br>[2406, 2426, 1]"]
%% Missing NodePath
121["Sweep Extrusion<br>[2406, 2426, 1]"]
%% Missing NodePath
122["Sweep Extrusion<br>[2406, 2426, 1]"]
%% Missing NodePath
123["Sweep Extrusion<br>[2406, 2426, 1]"]
%% Missing NodePath
124["Sweep Extrusion<br>[3165, 3200, 1]"]
%% Missing NodePath
125["Sweep Extrusion<br>[3365, 3403, 1]"]
%% Missing NodePath
126["Sweep Extrusion<br>[4781, 4800, 1]"]
%% Missing NodePath
127["Sweep Extrusion<br>[4960, 4980, 1]"]
%% Missing NodePath
128["Sweep Extrusion<br>[5069, 5090, 1]"]
%% Missing NodePath
129["Sweep Extrusion<br>[351, 371, 3]"]
%% Missing NodePath
130["Sweep Extrusion<br>[561, 582, 3]"]
%% Missing NodePath
131["Sweep Revolve<br>[782, 864, 4]"]
%% Missing NodePath
132["Sweep Loft<br>[2472, 2491, 4]"]
%% Missing NodePath
133[Wall]
%% face_code_ref=Missing NodePath
134[Wall]
%% face_code_ref=Missing NodePath
135[Wall]
%% face_code_ref=Missing NodePath
136[Wall]
%% face_code_ref=Missing NodePath
137[Wall]
%% face_code_ref=Missing NodePath
138[Wall]
%% face_code_ref=Missing NodePath
139[Wall]
%% face_code_ref=Missing NodePath
140[Wall]
%% face_code_ref=Missing NodePath
141[Wall]
%% face_code_ref=Missing NodePath
142[Wall]
%% face_code_ref=Missing NodePath
143[Wall]
%% face_code_ref=Missing NodePath
144[Wall]
%% face_code_ref=Missing NodePath
145[Wall]
%% face_code_ref=Missing NodePath
146[Wall]
%% face_code_ref=Missing NodePath
147[Wall]
%% face_code_ref=Missing NodePath
148[Wall]
%% face_code_ref=Missing NodePath
149[Wall]
%% face_code_ref=Missing NodePath
150[Wall]
%% face_code_ref=Missing NodePath
151[Wall]
%% face_code_ref=Missing NodePath
152[Wall]
%% face_code_ref=Missing NodePath
153[Wall]
%% face_code_ref=Missing NodePath
154[Wall]
%% face_code_ref=Missing NodePath
155[Wall]
%% face_code_ref=Missing NodePath
156[Wall]
%% face_code_ref=Missing NodePath
157[Wall]
%% face_code_ref=Missing NodePath
158[Wall]
%% face_code_ref=Missing NodePath
159[Wall]
%% face_code_ref=Missing NodePath
160[Wall]
%% face_code_ref=Missing NodePath
161[Wall]
%% face_code_ref=Missing NodePath
162[Wall]
%% face_code_ref=Missing NodePath
163[Wall]
%% face_code_ref=Missing NodePath
164[Wall]
%% face_code_ref=Missing NodePath
165[Wall]
%% face_code_ref=Missing NodePath
166[Wall]
%% face_code_ref=Missing NodePath
167[Wall]
%% face_code_ref=Missing NodePath
168[Wall]
%% face_code_ref=Missing NodePath
169[Wall]
%% face_code_ref=Missing NodePath
170[Wall]
%% face_code_ref=Missing NodePath
171[Wall]
%% face_code_ref=Missing NodePath
172[Wall]
%% face_code_ref=Missing NodePath
173[Wall]
%% face_code_ref=Missing NodePath
174[Wall]
%% face_code_ref=Missing NodePath
175[Wall]
%% face_code_ref=Missing NodePath
176[Wall]
%% face_code_ref=Missing NodePath
177[Wall]
%% face_code_ref=Missing NodePath
178["Cap Start"]
%% face_code_ref=Missing NodePath
179["Cap Start"]
%% face_code_ref=Missing NodePath
180["Cap Start"]
%% face_code_ref=Missing NodePath
181["Cap Start"]
%% face_code_ref=Missing NodePath
182["Cap End"]
%% face_code_ref=Missing NodePath
183["Cap End"]
%% face_code_ref=Missing NodePath
184["Cap End"]
%% face_code_ref=Missing NodePath
185["Cap End"]
%% face_code_ref=Missing NodePath
186["Cap End"]
%% face_code_ref=Missing NodePath
187["Cap End"]
%% face_code_ref=Missing NodePath
188["Cap End"]
%% face_code_ref=Missing NodePath
189["Cap End"]
%% face_code_ref=Missing NodePath
190["SweepEdge Opposite"]
191["SweepEdge Opposite"]
192["SweepEdge Opposite"]
@ -313,15 +480,25 @@ flowchart LR
265["SweepEdge Adjacent"]
266["SweepEdge Adjacent"]
267["EdgeCut Fillet<br>[5131, 5642, 1]"]
%% Missing NodePath
268["EdgeCut Fillet<br>[5131, 5642, 1]"]
%% Missing NodePath
269["EdgeCut Fillet<br>[5131, 5642, 1]"]
%% Missing NodePath
270["EdgeCut Fillet<br>[5131, 5642, 1]"]
%% Missing NodePath
271["EdgeCut Fillet<br>[5131, 5642, 1]"]
%% Missing NodePath
272["EdgeCut Fillet<br>[5131, 5642, 1]"]
%% Missing NodePath
273["EdgeCut Fillet<br>[5131, 5642, 1]"]
%% Missing NodePath
274["EdgeCut Fillet<br>[5131, 5642, 1]"]
%% Missing NodePath
275["EdgeCut Fillet<br>[412, 470, 3]"]
%% Missing NodePath
276["EdgeCut Fillet<br>[412, 470, 3]"]
%% Missing NodePath
1 --- 8
1 --- 9
1 --- 10

View File

@ -2,70 +2,115 @@
flowchart LR
subgraph path8 [Path]
8["Path<br>[682, 744, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
15["Segment<br>[682, 744, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
32[Solid2d]
end
subgraph path9 [Path]
9["Path<br>[768, 814, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }, CallKwArg { index: 0 }]
16["Segment<br>[768, 814, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }, CallKwArg { index: 0 }]
31[Solid2d]
end
subgraph path10 [Path]
10["Path<br>[998, 1054, 0]"]
%% [ProgramBodyItem { index: 12 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
17["Segment<br>[1060, 1119, 0]"]
%% [ProgramBodyItem { index: 12 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
18["Segment<br>[1125, 1132, 0]"]
%% [ProgramBodyItem { index: 12 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
29[Solid2d]
end
subgraph path11 [Path]
11["Path<br>[1502, 1624, 0]"]
%% [ProgramBodyItem { index: 14 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
19["Segment<br>[1630, 1690, 0]"]
%% [ProgramBodyItem { index: 14 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
20["Segment<br>[1696, 1727, 0]"]
%% [ProgramBodyItem { index: 14 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
21["Segment<br>[1733, 1761, 0]"]
%% [ProgramBodyItem { index: 14 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
22["Segment<br>[1767, 1774, 0]"]
%% [ProgramBodyItem { index: 14 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
27[Solid2d]
end
subgraph path12 [Path]
12["Path<br>[2108, 2250, 0]"]
%% [ProgramBodyItem { index: 16 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
23["Segment<br>[2108, 2250, 0]"]
%% [ProgramBodyItem { index: 16 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
28[Solid2d]
end
subgraph path13 [Path]
13["Path<br>[2644, 2697, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
24["Segment<br>[2644, 2697, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
30[Solid2d]
end
subgraph path14 [Path]
14["Path<br>[2721, 2795, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }, CallKwArg { index: 0 }]
25["Segment<br>[2721, 2795, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }, CallKwArg { index: 0 }]
26[Solid2d]
end
1["Plane<br>[628, 675, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }, CallKwUnlabeledArg]
2["Plane<br>[975, 992, 0]"]
%% [ProgramBodyItem { index: 12 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
3["Plane<br>[1479, 1496, 0]"]
%% [ProgramBodyItem { index: 14 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
4["Plane<br>[2085, 2102, 0]"]
%% [ProgramBodyItem { index: 16 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
5["Plane<br>[2590, 2637, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }, CallKwUnlabeledArg]
6["StartSketchOnPlane<br>[614, 676, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
7["StartSketchOnPlane<br>[2576, 2638, 0]"]
%% [ProgramBodyItem { index: 18 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
33["Sweep Extrusion<br>[866, 918, 0]"]
%% [ProgramBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit]
34["Sweep Revolve<br>[1214, 1244, 0]"]
%% [ProgramBodyItem { index: 13 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
35["Sweep Revolve<br>[1816, 1846, 0]"]
%% [ProgramBodyItem { index: 15 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
36["Sweep Revolve<br>[2293, 2344, 0]"]
%% [ProgramBodyItem { index: 17 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
37["Sweep Extrusion<br>[2812, 2865, 0]"]
%% [ProgramBodyItem { index: 19 }, VariableDeclarationDeclaration, VariableDeclarationInit]
38[Wall]
%% face_code_ref=Missing NodePath
39[Wall]
%% face_code_ref=Missing NodePath
40[Wall]
%% face_code_ref=Missing NodePath
41[Wall]
%% face_code_ref=Missing NodePath
42[Wall]
%% face_code_ref=Missing NodePath
43[Wall]
%% face_code_ref=Missing NodePath
44[Wall]
%% face_code_ref=Missing NodePath
45[Wall]
%% face_code_ref=Missing NodePath
46[Wall]
%% face_code_ref=Missing NodePath
47["Cap Start"]
%% face_code_ref=Missing NodePath
48["Cap Start"]
%% face_code_ref=Missing NodePath
49["Cap Start"]
%% face_code_ref=Missing NodePath
50["Cap End"]
%% face_code_ref=Missing NodePath
51["Cap End"]
%% face_code_ref=Missing NodePath
52["Cap End"]
%% face_code_ref=Missing NodePath
53["SweepEdge Opposite"]
54["SweepEdge Opposite"]
55["SweepEdge Opposite"]

View File

@ -5122,7 +5122,7 @@ description: Artifact commands bench.kcl
"trajectory": "[uuid]",
"sectional": false,
"tolerance": 0.0000001,
"relative_to": "sketch_plane"
"relative_to": "trajectory_curve"
}
},
{
@ -5134,7 +5134,7 @@ description: Artifact commands bench.kcl
"trajectory": "[uuid]",
"sectional": false,
"tolerance": 0.0000001,
"relative_to": "sketch_plane"
"relative_to": "trajectory_curve"
}
}
]

View File

@ -2,456 +2,864 @@
flowchart LR
subgraph path24 [Path]
24["Path<br>[380, 413, 1]"]
%% Missing NodePath
42["Segment<br>[421, 447, 1]"]
%% Missing NodePath
50["Segment<br>[455, 517, 1]"]
%% Missing NodePath
55["Segment<br>[525, 587, 1]"]
%% Missing NodePath
63["Segment<br>[595, 658, 1]"]
%% Missing NodePath
64["Segment<br>[666, 691, 1]"]
%% Missing NodePath
70["Segment<br>[699, 719, 1]"]
%% Missing NodePath
77["Segment<br>[727, 751, 1]"]
%% Missing NodePath
83["Segment<br>[759, 821, 1]"]
%% Missing NodePath
89["Segment<br>[829, 854, 1]"]
%% Missing NodePath
96["Segment<br>[862, 882, 1]"]
%% Missing NodePath
102["Segment<br>[890, 914, 1]"]
%% Missing NodePath
106["Segment<br>[922, 983, 1]"]
%% Missing NodePath
112["Segment<br>[991, 1052, 1]"]
%% Missing NodePath
118["Segment<br>[1060, 1085, 1]"]
%% Missing NodePath
125["Segment<br>[1093, 1117, 1]"]
%% Missing NodePath
132["Segment<br>[1125, 1187, 1]"]
%% Missing NodePath
139["Segment<br>[1195, 1220, 1]"]
%% Missing NodePath
146["Segment<br>[1228, 1255, 1]"]
%% Missing NodePath
152["Segment<br>[1263, 1324, 1]"]
%% Missing NodePath
157["Segment<br>[1332, 1376, 1]"]
%% Missing NodePath
162["Segment<br>[1384, 1391, 1]"]
%% Missing NodePath
213[Solid2d]
end
subgraph path25 [Path]
25["Path<br>[380, 413, 1]"]
%% Missing NodePath
40["Segment<br>[421, 447, 1]"]
%% Missing NodePath
51["Segment<br>[455, 517, 1]"]
%% Missing NodePath
57["Segment<br>[525, 587, 1]"]
%% Missing NodePath
58["Segment<br>[595, 658, 1]"]
%% Missing NodePath
69["Segment<br>[666, 691, 1]"]
%% Missing NodePath
75["Segment<br>[699, 719, 1]"]
%% Missing NodePath
80["Segment<br>[727, 751, 1]"]
%% Missing NodePath
82["Segment<br>[759, 821, 1]"]
%% Missing NodePath
90["Segment<br>[829, 854, 1]"]
%% Missing NodePath
97["Segment<br>[862, 882, 1]"]
%% Missing NodePath
103["Segment<br>[890, 914, 1]"]
%% Missing NodePath
108["Segment<br>[922, 983, 1]"]
%% Missing NodePath
114["Segment<br>[991, 1052, 1]"]
%% Missing NodePath
121["Segment<br>[1060, 1085, 1]"]
%% Missing NodePath
129["Segment<br>[1093, 1117, 1]"]
%% Missing NodePath
133["Segment<br>[1125, 1187, 1]"]
%% Missing NodePath
140["Segment<br>[1195, 1220, 1]"]
%% Missing NodePath
143["Segment<br>[1228, 1255, 1]"]
%% Missing NodePath
150["Segment<br>[1263, 1324, 1]"]
%% Missing NodePath
154["Segment<br>[1332, 1376, 1]"]
%% Missing NodePath
163["Segment<br>[1384, 1391, 1]"]
%% Missing NodePath
214[Solid2d]
end
subgraph path26 [Path]
26["Path<br>[380, 413, 1]"]
%% Missing NodePath
44["Segment<br>[421, 447, 1]"]
%% Missing NodePath
48["Segment<br>[455, 517, 1]"]
%% Missing NodePath
53["Segment<br>[525, 587, 1]"]
%% Missing NodePath
61["Segment<br>[595, 658, 1]"]
%% Missing NodePath
66["Segment<br>[666, 691, 1]"]
%% Missing NodePath
73["Segment<br>[699, 719, 1]"]
%% Missing NodePath
81["Segment<br>[727, 751, 1]"]
%% Missing NodePath
87["Segment<br>[759, 821, 1]"]
%% Missing NodePath
92["Segment<br>[829, 854, 1]"]
%% Missing NodePath
95["Segment<br>[862, 882, 1]"]
%% Missing NodePath
101["Segment<br>[890, 914, 1]"]
%% Missing NodePath
111["Segment<br>[922, 983, 1]"]
%% Missing NodePath
117["Segment<br>[991, 1052, 1]"]
%% Missing NodePath
119["Segment<br>[1060, 1085, 1]"]
%% Missing NodePath
124["Segment<br>[1093, 1117, 1]"]
%% Missing NodePath
135["Segment<br>[1125, 1187, 1]"]
%% Missing NodePath
137["Segment<br>[1195, 1220, 1]"]
%% Missing NodePath
147["Segment<br>[1228, 1255, 1]"]
%% Missing NodePath
148["Segment<br>[1263, 1324, 1]"]
%% Missing NodePath
159["Segment<br>[1332, 1376, 1]"]
%% Missing NodePath
164["Segment<br>[1384, 1391, 1]"]
%% Missing NodePath
218[Solid2d]
end
subgraph path27 [Path]
27["Path<br>[380, 413, 1]"]
%% Missing NodePath
43["Segment<br>[421, 447, 1]"]
%% Missing NodePath
47["Segment<br>[455, 517, 1]"]
%% Missing NodePath
56["Segment<br>[525, 587, 1]"]
%% Missing NodePath
59["Segment<br>[595, 658, 1]"]
%% Missing NodePath
65["Segment<br>[666, 691, 1]"]
%% Missing NodePath
71["Segment<br>[699, 719, 1]"]
%% Missing NodePath
76["Segment<br>[727, 751, 1]"]
%% Missing NodePath
86["Segment<br>[759, 821, 1]"]
%% Missing NodePath
91["Segment<br>[829, 854, 1]"]
%% Missing NodePath
99["Segment<br>[862, 882, 1]"]
%% Missing NodePath
100["Segment<br>[890, 914, 1]"]
%% Missing NodePath
110["Segment<br>[922, 983, 1]"]
%% Missing NodePath
116["Segment<br>[991, 1052, 1]"]
%% Missing NodePath
122["Segment<br>[1060, 1085, 1]"]
%% Missing NodePath
128["Segment<br>[1093, 1117, 1]"]
%% Missing NodePath
134["Segment<br>[1125, 1187, 1]"]
%% Missing NodePath
136["Segment<br>[1195, 1220, 1]"]
%% Missing NodePath
145["Segment<br>[1228, 1255, 1]"]
%% Missing NodePath
151["Segment<br>[1263, 1324, 1]"]
%% Missing NodePath
156["Segment<br>[1332, 1376, 1]"]
%% Missing NodePath
161["Segment<br>[1384, 1391, 1]"]
%% Missing NodePath
220[Solid2d]
end
subgraph path28 [Path]
28["Path<br>[380, 413, 1]"]
%% Missing NodePath
41["Segment<br>[421, 447, 1]"]
%% Missing NodePath
46["Segment<br>[455, 517, 1]"]
%% Missing NodePath
54["Segment<br>[525, 587, 1]"]
%% Missing NodePath
62["Segment<br>[595, 658, 1]"]
%% Missing NodePath
67["Segment<br>[666, 691, 1]"]
%% Missing NodePath
74["Segment<br>[699, 719, 1]"]
%% Missing NodePath
78["Segment<br>[727, 751, 1]"]
%% Missing NodePath
85["Segment<br>[759, 821, 1]"]
%% Missing NodePath
93["Segment<br>[829, 854, 1]"]
%% Missing NodePath
94["Segment<br>[862, 882, 1]"]
%% Missing NodePath
104["Segment<br>[890, 914, 1]"]
%% Missing NodePath
107["Segment<br>[922, 983, 1]"]
%% Missing NodePath
115["Segment<br>[991, 1052, 1]"]
%% Missing NodePath
123["Segment<br>[1060, 1085, 1]"]
%% Missing NodePath
126["Segment<br>[1093, 1117, 1]"]
%% Missing NodePath
130["Segment<br>[1125, 1187, 1]"]
%% Missing NodePath
138["Segment<br>[1195, 1220, 1]"]
%% Missing NodePath
144["Segment<br>[1228, 1255, 1]"]
%% Missing NodePath
149["Segment<br>[1263, 1324, 1]"]
%% Missing NodePath
158["Segment<br>[1332, 1376, 1]"]
%% Missing NodePath
165["Segment<br>[1384, 1391, 1]"]
%% Missing NodePath
221[Solid2d]
end
subgraph path29 [Path]
29["Path<br>[380, 413, 1]"]
%% Missing NodePath
45["Segment<br>[421, 447, 1]"]
%% Missing NodePath
49["Segment<br>[455, 517, 1]"]
%% Missing NodePath
52["Segment<br>[525, 587, 1]"]
%% Missing NodePath
60["Segment<br>[595, 658, 1]"]
%% Missing NodePath
68["Segment<br>[666, 691, 1]"]
%% Missing NodePath
72["Segment<br>[699, 719, 1]"]
%% Missing NodePath
79["Segment<br>[727, 751, 1]"]
%% Missing NodePath
84["Segment<br>[759, 821, 1]"]
%% Missing NodePath
88["Segment<br>[829, 854, 1]"]
%% Missing NodePath
98["Segment<br>[862, 882, 1]"]
%% Missing NodePath
105["Segment<br>[890, 914, 1]"]
%% Missing NodePath
109["Segment<br>[922, 983, 1]"]
%% Missing NodePath
113["Segment<br>[991, 1052, 1]"]
%% Missing NodePath
120["Segment<br>[1060, 1085, 1]"]
%% Missing NodePath
127["Segment<br>[1093, 1117, 1]"]
%% Missing NodePath
131["Segment<br>[1125, 1187, 1]"]
%% Missing NodePath
141["Segment<br>[1195, 1220, 1]"]
%% Missing NodePath
142["Segment<br>[1228, 1255, 1]"]
%% Missing NodePath
153["Segment<br>[1263, 1324, 1]"]
%% Missing NodePath
155["Segment<br>[1332, 1376, 1]"]
%% Missing NodePath
160["Segment<br>[1384, 1391, 1]"]
%% Missing NodePath
223[Solid2d]
end
subgraph path30 [Path]
30["Path<br>[1783, 1807, 1]"]
%% Missing NodePath
end
subgraph path31 [Path]
31["Path<br>[1783, 1807, 1]"]
%% Missing NodePath
end
subgraph path32 [Path]
32["Path<br>[1815, 1941, 1]"]
%% Missing NodePath
167["Segment<br>[1815, 1941, 1]"]
%% Missing NodePath
170["Segment<br>[1815, 1941, 1]"]
%% Missing NodePath
172["Segment<br>[1815, 1941, 1]"]
%% Missing NodePath
173["Segment<br>[1815, 1941, 1]"]
%% Missing NodePath
176["Segment<br>[1815, 1941, 1]"]
%% Missing NodePath
177["Segment<br>[1815, 1941, 1]"]
%% Missing NodePath
178["Segment<br>[1815, 1941, 1]"]
%% Missing NodePath
212[Solid2d]
end
subgraph path33 [Path]
33["Path<br>[1815, 1941, 1]"]
%% Missing NodePath
166["Segment<br>[1815, 1941, 1]"]
%% Missing NodePath
168["Segment<br>[1815, 1941, 1]"]
%% Missing NodePath
169["Segment<br>[1815, 1941, 1]"]
%% Missing NodePath
171["Segment<br>[1815, 1941, 1]"]
%% Missing NodePath
174["Segment<br>[1815, 1941, 1]"]
%% Missing NodePath
175["Segment<br>[1815, 1941, 1]"]
%% Missing NodePath
179["Segment<br>[1815, 1941, 1]"]
%% Missing NodePath
216[Solid2d]
end
subgraph path34 [Path]
34["Path<br>[2235, 2262, 1]"]
180["Segment<br>[2270, 2292, 1]"]
181["Segment<br>[2300, 2322, 1]"]
182["Segment<br>[2330, 2352, 1]"]
183["Segment<br>[2360, 2383, 1]"]
184["Segment<br>[2391, 2414, 1]"]
185["Segment<br>[2422, 2457, 1]"]
186["Segment<br>[2465, 2472, 1]"]
34["Path<br>[2217, 2244, 1]"]
%% Missing NodePath
180["Segment<br>[2252, 2274, 1]"]
%% Missing NodePath
181["Segment<br>[2282, 2304, 1]"]
%% Missing NodePath
182["Segment<br>[2312, 2334, 1]"]
%% Missing NodePath
183["Segment<br>[2342, 2365, 1]"]
%% Missing NodePath
184["Segment<br>[2373, 2396, 1]"]
%% Missing NodePath
185["Segment<br>[2404, 2439, 1]"]
%% Missing NodePath
186["Segment<br>[2447, 2454, 1]"]
%% Missing NodePath
215[Solid2d]
end
subgraph path35 [Path]
35["Path<br>[2746, 2775, 1]"]
187["Segment<br>[2783, 2818, 1]"]
188["Segment<br>[2826, 2851, 1]"]
189["Segment<br>[2859, 2895, 1]"]
190["Segment<br>[2903, 2927, 1]"]
191["Segment<br>[2935, 2969, 1]"]
192["Segment<br>[2977, 3012, 1]"]
193["Segment<br>[3020, 3027, 1]"]
35["Path<br>[2719, 2748, 1]"]
%% Missing NodePath
187["Segment<br>[2756, 2791, 1]"]
%% Missing NodePath
188["Segment<br>[2799, 2824, 1]"]
%% Missing NodePath
189["Segment<br>[2832, 2868, 1]"]
%% Missing NodePath
190["Segment<br>[2876, 2900, 1]"]
%% Missing NodePath
191["Segment<br>[2908, 2942, 1]"]
%% Missing NodePath
192["Segment<br>[2950, 2985, 1]"]
%% Missing NodePath
193["Segment<br>[2993, 3000, 1]"]
%% Missing NodePath
219[Solid2d]
end
subgraph path36 [Path]
36["Path<br>[3304, 3331, 1]"]
195["Segment<br>[3339, 3358, 1]"]
197["Segment<br>[3366, 3415, 1]"]
36["Path<br>[3268, 3295, 1]"]
%% Missing NodePath
195["Segment<br>[3303, 3322, 1]"]
%% Missing NodePath
197["Segment<br>[3330, 3379, 1]"]
%% Missing NodePath
end
subgraph path37 [Path]
37["Path<br>[3304, 3331, 1]"]
194["Segment<br>[3339, 3358, 1]"]
196["Segment<br>[3366, 3415, 1]"]
37["Path<br>[3268, 3295, 1]"]
%% Missing NodePath
194["Segment<br>[3303, 3322, 1]"]
%% Missing NodePath
196["Segment<br>[3330, 3379, 1]"]
%% Missing NodePath
end
subgraph path38 [Path]
38["Path<br>[3516, 3549, 1]"]
198["Segment<br>[3557, 3576, 1]"]
201["Segment<br>[3584, 3606, 1]"]
202["Segment<br>[3614, 3637, 1]"]
204["Segment<br>[3645, 3665, 1]"]
206["Segment<br>[3673, 3697, 1]"]
208["Segment<br>[3705, 3728, 1]"]
211["Segment<br>[3736, 3743, 1]"]
38["Path<br>[3480, 3513, 1]"]
%% Missing NodePath
198["Segment<br>[3521, 3540, 1]"]
%% Missing NodePath
201["Segment<br>[3548, 3570, 1]"]
%% Missing NodePath
202["Segment<br>[3578, 3601, 1]"]
%% Missing NodePath
204["Segment<br>[3609, 3629, 1]"]
%% Missing NodePath
206["Segment<br>[3637, 3661, 1]"]
%% Missing NodePath
208["Segment<br>[3669, 3692, 1]"]
%% Missing NodePath
211["Segment<br>[3700, 3707, 1]"]
%% Missing NodePath
217[Solid2d]
end
subgraph path39 [Path]
39["Path<br>[3516, 3549, 1]"]
199["Segment<br>[3557, 3576, 1]"]
200["Segment<br>[3584, 3606, 1]"]
203["Segment<br>[3614, 3637, 1]"]
205["Segment<br>[3645, 3665, 1]"]
207["Segment<br>[3673, 3697, 1]"]
209["Segment<br>[3705, 3728, 1]"]
210["Segment<br>[3736, 3743, 1]"]
39["Path<br>[3480, 3513, 1]"]
%% Missing NodePath
199["Segment<br>[3521, 3540, 1]"]
%% Missing NodePath
200["Segment<br>[3548, 3570, 1]"]
%% Missing NodePath
203["Segment<br>[3578, 3601, 1]"]
%% Missing NodePath
205["Segment<br>[3609, 3629, 1]"]
%% Missing NodePath
207["Segment<br>[3637, 3661, 1]"]
%% Missing NodePath
209["Segment<br>[3669, 3692, 1]"]
%% Missing NodePath
210["Segment<br>[3700, 3707, 1]"]
%% Missing NodePath
222[Solid2d]
end
1["Plane<br>[841, 882, 0]"]
%% [ProgramBodyItem { index: 8 }, ExpressionStatementExpr, CallKwUnlabeledArg]
2["Plane<br>[892, 934, 0]"]
%% [ProgramBodyItem { index: 9 }, ExpressionStatementExpr, CallKwUnlabeledArg]
3["Plane<br>[993, 1035, 0]"]
%% [ProgramBodyItem { index: 10 }, ExpressionStatementExpr, CallKwUnlabeledArg]
4["Plane<br>[1095, 1162, 0]"]
%% [ProgramBodyItem { index: 11 }, ExpressionStatementExpr, CallKwUnlabeledArg]
5["Plane<br>[1241, 1308, 0]"]
%% [ProgramBodyItem { index: 12 }, ExpressionStatementExpr, CallKwUnlabeledArg]
6["Plane<br>[352, 372, 1]"]
%% Missing NodePath
7["Plane<br>[352, 372, 1]"]
8["Plane<br>[3823, 3858, 1]"]
9["Plane<br>[3823, 3858, 1]"]
10["Plane<br>[3887, 3916, 1]"]
11["Plane<br>[3887, 3916, 1]"]
%% Missing NodePath
8["Plane<br>[3787, 3822, 1]"]
%% Missing NodePath
9["Plane<br>[3787, 3822, 1]"]
%% Missing NodePath
10["Plane<br>[3851, 3880, 1]"]
%% Missing NodePath
11["Plane<br>[3851, 3880, 1]"]
%% Missing NodePath
12["StartSketchOnPlane<br>[352, 372, 1]"]
13["StartSketchOnPlane<br>[3276, 3296, 1]"]
14["StartSketchOnPlane<br>[3488, 3508, 1]"]
15["StartSketchOnPlane<br>[2718, 2738, 1]"]
16["StartSketchOnPlane<br>[3488, 3508, 1]"]
17["StartSketchOnPlane<br>[2207, 2227, 1]"]
%% Missing NodePath
13["StartSketchOnPlane<br>[3240, 3260, 1]"]
%% Missing NodePath
14["StartSketchOnPlane<br>[3452, 3472, 1]"]
%% Missing NodePath
15["StartSketchOnPlane<br>[2691, 2711, 1]"]
%% Missing NodePath
16["StartSketchOnPlane<br>[3452, 3472, 1]"]
%% Missing NodePath
17["StartSketchOnPlane<br>[2189, 2209, 1]"]
%% Missing NodePath
18["StartSketchOnPlane<br>[352, 372, 1]"]
%% Missing NodePath
19["StartSketchOnPlane<br>[1755, 1775, 1]"]
%% Missing NodePath
20["StartSketchOnPlane<br>[1755, 1775, 1]"]
21["StartSketchOnPlane<br>[3276, 3296, 1]"]
%% Missing NodePath
21["StartSketchOnPlane<br>[3240, 3260, 1]"]
%% Missing NodePath
22["StartSketchOnPlane<br>[352, 372, 1]"]
%% Missing NodePath
23["StartSketchOnPlane<br>[352, 372, 1]"]
%% Missing NodePath
224["Sweep Extrusion<br>[1480, 1518, 1]"]
%% Missing NodePath
225["Sweep Extrusion<br>[1480, 1518, 1]"]
%% Missing NodePath
226["Sweep Extrusion<br>[1480, 1518, 1]"]
%% Missing NodePath
227["Sweep Extrusion<br>[1556, 1595, 1]"]
%% Missing NodePath
228["Sweep Extrusion<br>[1556, 1595, 1]"]
%% Missing NodePath
229["Sweep Extrusion<br>[1556, 1595, 1]"]
230["Sweep Extrusion<br>[2052, 2076, 1]"]
231["Sweep Extrusion<br>[2126, 2150, 1]"]
232["Sweep Extrusion<br>[2636, 2660, 1]"]
233["Sweep Extrusion<br>[2636, 2660, 1]"]
234["Sweep Extrusion<br>[2636, 2660, 1]"]
235["Sweep Extrusion<br>[3198, 3222, 1]"]
236["Sweep Extrusion<br>[3198, 3222, 1]"]
237["Sweep Sweep<br>[3938, 3965, 1]"]
238["Sweep Sweep<br>[3938, 3965, 1]"]
%% Missing NodePath
230["Sweep Extrusion<br>[2052, 2067, 1]"]
%% Missing NodePath
231["Sweep Extrusion<br>[2117, 2132, 1]"]
%% Missing NodePath
232["Sweep Extrusion<br>[2618, 2633, 1]"]
%% Missing NodePath
233["Sweep Extrusion<br>[2618, 2633, 1]"]
%% Missing NodePath
234["Sweep Extrusion<br>[2618, 2633, 1]"]
%% Missing NodePath
235["Sweep Extrusion<br>[3171, 3186, 1]"]
%% Missing NodePath
236["Sweep Extrusion<br>[3171, 3186, 1]"]
%% Missing NodePath
237["Sweep Sweep<br>[3902, 3929, 1]"]
%% Missing NodePath
238["Sweep Sweep<br>[3902, 3929, 1]"]
%% Missing NodePath
239[Wall]
%% face_code_ref=Missing NodePath
240[Wall]
%% face_code_ref=Missing NodePath
241[Wall]
%% face_code_ref=Missing NodePath
242[Wall]
%% face_code_ref=Missing NodePath
243[Wall]
%% face_code_ref=Missing NodePath
244[Wall]
%% face_code_ref=Missing NodePath
245[Wall]
%% face_code_ref=Missing NodePath
246[Wall]
%% face_code_ref=Missing NodePath
247[Wall]
%% face_code_ref=Missing NodePath
248[Wall]
%% face_code_ref=Missing NodePath
249[Wall]
%% face_code_ref=Missing NodePath
250[Wall]
%% face_code_ref=Missing NodePath
251[Wall]
%% face_code_ref=Missing NodePath
252[Wall]
%% face_code_ref=Missing NodePath
253[Wall]
%% face_code_ref=Missing NodePath
254[Wall]
%% face_code_ref=Missing NodePath
255[Wall]
%% face_code_ref=Missing NodePath
256[Wall]
%% face_code_ref=Missing NodePath
257[Wall]
%% face_code_ref=Missing NodePath
258[Wall]
%% face_code_ref=Missing NodePath
259[Wall]
%% face_code_ref=Missing NodePath
260[Wall]
%% face_code_ref=Missing NodePath
261[Wall]
%% face_code_ref=Missing NodePath
262[Wall]
%% face_code_ref=Missing NodePath
263[Wall]
%% face_code_ref=Missing NodePath
264[Wall]
%% face_code_ref=Missing NodePath
265[Wall]
%% face_code_ref=Missing NodePath
266[Wall]
%% face_code_ref=Missing NodePath
267[Wall]
%% face_code_ref=Missing NodePath
268[Wall]
%% face_code_ref=Missing NodePath
269[Wall]
%% face_code_ref=Missing NodePath
270[Wall]
%% face_code_ref=Missing NodePath
271[Wall]
%% face_code_ref=Missing NodePath
272[Wall]
%% face_code_ref=Missing NodePath
273[Wall]
%% face_code_ref=Missing NodePath
274[Wall]
%% face_code_ref=Missing NodePath
275[Wall]
%% face_code_ref=Missing NodePath
276[Wall]
%% face_code_ref=Missing NodePath
277[Wall]
%% face_code_ref=Missing NodePath
278[Wall]
%% face_code_ref=Missing NodePath
279[Wall]
%% face_code_ref=Missing NodePath
280[Wall]
%% face_code_ref=Missing NodePath
281[Wall]
%% face_code_ref=Missing NodePath
282[Wall]
%% face_code_ref=Missing NodePath
283[Wall]
%% face_code_ref=Missing NodePath
284[Wall]
%% face_code_ref=Missing NodePath
285[Wall]
%% face_code_ref=Missing NodePath
286[Wall]
%% face_code_ref=Missing NodePath
287[Wall]
%% face_code_ref=Missing NodePath
288[Wall]
%% face_code_ref=Missing NodePath
289[Wall]
%% face_code_ref=Missing NodePath
290[Wall]
%% face_code_ref=Missing NodePath
291[Wall]
%% face_code_ref=Missing NodePath
292[Wall]
%% face_code_ref=Missing NodePath
293[Wall]
%% face_code_ref=Missing NodePath
294[Wall]
%% face_code_ref=Missing NodePath
295[Wall]
%% face_code_ref=Missing NodePath
296[Wall]
%% face_code_ref=Missing NodePath
297[Wall]
%% face_code_ref=Missing NodePath
298[Wall]
%% face_code_ref=Missing NodePath
299[Wall]
%% face_code_ref=Missing NodePath
300[Wall]
%% face_code_ref=Missing NodePath
301[Wall]
%% face_code_ref=Missing NodePath
302[Wall]
%% face_code_ref=Missing NodePath
303[Wall]
%% face_code_ref=Missing NodePath
304[Wall]
%% face_code_ref=Missing NodePath
305[Wall]
%% face_code_ref=Missing NodePath
306[Wall]
%% face_code_ref=Missing NodePath
307[Wall]
%% face_code_ref=Missing NodePath
308[Wall]
%% face_code_ref=Missing NodePath
309[Wall]
%% face_code_ref=Missing NodePath
310[Wall]
%% face_code_ref=Missing NodePath
311[Wall]
%% face_code_ref=Missing NodePath
312[Wall]
%% face_code_ref=Missing NodePath
313[Wall]
%% face_code_ref=Missing NodePath
314[Wall]
%% face_code_ref=Missing NodePath
315[Wall]
%% face_code_ref=Missing NodePath
316[Wall]
%% face_code_ref=Missing NodePath
317[Wall]
%% face_code_ref=Missing NodePath
318[Wall]
%% face_code_ref=Missing NodePath
319[Wall]
%% face_code_ref=Missing NodePath
320[Wall]
%% face_code_ref=Missing NodePath
321[Wall]
%% face_code_ref=Missing NodePath
322[Wall]
%% face_code_ref=Missing NodePath
323[Wall]
%% face_code_ref=Missing NodePath
324[Wall]
%% face_code_ref=Missing NodePath
325[Wall]
%% face_code_ref=Missing NodePath
326[Wall]
%% face_code_ref=Missing NodePath
327[Wall]
%% face_code_ref=Missing NodePath
328[Wall]
%% face_code_ref=Missing NodePath
329[Wall]
%% face_code_ref=Missing NodePath
330[Wall]
%% face_code_ref=Missing NodePath
331[Wall]
%% face_code_ref=Missing NodePath
332[Wall]
%% face_code_ref=Missing NodePath
333[Wall]
%% face_code_ref=Missing NodePath
334[Wall]
%% face_code_ref=Missing NodePath
335[Wall]
%% face_code_ref=Missing NodePath
336[Wall]
%% face_code_ref=Missing NodePath
337[Wall]
%% face_code_ref=Missing NodePath
338[Wall]
%% face_code_ref=Missing NodePath
339[Wall]
%% face_code_ref=Missing NodePath
340[Wall]
%% face_code_ref=Missing NodePath
341[Wall]
%% face_code_ref=Missing NodePath
342[Wall]
%% face_code_ref=Missing NodePath
343[Wall]
%% face_code_ref=Missing NodePath
344[Wall]
%% face_code_ref=Missing NodePath
345[Wall]
%% face_code_ref=Missing NodePath
346[Wall]
%% face_code_ref=Missing NodePath
347[Wall]
%% face_code_ref=Missing NodePath
348[Wall]
%% face_code_ref=Missing NodePath
349[Wall]
%% face_code_ref=Missing NodePath
350[Wall]
%% face_code_ref=Missing NodePath
351[Wall]
%% face_code_ref=Missing NodePath
352[Wall]
%% face_code_ref=Missing NodePath
353[Wall]
%% face_code_ref=Missing NodePath
354[Wall]
%% face_code_ref=Missing NodePath
355[Wall]
%% face_code_ref=Missing NodePath
356[Wall]
%% face_code_ref=Missing NodePath
357[Wall]
%% face_code_ref=Missing NodePath
358[Wall]
%% face_code_ref=Missing NodePath
359[Wall]
%% face_code_ref=Missing NodePath
360[Wall]
%% face_code_ref=Missing NodePath
361[Wall]
%% face_code_ref=Missing NodePath
362[Wall]
%% face_code_ref=Missing NodePath
363[Wall]
%% face_code_ref=Missing NodePath
364[Wall]
%% face_code_ref=Missing NodePath
365[Wall]
%% face_code_ref=Missing NodePath
366[Wall]
%% face_code_ref=Missing NodePath
367[Wall]
%% face_code_ref=Missing NodePath
368[Wall]
%% face_code_ref=Missing NodePath
369[Wall]
%% face_code_ref=Missing NodePath
370[Wall]
%% face_code_ref=Missing NodePath
371[Wall]
%% face_code_ref=Missing NodePath
372[Wall]
%% face_code_ref=Missing NodePath
373[Wall]
%% face_code_ref=Missing NodePath
374[Wall]
%% face_code_ref=Missing NodePath
375[Wall]
%% face_code_ref=Missing NodePath
376[Wall]
%% face_code_ref=Missing NodePath
377[Wall]
%% face_code_ref=Missing NodePath
378[Wall]
%% face_code_ref=Missing NodePath
379[Wall]
%% face_code_ref=Missing NodePath
380[Wall]
%% face_code_ref=Missing NodePath
381[Wall]
%% face_code_ref=Missing NodePath
382[Wall]
%% face_code_ref=Missing NodePath
383[Wall]
%% face_code_ref=Missing NodePath
384[Wall]
%% face_code_ref=Missing NodePath
385[Wall]
%% face_code_ref=Missing NodePath
386[Wall]
%% face_code_ref=Missing NodePath
387[Wall]
%% face_code_ref=Missing NodePath
388[Wall]
%% face_code_ref=Missing NodePath
389[Wall]
%% face_code_ref=Missing NodePath
390[Wall]
%% face_code_ref=Missing NodePath
391[Wall]
%% face_code_ref=Missing NodePath
392[Wall]
%% face_code_ref=Missing NodePath
393[Wall]
%% face_code_ref=Missing NodePath
394[Wall]
%% face_code_ref=Missing NodePath
395[Wall]
%% face_code_ref=Missing NodePath
396[Wall]
%% face_code_ref=Missing NodePath
397["Cap Start"]
%% face_code_ref=Missing NodePath
398["Cap Start"]
%% face_code_ref=Missing NodePath
399["Cap Start"]
%% face_code_ref=Missing NodePath
400["Cap Start"]
%% face_code_ref=Missing NodePath
401["Cap Start"]
%% face_code_ref=Missing NodePath
402["Cap Start"]
%% face_code_ref=Missing NodePath
403["Cap Start"]
%% face_code_ref=Missing NodePath
404["Cap Start"]
%% face_code_ref=Missing NodePath
405["Cap Start"]
%% face_code_ref=Missing NodePath
406["Cap Start"]
%% face_code_ref=Missing NodePath
407["Cap Start"]
%% face_code_ref=Missing NodePath
408["Cap Start"]
%% face_code_ref=Missing NodePath
409["Cap End"]
%% face_code_ref=Missing NodePath
410["Cap End"]
%% face_code_ref=Missing NodePath
411["Cap End"]
%% face_code_ref=Missing NodePath
412["Cap End"]
%% face_code_ref=Missing NodePath
413["Cap End"]
%% face_code_ref=Missing NodePath
414["Cap End"]
%% face_code_ref=Missing NodePath
415["Cap End"]
%% face_code_ref=Missing NodePath
416["Cap End"]
%% face_code_ref=Missing NodePath
417["Cap End"]
%% face_code_ref=Missing NodePath
418["Cap End"]
%% face_code_ref=Missing NodePath
419["Cap End"]
%% face_code_ref=Missing NodePath
420["Cap End"]
%% face_code_ref=Missing NodePath
421["SweepEdge Opposite"]
422["SweepEdge Opposite"]
423["SweepEdge Opposite"]

Some files were not shown because too many files have changed in this diff Show More