Compare commits

...

31 Commits

Author SHA1 Message Date
cac7aa2bee Optionally chain error_code
Something in the Chamfer E2E tests is complaining about an uncaught
error with `error_code` trying to be referenced on something that is
`undefined`. That means that an API request is coming back as not
successful but does not have an actual error in the body of the
response.
2025-05-20 19:24:55 -04:00
0753987b5a [Fix]: Allow importing assemblies into exsiting projects and handling the collision (#7108)
* fix: saving off code

* fix: saving off progress

* chore: implemented kcl sample assembly unique sub dir creation

* fix: removing testing console logs

* fix: cleaning up old comment

* fix: add to file always does subdir/main.kcl now for single files

* fix: auto fmt

* fix: delete project and folder from ttc

* fix: fixed deleting projects and subdirs

* fix: if statement logic fixed for deleting project or subdir

* fix: TTC isProjectNew makes main.kcl not a subdir.

* fix: fixing e2e test

* fix: this should pass now
2025-05-20 19:03:54 -04:00
815ff7dc2b more subtract regression tests (#7123)
* more regression tests

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

* snaps

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

* iupdates

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

---------

Signed-off-by: Jess Frazelle <github@jessfraz.com>
2025-05-20 16:02:44 -07:00
46684d420d Test nested imports on all platforms (#7126) 2025-05-20 18:45:04 -04:00
eca09984a3 Fix: Follow up Text-to-CAD Edit to fix in browser (#7124)
* fix: web vs desktop who wins

* fix: fixed logic round two :(
2025-05-20 21:11:31 +00:00
ce63c6423e Impove naming in point-and-click Revolve to convey that axis are relative (#7122)
* Better axis options in point-and-click Revolve to convey the axis are relative
Fixes #7121

* Less changes
2025-05-20 16:57:55 -04:00
09699afe82 Fix: Can't go back to Profiles arg in Extrude, Revolve, Loft (#7106)
* Revert "Update failing E2E tests with new behavior, which allows skip with preselection"

This reverts commit d72bee8637.

* Fix: Can't go back to Profiles step in sweep commands
Fixes #7080

* Make it better but still not quite there

* I think I got it: this was likely the real bug making submit fire twice

* Bring timemouts back
2025-05-20 20:07:56 +00:00
36c8ad439d KCL: Add diameter arg to circle (#7116)
Paul's been requesting this for a long time. Now that we're fully using keyword args, this is easy to do.

We should probably add a similar `diameter` arg to `arc`, `tangentialArc`, `polygon` etc. And _maybe_ to `fillet`, but that might not be as helpful.
2025-05-20 19:44:35 +00:00
5dc77ceed5 Only start saving camera after scene is ready (#7120) 2025-05-20 15:12:08 -04:00
c7baa26b2d idiomatic kcl for hip sample (#7095)
* idiomatic kcl for hip sample

* Update kcl-samples simulation test output

* updates

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

---------

Signed-off-by: Jess Frazelle <github@jessfraz.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Jess Frazelle <github@jessfraz.com>
2025-05-20 11:36:08 -07:00
4d0454abcd Remove old ZMA logos, rip out JS theme state from open-in-desktop view (#7119)
* Remove old ZMA logos, rip out JS theme state from open-in-desktop view

Make this page dumber so that it doesn't break

* Lint and remove kcma refs

---------

Co-authored-by: Pierre Jacquier <pierre@zoo.dev>
2025-05-20 18:13:58 +00:00
1dafbf105e Identify distinct test suites (#7109) 2025-05-20 12:56:55 -04:00
773f013115 [Fix]: When loading the modeling page the user's settings for camera projection was ignored (#7111)
* fix: initialization of user camera projection is now used again, ope

* fix: removing comment
2025-05-20 12:46:53 -04:00
c5cd460595 Show error when trying to export at non-top-level (#7110) 2025-05-20 12:43:11 -04:00
845352046b Modeling machine unit tests (#7098)
* successfully transition to sketch idle

* get constraint to mod code

* clean up

* remove .only

* Fixed tsc

---------

Co-authored-by: lee-at-zoo-corp <lee@zoo.dev>
2025-05-20 12:22:52 -04:00
597f1087f9 Fix enter key loop in sweep commands (#7112)
* use effect for focus of command palette submit button, not autoFocus

autoFocus is being overridden by the Headless UI Dialog component's
focus management here
https://headlessui.com/v1/react/dialog#focus-management (we do not have
access to pass back initialFocus in this case). So we can use an effect
to imperatively focus the button when this component is mounted.

* Update sweep tests to submit the command with Enter
2025-05-20 16:04:56 +00:00
511334683a test: Add regression test for importing only at the top level (#7104)
Add regression test for importing only at the top level
2025-05-20 11:43:48 -04:00
223a4ad45d Style the experimental badge to match the website (#7100)
* Style the experimental badge to match the website

* Match the styling of the rest of the app

We don't use all apps monospace fonts anywhere.

* Bring back all caps
2025-05-20 14:57:53 +00:00
edf31ec1d3 Make the textarea command bar input run its resize initially (#7103)
We have a hook to auto-grow the textarea input but it wasn't running
once initially. This is noticable on the onboarding, where we show the
user a long Text-to-CAD Edit prompt that overflows.
2025-05-20 10:56:03 -04:00
1539557005 Always update snapshots if needed (#7105) 2025-05-20 14:34:26 +00:00
1d3ba4e3ac [Fix]: Remove console logs (#7102)
* fix: these got in when they should not have

* fix: spacemacs found wrong eslint again biome thing..
2025-05-20 14:12:32 +00:00
4110aa00db Only update snapshots for tests that repeatedly fail (#7101)
* Only update snapshots for tests that repeatedly fail

* Let TAB silence snapshot capture failures as well
2025-05-20 14:00:33 +00:00
7eb52cda36 Fix: creating a dir ending with .kcl panics the app (#7099)
* Fix: creating a dir ending with .kcl panics the app
Fixes #7082

* Update snapshots

* Update snapshots

* Add test

* tag: ['@electron', '@macos', '@windows']

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-20 13:53:26 +00:00
7872fb9cbd Update snapshots on CI (#7069) 2025-05-20 06:00:31 -04:00
651181e62c Restrict subdirectory imports to main.kcl (#7094)
Signed-off-by: Nick Cameron <nrc@ncameron.org>
2025-05-20 18:13:17 +12:00
max
38a245f2fc fix typos in the kcl samples (#7078)
typos
2025-05-20 05:47:33 +00:00
1b4289f93f allow nested files imported (#7090)
* allow nested files

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

* fix test

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

* disallow bad things

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

* add playwright test on windows

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

* add playwright test on windows

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

* fixes

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

* updates

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

* updates

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

* fix test

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

* Update rust/kcl-lib/tests/nested_windows_main_kcl/unparsed@main.kcl.snap

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

* updates

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>
Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
2025-05-19 22:42:25 -04:00
d0697c24fd Change Sketch to use the units of the module (#7076)
* Change Sketch to use the units of the module

* Update output
2025-05-19 20:20:47 -04:00
8c24e29081 [Fix]: P2E base path is always the project directory, P2E when completed stays in your current file (#7091)
* fix: fixes for p2e

* fix: yep tsc fixes

* fix: fixing reject workflow and navigate
2025-05-19 20:05:38 -04:00
2b9d26e2ff Make Text-to-CAD Edit the default workflow in the toolbar (#7092)
We want users to make edits first and foremost within projects, so we're
going to surface it as the default workflow button in the toolbar. WIP
until I verify that tests are okay with this.
2025-05-19 19:58:18 -04:00
ab148a7654 Fix: Esc key doesn't work in Text-to-CAD prompt (#7089)
* Fix: Esc key doesn't work in Text-to-CAD prompt
Fixes #7086

* Add e2e test because why not
2025-05-19 23:31:33 +00:00
138 changed files with 13360 additions and 5871 deletions

View File

@ -6,6 +6,7 @@ if [ -z "${TAB_API_URL:-}" ] || [ -z "${TAB_API_KEY:-}" ]; then
fi fi
project="https://github.com/KittyCAD/modeling-app" project="https://github.com/KittyCAD/modeling-app"
suite="${CI_SUITE:-unit}"
branch="${GITHUB_HEAD_REF:-${GITHUB_REF_NAME:-}}" branch="${GITHUB_HEAD_REF:-${GITHUB_REF_NAME:-}}"
commit="${CI_COMMIT_SHA:-${GITHUB_SHA:-}}" commit="${CI_COMMIT_SHA:-${GITHUB_SHA:-}}"
@ -13,6 +14,7 @@ echo "Uploading batch results"
curl --silent --request POST \ curl --silent --request POST \
--header "X-API-Key: ${TAB_API_KEY}" \ --header "X-API-Key: ${TAB_API_KEY}" \
--form "project=${project}" \ --form "project=${project}" \
--form "suite=${suite}" \
--form "branch=${branch}" \ --form "branch=${branch}" \
--form "commit=${commit}" \ --form "commit=${commit}" \
--form "tests=@test-results/junit.xml" \ --form "tests=@test-results/junit.xml" \

View File

@ -193,6 +193,7 @@ jobs:
TAB_API_KEY: ${{ secrets.TAB_API_KEY }} TAB_API_KEY: ${{ secrets.TAB_API_KEY }}
CI_COMMIT_SHA: ${{ github.event.pull_request.head.sha }} CI_COMMIT_SHA: ${{ github.event.pull_request.head.sha }}
CI_PR_NUMBER: ${{ github.event.pull_request.number }} CI_PR_NUMBER: ${{ github.event.pull_request.number }}
CI_SUITE: unit:kcl
run-internal-kcl-samples: run-internal-kcl-samples:
name: cargo test (internal-kcl-samples) name: cargo test (internal-kcl-samples)
runs-on: runs-on:

View File

@ -143,7 +143,7 @@ jobs:
- name: Install browsers - name: Install browsers
run: npm run playwright install --with-deps run: npm run playwright install --with-deps
- name: Capture snapshots - name: Test snapshots
uses: nick-fields/retry@v3.0.2 uses: nick-fields/retry@v3.0.2
with: with:
shell: bash shell: bash
@ -156,6 +156,19 @@ jobs:
TAB_API_KEY: ${{ secrets.TAB_API_KEY }} TAB_API_KEY: ${{ secrets.TAB_API_KEY }}
CI_COMMIT_SHA: ${{ github.event.pull_request.head.sha }} CI_COMMIT_SHA: ${{ github.event.pull_request.head.sha }}
CI_PR_NUMBER: ${{ github.event.pull_request.number }} CI_PR_NUMBER: ${{ github.event.pull_request.number }}
CI_SUITE: snapshots
TARGET: web
- name: Update snapshots
if: always()
run: npm run test:snapshots -- --last-failed --update-snapshots
env:
token: ${{ secrets.KITTYCAD_API_TOKEN_DEV }}
TAB_API_URL: ${{ secrets.TAB_API_URL }}
TAB_API_KEY: ${{ secrets.TAB_API_KEY }}
CI_COMMIT_SHA: ${{ github.event.pull_request.head.sha }}
CI_PR_NUMBER: ${{ github.event.pull_request.number }}
CI_SUITE: snapshots
TARGET: web TARGET: web
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
@ -173,7 +186,7 @@ jobs:
id: git-check id: git-check
run: | run: |
git add e2e/playwright/snapshot-tests.spec.ts-snapshots e2e/playwright/snapshots git add e2e/playwright/snapshot-tests.spec.ts-snapshots e2e/playwright/snapshots
if git status | grep -q "Changes to be committed" if git status | grep --quiet "Changes to be committed"
then echo "modified=true" >> $GITHUB_OUTPUT then echo "modified=true" >> $GITHUB_OUTPUT
else echo "modified=false" >> $GITHUB_OUTPUT else echo "modified=false" >> $GITHUB_OUTPUT
fi fi

View File

@ -27,9 +27,6 @@ import increment from "util.kcl"
answer = increment(41) answer = increment(41)
``` ```
Imported files _must_ be in the same project so that units are uniform across
modules. This means that it must be in the same directory.
Import statements must be at the top-level of a file. It is not allowed to have Import statements must be at the top-level of a file. It is not allowed to have
an `import` statement inside a function or in the body of an ifelse. an `import` statement inside a function or in the body of an ifelse.
@ -58,6 +55,9 @@ Imported symbols can be renamed for convenience or to avoid name collisions.
import increment as inc, decrement as dec from "util.kcl" import increment as inc, decrement as dec from "util.kcl"
``` ```
You can import files from the current directory or from subdirectories, but if importing from a
subdirectory you can only import `main.kcl`.
--- ---
## Functions vs `clone` ## Functions vs `clone`
@ -229,6 +229,19 @@ The final statement is what's important because it's the return value of the
entire module. The module is expected to return a single object that can be used entire module. The module is expected to return a single object that can be used
as a variable by the file that imports it. as a variable by the file that imports it.
The name of the file or subdirectory is used as the name of the variable within the importing program.
If you want to use a different name, you can do so by using the `as` keyword:
```kcl,norun
import "cube.kcl" // Introduces a new variable called `cube`.
import "cube.kcl" as block // Introduces a new variable called `block`.
import "cube/main.kcl" // Introduces a new variable called `cube`.
import "cube/main.kcl" as block // Introduces a new variable called `block`.
```
If the filename includes hyphens (`-`) or starts with an underscore (`_`), then you must specify a
variable name.
--- ---
## Multiple instances of the same import ## Multiple instances of the same import

View File

@ -11,7 +11,8 @@ layout: manual
circle( circle(
@sketch_or_surface: Sketch | Plane | Face, @sketch_or_surface: Sketch | Plane | Face,
center: Point2d, center: Point2d,
radius: number(Length), radius?: number(Length),
diameter?: number(Length),
tag?: tag, tag?: tag,
): Sketch ): Sketch
``` ```
@ -25,7 +26,8 @@ the provided (x, y) origin point.
|----------|------|-------------|----------| |----------|------|-------------|----------|
| `sketch_or_surface` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) or [`Plane`](/docs/kcl-std/types/std-types-Plane) or [`Face`](/docs/kcl-std/types/std-types-Face) | Sketch to extend, or plane or surface to sketch on. | Yes | | `sketch_or_surface` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) or [`Plane`](/docs/kcl-std/types/std-types-Plane) or [`Face`](/docs/kcl-std/types/std-types-Face) | Sketch to extend, or plane or surface to sketch on. | Yes |
| `center` | [`Point2d`](/docs/kcl-std/types/std-types-Point2d) | The center of the circle. | Yes | | `center` | [`Point2d`](/docs/kcl-std/types/std-types-Point2d) | The center of the circle. | Yes |
| `radius` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | The radius of the circle. | Yes | | `radius` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | The radius of the circle. Incompatible with `diameter`. | No |
| `diameter` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | The diameter of the circle. Incompatible with `radius`. | No |
| [`tag`](/docs/kcl-std/types/std-types-tag) | [`tag`](/docs/kcl-std/types/std-types-tag) | Create a new tag which refers to this circle. | No | | [`tag`](/docs/kcl-std/types/std-types-tag) | [`tag`](/docs/kcl-std/types/std-types-tag) | Create a new tag which refers to this circle. | No |
### Returns ### Returns
@ -51,7 +53,7 @@ exampleSketch = startSketchOn(XZ)
|> line(end = [0, 30]) |> line(end = [0, 30])
|> line(end = [-30, 0]) |> line(end = [-30, 0])
|> close() |> close()
|> subtract2d(tool = circle(center = [0, 15], radius = 5)) |> subtract2d(tool = circle(center = [0, 15], diameter = 10))
example = extrude(exampleSketch, length = 5) example = extrude(exampleSketch, length = 5)
``` ```

View File

@ -45,15 +45,16 @@ test.describe('Command bar tests', () => {
await cmdBar.expectState({ await cmdBar.expectState({
stage: 'arguments', stage: 'arguments',
commandName: 'Extrude', commandName: 'Extrude',
currentArgKey: 'length', currentArgKey: 'sketches',
currentArgValue: '5', currentArgValue: '',
headerArguments: { headerArguments: {
Profiles: '1 profile', Profiles: '',
Length: '', Length: '',
}, },
highlightedHeaderArg: 'length', highlightedHeaderArg: 'Profiles',
}) })
await cmdBar.progressCmdBar() await cmdBar.progressCmdBar()
await cmdBar.progressCmdBar()
await cmdBar.expectState({ await cmdBar.expectState({
stage: 'review', stage: 'review',
commandName: 'Extrude', commandName: 'Extrude',
@ -684,4 +685,33 @@ c = 3 + a`
highlightedHeaderArg: 'value', highlightedHeaderArg: 'value',
}) })
}) })
test('Text-to-CAD command can be closed with escape while in prompt', async ({
page,
homePage,
cmdBar,
}) => {
await homePage.expectState({
projectCards: [],
sortBy: 'last-modified-desc',
})
await homePage.textToCadBtn.click()
await cmdBar.expectState({
stage: 'arguments',
commandName: 'Text-to-CAD Create',
currentArgKey: 'prompt',
currentArgValue: '',
headerArguments: {
Method: 'New project',
NewProjectName: 'untitled',
Prompt: '',
},
highlightedHeaderArg: 'prompt',
})
await page.keyboard.press('Escape')
await cmdBar.toBeClosed()
await cmdBar.expectState({
stage: 'commandBarClosed',
})
})
}) })

View File

@ -1134,6 +1134,7 @@ sketch001 = startSketchOn(XZ)
// Wait for the selection to register (TODO: we need a definitive way to wait for this) // Wait for the selection to register (TODO: we need a definitive way to wait for this)
await page.waitForTimeout(200) await page.waitForTimeout(200)
await toolbar.extrudeButton.click() await toolbar.extrudeButton.click()
await cmdBar.progressCmdBar()
await cmdBar.expectState({ await cmdBar.expectState({
stage: 'arguments', stage: 'arguments',
currentArgKey: 'length', currentArgKey: 'length',
@ -1355,9 +1356,7 @@ sketch001 = startSketchOn(XZ)
const u = await getUtils(page) const u = await getUtils(page)
const projectLink = page.getByRole('link', { name: 'cube' }) const projectLink = page.getByRole('link', { name: 'cube' })
const gizmo = page.locator('[aria-label*=gizmo]') const gizmo = page.locator('[aria-label*=gizmo]')
const resetCameraButton = page.getByRole('button', { const resetCameraButton = page.getByRole('button', { name: 'Reset view' })
name: 'Reset view',
})
const locationToHaveColor = async ( const locationToHaveColor = async (
position: { x: number; y: number }, position: { x: number; y: number },
color: [number, number, number] color: [number, number, number]

View File

@ -238,6 +238,26 @@ test.describe('when using the file tree to', () => {
} }
) )
test(
`create new folders and that doesn't trigger a navigation`,
{ tag: ['@electron', '@macos', '@windows'] },
async ({ page, homePage, scene, toolbar, cmdBar }) => {
await homePage.goToModelingScene()
await scene.settled(cmdBar)
await toolbar.openPane('files')
const { createNewFolder } = await getUtils(page, test)
await createNewFolder('folder')
await createNewFolder('folder.kcl')
await test.step(`Postcondition: folders are created and we didn't navigate`, async () => {
await toolbar.expectFileTreeState(['folder', 'folder.kcl', 'main.kcl'])
await expect(toolbar.fileName).toHaveText('main.kcl')
})
}
)
test( test(
'deleting all files recreates a default main.kcl with no code', 'deleting all files recreates a default main.kcl with no code',
{ tag: '@electron' }, { tag: '@electron' },

View File

@ -105,14 +105,19 @@ export class CmdBarFixture {
expectState = async (expected: CmdBarSerialised) => { expectState = async (expected: CmdBarSerialised) => {
return expect.poll(() => this._serialiseCmdBar()).toEqual(expected) return expect.poll(() => this._serialiseCmdBar()).toEqual(expected)
} }
/** The method will use buttons OR press enter randomly to progress the cmdbar, /**
* this could have unexpected results depending on what's focused * This method is used to progress the command bar to the next step, defaulting to clicking the next button.
* * Optionally, with the `shouldUseKeyboard` parameter, it will hit `Enter` to progress.
* TODO: This method assumes the user has a valid input to the current stage, * * TODO: This method assumes the user has a valid input to the current stage,
* and assumes we are past the `pickCommand` step. * and assumes we are past the `pickCommand` step.
*/ */
progressCmdBar = async (shouldFuzzProgressMethod = true) => { progressCmdBar = async (shouldUseKeyboard = false) => {
await this.page.waitForTimeout(2000) await this.page.waitForTimeout(2000)
if (shouldUseKeyboard) {
await this.page.keyboard.press('Enter')
return
}
const arrowButton = this.page.getByRole('button', { const arrowButton = this.page.getByRole('button', {
name: 'arrow right Continue', name: 'arrow right Continue',
}) })
@ -308,6 +313,11 @@ export class CmdBarFixture {
await expect(this.cmdBarElement).toBeVisible({ timeout: 10_000 }) await expect(this.cmdBarElement).toBeVisible({ timeout: 10_000 })
} }
async toBeClosed() {
// Check that the command bar is closed
await expect(this.cmdBarElement).not.toBeVisible({ timeout: 10_000 })
}
async expectArgValue(value: string) { async expectArgValue(value: string) {
// Check the placeholder project name exists // Check the placeholder project name exists
const actualArgument = await this.cmdBarElement const actualArgument = await this.cmdBarElement

View File

@ -26,6 +26,7 @@ export class HomePageFixture {
sortByNameBtn!: Locator sortByNameBtn!: Locator
appHeader!: Locator appHeader!: Locator
tutorialBtn!: Locator tutorialBtn!: Locator
textToCadBtn!: Locator
constructor(page: Page) { constructor(page: Page) {
this.page = page this.page = page
@ -47,6 +48,7 @@ export class HomePageFixture {
this.sortByNameBtn = this.page.getByTestId('home-sort-by-name') this.sortByNameBtn = this.page.getByTestId('home-sort-by-name')
this.appHeader = this.page.getByTestId('app-header') this.appHeader = this.page.getByTestId('app-header')
this.tutorialBtn = this.page.getByTestId('home-tutorial-button') this.tutorialBtn = this.page.getByTestId('home-tutorial-button')
this.textToCadBtn = this.page.getByTestId('home-text-to-cad')
} }
private _serialiseSortBy = async (): Promise< private _serialiseSortBy = async (): Promise<

View File

@ -61,6 +61,7 @@ class MyAPIReporter implements Reporter {
const payload = { const payload = {
// Required information // Required information
project: 'https://github.com/KittyCAD/modeling-app', project: 'https://github.com/KittyCAD/modeling-app',
suite: process.env.CI_SUITE || 'e2e',
branch: process.env.GITHUB_HEAD_REF || process.env.GITHUB_REF_NAME || '', branch: process.env.GITHUB_HEAD_REF || process.env.GITHUB_REF_NAME || '',
commit: process.env.CI_COMMIT_SHA || process.env.GITHUB_SHA || '', commit: process.env.CI_COMMIT_SHA || process.env.GITHUB_SHA || '',
test: test.titlePath().slice(2).join(' '), test: test.titlePath().slice(2).join(' '),

View File

@ -74,6 +74,15 @@ test.describe('Point-and-click tests', () => {
await test.step('do extrude flow and check extrude code is added to editor', async () => { await test.step('do extrude flow and check extrude code is added to editor', async () => {
await toolbar.extrudeButton.click() await toolbar.extrudeButton.click()
await cmdBar.expectState({
stage: 'arguments',
currentArgKey: 'sketches',
currentArgValue: '',
headerArguments: { Profiles: '', Length: '' },
highlightedHeaderArg: 'Profiles',
commandName: 'Extrude',
})
await cmdBar.progressCmdBar()
await cmdBar.expectState({ await cmdBar.expectState({
stage: 'arguments', stage: 'arguments',
currentArgKey: 'length', currentArgKey: 'length',
@ -1645,6 +1654,15 @@ sketch002 = startSketchOn(plane001)
await test.step(`Go through the command bar flow with preselected sketches`, async () => { await test.step(`Go through the command bar flow with preselected sketches`, async () => {
await toolbar.loftButton.click() await toolbar.loftButton.click()
await cmdBar.expectState({
stage: 'arguments',
currentArgKey: 'sketches',
currentArgValue: '',
headerArguments: { Profiles: '' },
highlightedHeaderArg: 'Profiles',
commandName: 'Loft',
})
await cmdBar.progressCmdBar()
await cmdBar.expectState({ await cmdBar.expectState({
stage: 'review', stage: 'review',
headerArguments: { Profiles: '2 profiles' }, headerArguments: { Profiles: '2 profiles' },
@ -1855,7 +1873,11 @@ sketch002 = startSketchOn(XZ)
}, },
stage: 'review', stage: 'review',
}) })
await cmdBar.progressCmdBar() // Confirm we can submit from the review step with just `Enter`
await cmdBar.progressCmdBar(true)
await cmdBar.expectState({
stage: 'commandBarClosed',
})
}) })
await test.step(`Confirm code is added to the editor, scene has changed`, async () => { await test.step(`Confirm code is added to the editor, scene has changed`, async () => {
@ -1995,7 +2017,7 @@ profile001 = ${circleCode}`
}, },
stage: 'review', stage: 'review',
}) })
await cmdBar.progressCmdBar() await cmdBar.progressCmdBar(true)
await editor.expectEditor.toContain(sweepDeclaration) await editor.expectEditor.toContain(sweepDeclaration)
}) })
@ -2088,6 +2110,18 @@ extrude001 = extrude(sketch001, length = -12)
await test.step(`Apply fillet to the preselected edge`, async () => { await test.step(`Apply fillet to the preselected edge`, async () => {
await page.waitForTimeout(100) await page.waitForTimeout(100)
await toolbar.filletButton.click() await toolbar.filletButton.click()
await cmdBar.expectState({
commandName: 'Fillet',
highlightedHeaderArg: 'selection',
currentArgKey: 'selection',
currentArgValue: '',
headerArguments: {
Selection: '',
Radius: '',
},
stage: 'arguments',
})
await cmdBar.progressCmdBar()
await cmdBar.expectState({ await cmdBar.expectState({
commandName: 'Fillet', commandName: 'Fillet',
highlightedHeaderArg: 'radius', highlightedHeaderArg: 'radius',
@ -2617,6 +2651,18 @@ extrude001 = extrude(profile001, length = 5)
await test.step(`Apply fillet`, async () => { await test.step(`Apply fillet`, async () => {
await page.waitForTimeout(100) await page.waitForTimeout(100)
await toolbar.filletButton.click() await toolbar.filletButton.click()
await cmdBar.expectState({
commandName: 'Fillet',
highlightedHeaderArg: 'selection',
currentArgKey: 'selection',
currentArgValue: '',
headerArguments: {
Selection: '',
Radius: '',
},
stage: 'arguments',
})
await cmdBar.progressCmdBar()
await cmdBar.expectState({ await cmdBar.expectState({
commandName: 'Fillet', commandName: 'Fillet',
highlightedHeaderArg: 'radius', highlightedHeaderArg: 'radius',
@ -2722,6 +2768,19 @@ extrude001 = extrude(sketch001, length = -12)
await test.step(`Apply chamfer to the preselected edge`, async () => { await test.step(`Apply chamfer to the preselected edge`, async () => {
await page.waitForTimeout(100) await page.waitForTimeout(100)
await toolbar.chamferButton.click() await toolbar.chamferButton.click()
await cmdBar.expectState({
commandName: 'Chamfer',
highlightedHeaderArg: 'selection',
currentArgKey: 'selection',
currentArgValue: '',
headerArguments: {
Selection: '',
Length: '',
},
stage: 'arguments',
})
await cmdBar.progressCmdBar()
await page.waitForTimeout(1000)
await cmdBar.expectState({ await cmdBar.expectState({
commandName: 'Chamfer', commandName: 'Chamfer',
highlightedHeaderArg: 'length', highlightedHeaderArg: 'length',
@ -3205,6 +3264,8 @@ extrude001 = extrude(sketch001, length = 30)
await test.step(`Go through the command bar flow with a preselected face (cap)`, async () => { await test.step(`Go through the command bar flow with a preselected face (cap)`, async () => {
await toolbar.shellButton.click() await toolbar.shellButton.click()
await cmdBar.progressCmdBar() await cmdBar.progressCmdBar()
await page.waitForTimeout(500)
await cmdBar.progressCmdBar()
await cmdBar.expectState({ await cmdBar.expectState({
stage: 'review', stage: 'review',
headerArguments: { headerArguments: {
@ -3638,13 +3699,12 @@ tag=$rectangleSegmentC002,
// revolve // revolve
await editor.scrollToText(codeToSelection) await editor.scrollToText(codeToSelection)
await page.getByText(codeToSelection).click() await page.getByText(codeToSelection).click()
// Wait for the selection to register (TODO: we need a definitive way to wait for this)
await page.waitForTimeout(200)
await toolbar.revolveButton.click() await toolbar.revolveButton.click()
await cmdBar.progressCmdBar() await cmdBar.progressCmdBar()
await cmdBar.progressCmdBar() await cmdBar.progressCmdBar()
await cmdBar.progressCmdBar() await cmdBar.progressCmdBar()
await cmdBar.progressCmdBar() await cmdBar.progressCmdBar()
await cmdBar.progressCmdBar()
const newCodeToFind = `revolve001 = revolve(sketch002, angle = 360, axis = X)` const newCodeToFind = `revolve001 = revolve(sketch002, angle = 360, axis = X)`
expect(editor.expectEditor.toContain(newCodeToFind)).toBeTruthy() expect(editor.expectEditor.toContain(newCodeToFind)).toBeTruthy()
@ -4573,6 +4633,18 @@ path001 = startProfile(sketch001, at = [0, 0])
await test.step('Go through command bar flow', async () => { await test.step('Go through command bar flow', async () => {
await toolbar.extrudeButton.click() await toolbar.extrudeButton.click()
await cmdBar.expectState({
stage: 'arguments',
currentArgKey: 'sketches',
currentArgValue: '',
headerArguments: {
Profiles: '',
Length: '',
},
highlightedHeaderArg: 'Profiles',
commandName: 'Extrude',
})
await cmdBar.progressCmdBar()
await cmdBar.expectState({ await cmdBar.expectState({
stage: 'arguments', stage: 'arguments',
currentArgKey: 'length', currentArgKey: 'length',
@ -4655,6 +4727,19 @@ path001 = startProfile(sketch001, at = [0, 0])
await test.step('Go through command bar flow', async () => { await test.step('Go through command bar flow', async () => {
await toolbar.sweepButton.click() await toolbar.sweepButton.click()
await cmdBar.expectState({
stage: 'arguments',
currentArgKey: 'sketches',
currentArgValue: '',
headerArguments: {
Profiles: '',
Path: '',
Sectional: '',
},
highlightedHeaderArg: 'Profiles',
commandName: 'Sweep',
})
await cmdBar.progressCmdBar()
await cmdBar.expectState({ await cmdBar.expectState({
stage: 'arguments', stage: 'arguments',
currentArgKey: 'path', currentArgKey: 'path',
@ -4739,6 +4824,19 @@ path001 = startProfile(sketch001, at = [0, 0])
await test.step('Go through command bar flow', async () => { await test.step('Go through command bar flow', async () => {
await toolbar.closePane('code') await toolbar.closePane('code')
await toolbar.revolveButton.click() await toolbar.revolveButton.click()
await cmdBar.expectState({
stage: 'arguments',
currentArgKey: 'sketches',
currentArgValue: '',
headerArguments: {
Profiles: '',
AxisOrEdge: '',
Angle: '',
},
highlightedHeaderArg: 'Profiles',
commandName: 'Revolve',
})
await cmdBar.progressCmdBar()
await cmdBar.expectState({ await cmdBar.expectState({
stage: 'arguments', stage: 'arguments',
currentArgKey: 'axisOrEdge', currentArgKey: 'axisOrEdge',

View File

@ -11,6 +11,7 @@ import {
getPlaywrightDownloadDir, getPlaywrightDownloadDir,
getUtils, getUtils,
isOutOfViewInScrollContainer, isOutOfViewInScrollContainer,
runningOnWindows,
} from '@e2e/playwright/test-utils' } from '@e2e/playwright/test-utils'
import { expect, test } from '@e2e/playwright/zoo-test' import { expect, test } from '@e2e/playwright/zoo-test'
@ -1979,7 +1980,6 @@ test(
} }
) )
// Flaky
test( test(
'Original project name persist after onboarding', 'Original project name persist after onboarding',
{ tag: '@electron' }, { tag: '@electron' },
@ -2064,3 +2064,55 @@ test(
}) })
} }
) )
test(
'import from nested directory',
{ tag: ['@electron', '@windows', '@macos'] },
async ({ scene, cmdBar, context, page }) => {
await context.folderSetupFn(async (dir) => {
const bracketDir = path.join(dir, 'bracket')
await fsp.mkdir(bracketDir, { recursive: true })
const nestedDir = path.join(bracketDir, 'nested')
await fsp.mkdir(nestedDir, { recursive: true })
await fsp.copyFile(
executorInputPath('cylinder-inches.kcl'),
path.join(nestedDir, 'main.kcl')
)
await fsp.writeFile(
path.join(bracketDir, 'main.kcl'),
runningOnWindows()
? `import 'nested\\main.kcl' as thing\n\nthing`
: `import 'nested/main.kcl' as thing\n\nthing`
)
})
await page.setBodyDimensions({ width: 1200, height: 500 })
const u = await getUtils(page)
const pointOnModel = { x: 630, y: 280 }
await test.step('Opening the bracket project should load the stream', async () => {
// expect to see the text bracket
await expect(page.getByText('bracket')).toBeVisible()
await page.getByText('bracket').click()
await scene.settled(cmdBar)
await expect(
page.getByRole('button', { name: 'Start Sketch' })
).toBeEnabled({
timeout: 20_000,
})
// gray at this pixel means the stream has loaded in the most
// user way we can verify it (pixel color)
await expect
.poll(() => u.getGreatestPixDiff(pointOnModel, [125, 125, 125]), {
timeout: 10_000,
})
.toBeLessThan(15)
})
}
)

View File

@ -1016,6 +1016,7 @@ profile001 = startProfile(sketch001, at = [${roundOff(scale * 69.6)}, ${roundOff
// sketch selection should already have been made. // sketch selection should already have been made.
// otherwise the cmdbar would be waiting for a selection. // otherwise the cmdbar would be waiting for a selection.
await cmdBar.progressCmdBar()
await cmdBar.expectState({ await cmdBar.expectState({
stage: 'arguments', stage: 'arguments',
currentArgKey: 'length', currentArgKey: 'length',

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 KiB

After

Width:  |  Height:  |  Size: 133 KiB

View File

@ -557,6 +557,14 @@ export async function getUtils(page: Page, test_?: typeof test) {
}) })
}, },
createNewFolder: async (name: string) => {
return test?.step(`Create a folder named ${name}`, async () => {
await page.getByTestId('create-folder-button').click()
await page.getByTestId('tree-input-field').fill(name)
await page.keyboard.press('Enter')
})
},
cloneFile: async (name: string) => { cloneFile: async (name: string) => {
return test?.step(`Cloning file '${name}'`, async () => { return test?.step(`Cloning file '${name}'`, async () => {
await page await page

View File

@ -103,6 +103,8 @@ test.describe('Testing loading external models', () => {
file: 'ball-bearing' + FILE_EXT, file: 'ball-bearing' + FILE_EXT,
title: 'Ball Bearing', title: 'Ball Bearing',
file1: 'ball-bearing-1' + FILE_EXT, file1: 'ball-bearing-1' + FILE_EXT,
folderName: 'ball-bearing',
folderName1: 'ball-bearing-1',
} }
const projectCard = page.getByRole('link', { name: 'bracket' }) const projectCard = page.getByRole('link', { name: 'bracket' })
const overwriteWarning = page.getByText( const overwriteWarning = page.getByText(
@ -154,8 +156,10 @@ test.describe('Testing loading external models', () => {
await test.step(`Ensure we made and opened a new file`, async () => { await test.step(`Ensure we made and opened a new file`, async () => {
await editor.expectEditor.toContain('// ' + sampleOne.title) await editor.expectEditor.toContain('// ' + sampleOne.title)
await expect(newlyCreatedFile(sampleOne.file)).toBeVisible() await expect(
await expect(projectMenuButton).toContainText(sampleOne.file) page.getByTestId('file-tree-item').getByText(sampleOne.folderName)
).toBeVisible()
await expect(projectMenuButton).toContainText('main.kcl')
}) })
await test.step(`Load a KCL sample with the command palette`, async () => { await test.step(`Load a KCL sample with the command palette`, async () => {
@ -169,8 +173,10 @@ test.describe('Testing loading external models', () => {
await test.step(`Ensure we made and opened a new file with a unique name`, async () => { await test.step(`Ensure we made and opened a new file with a unique name`, async () => {
await editor.expectEditor.toContain('// ' + sampleOne.title) await editor.expectEditor.toContain('// ' + sampleOne.title)
await expect(newlyCreatedFile(sampleOne.file1)).toBeVisible() await expect(
await expect(projectMenuButton).toContainText(sampleOne.file1) page.getByTestId('file-tree-item').getByText(sampleOne.folderName1)
).toBeVisible()
await expect(projectMenuButton).toContainText('main.kcl')
}) })
} }
) )

View File

@ -984,12 +984,12 @@ test.describe('Mocked Text-to-CAD API tests', { tag: ['@skipWin'] }, () => {
) )
await expect(page.getByTestId('app-header-file-name')).toBeVisible() await expect(page.getByTestId('app-header-file-name')).toBeVisible()
await expect(page.getByTestId('app-header-file-name')).toContainText( await expect(page.getByTestId('app-header-file-name')).toContainText(
'2x2x2-cube.kcl' 'main.kcl'
) )
await u.openFilePanel() await u.openFilePanel()
await expect( await expect(
page.getByTestId('file-tree-item').getByText('2x2x2-cube.kcl') page.getByTestId('file-tree-item').getByText('2x2x2-cube')
).toBeVisible() ).toBeVisible()
} }
) )
@ -1184,13 +1184,13 @@ test.describe('Mocked Text-to-CAD API tests', { tag: ['@skipWin'] }, () => {
) )
await expect(page.getByTestId('app-header-file-name')).toBeVisible() await expect(page.getByTestId('app-header-file-name')).toBeVisible()
await expect(page.getByTestId('app-header-file-name')).toContainText( await expect(page.getByTestId('app-header-file-name')).toContainText(
'2x2x2-cube.kcl' 'main.kcl'
) )
// Check file is created // Check file is created
await u.openFilePanel() await u.openFilePanel()
await expect( await expect(
page.getByTestId('file-tree-item').getByText('2x2x2-cube.kcl') page.getByTestId('file-tree-item').getByText('2x2x2-cube')
).toBeVisible() ).toBeVisible()
} }
) )
@ -1476,13 +1476,13 @@ test.describe('Mocked Text-to-CAD API tests', { tag: ['@skipWin'] }, () => {
) )
await expect(page.getByTestId('app-header-file-name')).toBeVisible() await expect(page.getByTestId('app-header-file-name')).toBeVisible()
await expect(page.getByTestId('app-header-file-name')).toContainText( await expect(page.getByTestId('app-header-file-name')).toContainText(
'2x2x2-cube.kcl' 'main.kcl'
) )
// Check file is created // Check file is created
await u.openFilePanel() await u.openFilePanel()
await expect( await expect(
page.getByTestId('file-tree-item').getByText('2x2x2-cube.kcl') page.getByTestId('file-tree-item').getByText('2x2x2-cube')
).toBeVisible() ).toBeVisible()
await expect( await expect(
page.getByTestId('file-tree-item').getByText('main.kcl') page.getByTestId('file-tree-item').getByText('main.kcl')

View File

@ -573,6 +573,7 @@ profile001 = startProfile(sketch002, at = [-12.34, 12.34])
await expect(page.getByTestId('command-bar')).toBeVisible() await expect(page.getByTestId('command-bar')).toBeVisible()
await page.waitForTimeout(100) await page.waitForTimeout(100)
await cmdBar.progressCmdBar()
await cmdBar.progressCmdBar() await cmdBar.progressCmdBar()
await expect(page.getByText('Confirm Extrude')).toBeVisible() await expect(page.getByText('Confirm Extrude')).toBeVisible()
await cmdBar.progressCmdBar() await cmdBar.progressCmdBar()

View File

@ -72,25 +72,25 @@ leftSpacerShape = boxModuleFn(width = leftSpacerWidth)
// Module for power switch including front plate and red rocker button // Module for power switch including front plate and red rocker button
switchPosition = leftSpacerPosition + leftSpacerWidth / 2 + moduleWidth / 2 switchPosition = leftSpacerPosition + leftSpacerWidth / 2 + moduleWidth / 2
swtichWidth = moduleWidth switchWidth = moduleWidth
// Switch Body // Switch Body
switchBody = boxModuleFn(width = moduleWidth) switchBody = boxModuleFn(width = moduleWidth)
// Switch Plate // Switch Plate
swtichPlateWidth = 20 switchPlateWidth = 20
switchPlateHeight = 30 switchPlateHeight = 30
switchPlateThickness = 3 switchPlateThickness = 3
switchPlateShape = startSketchOn(switchBody, face = END) switchPlateShape = startSketchOn(switchBody, face = END)
|> startProfile( |> startProfile(
%, %,
at = [ at = [
-swtichPlateWidth / 2, -switchPlateWidth / 2,
-switchPlateHeight / 2 -switchPlateHeight / 2
], ],
) )
|> yLine(length = switchPlateHeight) |> yLine(length = switchPlateHeight)
|> xLine(length = swtichPlateWidth) |> xLine(length = switchPlateWidth)
|> yLine(length = -switchPlateHeight) |> yLine(length = -switchPlateHeight)
|> line(endAbsolute = [profileStartX(%), profileStartY(%)]) |> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close() |> close()
@ -104,8 +104,8 @@ switchPlateBody = extrude(switchPlateShape, length = switchPlateThickness)
// Switch Button // Switch Button
switchButtonHeight = 26 switchButtonHeight = 26
swtichButtonWidth = 15 switchButtonWidth = 15
switchButtonShape = startSketchOn(offsetPlane(-YZ, offset = -swtichButtonWidth / 2)) switchButtonShape = startSketchOn(offsetPlane(-YZ, offset = -switchButtonWidth / 2))
|> startProfile( |> startProfile(
%, %,
at = [ at = [
@ -121,7 +121,7 @@ switchButtonShape = startSketchOn(offsetPlane(-YZ, offset = -swtichButtonWidth /
]) ])
|> line(endAbsolute = [profileStartX(%), profileStartY(%)]) |> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close() |> close()
switchButtonBody = extrude(switchButtonShape, length = swtichButtonWidth) switchButtonBody = extrude(switchButtonShape, length = switchButtonWidth)
|> translate( |> translate(
%, %,
x = switchPosition, x = switchPosition,
@ -132,7 +132,7 @@ switchButtonBody = extrude(switchButtonShape, length = swtichButtonWidth)
// Spacer between switch and plug modules for layout alignment // Spacer between switch and plug modules for layout alignment
secondSpacerWidth = moduleWidth / 2 secondSpacerWidth = moduleWidth / 2
secondSpacerPosition = switchPosition + swtichWidth / 2 + secondSpacerWidth / 2 secondSpacerPosition = switchPosition + switchWidth / 2 + secondSpacerWidth / 2
secondSpacerBody = boxModuleFn(width = secondSpacerWidth) secondSpacerBody = boxModuleFn(width = secondSpacerWidth)
|> translate( |> translate(
%, %,

View File

@ -33,14 +33,9 @@ stemLoftProfile2 = startSketchOn(offsetPlane(XY, offset = 75))
// Draw the third profile for the lofted femur // Draw the third profile for the lofted femur
p3Z = 110 p3Z = 110
p3A = 25 p3A = 25
plane003 = {
origin = [0, 0.0, p3Z],
xAxis = [cos(p3A), 0, sin(p3A)],
yAxis = [0.0, 1.0, 0.0]
}
l3 = 32 l3 = 32
r3 = 4 r3 = 4
stemLoftProfile3 = startSketchOn(plane003) stemLoftProfile3 = startSketchOn(XY)
|> startProfile(at = [-15.5, -l3 / 2]) |> startProfile(at = [-15.5, -l3 / 2])
|> yLine(length = l3, tag = $seg03) |> yLine(length = l3, tag = $seg03)
|> tangentialArc(angle = -120, radius = r3) |> tangentialArc(angle = -120, radius = r3)
@ -49,18 +44,14 @@ stemLoftProfile3 = startSketchOn(plane003)
|> angledLine(angle = 30, length = -segLen(seg03)) |> angledLine(angle = 30, length = -segLen(seg03))
|> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close() |> close()
|> translate(z = p3Z)
|> rotate(pitch = -p3A)
// Draw the fourth profile for the lofted femur // Draw the fourth profile for the lofted femur
p4Z = 130 p4Z = 130
p4A = 36.5 p4A = 36.5
plane004 = {
origin = [0, 0.0, p4Z],
xAxis = [cos(p4A), 0, sin(p4A)],
yAxis = [0.0, 1.0, 0.0]
}
l4 = 16 l4 = 16
r4 = 5 r4 = 5
stemLoftProfile4 = startSketchOn(plane004) stemLoftProfile4 = startSketchOn(XY)
|> startProfile(at = [-23, -l4 / 2]) |> startProfile(at = [-23, -l4 / 2])
|> yLine(length = l4, tag = $seg04) |> yLine(length = l4, tag = $seg04)
|> tangentialArc(angle = -120, radius = r4) |> tangentialArc(angle = -120, radius = r4)
@ -69,18 +60,14 @@ stemLoftProfile4 = startSketchOn(plane004)
|> angledLine(angle = 30, length = -segLen(seg04)) |> angledLine(angle = 30, length = -segLen(seg04))
|> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close() |> close()
|> translate(z = p4Z)
|> rotate(pitch = -p4A)
// Draw the first profile for the femoral stem // Draw the first profile for the femoral stem
p5Z = 140 p5Z = 140
p5A = 36.5 p5A = 36.5
plane005 = {
origin = [0, 0.0, p5Z],
xAxis = [cos(p5A), 0, sin(p5A)],
yAxis = [0.0, 1.0, 0.0]
}
l5 = 1.6 l5 = 1.6
r5 = 1.6 r5 = 1.6
stemLoftProfile5 = startSketchOn(plane005) stemLoftProfile5 = startSketchOn(XY)
|> startProfile(at = [-19.5, -l5 / 2]) |> startProfile(at = [-19.5, -l5 / 2])
|> yLine(length = l5, tag = $seg05) |> yLine(length = l5, tag = $seg05)
|> tangentialArc(angle = -120, radius = r5) |> tangentialArc(angle = -120, radius = r5)
@ -89,18 +76,14 @@ stemLoftProfile5 = startSketchOn(plane005)
|> angledLine(angle = 30, length = -segLen(seg05)) |> angledLine(angle = 30, length = -segLen(seg05))
|> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close() |> close()
|> translate(z = p5Z)
|> rotate(pitch = -p5A)
// Draw the second profile for the femoral stem // Draw the second profile for the femoral stem
p6Z = 145 p6Z = 145
p6A = 36.5 p6A = 36.5
plane006 = {
origin = [0, 0.0, p6Z],
xAxis = [cos(p6A), 0, sin(p6A)],
yAxis = [0.0, 1.0, 0.0]
}
l6 = 1 l6 = 1
r6 = 3 r6 = 3
stemLoftProfile6 = startSketchOn(plane006) stemLoftProfile6 = startSketchOn(XY)
|> startProfile(at = [-23.4, -l6 / 2]) |> startProfile(at = [-23.4, -l6 / 2])
|> yLine(length = l6, tag = $seg06) |> yLine(length = l6, tag = $seg06)
|> tangentialArc(angle = -120, radius = r6) |> tangentialArc(angle = -120, radius = r6)
@ -109,27 +92,24 @@ stemLoftProfile6 = startSketchOn(plane006)
|> angledLine(angle = 30, length = -segLen(seg06)) |> angledLine(angle = 30, length = -segLen(seg06))
|> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close() |> close()
|> translate(z = p6Z)
// Draw the third profile for the femoral stem |> rotate(pitch = -p6A)
stemTab = clone(stemLoftProfile6)
|> extrude(%, length = 6)
// Loft the femur using all profiles in sequence // Loft the femur using all profiles in sequence
femur = loft([ femur = loft([
stemLoftProfile1, stemLoftProfile1,
stemLoftProfile2, stemLoftProfile2,
stemLoftProfile3, stemLoftProfile3,
stemLoftProfile4 stemLoftProfile4
]) ])
// Loft the femoral stem // Loft the femoral stem
femoralStem = loft([ femoralStem = loft([
clone(stemLoftProfile4), clone(stemLoftProfile4),
stemLoftProfile5, stemLoftProfile5,
stemLoftProfile6 clone(stemLoftProfile6)
]) ])
// Draw the third profile for the femoral stem
stemTab = stemLoftProfile6
|> extrude(length = 6)
// Revolve a hollow socket to represent the femoral head // Revolve a hollow socket to represent the femoral head
femoralHead = startSketchOn(XZ) femoralHead = startSketchOn(XZ)
|> startProfile(at = [4, 0]) |> startProfile(at = [4, 0])

View File

@ -53,8 +53,8 @@ baseSlab = boxFn(plane = XY, width = slabWidth, height = -baseThickness)
|> appearance(%, color = "#dbd7d2") |> appearance(%, color = "#dbd7d2")
// Create ground platform beneath the base // Create ground platform beneath the base
goundSize = 50 groundSize = 50
groundBody = boxFn(plane = offsetPlane(XY, offset = -baseThickness), width = goundSize, height = -5) groundBody = boxFn(plane = offsetPlane(XY, offset = -baseThickness), width = groundSize, height = -5)
|> appearance(%, color = "#3a3631") |> appearance(%, color = "#3a3631")
// Create a single slab with handrail height to be reused with pattern // Create a single slab with handrail height to be reused with pattern

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 16 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 13 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 13 KiB

View File

@ -631,6 +631,8 @@ impl FnData {
return "clone(${0:part001})".to_owned(); return "clone(${0:part001})".to_owned();
} else if self.name == "hole" { } else if self.name == "hole" {
return "hole(${0:holeSketch}, ${1:%})".to_owned(); return "hole(${0:holeSketch}, ${1:%})".to_owned();
} else if self.name == "circle" {
return "circle(center = [${0:3.14}, ${1:3.14}], diameter = ${2:3.14})".to_owned();
} }
let mut args = Vec::new(); let mut args = Vec::new();
let mut index = 0; let mut index = 0;

View File

@ -1018,7 +1018,7 @@ mod tests {
let snippet = circle_fn.to_autocomplete_snippet(); let snippet = circle_fn.to_autocomplete_snippet();
assert_eq!( assert_eq!(
snippet, snippet,
r#"circle(center = [${0:3.14}, ${1:3.14}], radius = ${2:3.14})"# r#"circle(center = [${0:3.14}, ${1:3.14}], diameter = ${2:3.14})"#
); );
} }

View File

@ -281,7 +281,14 @@ impl ExecutorContext {
// Track exports. // Track exports.
if let ItemVisibility::Export = variable_declaration.visibility { if let ItemVisibility::Export = variable_declaration.visibility {
exec_state.mod_local.module_exports.push(var_name); if matches!(body_type, BodyType::Root) {
exec_state.mod_local.module_exports.push(var_name);
} else {
exec_state.err(CompilationError::err(
variable_declaration.as_source_range(),
"Exports are only supported at the top-level of a file. Remove `export` or move it to the top-level.",
));
}
} }
// Variable declaration can be the return value of a module. // Variable declaration can be the return value of a module.
last_expr = matches!(body_type, BodyType::Root).then_some(value); last_expr = matches!(body_type, BodyType::Root).then_some(value);

View File

@ -35,31 +35,28 @@ impl Default for TypedPath {
impl From<&String> for TypedPath { impl From<&String> for TypedPath {
fn from(path: &String) -> Self { fn from(path: &String) -> Self {
#[cfg(target_arch = "wasm32")] TypedPath::new(path)
{
TypedPath(typed_path::TypedPath::derive(path).to_path_buf())
}
#[cfg(not(target_arch = "wasm32"))]
{
TypedPath(std::path::PathBuf::from(path))
}
} }
} }
impl From<&str> for TypedPath { impl From<&str> for TypedPath {
fn from(path: &str) -> Self { fn from(path: &str) -> Self {
TypedPath::new(path)
}
}
impl TypedPath {
pub fn new(path: &str) -> Self {
#[cfg(target_arch = "wasm32")] #[cfg(target_arch = "wasm32")]
{ {
TypedPath(typed_path::TypedPath::derive(path).to_path_buf()) TypedPath(typed_path::TypedPath::derive(path).to_path_buf())
} }
#[cfg(not(target_arch = "wasm32"))] #[cfg(not(target_arch = "wasm32"))]
{ {
TypedPath(std::path::PathBuf::from(path)) TypedPath(normalise_import(path))
} }
} }
}
impl TypedPath {
pub fn extension(&self) -> Option<&str> { pub fn extension(&self) -> Option<&str> {
#[cfg(target_arch = "wasm32")] #[cfg(target_arch = "wasm32")]
{ {
@ -85,6 +82,17 @@ impl TypedPath {
} }
} }
pub fn join_typed(&self, path: &TypedPath) -> Self {
#[cfg(target_arch = "wasm32")]
{
TypedPath(self.0.join(path.0.to_path()))
}
#[cfg(not(target_arch = "wasm32"))]
{
TypedPath(self.0.join(&path.0))
}
}
pub fn parent(&self) -> Option<Self> { pub fn parent(&self) -> Option<Self> {
#[cfg(target_arch = "wasm32")] #[cfg(target_arch = "wasm32")]
{ {
@ -206,3 +214,19 @@ impl schemars::JsonSchema for TypedPath {
gen.subschema_for::<std::path::PathBuf>() gen.subschema_for::<std::path::PathBuf>()
} }
} }
/// Turn `nested\foo\bar\main.kcl` or `nested/foo/bar/main.kcl`
/// into a PathBuf that works on the host OS.
///
/// * Does **not** touch `..` or symlinks call `canonicalize()` if you need that.
/// * Returns an owned `PathBuf` only when normalisation was required.
fn normalise_import<S: AsRef<str>>(raw: S) -> std::path::PathBuf {
let s = raw.as_ref();
// On Unix we need to swap `\` → `/`. On Windows we leave it alone.
// (Windows happily consumes `/`)
if cfg!(unix) && s.contains('\\') {
std::path::PathBuf::from(s.replace('\\', "/"))
} else {
std::path::Path::new(s).to_path_buf()
}
}

View File

@ -185,9 +185,9 @@ impl ModulePath {
match path { match path {
ImportPath::Kcl { filename: path } | ImportPath::Foreign { path } => { ImportPath::Kcl { filename: path } | ImportPath::Foreign { path } => {
let resolved_path = if let Some(project_dir) = project_directory { let resolved_path = if let Some(project_dir) = project_directory {
project_dir.join(path) project_dir.join_typed(path)
} else { } else {
TypedPath::from(path) path.clone()
}; };
ModulePath::Local { value: resolved_path } ModulePath::Local { value: resolved_path }
} }

View File

@ -34,7 +34,7 @@ use crate::{
}, },
parsing::{ast::digest::Digest, token::NumericSuffix, PIPE_OPERATOR}, parsing::{ast::digest::Digest, token::NumericSuffix, PIPE_OPERATOR},
source_range::SourceRange, source_range::SourceRange,
ModuleId, ModuleId, TypedPath,
}; };
mod condition; mod condition;
@ -1741,8 +1741,8 @@ impl ImportSelector {
#[ts(export)] #[ts(export)]
#[serde(tag = "type")] #[serde(tag = "type")]
pub enum ImportPath { pub enum ImportPath {
Kcl { filename: String }, Kcl { filename: TypedPath },
Foreign { path: String }, Foreign { path: TypedPath },
Std { path: Vec<String> }, Std { path: Vec<String> },
} }
@ -1811,16 +1811,25 @@ impl ImportStatement {
match &self.path { match &self.path {
ImportPath::Kcl { filename: s } | ImportPath::Foreign { path: s } => { ImportPath::Kcl { filename: s } | ImportPath::Foreign { path: s } => {
let mut parts = s.split('.'); let name = s.to_string_lossy();
let path = parts.next()?; if name.ends_with("/main.kcl") || name.ends_with("\\main.kcl") {
let _ext = parts.next()?; let name = &name[..name.len() - 9];
let rest = parts.next(); let start = name.rfind(['/', '\\']).map(|s| s + 1).unwrap_or(0);
return Some(name[start..].to_owned());
}
if rest.is_some() { let name = s.file_name().map(|f| f.to_string())?;
if name.contains('\\') || name.contains('/') {
return None; return None;
} }
path.rsplit(&['/', '\\']).next().map(str::to_owned) // Remove the extension if it exists.
let extension = s.extension();
Some(if let Some(extension) = extension {
name.trim_end_matches(extension).trim_end_matches('.').to_string()
} else {
name
})
} }
ImportPath::Std { path } => path.last().cloned(), ImportPath::Std { path } => path.last().cloned(),
} }
@ -4332,4 +4341,20 @@ startSketchOn(XY)
"# "#
); );
} }
#[test]
fn module_name() {
#[track_caller]
fn assert_mod_name(stmt: &str, name: &str) {
let tokens = crate::parsing::token::lex(stmt, ModuleId::default()).unwrap();
let stmt = crate::parsing::parser::import_stmt(&mut tokens.as_slice()).unwrap();
assert_eq!(stmt.module_name().unwrap(), name);
}
assert_mod_name("import 'foo.kcl'", "foo");
assert_mod_name("import 'foo.kcl' as bar", "bar");
assert_mod_name("import 'main.kcl'", "main");
assert_mod_name("import 'foo/main.kcl'", "foo");
assert_mod_name("import 'foo\\bar\\main.kcl'", "bar");
}
} }

View File

@ -35,7 +35,7 @@ use crate::{
token::{Token, TokenSlice, TokenType}, token::{Token, TokenSlice, TokenType},
PIPE_OPERATOR, PIPE_SUBSTITUTION_OPERATOR, PIPE_OPERATOR, PIPE_SUBSTITUTION_OPERATOR,
}, },
SourceRange, IMPORT_FILE_EXTENSIONS, SourceRange, TypedPath, IMPORT_FILE_EXTENSIONS,
}; };
thread_local! { thread_local! {
@ -1729,7 +1729,7 @@ fn glob(i: &mut TokenSlice) -> PResult<Token> {
.parse_next(i) .parse_next(i)
} }
fn import_stmt(i: &mut TokenSlice) -> PResult<BoxNode<ImportStatement>> { pub(super) fn import_stmt(i: &mut TokenSlice) -> PResult<BoxNode<ImportStatement>> {
let (visibility, visibility_token) = opt(terminated(item_visibility, whitespace)) let (visibility, visibility_token) = opt(terminated(item_visibility, whitespace))
.parse_next(i)? .parse_next(i)?
.map_or((ItemVisibility::Default, None), |pair| (pair.0, Some(pair.1))); .map_or((ItemVisibility::Default, None), |pair| (pair.0, Some(pair.1)));
@ -1862,18 +1862,50 @@ fn validate_path_string(path_string: String, var_name: bool, path_range: SourceR
let path = if path_string.ends_with(".kcl") { let path = if path_string.ends_with(".kcl") {
if path_string if path_string
.chars() .chars()
.any(|c| !c.is_ascii_alphanumeric() && c != '_' && c != '-' && c != '.') .any(|c| !c.is_ascii_alphanumeric() && c != '_' && c != '-' && c != '.' && c != '/' && c != '\\')
{ {
return Err(ErrMode::Cut( return Err(ErrMode::Cut(
CompilationError::fatal( CompilationError::fatal(
path_range, path_range,
"import path may only contain alphanumeric characters, underscore, hyphen, and period. KCL files in other directories are not yet supported.", "import path may only contain alphanumeric characters, `_`, `-`, `.`, `/`, and `\\`.",
) )
.into(), .into(),
)); ));
} }
ImportPath::Kcl { filename: path_string } if path_string.starts_with("..") {
return Err(ErrMode::Cut(
CompilationError::fatal(
path_range,
"import path may not start with '..'. Cannot traverse to something outside the bounds of your project. If this path is inside your project please find a better way to reference it.",
)
.into(),
));
}
// Make sure they are not using an absolute path.
if path_string.starts_with('/') || path_string.starts_with('\\') {
return Err(ErrMode::Cut(
CompilationError::fatal(
path_range,
"import path may not start with '/' or '\\'. Cannot traverse to something outside the bounds of your project. If this path is inside your project please find a better way to reference it.",
)
.into(),
));
}
if (path_string.contains('/') || path_string.contains('\\'))
&& !(path_string.ends_with("/main.kcl") || path_string.ends_with("\\main.kcl"))
{
return Err(ErrMode::Cut(
CompilationError::fatal(path_range, "import path to a subdirectory must only refer to main.kcl.")
.into(),
));
}
ImportPath::Kcl {
filename: TypedPath::new(&path_string),
}
} else if path_string.starts_with("std::") { } else if path_string.starts_with("std::") {
ParseContext::warn(CompilationError::err( ParseContext::warn(CompilationError::err(
path_range, path_range,
@ -1910,7 +1942,9 @@ fn validate_path_string(path_string: String, var_name: bool, path_range: SourceR
format!("unsupported import path format. KCL files can be imported from the current project, CAD files with the following formats are supported: {}", IMPORT_FILE_EXTENSIONS.join(", ")), format!("unsupported import path format. KCL files can be imported from the current project, CAD files with the following formats are supported: {}", IMPORT_FILE_EXTENSIONS.join(", ")),
)) ))
} }
ImportPath::Foreign { path: path_string } ImportPath::Foreign {
path: TypedPath::new(&path_string),
}
} else { } else {
return Err(ErrMode::Cut( return Err(ErrMode::Cut(
CompilationError::fatal( CompilationError::fatal(
@ -4534,9 +4568,24 @@ e
fn bad_imports() { fn bad_imports() {
assert_err( assert_err(
r#"import cube from "../cube.kcl""#, r#"import cube from "../cube.kcl""#,
"import path may only contain alphanumeric characters, underscore, hyphen, and period. KCL files in other directories are not yet supported.", "import path may not start with '..'. Cannot traverse to something outside the bounds of your project. If this path is inside your project please find a better way to reference it.",
[17, 30], [17, 30],
); );
assert_err(
r#"import cube from "/cube.kcl""#,
"import path may not start with '/' or '\\'. Cannot traverse to something outside the bounds of your project. If this path is inside your project please find a better way to reference it.",
[17, 28],
);
assert_err(
r#"import cube from "C:\cube.kcl""#,
"import path may only contain alphanumeric characters, `_`, `-`, `.`, `/`, and `\\`.",
[17, 30],
);
assert_err(
r#"import cube from "cube/cube.kcl""#,
"import path to a subdirectory must only refer to main.kcl.",
[17, 32],
);
assert_err( assert_err(
r#"import * as foo from "dsfs""#, r#"import * as foo from "dsfs""#,
"as is not the 'from' keyword", "as is not the 'from' keyword",

View File

@ -996,6 +996,27 @@ mod import_cycle1 {
super::execute(TEST_NAME, false).await super::execute(TEST_NAME, false).await
} }
} }
mod import_only_at_top_level {
const TEST_NAME: &str = "import_only_at_top_level";
/// 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, false).await
}
}
mod import_function_not_sketch { mod import_function_not_sketch {
const TEST_NAME: &str = "import_function_not_sketch"; const TEST_NAME: &str = "import_function_not_sketch";
@ -1164,6 +1185,27 @@ mod import_foreign {
super::execute(TEST_NAME, false).await super::execute(TEST_NAME, false).await
} }
} }
mod export_var_only_at_top_level {
const TEST_NAME: &str = "export_var_only_at_top_level";
/// 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, false).await
}
}
mod assembly_non_default_units { mod assembly_non_default_units {
const TEST_NAME: &str = "assembly_non_default_units"; const TEST_NAME: &str = "assembly_non_default_units";
@ -3276,3 +3318,87 @@ mod subtract_regression10 {
super::execute(TEST_NAME, true).await super::execute(TEST_NAME, true).await
} }
} }
mod nested_main_kcl {
const TEST_NAME: &str = "nested_main_kcl";
/// 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
}
}
mod nested_windows_main_kcl {
const TEST_NAME: &str = "nested_windows_main_kcl";
/// 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
}
}
mod subtract_regression11 {
const TEST_NAME: &str = "subtract_regression11";
/// 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
}
}
mod subtract_regression12 {
const TEST_NAME: &str = "subtract_regression12";
/// 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

@ -44,10 +44,11 @@ pub enum SketchOrSurface {
pub async fn circle(exec_state: &mut ExecState, args: Args) -> Result<KclValue, KclError> { pub async fn circle(exec_state: &mut ExecState, args: Args) -> Result<KclValue, KclError> {
let sketch_or_surface = args.get_unlabeled_kw_arg("sketchOrSurface")?; let sketch_or_surface = args.get_unlabeled_kw_arg("sketchOrSurface")?;
let center = args.get_kw_arg_typed("center", &RuntimeType::point2d(), exec_state)?; let center = args.get_kw_arg_typed("center", &RuntimeType::point2d(), exec_state)?;
let radius: TyF64 = args.get_kw_arg_typed("radius", &RuntimeType::length(), exec_state)?; let radius: Option<TyF64> = args.get_kw_arg_opt_typed("radius", &RuntimeType::length(), exec_state)?;
let diameter: Option<TyF64> = args.get_kw_arg_opt_typed("diameter", &RuntimeType::length(), exec_state)?;
let tag = args.get_kw_arg_opt(NEW_TAG_KW)?; let tag = args.get_kw_arg_opt(NEW_TAG_KW)?;
let sketch = inner_circle(sketch_or_surface, center, radius, tag, exec_state, args).await?; let sketch = inner_circle(sketch_or_surface, center, radius, diameter, tag, exec_state, args).await?;
Ok(KclValue::Sketch { Ok(KclValue::Sketch {
value: Box::new(sketch), value: Box::new(sketch),
}) })
@ -56,7 +57,8 @@ pub async fn circle(exec_state: &mut ExecState, args: Args) -> Result<KclValue,
async fn inner_circle( async fn inner_circle(
sketch_or_surface: SketchOrSurface, sketch_or_surface: SketchOrSurface,
center: [TyF64; 2], center: [TyF64; 2],
radius: TyF64, radius: Option<TyF64>,
diameter: Option<TyF64>,
tag: Option<TagNode>, tag: Option<TagNode>,
exec_state: &mut ExecState, exec_state: &mut ExecState,
args: Args, args: Args,
@ -68,6 +70,25 @@ async fn inner_circle(
let (center_u, ty) = untype_point(center.clone()); let (center_u, ty) = untype_point(center.clone());
let units = ty.expect_length(); let units = ty.expect_length();
let radius = match (radius, diameter) {
(Some(radius), None) => radius,
(None, Some(mut diameter)) => {
diameter.n /= 2.0;
diameter
}
(None, None) => {
return Err(KclError::Type(KclErrorDetails::new(
"This function needs either `diameter` or `radius`".to_string(),
vec![args.source_range],
)))
}
(Some(_), Some(_)) => {
return Err(KclError::Type(KclErrorDetails::new(
"You cannot specify both `diameter` and `radius`, please remove one".to_string(),
vec![args.source_range],
)))
}
};
let from = [center_u[0] + radius.to_length_units(units), center_u[1]]; let from = [center_u[0] + radius.to_length_units(units), center_u[1]];
let from_t = [TyF64::new(from[0], ty.clone()), TyF64::new(from[1], ty)]; let from_t = [TyF64::new(from[0], ty.clone()), TyF64::new(from[1], ty)];

View File

@ -26,7 +26,7 @@ use crate::{
args::{Args, TyF64}, args::{Args, TyF64},
utils::{ utils::{
arc_center_and_end, get_tangential_arc_to_info, get_x_component, get_y_component, arc_center_and_end, get_tangential_arc_to_info, get_x_component, get_y_component,
intersection_with_parallel_line, point_to_len_unit, point_to_mm, untype_point, untyped_point_to_mm, intersection_with_parallel_line, point_to_len_unit, point_to_mm, untyped_point_to_mm,
TangentialArcInfoInput, TangentialArcInfoInput,
}, },
}, },
@ -1396,12 +1396,14 @@ pub(crate) async fn inner_start_profile(
]) ])
.await?; .await?;
let (to, ty) = untype_point(at); // Convert to the units of the module. This is what the frontend expects.
let units = exec_state.length_unit();
let to = point_to_len_unit(at, units);
let current_path = BasePath { let current_path = BasePath {
from: to, from: to,
to, to,
tag: tag.clone(), tag: tag.clone(),
units: ty.expect_length(), units,
geo_meta: GeoMeta { geo_meta: GeoMeta {
id: move_pen_id, id: move_pen_id,
metadata: args.source_range.into(), metadata: args.source_range.into(),
@ -1414,7 +1416,7 @@ pub(crate) async fn inner_start_profile(
artifact_id: path_id.into(), artifact_id: path_id.into(),
on: sketch_surface.clone(), on: sketch_surface.clone(),
paths: vec![], paths: vec![],
units: ty.expect_length(), units,
mirror: Default::default(), mirror: Default::default(),
meta: vec![args.source_range.into()], meta: vec![args.source_range.into()],
tags: if let Some(tag) = &tag { tags: if let Some(tag) = &tag {

View File

@ -24,7 +24,7 @@
/// |> line(end = [0, 30]) /// |> line(end = [0, 30])
/// |> line(end = [-30, 0]) /// |> line(end = [-30, 0])
/// |> close() /// |> close()
/// |> subtract2d(tool = circle(center = [0, 15], radius = 5)) /// |> subtract2d(tool = circle(center = [0, 15], diameter = 10))
/// ///
/// example = extrude(exampleSketch, length = 5) /// example = extrude(exampleSketch, length = 5)
/// ``` /// ```
@ -34,8 +34,10 @@ export fn circle(
@sketch_or_surface: Sketch | Plane | Face, @sketch_or_surface: Sketch | Plane | Face,
/// The center of the circle. /// The center of the circle.
center: Point2d, center: Point2d,
/// The radius of the circle. /// The radius of the circle. Incompatible with `diameter`.
radius: number(Length), radius?: number(Length),
/// The diameter of the circle. Incompatible with `radius`.
diameter?: number(Length),
/// Create a new tag which refers to this circle. /// Create a new tag which refers to this circle.
tag?: tag, tag?: tag,
): Sketch {} ): Sketch {}

View File

@ -0,0 +1,5 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Artifact commands export_only_at_top_level.kcl
---
[]

View File

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

View File

@ -0,0 +1,3 @@
```mermaid
flowchart LR
```

View File

@ -0,0 +1,148 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Result of parsing export_only_at_top_level.kcl
---
{
"Ok": {
"body": [
{
"commentStart": 0,
"declaration": {
"commentStart": 0,
"end": 0,
"id": {
"commentStart": 0,
"end": 0,
"name": "main",
"start": 0,
"type": "Identifier"
},
"init": {
"body": {
"body": [
{
"commentStart": 0,
"declaration": {
"commentStart": 0,
"end": 0,
"id": {
"commentStart": 0,
"end": 0,
"name": "x",
"start": 0,
"type": "Identifier"
},
"init": {
"commentStart": 0,
"end": 0,
"raw": "2",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 2.0,
"suffix": "None"
}
},
"start": 0,
"type": "VariableDeclarator"
},
"end": 0,
"kind": "const",
"start": 0,
"type": "VariableDeclaration",
"type": "VariableDeclaration",
"visibility": "export"
},
{
"argument": {
"commentStart": 0,
"end": 0,
"raw": "0",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 0.0,
"suffix": "None"
}
},
"commentStart": 0,
"end": 0,
"start": 0,
"type": "ReturnStatement",
"type": "ReturnStatement"
}
],
"commentStart": 0,
"end": 0,
"start": 0
},
"commentStart": 0,
"end": 0,
"params": [],
"start": 0,
"type": "FunctionExpression",
"type": "FunctionExpression"
},
"start": 0,
"type": "VariableDeclarator"
},
"end": 0,
"kind": "fn",
"start": 0,
"type": "VariableDeclaration",
"type": "VariableDeclaration"
},
{
"commentStart": 0,
"end": 0,
"expression": {
"callee": {
"abs_path": false,
"commentStart": 0,
"end": 0,
"name": {
"commentStart": 0,
"end": 0,
"name": "main",
"start": 0,
"type": "Identifier"
},
"path": [],
"start": 0,
"type": "Name"
},
"commentStart": 0,
"end": 0,
"start": 0,
"type": "CallExpressionKw",
"type": "CallExpressionKw",
"unlabeled": null
},
"start": 0,
"type": "ExpressionStatement",
"type": "ExpressionStatement"
}
],
"commentStart": 0,
"end": 0,
"nonCodeMeta": {
"nonCodeNodes": {
"0": [
{
"commentStart": 0,
"end": 0,
"start": 0,
"type": "NonCodeNode",
"value": {
"type": "newLine"
}
}
]
},
"startNodes": []
},
"start": 0
}
}

View File

@ -0,0 +1,15 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Error from executing export_only_at_top_level.kcl
---
KCL Semantic error
× semantic: Exports are only supported at the top-level of a file. Remove
│ `export` or move it to the top-level.
╭─[2:3]
1 │ fn main() {
2 │ export x = 2
· ──────┬─────
· ╰── main
3 │ return 0
╰────

View File

@ -0,0 +1,6 @@
fn main() {
export x = 2
return 0
}
main()

View File

@ -0,0 +1,5 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Operations executed export_only_at_top_level.kcl
---
[]

View File

@ -0,0 +1,10 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Result of unparsing export_only_at_top_level.kcl
---
fn main() {
export x = 2
return 0
}
main()

View File

@ -0,0 +1,32 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Artifact commands import_only_at_top_level.kcl
---
[
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "edge_lines_visible",
"hidden": false
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "object_visible",
"object_id": "[uuid]",
"hidden": true
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "object_visible",
"object_id": "[uuid]",
"hidden": true
}
}
]

View File

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

View File

@ -0,0 +1,3 @@
```mermaid
flowchart LR
```

View File

@ -0,0 +1,129 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Result of parsing import_only_at_top_level.kcl
---
{
"Ok": {
"body": [
{
"commentStart": 0,
"declaration": {
"commentStart": 0,
"end": 0,
"id": {
"commentStart": 0,
"end": 0,
"name": "main",
"start": 0,
"type": "Identifier"
},
"init": {
"body": {
"body": [
{
"commentStart": 0,
"end": 0,
"path": {
"type": "Kcl",
"filename": "empty.kcl"
},
"selector": {
"type": "None",
"alias": null
},
"start": 0,
"type": "ImportStatement",
"type": "ImportStatement"
},
{
"argument": {
"commentStart": 0,
"end": 0,
"raw": "0",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 0.0,
"suffix": "None"
}
},
"commentStart": 0,
"end": 0,
"start": 0,
"type": "ReturnStatement",
"type": "ReturnStatement"
}
],
"commentStart": 0,
"end": 0,
"start": 0
},
"commentStart": 0,
"end": 0,
"params": [],
"start": 0,
"type": "FunctionExpression",
"type": "FunctionExpression"
},
"start": 0,
"type": "VariableDeclarator"
},
"end": 0,
"kind": "fn",
"start": 0,
"type": "VariableDeclaration",
"type": "VariableDeclaration"
},
{
"commentStart": 0,
"end": 0,
"expression": {
"callee": {
"abs_path": false,
"commentStart": 0,
"end": 0,
"name": {
"commentStart": 0,
"end": 0,
"name": "main",
"start": 0,
"type": "Identifier"
},
"path": [],
"start": 0,
"type": "Name"
},
"commentStart": 0,
"end": 0,
"start": 0,
"type": "CallExpressionKw",
"type": "CallExpressionKw",
"unlabeled": null
},
"start": 0,
"type": "ExpressionStatement",
"type": "ExpressionStatement"
}
],
"commentStart": 0,
"end": 0,
"nonCodeMeta": {
"nonCodeNodes": {
"0": [
{
"commentStart": 0,
"end": 0,
"start": 0,
"type": "NonCodeNode",
"value": {
"type": "newLine"
}
}
]
},
"startNodes": []
},
"start": 0
}
}

View File

@ -0,0 +1,30 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Error from executing import_only_at_top_level.kcl
---
KCL Semantic error
× semantic: Imports are only supported at the top-level of a file.
╭─[2:3]
1 │ fn main() {
2 │ import "empty.kcl"
· ─────────┬────────
· ╰── tests/import_only_at_top_level/input.kcl
3 │ return 0
╰────
╭─[6:1]
5 │
6 │ main()
· ───┬──
· ╰── tests/import_only_at_top_level/input.kcl
╰────
╰─▶ KCL Semantic error
× semantic: Imports are only supported at the top-level of a file.
╭─[2:3]
1 │ fn main() {
2 │ import "empty.kcl"
· ─────────┬────────
· ╰── tests/import_only_at_top_level/input.kcl
3 │ return 0
╰────

View File

@ -0,0 +1,6 @@
fn main() {
import "empty.kcl"
return 0
}
main()

View File

@ -0,0 +1,32 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Operations executed import_only_at_top_level.kcl
---
[
{
"type": "GroupBegin",
"group": {
"type": "ModuleInstance",
"name": "empty.kcl",
"moduleId": 0
},
"sourceRange": []
},
{
"type": "GroupBegin",
"group": {
"type": "FunctionCall",
"name": "main",
"functionSourceRange": [],
"unlabeledArg": null,
"labeledArgs": {}
},
"sourceRange": []
},
{
"type": "GroupEnd"
},
{
"type": "GroupEnd"
}
]

View File

@ -0,0 +1,10 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Result of unparsing import_only_at_top_level.kcl
---
fn main() {
import "empty.kcl"
return 0
}
main()

View File

@ -0,0 +1,5 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Result of unparsing tests/import_only_at_top_level/empty.kcl
---

View File

@ -185,21 +185,20 @@ flowchart LR
%% face_code_ref=Missing NodePath %% face_code_ref=Missing NodePath
86["Cap Start"] 86["Cap Start"]
%% face_code_ref=Missing NodePath %% face_code_ref=Missing NodePath
87["Cap Start"] 87["Cap End"]
%% face_code_ref=Missing NodePath %% face_code_ref=Missing NodePath
88["Cap End"] 88["Cap End"]
%% face_code_ref=Missing NodePath %% face_code_ref=Missing NodePath
89["Cap End"] 89["Cap End"]
%% face_code_ref=Missing NodePath %% face_code_ref=Missing NodePath
90["Cap End"] 90["SweepEdge Opposite"]
%% face_code_ref=Missing NodePath
91["SweepEdge Opposite"] 91["SweepEdge Opposite"]
92["SweepEdge Opposite"] 92["SweepEdge Opposite"]
93["SweepEdge Opposite"] 93["SweepEdge Opposite"]
94["SweepEdge Opposite"] 94["SweepEdge Opposite"]
95["SweepEdge Opposite"] 95["SweepEdge Opposite"]
96["SweepEdge Opposite"] 96["SweepEdge Opposite"]
97["SweepEdge Opposite"] 97["SweepEdge Adjacent"]
98["SweepEdge Adjacent"] 98["SweepEdge Adjacent"]
99["SweepEdge Adjacent"] 99["SweepEdge Adjacent"]
100["SweepEdge Adjacent"] 100["SweepEdge Adjacent"]
@ -214,15 +213,14 @@ flowchart LR
109["SweepEdge Adjacent"] 109["SweepEdge Adjacent"]
110["SweepEdge Adjacent"] 110["SweepEdge Adjacent"]
111["SweepEdge Adjacent"] 111["SweepEdge Adjacent"]
112["SweepEdge Adjacent"] 112["EdgeCut Fillet<br>[2999, 3289, 0]"]
%% [ProgramBodyItem { index: 26 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
113["EdgeCut Fillet<br>[2999, 3289, 0]"] 113["EdgeCut Fillet<br>[2999, 3289, 0]"]
%% [ProgramBodyItem { index: 26 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] %% [ProgramBodyItem { index: 26 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
114["EdgeCut Fillet<br>[2999, 3289, 0]"] 114["EdgeCut Fillet<br>[2999, 3289, 0]"]
%% [ProgramBodyItem { index: 26 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] %% [ProgramBodyItem { index: 26 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
115["EdgeCut Fillet<br>[2999, 3289, 0]"] 115["EdgeCut Fillet<br>[2999, 3289, 0]"]
%% [ProgramBodyItem { index: 26 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] %% [ProgramBodyItem { index: 26 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
116["EdgeCut Fillet<br>[2999, 3289, 0]"]
%% [ProgramBodyItem { index: 26 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
1 --- 8 1 --- 8
1 --- 9 1 --- 9
1 --- 13 1 --- 13
@ -283,84 +281,84 @@ flowchart LR
20 ---- 64 20 ---- 64
82 --- 20 82 --- 20
27 --- 83 27 --- 83
27 x--> 87 27 x--> 86
27 --- 97 27 --- 96
27 --- 112 27 --- 111
28 --- 68 28 --- 68
28 x--> 85 28 x--> 85
28 --- 91 28 --- 90
28 --- 98 28 --- 97
31 --- 70 31 --- 70
31 x--> 84 31 x--> 84
31 --- 95 31 --- 94
31 --- 102 31 --- 101
32 --- 71 32 --- 71
32 x--> 84 32 x--> 84
32 --- 94 32 --- 93
32 --- 101 32 --- 100
33 --- 69 33 --- 69
33 x--> 84 33 x--> 84
33 --- 93 33 --- 92
33 --- 100 33 --- 99
34 --- 72 34 --- 72
34 x--> 84 34 x--> 84
34 --- 92 34 --- 91
34 --- 99 34 --- 98
62 <--x 36 62 <--x 36
36 --- 78 36 --- 78
36 x--> 104 36 x--> 103
62 <--x 37 62 <--x 37
37 --- 77 37 --- 77
37 --- 104 37 --- 103
62 <--x 38 62 <--x 38
38 --- 82 38 --- 82
38 --- 105 38 --- 104
62 <--x 39 62 <--x 39
39 --- 79 39 --- 79
39 --- 106 39 --- 105
62 <--x 40 62 <--x 40
40 --- 74 40 --- 74
40 --- 107 40 --- 106
62 <--x 41 62 <--x 41
41 --- 81 41 --- 81
41 --- 108 41 --- 107
62 <--x 42 62 <--x 42
42 --- 76 42 --- 76
42 --- 109 42 --- 108
62 <--x 43 62 <--x 43
43 --- 75 43 --- 75
43 --- 110 43 --- 109
62 <--x 44 62 <--x 44
44 --- 80 44 --- 80
44 --- 111 44 --- 110
45 --- 73 45 --- 73
45 x--> 82 45 x--> 82
45 --- 96 45 --- 95
45 --- 103 45 --- 102
59 --- 68 59 --- 68
59 --- 85 59 --- 85
59 --- 89 59 --- 88
59 --- 91 59 --- 90
59 --- 98 59 --- 97
60 --- 83 60 --- 83
60 --- 87 60 --- 86
60 --- 90 60 --- 89
60 --- 97 60 --- 96
60 --- 112 60 --- 111
61 --- 69 61 --- 69
61 --- 70 61 --- 70
61 --- 71 61 --- 71
61 --- 72 61 --- 72
61 --- 84 61 --- 84
61 --- 88 61 --- 87
61 --- 91
61 --- 92 61 --- 92
61 --- 93 61 --- 93
61 --- 94 61 --- 94
61 --- 95 61 --- 98
61 --- 99 61 --- 99
61 --- 100 61 --- 100
61 --- 101 61 --- 101
61 --- 102
62 --- 74 62 --- 74
62 --- 75 62 --- 75
62 --- 76 62 --- 76
@ -370,6 +368,7 @@ flowchart LR
62 --- 80 62 --- 80
62 --- 81 62 --- 81
62 --- 82 62 --- 82
62 --- 103
62 --- 104 62 --- 104
62 --- 105 62 --- 105
62 --- 106 62 --- 106
@ -377,54 +376,52 @@ flowchart LR
62 --- 108 62 --- 108
62 --- 109 62 --- 109
62 --- 110 62 --- 110
62 --- 111
64 --- 73 64 --- 73
64 --- 86 64 --- 95
64 --- 96 64 --- 102
64 --- 103 68 --- 90
68 --- 91 68 --- 97
68 --- 98 69 --- 92
69 --- 93 69 --- 99
69 --- 100 100 <--x 69
101 <--x 69 70 --- 94
70 --- 95 98 <--x 70
99 <--x 70 70 --- 101
70 --- 102 71 --- 93
71 --- 94 71 --- 100
71 --- 101 101 <--x 71
102 <--x 71 72 --- 91
72 --- 92 72 --- 98
72 --- 99 99 <--x 72
100 <--x 72 73 --- 95
73 --- 96 73 --- 102
73 --- 103 95 <--x 74
106 <--x 74 105 <--x 74
74 --- 107 74 --- 106
109 <--x 75 108 <--x 75
75 --- 110 75 --- 109
108 <--x 76 107 <--x 76
76 --- 109 76 --- 108
77 --- 104 77 --- 103
78 --- 104 78 --- 103
111 <--x 78 110 <--x 78
105 <--x 79 104 <--x 79
79 --- 106 79 --- 105
110 <--x 80 109 <--x 80
80 --- 111 80 --- 110
107 <--x 81 106 <--x 81
81 --- 108 81 --- 107
82 --- 105 82 --- 104
83 --- 97 83 --- 96
83 --- 112 83 --- 111
96 <--x 86 91 <--x 87
92 <--x 88 92 <--x 87
93 <--x 88 93 <--x 87
94 <--x 88 94 <--x 87
95 <--x 88 90 <--x 88
91 <--x 89 96 <--x 89
97 <--x 90 98 <--x 113
99 <--x 114 99 <--x 112
100 <--x 113 100 <--x 115
101 <--x 116 101 <--x 114
102 <--x 115
``` ```

View File

@ -1172,7 +1172,7 @@ description: Variables in memory after executing brake-rotor.kcl
} }
}, },
"height": -7.0, "height": -7.0,
"startCapId": "[uuid]", "startCapId": null,
"endCapId": null, "endCapId": null,
"units": { "units": {
"type": "Mm" "type": "Mm"
@ -1606,7 +1606,7 @@ description: Variables in memory after executing brake-rotor.kcl
} }
}, },
"height": -7.0, "height": -7.0,
"startCapId": "[uuid]", "startCapId": null,
"endCapId": null, "endCapId": null,
"units": { "units": {
"type": "Mm" "type": "Mm"
@ -2040,7 +2040,7 @@ description: Variables in memory after executing brake-rotor.kcl
} }
}, },
"height": -7.0, "height": -7.0,
"startCapId": "[uuid]", "startCapId": null,
"endCapId": null, "endCapId": null,
"units": { "units": {
"type": "Mm" "type": "Mm"
@ -2474,7 +2474,7 @@ description: Variables in memory after executing brake-rotor.kcl
} }
}, },
"height": -7.0, "height": -7.0,
"startCapId": "[uuid]", "startCapId": null,
"endCapId": null, "endCapId": null,
"units": { "units": {
"type": "Mm" "type": "Mm"
@ -2908,7 +2908,7 @@ description: Variables in memory after executing brake-rotor.kcl
} }
}, },
"height": -7.0, "height": -7.0,
"startCapId": "[uuid]", "startCapId": null,
"endCapId": null, "endCapId": null,
"units": { "units": {
"type": "Mm" "type": "Mm"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 81 KiB

View File

@ -203,7 +203,7 @@ description: Artifact commands helium-tank.kcl
"path": "[uuid]", "path": "[uuid]",
"segment": { "segment": {
"type": "tangential_arc", "type": "tangential_arc",
"radius": 95.88500000000016, "radius": 95.8850000000001,
"offset": { "offset": {
"unit": "degrees", "unit": "degrees",
"value": -90.0 "value": -90.0

View File

@ -3271,7 +3271,7 @@ description: Result of parsing pdu-faceplate.kcl
"id": { "id": {
"commentStart": 0, "commentStart": 0,
"end": 0, "end": 0,
"name": "swtichWidth", "name": "switchWidth",
"start": 0, "start": 0,
"type": "Identifier" "type": "Identifier"
}, },
@ -3385,7 +3385,7 @@ description: Result of parsing pdu-faceplate.kcl
"id": { "id": {
"commentStart": 0, "commentStart": 0,
"end": 0, "end": 0,
"name": "swtichPlateWidth", "name": "switchPlateWidth",
"start": 0, "start": 0,
"type": "Identifier" "type": "Identifier"
}, },
@ -3586,7 +3586,7 @@ description: Result of parsing pdu-faceplate.kcl
"name": { "name": {
"commentStart": 0, "commentStart": 0,
"end": 0, "end": 0,
"name": "swtichPlateWidth", "name": "switchPlateWidth",
"start": 0, "start": 0,
"type": "Identifier" "type": "Identifier"
}, },
@ -3768,7 +3768,7 @@ description: Result of parsing pdu-faceplate.kcl
"name": { "name": {
"commentStart": 0, "commentStart": 0,
"end": 0, "end": 0,
"name": "swtichPlateWidth", "name": "switchPlateWidth",
"start": 0, "start": 0,
"type": "Identifier" "type": "Identifier"
}, },
@ -4257,7 +4257,7 @@ description: Result of parsing pdu-faceplate.kcl
"id": { "id": {
"commentStart": 0, "commentStart": 0,
"end": 0, "end": 0,
"name": "swtichButtonWidth", "name": "switchButtonWidth",
"start": 0, "start": 0,
"type": "Identifier" "type": "Identifier"
}, },
@ -4339,7 +4339,7 @@ description: Result of parsing pdu-faceplate.kcl
"name": { "name": {
"commentStart": 0, "commentStart": 0,
"end": 0, "end": 0,
"name": "swtichButtonWidth", "name": "switchButtonWidth",
"start": 0, "start": 0,
"type": "Identifier" "type": "Identifier"
}, },
@ -4994,7 +4994,7 @@ description: Result of parsing pdu-faceplate.kcl
"name": { "name": {
"commentStart": 0, "commentStart": 0,
"end": 0, "end": 0,
"name": "swtichButtonWidth", "name": "switchButtonWidth",
"start": 0, "start": 0,
"type": "Identifier" "type": "Identifier"
}, },
@ -5329,7 +5329,7 @@ description: Result of parsing pdu-faceplate.kcl
"name": { "name": {
"commentStart": 0, "commentStart": 0,
"end": 0, "end": 0,
"name": "swtichWidth", "name": "switchWidth",
"start": 0, "start": 0,
"type": "Identifier" "type": "Identifier"
}, },

View File

@ -17406,6 +17406,19 @@ description: Variables in memory after executing pdu-faceplate.kcl
} }
} }
}, },
"switchButtonWidth": {
"type": "Number",
"value": 15.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
"switchPlateBody": { "switchPlateBody": {
"type": "Solid", "type": "Solid",
"value": { "value": {
@ -18170,6 +18183,19 @@ description: Variables in memory after executing pdu-faceplate.kcl
} }
} }
}, },
"switchPlateWidth": {
"type": "Number",
"value": 20.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
"switchPosition": { "switchPosition": {
"type": "Number", "type": "Number",
"value": -158.4, "value": -158.4,
@ -18183,33 +18209,7 @@ description: Variables in memory after executing pdu-faceplate.kcl
} }
} }
}, },
"swtichButtonWidth": { "switchWidth": {
"type": "Number",
"value": 15.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
"swtichPlateWidth": {
"type": "Number",
"value": 20.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
"swtichWidth": {
"type": "Number", "type": "Number",
"value": 40.45, "value": 40.45,
"ty": { "ty": {

View File

@ -412,12 +412,12 @@ description: Artifact commands prosthetic-hip.kcl
"origin": { "origin": {
"x": 0.0, "x": 0.0,
"y": 0.0, "y": 0.0,
"z": 110.0 "z": 0.0
}, },
"x_axis": { "x_axis": {
"x": 0.9063, "x": 1.0,
"y": 0.0, "y": 0.0,
"z": 0.4226 "z": 0.0
}, },
"y_axis": { "y_axis": {
"x": 0.0, "x": 0.0,
@ -439,9 +439,9 @@ description: Artifact commands prosthetic-hip.kcl
"animated": false, "animated": false,
"adjust_camera": false, "adjust_camera": false,
"planar_normal": { "planar_normal": {
"x": -0.4226, "x": 0.0,
"y": 0.0, "y": 0.0,
"z": 0.9063 "z": 1.0
} }
} }
}, },
@ -458,15 +458,6 @@ description: Artifact commands prosthetic-hip.kcl
} }
} }
}, },
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "object_visible",
"object_id": "[uuid]",
"hidden": true
}
},
{ {
"cmdId": "[uuid]", "cmdId": "[uuid]",
"range": [], "range": [],
@ -589,6 +580,54 @@ description: Artifact commands prosthetic-hip.kcl
"path_id": "[uuid]" "path_id": "[uuid]"
} }
}, },
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "set_object_transform",
"object_id": "[uuid]",
"transforms": [
{
"translate": {
"property": {
"x": 0.0,
"y": 0.0,
"z": 110.0
},
"set": false,
"is_local": true
},
"rotate_rpy": null,
"rotate_angle_axis": null,
"scale": null
}
]
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "set_object_transform",
"object_id": "[uuid]",
"transforms": [
{
"translate": null,
"rotate_rpy": {
"property": {
"x": 0.0,
"y": -25.0,
"z": 0.0
},
"set": false,
"is_local": true
},
"rotate_angle_axis": null,
"scale": null
}
]
}
},
{ {
"cmdId": "[uuid]", "cmdId": "[uuid]",
"range": [], "range": [],
@ -597,12 +636,12 @@ description: Artifact commands prosthetic-hip.kcl
"origin": { "origin": {
"x": 0.0, "x": 0.0,
"y": 0.0, "y": 0.0,
"z": 130.0 "z": 0.0
}, },
"x_axis": { "x_axis": {
"x": 0.8039, "x": 1.0,
"y": 0.0, "y": 0.0,
"z": 0.5948 "z": 0.0
}, },
"y_axis": { "y_axis": {
"x": 0.0, "x": 0.0,
@ -624,9 +663,9 @@ description: Artifact commands prosthetic-hip.kcl
"animated": false, "animated": false,
"adjust_camera": false, "adjust_camera": false,
"planar_normal": { "planar_normal": {
"x": -0.5948, "x": 0.0,
"y": 0.0, "y": 0.0,
"z": 0.8039 "z": 1.0
} }
} }
}, },
@ -643,15 +682,6 @@ description: Artifact commands prosthetic-hip.kcl
} }
} }
}, },
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "object_visible",
"object_id": "[uuid]",
"hidden": true
}
},
{ {
"cmdId": "[uuid]", "cmdId": "[uuid]",
"range": [], "range": [],
@ -774,6 +804,54 @@ description: Artifact commands prosthetic-hip.kcl
"path_id": "[uuid]" "path_id": "[uuid]"
} }
}, },
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "set_object_transform",
"object_id": "[uuid]",
"transforms": [
{
"translate": {
"property": {
"x": 0.0,
"y": 0.0,
"z": 130.0
},
"set": false,
"is_local": true
},
"rotate_rpy": null,
"rotate_angle_axis": null,
"scale": null
}
]
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "set_object_transform",
"object_id": "[uuid]",
"transforms": [
{
"translate": null,
"rotate_rpy": {
"property": {
"x": 0.0,
"y": -36.5,
"z": 0.0
},
"set": false,
"is_local": true
},
"rotate_angle_axis": null,
"scale": null
}
]
}
},
{ {
"cmdId": "[uuid]", "cmdId": "[uuid]",
"range": [], "range": [],
@ -782,12 +860,12 @@ description: Artifact commands prosthetic-hip.kcl
"origin": { "origin": {
"x": 0.0, "x": 0.0,
"y": 0.0, "y": 0.0,
"z": 140.0 "z": 0.0
}, },
"x_axis": { "x_axis": {
"x": 0.8039, "x": 1.0,
"y": 0.0, "y": 0.0,
"z": 0.5948 "z": 0.0
}, },
"y_axis": { "y_axis": {
"x": 0.0, "x": 0.0,
@ -809,9 +887,9 @@ description: Artifact commands prosthetic-hip.kcl
"animated": false, "animated": false,
"adjust_camera": false, "adjust_camera": false,
"planar_normal": { "planar_normal": {
"x": -0.5948, "x": 0.0,
"y": 0.0, "y": 0.0,
"z": 0.8039 "z": 1.0
} }
} }
}, },
@ -828,15 +906,6 @@ description: Artifact commands prosthetic-hip.kcl
} }
} }
}, },
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "object_visible",
"object_id": "[uuid]",
"hidden": true
}
},
{ {
"cmdId": "[uuid]", "cmdId": "[uuid]",
"range": [], "range": [],
@ -959,6 +1028,54 @@ description: Artifact commands prosthetic-hip.kcl
"path_id": "[uuid]" "path_id": "[uuid]"
} }
}, },
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "set_object_transform",
"object_id": "[uuid]",
"transforms": [
{
"translate": {
"property": {
"x": 0.0,
"y": 0.0,
"z": 140.0
},
"set": false,
"is_local": true
},
"rotate_rpy": null,
"rotate_angle_axis": null,
"scale": null
}
]
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "set_object_transform",
"object_id": "[uuid]",
"transforms": [
{
"translate": null,
"rotate_rpy": {
"property": {
"x": 0.0,
"y": -36.5,
"z": 0.0
},
"set": false,
"is_local": true
},
"rotate_angle_axis": null,
"scale": null
}
]
}
},
{ {
"cmdId": "[uuid]", "cmdId": "[uuid]",
"range": [], "range": [],
@ -967,12 +1084,12 @@ description: Artifact commands prosthetic-hip.kcl
"origin": { "origin": {
"x": 0.0, "x": 0.0,
"y": 0.0, "y": 0.0,
"z": 145.0 "z": 0.0
}, },
"x_axis": { "x_axis": {
"x": 0.8039, "x": 1.0,
"y": 0.0, "y": 0.0,
"z": 0.5948 "z": 0.0
}, },
"y_axis": { "y_axis": {
"x": 0.0, "x": 0.0,
@ -994,9 +1111,9 @@ description: Artifact commands prosthetic-hip.kcl
"animated": false, "animated": false,
"adjust_camera": false, "adjust_camera": false,
"planar_normal": { "planar_normal": {
"x": -0.5948, "x": 0.0,
"y": 0.0, "y": 0.0,
"z": 0.8039 "z": 1.0
} }
} }
}, },
@ -1013,15 +1130,6 @@ description: Artifact commands prosthetic-hip.kcl
} }
} }
}, },
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "object_visible",
"object_id": "[uuid]",
"hidden": true
}
},
{ {
"cmdId": "[uuid]", "cmdId": "[uuid]",
"range": [], "range": [],
@ -1144,6 +1252,163 @@ description: Artifact commands prosthetic-hip.kcl
"path_id": "[uuid]" "path_id": "[uuid]"
} }
}, },
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "set_object_transform",
"object_id": "[uuid]",
"transforms": [
{
"translate": {
"property": {
"x": 0.0,
"y": 0.0,
"z": 145.0
},
"set": false,
"is_local": true
},
"rotate_rpy": null,
"rotate_angle_axis": null,
"scale": null
}
]
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "set_object_transform",
"object_id": "[uuid]",
"transforms": [
{
"translate": null,
"rotate_rpy": {
"property": {
"x": 0.0,
"y": -36.5,
"z": 0.0
},
"set": false,
"is_local": true
},
"rotate_angle_axis": null,
"scale": null
}
]
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "loft",
"section_ids": [
"[uuid]",
"[uuid]",
"[uuid]",
"[uuid]"
],
"v_degree": 2,
"bez_approximate_rational": false,
"base_curve_index": null,
"tolerance": 0.0000001
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "object_bring_to_front",
"object_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_adjacency_info",
"object_id": "[uuid]",
"edge_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_extrusion_face_info",
"object_id": "[uuid]",
"edge_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "loft",
"section_ids": [
"[uuid]",
"[uuid]",
"[uuid]"
],
"v_degree": 2,
"bez_approximate_rational": false,
"base_curve_index": null,
"tolerance": 0.0000001
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "object_bring_to_front",
"object_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_adjacency_info",
"object_id": "[uuid]",
"edge_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_extrusion_face_info",
"object_id": "[uuid]",
"edge_id": "[uuid]"
}
},
{
"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]", "cmdId": "[uuid]",
"range": [], "range": [],
@ -1178,9 +1443,9 @@ description: Artifact commands prosthetic-hip.kcl
"animated": false, "animated": false,
"adjust_camera": false, "adjust_camera": false,
"planar_normal": { "planar_normal": {
"x": -0.5948, "x": 0.0,
"y": 0.0, "y": 0.0,
"z": 0.8039 "z": 1.0
} }
} }
}, },
@ -1228,115 +1493,6 @@ description: Artifact commands prosthetic-hip.kcl
"edge_id": "[uuid]" "edge_id": "[uuid]"
} }
}, },
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "loft",
"section_ids": [
"[uuid]",
"[uuid]",
"[uuid]",
"[uuid]"
],
"v_degree": 2,
"bez_approximate_rational": false,
"base_curve_index": null,
"tolerance": 0.0000001
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "object_bring_to_front",
"object_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_adjacency_info",
"object_id": "[uuid]",
"edge_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_extrusion_face_info",
"object_id": "[uuid]",
"edge_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "loft",
"section_ids": [
"[uuid]",
"[uuid]",
"[uuid]"
],
"v_degree": 2,
"bez_approximate_rational": false,
"base_curve_index": null,
"tolerance": 0.0000001
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "object_bring_to_front",
"object_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_adjacency_info",
"object_id": "[uuid]",
"edge_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_extrusion_face_info",
"object_id": "[uuid]",
"edge_id": "[uuid]"
}
},
{
"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]", "cmdId": "[uuid]",
"range": [], "range": [],

View File

@ -17,7 +17,7 @@ flowchart LR
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }] %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }]
26["Segment<br>[676, 683, 0]"] 26["Segment<br>[676, 683, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 8 }] %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 8 }]
80[Solid2d] 79[Solid2d]
end end
subgraph path12 [Path] subgraph path12 [Path]
12["Path<br>[816, 848, 0]"] 12["Path<br>[816, 848, 0]"]
@ -36,161 +36,161 @@ flowchart LR
%% [ProgramBodyItem { index: 5 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }] %% [ProgramBodyItem { index: 5 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }]
33["Segment<br>[1161, 1168, 0]"] 33["Segment<br>[1161, 1168, 0]"]
%% [ProgramBodyItem { index: 5 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 8 }] %% [ProgramBodyItem { index: 5 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 8 }]
84[Solid2d]
end
subgraph path13 [Path]
13["Path<br>[1401, 1436, 0]"]
%% [ProgramBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
34["Segment<br>[1442, 1474, 0]"]
%% [ProgramBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
35["Segment<br>[1480, 1520, 0]"]
%% [ProgramBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
36["Segment<br>[1526, 1573, 0]"]
%% [ProgramBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
37["Segment<br>[1579, 1619, 0]"]
%% [ProgramBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
38["Segment<br>[1625, 1672, 0]"]
%% [ProgramBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }]
39["Segment<br>[1678, 1743, 0]"]
%% [ProgramBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }]
40["Segment<br>[1749, 1756, 0]"]
%% [ProgramBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 8 }]
77[Solid2d]
end
subgraph path14 [Path]
14["Path<br>[1992, 2025, 0]"]
%% [ProgramBodyItem { index: 17 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
41["Segment<br>[2338, 2345, 0]"]
%% [ProgramBodyItem { index: 17 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 8 }]
85[Solid2d] 85[Solid2d]
end end
subgraph path15 [Path] subgraph path13 [Path]
15["Path<br>[2583, 2618, 0]"] 13["Path<br>[1293, 1328, 0]"]
%% [ProgramBodyItem { index: 23 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] %% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
42["Segment<br>[2624, 2656, 0]"] 34["Segment<br>[1334, 1366, 0]"]
%% [ProgramBodyItem { index: 23 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }] %% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
43["Segment<br>[2662, 2702, 0]"] 35["Segment<br>[1372, 1412, 0]"]
%% [ProgramBodyItem { index: 23 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }] %% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
44["Segment<br>[2708, 2755, 0]"] 36["Segment<br>[1418, 1465, 0]"]
%% [ProgramBodyItem { index: 23 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }] %% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
45["Segment<br>[2761, 2801, 0]"] 37["Segment<br>[1471, 1511, 0]"]
%% [ProgramBodyItem { index: 23 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }] %% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
46["Segment<br>[2807, 2854, 0]"] 38["Segment<br>[1517, 1564, 0]"]
%% [ProgramBodyItem { index: 23 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }] %% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }]
47["Segment<br>[2860, 2925, 0]"] 39["Segment<br>[1570, 1635, 0]"]
%% [ProgramBodyItem { index: 23 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }] %% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }]
48["Segment<br>[2931, 2938, 0]"] 40["Segment<br>[1641, 1648, 0]"]
%% [ProgramBodyItem { index: 23 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 8 }] %% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 8 }]
79[Solid2d]
end
subgraph path16 [Path]
16["Path<br>[3173, 3208, 0]"]
%% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
49["Segment<br>[3214, 3246, 0]"]
%% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
50["Segment<br>[3252, 3292, 0]"]
%% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
51["Segment<br>[3298, 3345, 0]"]
%% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
52["Segment<br>[3351, 3391, 0]"]
%% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
53["Segment<br>[3397, 3444, 0]"]
%% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }]
54["Segment<br>[3450, 3515, 0]"]
%% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }]
55["Segment<br>[3521, 3528, 0]"]
%% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 8 }]
78[Solid2d] 78[Solid2d]
end end
subgraph path14 [Path]
14["Path<br>[1825, 1858, 0]"]
%% [ProgramBodyItem { index: 15 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
41["Segment<br>[2171, 2178, 0]"]
%% [ProgramBodyItem { index: 15 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 8 }]
80[Solid2d]
end
subgraph path15 [Path]
15["Path<br>[2357, 2392, 0]"]
%% [ProgramBodyItem { index: 20 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
42["Segment<br>[2398, 2430, 0]"]
%% [ProgramBodyItem { index: 20 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
43["Segment<br>[2436, 2476, 0]"]
%% [ProgramBodyItem { index: 20 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
44["Segment<br>[2482, 2529, 0]"]
%% [ProgramBodyItem { index: 20 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
45["Segment<br>[2535, 2575, 0]"]
%% [ProgramBodyItem { index: 20 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
46["Segment<br>[2581, 2628, 0]"]
%% [ProgramBodyItem { index: 20 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }]
47["Segment<br>[2634, 2699, 0]"]
%% [ProgramBodyItem { index: 20 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }]
48["Segment<br>[2705, 2712, 0]"]
%% [ProgramBodyItem { index: 20 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 8 }]
84[Solid2d]
end
subgraph path16 [Path]
16["Path<br>[2888, 2923, 0]"]
%% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
49["Segment<br>[2929, 2961, 0]"]
%% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
50["Segment<br>[2967, 3007, 0]"]
%% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
51["Segment<br>[3013, 3060, 0]"]
%% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
52["Segment<br>[3066, 3106, 0]"]
%% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
53["Segment<br>[3112, 3159, 0]"]
%% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }]
54["Segment<br>[3165, 3230, 0]"]
%% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }]
55["Segment<br>[3236, 3243, 0]"]
%% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 8 }]
77[Solid2d]
end
subgraph path17 [Path] subgraph path17 [Path]
17["Path<br>[3998, 4023, 0]"] 17["Path<br>[3755, 3780, 0]"]
%% [ProgramBodyItem { index: 33 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] %% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
56["Segment<br>[4029, 4048, 0]"] 56["Segment<br>[3786, 3805, 0]"]
%% [ProgramBodyItem { index: 33 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }] %% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
57["Segment<br>[4054, 4091, 0]"] 57["Segment<br>[3811, 3848, 0]"]
%% [ProgramBodyItem { index: 33 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }] %% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
58["Segment<br>[4097, 4134, 0]"] 58["Segment<br>[3854, 3891, 0]"]
%% [ProgramBodyItem { index: 33 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }] %% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
59["Segment<br>[4140, 4158, 0]"] 59["Segment<br>[3897, 3915, 0]"]
%% [ProgramBodyItem { index: 33 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }] %% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
60["Segment<br>[4164, 4202, 0]"] 60["Segment<br>[3921, 3959, 0]"]
%% [ProgramBodyItem { index: 33 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }] %% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }]
61["Segment<br>[4208, 4273, 0]"] 61["Segment<br>[3965, 4030, 0]"]
%% [ProgramBodyItem { index: 33 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }] %% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }]
62["Segment<br>[4279, 4286, 0]"] 62["Segment<br>[4036, 4043, 0]"]
%% [ProgramBodyItem { index: 33 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 8 }] %% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 8 }]
81[Solid2d] 81[Solid2d]
end end
subgraph path18 [Path] subgraph path18 [Path]
18["Path<br>[4515, 4543, 0]"] 18["Path<br>[4272, 4300, 0]"]
%% [ProgramBodyItem { index: 34 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] %% [ProgramBodyItem { index: 30 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
63["Segment<br>[4549, 4568, 0]"] 63["Segment<br>[4306, 4325, 0]"]
%% [ProgramBodyItem { index: 34 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }] %% [ProgramBodyItem { index: 30 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
64["Segment<br>[4574, 4592, 0]"] 64["Segment<br>[4331, 4349, 0]"]
%% [ProgramBodyItem { index: 34 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }] %% [ProgramBodyItem { index: 30 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
65["Segment<br>[4598, 4639, 0]"] 65["Segment<br>[4355, 4396, 0]"]
%% [ProgramBodyItem { index: 34 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }] %% [ProgramBodyItem { index: 30 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
66["Segment<br>[4645, 4666, 0]"] 66["Segment<br>[4402, 4423, 0]"]
%% [ProgramBodyItem { index: 34 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }] %% [ProgramBodyItem { index: 30 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
67["Segment<br>[4672, 4692, 0]"] 67["Segment<br>[4429, 4449, 0]"]
%% [ProgramBodyItem { index: 34 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }] %% [ProgramBodyItem { index: 30 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }]
68["Segment<br>[4698, 4763, 0]"] 68["Segment<br>[4455, 4520, 0]"]
%% [ProgramBodyItem { index: 34 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }] %% [ProgramBodyItem { index: 30 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }]
69["Segment<br>[4769, 4776, 0]"] 69["Segment<br>[4526, 4533, 0]"]
%% [ProgramBodyItem { index: 34 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 8 }] %% [ProgramBodyItem { index: 30 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 8 }]
82[Solid2d] 82[Solid2d]
end end
subgraph path19 [Path] subgraph path19 [Path]
19["Path<br>[4999, 5029, 0]"] 19["Path<br>[4756, 4786, 0]"]
%% [ProgramBodyItem { index: 35 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] %% [ProgramBodyItem { index: 31 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
70["Segment<br>[5035, 5052, 0]"] 70["Segment<br>[4792, 4809, 0]"]
%% [ProgramBodyItem { index: 35 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }] %% [ProgramBodyItem { index: 31 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
71["Segment<br>[5058, 5076, 0]"] 71["Segment<br>[4815, 4833, 0]"]
%% [ProgramBodyItem { index: 35 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }] %% [ProgramBodyItem { index: 31 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
72["Segment<br>[5082, 5120, 0]"] 72["Segment<br>[4839, 4877, 0]"]
%% [ProgramBodyItem { index: 35 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }] %% [ProgramBodyItem { index: 31 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
73["Segment<br>[5126, 5152, 0]"] 73["Segment<br>[4883, 4909, 0]"]
%% [ProgramBodyItem { index: 35 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }] %% [ProgramBodyItem { index: 31 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
74["Segment<br>[5158, 5177, 0]"] 74["Segment<br>[4915, 4934, 0]"]
%% [ProgramBodyItem { index: 35 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }] %% [ProgramBodyItem { index: 31 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }]
75["Segment<br>[5183, 5248, 0]"] 75["Segment<br>[4940, 5005, 0]"]
%% [ProgramBodyItem { index: 35 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }] %% [ProgramBodyItem { index: 31 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }]
76["Segment<br>[5254, 5261, 0]"] 76["Segment<br>[5011, 5018, 0]"]
%% [ProgramBodyItem { index: 35 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 8 }] %% [ProgramBodyItem { index: 31 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 8 }]
83[Solid2d] 83[Solid2d]
end end
1["Plane<br>[308, 325, 0]"] 1["Plane<br>[308, 325, 0]"]
%% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
2["Plane<br>[781, 809, 0]"] 2["Plane<br>[781, 809, 0]"]
%% [ProgramBodyItem { index: 5 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }, CallKwUnlabeledArg] %% [ProgramBodyItem { index: 5 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }, CallKwUnlabeledArg]
3["Plane<br>[1372, 1395, 0]"] 3["Plane<br>[1270, 1287, 0]"]
%% [ProgramBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] %% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
4["Plane<br>[1963, 1986, 0]"] 4["Plane<br>[1802, 1819, 0]"]
%% [ProgramBodyItem { index: 17 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] %% [ProgramBodyItem { index: 15 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
5["Plane<br>[2554, 2577, 0]"] 5["Plane<br>[2334, 2351, 0]"]
%% [ProgramBodyItem { index: 23 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] %% [ProgramBodyItem { index: 20 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
6["Plane<br>[3144, 3167, 0]"] 6["Plane<br>[2865, 2882, 0]"]
%% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
7["Plane<br>[3732, 3749, 0]"]
%% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] %% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
7["Plane<br>[3975, 3992, 0]"] 8["Plane<br>[4249, 4266, 0]"]
%% [ProgramBodyItem { index: 33 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] %% [ProgramBodyItem { index: 30 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
8["Plane<br>[4492, 4509, 0]"] 9["Plane<br>[4733, 4750, 0]"]
%% [ProgramBodyItem { index: 34 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] %% [ProgramBodyItem { index: 31 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
9["Plane<br>[4976, 4993, 0]"]
%% [ProgramBodyItem { index: 35 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
10["StartSketchOnPlane<br>[767, 810, 0]"] 10["StartSketchOnPlane<br>[767, 810, 0]"]
%% [ProgramBodyItem { index: 5 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] %% [ProgramBodyItem { index: 5 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
86["Sweep Extrusion<br>[3616, 3638, 0]"] 86["Sweep Loft<br>[3351, 3439, 0]"]
%% [ProgramBodyItem { index: 30 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] %% [ProgramBodyItem { index: 26 }, VariableDeclarationDeclaration, VariableDeclarationInit]
87["Sweep Loft<br>[3698, 3786, 0]"] 87["Sweep Loft<br>[3479, 3561, 0]"]
%% [ProgramBodyItem { index: 31 }, VariableDeclarationDeclaration, VariableDeclarationInit] %% [ProgramBodyItem { index: 27 }, VariableDeclarationDeclaration, VariableDeclarationInit]
88["Sweep Loft<br>[3827, 3902, 0]"] 88["Sweep Extrusion<br>[3641, 3660, 0]"]
%% [ProgramBodyItem { index: 32 }, VariableDeclarationDeclaration, VariableDeclarationInit] %% [ProgramBodyItem { index: 28 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
89["Sweep Revolve<br>[4292, 4322, 0]"] 89["Sweep Revolve<br>[4049, 4079, 0]"]
%% [ProgramBodyItem { index: 33 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 9 }] %% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 9 }]
90["Sweep Revolve<br>[4782, 4812, 0]"] 90["Sweep Revolve<br>[4539, 4569, 0]"]
%% [ProgramBodyItem { index: 34 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 9 }] %% [ProgramBodyItem { index: 30 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 9 }]
91["Sweep Revolve<br>[5267, 5297, 0]"] 91["Sweep Revolve<br>[5024, 5054, 0]"]
%% [ProgramBodyItem { index: 35 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 9 }] %% [ProgramBodyItem { index: 31 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 9 }]
92[Wall] 92[Wall]
%% face_code_ref=Missing NodePath %% face_code_ref=Missing NodePath
93[Wall] 93[Wall]
@ -239,30 +239,38 @@ flowchart LR
%% face_code_ref=Missing NodePath %% face_code_ref=Missing NodePath
115[Wall] 115[Wall]
%% face_code_ref=Missing NodePath %% face_code_ref=Missing NodePath
116["Cap Start"] 116[Wall]
%% face_code_ref=Missing NodePath %% face_code_ref=Missing NodePath
117["Cap End"] 117[Wall]
%% face_code_ref=Missing NodePath %% face_code_ref=Missing NodePath
118["SweepEdge Opposite"] 118[Wall]
119["SweepEdge Opposite"] %% face_code_ref=Missing NodePath
120["SweepEdge Opposite"] 119[Wall]
121["SweepEdge Opposite"] %% face_code_ref=Missing NodePath
122["SweepEdge Opposite"] 120[Wall]
123["SweepEdge Opposite"] %% face_code_ref=Missing NodePath
124["SweepEdge Adjacent"] 121[Wall]
125["SweepEdge Adjacent"] %% face_code_ref=Missing NodePath
126["SweepEdge Adjacent"] 122["Cap Start"]
127["SweepEdge Adjacent"] %% face_code_ref=Missing NodePath
128["SweepEdge Adjacent"] 123["Cap Start"]
129["SweepEdge Adjacent"] %% face_code_ref=Missing NodePath
130["SweepEdge Adjacent"] 124["Cap End"]
131["SweepEdge Adjacent"] %% face_code_ref=Missing NodePath
132["SweepEdge Adjacent"] 125["Cap End"]
133["SweepEdge Adjacent"] %% face_code_ref=Missing NodePath
134["SweepEdge Adjacent"] 126["SweepEdge Opposite"]
135["SweepEdge Adjacent"] 127["SweepEdge Opposite"]
136["SweepEdge Adjacent"] 128["SweepEdge Opposite"]
137["SweepEdge Adjacent"] 129["SweepEdge Opposite"]
130["SweepEdge Opposite"]
131["SweepEdge Opposite"]
132["SweepEdge Opposite"]
133["SweepEdge Opposite"]
134["SweepEdge Opposite"]
135["SweepEdge Opposite"]
136["SweepEdge Opposite"]
137["SweepEdge Opposite"]
138["SweepEdge Adjacent"] 138["SweepEdge Adjacent"]
139["SweepEdge Adjacent"] 139["SweepEdge Adjacent"]
140["SweepEdge Adjacent"] 140["SweepEdge Adjacent"]
@ -272,6 +280,26 @@ flowchart LR
144["SweepEdge Adjacent"] 144["SweepEdge Adjacent"]
145["SweepEdge Adjacent"] 145["SweepEdge Adjacent"]
146["SweepEdge Adjacent"] 146["SweepEdge Adjacent"]
147["SweepEdge Adjacent"]
148["SweepEdge Adjacent"]
149["SweepEdge Adjacent"]
150["SweepEdge Adjacent"]
151["SweepEdge Adjacent"]
152["SweepEdge Adjacent"]
153["SweepEdge Adjacent"]
154["SweepEdge Adjacent"]
155["SweepEdge Adjacent"]
156["SweepEdge Adjacent"]
157["SweepEdge Adjacent"]
158["SweepEdge Adjacent"]
159["SweepEdge Adjacent"]
160["SweepEdge Adjacent"]
161["SweepEdge Adjacent"]
162["SweepEdge Adjacent"]
163["SweepEdge Adjacent"]
164["SweepEdge Adjacent"]
165["SweepEdge Adjacent"]
166["SweepEdge Adjacent"]
1 --- 11 1 --- 11
2 <--x 10 2 <--x 10
2 --- 12 2 --- 12
@ -289,8 +317,8 @@ flowchart LR
11 --- 24 11 --- 24
11 --- 25 11 --- 25
11 --- 26 11 --- 26
11 --- 80 11 --- 79
11 ---- 87 11 ---- 86
12 --- 27 12 --- 27
12 --- 28 12 --- 28
12 --- 29 12 --- 29
@ -298,8 +326,8 @@ flowchart LR
12 --- 31 12 --- 31
12 --- 32 12 --- 32
12 --- 33 12 --- 33
12 --- 84 12 --- 85
12 x---> 87 12 x---> 86
13 --- 34 13 --- 34
13 --- 35 13 --- 35
13 --- 36 13 --- 36
@ -307,17 +335,17 @@ flowchart LR
13 --- 38 13 --- 38
13 --- 39 13 --- 39
13 --- 40 13 --- 40
13 --- 77 13 --- 78
13 x---> 87 13 x---> 86
14 --- 41 14 --- 41
14 --- 85 14 --- 80
14 x---> 87 14 x---> 86
14 x--> 118 14 x--> 132
14 x--> 119 14 x--> 133
14 x--> 120 14 x--> 134
14 x--> 121 14 x--> 135
14 x--> 122 14 x--> 136
14 x--> 123 14 x--> 137
15 --- 42 15 --- 42
15 --- 43 15 --- 43
15 --- 44 15 --- 44
@ -325,8 +353,8 @@ flowchart LR
15 --- 46 15 --- 46
15 --- 47 15 --- 47
15 --- 48 15 --- 48
15 --- 79 15 --- 84
15 x---> 88 15 x---> 87
16 --- 49 16 --- 49
16 --- 50 16 --- 50
16 --- 51 16 --- 51
@ -334,8 +362,8 @@ flowchart LR
16 --- 53 16 --- 53
16 --- 54 16 --- 54
16 --- 55 16 --- 55
16 --- 78 16 --- 77
16 x---> 88 16 ---- 88
17 --- 56 17 --- 56
17 --- 57 17 --- 57
17 --- 58 17 --- 58
@ -363,195 +391,263 @@ flowchart LR
19 --- 76 19 --- 76
19 --- 83 19 --- 83
19 ---- 91 19 ---- 91
20 --- 103 20 --- 109
20 x--> 116 20 x--> 122
20 --- 118 20 --- 132
20 --- 130 20 --- 150
21 --- 101 21 --- 107
21 x--> 116 21 x--> 122
21 --- 119 21 --- 133
21 --- 131 21 --- 151
22 --- 100 22 --- 106
22 x--> 116 22 x--> 122
22 --- 120 22 --- 134
22 --- 132 22 --- 152
23 --- 102 23 --- 108
23 x--> 116 23 x--> 122
23 --- 121 23 --- 135
23 --- 133 23 --- 153
24 --- 99 24 --- 105
24 x--> 116 24 x--> 122
24 --- 122 24 --- 136
24 --- 134 24 --- 154
25 --- 98 25 --- 104
25 x--> 116 25 x--> 122
25 --- 123 25 --- 137
25 --- 135 25 --- 155
49 --- 94
49 x--> 123
49 --- 131
49 --- 143
50 --- 95
50 x--> 123
50 --- 130
50 --- 142
51 --- 96
51 x--> 123
51 --- 129
51 --- 141
52 --- 97
52 x--> 123
52 --- 128
52 --- 140
53 --- 92
53 x--> 123
53 --- 127
53 --- 139
54 --- 93
54 x--> 123
54 --- 126
54 --- 138
89 <--x 56 89 <--x 56
56 --- 109 56 --- 115
56 x--> 136 56 x--> 156
89 <--x 57 89 <--x 57
57 --- 108 57 --- 114
57 --- 136 57 --- 156
89 <--x 58 89 <--x 58
58 --- 104 58 --- 110
58 --- 137 58 --- 157
89 <--x 59 89 <--x 59
59 --- 107 59 --- 113
59 --- 138 59 --- 158
89 <--x 60 89 <--x 60
60 --- 106 60 --- 112
60 --- 139 60 --- 159
89 <--x 61 89 <--x 61
61 --- 105 61 --- 111
61 --- 140 61 --- 160
90 <--x 63 90 <--x 63
63 --- 96 63 --- 102
63 --- 124 63 --- 144
90 <--x 64 90 <--x 64
64 --- 92 64 --- 98
64 --- 125 64 --- 145
90 <--x 65 90 <--x 65
65 --- 93 65 --- 99
65 --- 126 65 --- 146
90 <--x 66 90 <--x 66
66 --- 97 66 --- 103
66 --- 127 66 --- 147
90 <--x 67 90 <--x 67
67 --- 95 67 --- 101
67 --- 128 67 --- 148
90 <--x 68 90 <--x 68
68 --- 94 68 --- 100
68 --- 129 68 --- 149
91 <--x 70 91 <--x 70
70 --- 112 70 --- 118
70 --- 141 70 --- 161
91 <--x 71 91 <--x 71
71 --- 115 71 --- 121
71 --- 142 71 --- 162
91 <--x 72 91 <--x 72
72 --- 114 72 --- 120
72 --- 143 72 --- 163
91 <--x 73 91 <--x 73
73 --- 110 73 --- 116
73 --- 144 73 --- 164
91 <--x 74 91 <--x 74
74 --- 113 74 --- 119
74 --- 145 74 --- 165
91 <--x 75 91 <--x 75
75 --- 111 75 --- 117
75 --- 146 75 --- 166
87 --- 98 86 --- 104
87 --- 99 86 --- 105
87 --- 100 86 --- 106
87 --- 101 86 --- 107
87 --- 102 86 --- 108
87 --- 103 86 --- 109
87 --- 116 86 --- 122
87 --- 117 86 --- 124
87 --- 118 86 --- 132
87 --- 119 86 --- 133
87 --- 120 86 --- 134
87 --- 121 86 --- 135
87 --- 122 86 --- 136
87 --- 123 86 --- 137
87 --- 130 86 --- 150
87 --- 131 86 --- 151
87 --- 132 86 --- 152
87 --- 133 86 --- 153
87 --- 134 86 --- 154
87 --- 135 86 --- 155
89 --- 104 88 --- 92
89 --- 105 88 --- 93
89 --- 106 88 --- 94
89 --- 107 88 --- 95
89 --- 108 88 --- 96
89 --- 109 88 --- 97
89 --- 136 88 --- 123
89 --- 137 88 --- 125
89 --- 138 88 --- 126
89 --- 139 88 --- 127
89 --- 140 88 --- 128
90 --- 92 88 --- 129
90 --- 93 88 --- 130
90 --- 94 88 --- 131
90 --- 95 88 --- 138
90 --- 96 88 --- 139
90 --- 97 88 --- 140
90 --- 124 88 --- 141
90 --- 125 88 --- 142
90 --- 126 88 --- 143
90 --- 127 89 --- 110
90 --- 128 89 --- 111
90 --- 129 89 --- 112
91 --- 110 89 --- 113
91 --- 111 89 --- 114
91 --- 112 89 --- 115
91 --- 113 89 --- 156
91 --- 114 89 --- 157
91 --- 115 89 --- 158
91 --- 141 89 --- 159
91 --- 142 89 --- 160
91 --- 143 90 --- 98
91 --- 144 90 --- 99
91 --- 145 90 --- 100
91 --- 146 90 --- 101
124 <--x 92 90 --- 102
92 --- 125 90 --- 103
125 <--x 93 90 --- 144
90 --- 145
90 --- 146
90 --- 147
90 --- 148
90 --- 149
91 --- 116
91 --- 117
91 --- 118
91 --- 119
91 --- 120
91 --- 121
91 --- 161
91 --- 162
91 --- 163
91 --- 164
91 --- 165
91 --- 166
92 --- 127
92 --- 139
140 <--x 92
93 --- 126 93 --- 126
128 <--x 94 93 --- 138
94 --- 129 139 <--x 93
127 <--x 95 94 --- 131
95 --- 128 138 <--x 94
96 --- 124 94 --- 143
129 <--x 96 95 --- 130
126 <--x 97 95 --- 142
97 --- 127 143 <--x 95
98 --- 123 96 --- 129
130 <--x 98 96 --- 141
98 --- 135 142 <--x 96
99 --- 122 97 --- 128
99 --- 134 97 --- 140
135 <--x 99 141 <--x 97
100 --- 120 144 <--x 98
100 --- 132 98 --- 145
133 <--x 100 145 <--x 99
101 --- 119 99 --- 146
101 --- 131 148 <--x 100
132 <--x 101 100 --- 149
102 --- 121 147 <--x 101
102 --- 133 101 --- 148
134 <--x 102 102 --- 144
103 --- 118 149 <--x 102
103 --- 130 146 <--x 103
131 <--x 103 103 --- 147
104 --- 137 104 --- 137
139 <--x 105 150 <--x 104
105 --- 140 104 --- 155
138 <--x 106 105 --- 136
106 --- 139 105 --- 154
137 <--x 107 155 <--x 105
107 --- 138 106 --- 134
108 --- 136 106 --- 152
109 --- 136 153 <--x 106
140 <--x 109 107 --- 133
143 <--x 110 107 --- 151
110 --- 144 152 <--x 107
145 <--x 111 108 --- 135
111 --- 146 108 --- 153
112 --- 141 154 <--x 108
146 <--x 112 109 --- 132
144 <--x 113 109 --- 150
113 --- 145 151 <--x 109
142 <--x 114 110 --- 157
114 --- 143 159 <--x 111
141 <--x 115 111 --- 160
115 --- 142 158 <--x 112
118 <--x 117 112 --- 159
119 <--x 117 157 <--x 113
120 <--x 117 113 --- 158
121 <--x 117 114 --- 156
122 <--x 117 115 --- 156
123 <--x 117 160 <--x 115
163 <--x 116
116 --- 164
165 <--x 117
117 --- 166
118 --- 161
166 <--x 118
164 <--x 119
119 --- 165
162 <--x 120
120 --- 163
161 <--x 121
121 --- 162
132 <--x 124
133 <--x 124
134 <--x 124
135 <--x 124
136 <--x 124
137 <--x 124
126 <--x 125
127 <--x 125
128 <--x 125
129 <--x 125
130 <--x 125
131 <--x 125
``` ```

File diff suppressed because it is too large Load Diff

View File

@ -64,131 +64,8 @@ description: Operations executed prosthetic-hip.kcl
"name": "startSketchOn", "name": "startSketchOn",
"unlabeledArg": { "unlabeledArg": {
"value": { "value": {
"type": "Object", "type": "Plane",
"value": { "artifact_id": "[uuid]"
"origin": {
"type": "Array",
"value": [
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 110.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
}
]
},
"xAxis": {
"type": "Array",
"value": [
{
"type": "Number",
"value": 0.9063077870366499,
"ty": {
"type": "Known",
"type": "Count"
}
},
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 0.42261826174069944,
"ty": {
"type": "Known",
"type": "Count"
}
}
]
},
"yAxis": {
"type": "Array",
"value": [
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 1.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
}
]
}
}
}, },
"sourceRange": [] "sourceRange": []
}, },
@ -200,131 +77,8 @@ description: Operations executed prosthetic-hip.kcl
"name": "startSketchOn", "name": "startSketchOn",
"unlabeledArg": { "unlabeledArg": {
"value": { "value": {
"type": "Object", "type": "Plane",
"value": { "artifact_id": "[uuid]"
"origin": {
"type": "Array",
"value": [
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 130.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
}
]
},
"xAxis": {
"type": "Array",
"value": [
{
"type": "Number",
"value": 0.8038568606172173,
"ty": {
"type": "Known",
"type": "Count"
}
},
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 0.5948227867513413,
"ty": {
"type": "Known",
"type": "Count"
}
}
]
},
"yAxis": {
"type": "Array",
"value": [
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 1.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
}
]
}
}
}, },
"sourceRange": [] "sourceRange": []
}, },
@ -336,131 +90,8 @@ description: Operations executed prosthetic-hip.kcl
"name": "startSketchOn", "name": "startSketchOn",
"unlabeledArg": { "unlabeledArg": {
"value": { "value": {
"type": "Object", "type": "Plane",
"value": { "artifact_id": "[uuid]"
"origin": {
"type": "Array",
"value": [
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 140.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
}
]
},
"xAxis": {
"type": "Array",
"value": [
{
"type": "Number",
"value": 0.8038568606172173,
"ty": {
"type": "Known",
"type": "Count"
}
},
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 0.5948227867513413,
"ty": {
"type": "Known",
"type": "Count"
}
}
]
},
"yAxis": {
"type": "Array",
"value": [
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 1.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
}
]
}
}
}, },
"sourceRange": [] "sourceRange": []
}, },
@ -472,130 +103,92 @@ description: Operations executed prosthetic-hip.kcl
"name": "startSketchOn", "name": "startSketchOn",
"unlabeledArg": { "unlabeledArg": {
"value": { "value": {
"type": "Object", "type": "Plane",
"value": { "artifact_id": "[uuid]"
"origin": { },
"type": "Array", "sourceRange": []
"value": [ },
{ "labeledArgs": {},
"type": "Number", "sourceRange": []
"value": 0.0, },
"ty": { {
"type": "Default", "type": "StdLibCall",
"len": { "name": "loft",
"type": "Mm" "unlabeledArg": {
}, "value": {
"angle": { "type": "Array",
"type": "Degrees" "value": [
} {
} "type": "Sketch",
}, "value": {
{ "artifactId": "[uuid]"
"type": "Number", }
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 145.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
}
]
}, },
"xAxis": { {
"type": "Array", "type": "Sketch",
"value": [ "value": {
{ "artifactId": "[uuid]"
"type": "Number", }
"value": 0.8038568606172173,
"ty": {
"type": "Known",
"type": "Count"
}
},
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 0.5948227867513413,
"ty": {
"type": "Known",
"type": "Count"
}
}
]
}, },
"yAxis": { {
"type": "Array", "type": "Sketch",
"value": [ "value": {
{ "artifactId": "[uuid]"
"type": "Number", }
"value": 0.0, },
"ty": { {
"type": "Default", "type": "Sketch",
"len": { "value": {
"type": "Mm" "artifactId": "[uuid]"
}, }
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 1.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
}
]
} }
]
},
"sourceRange": []
},
"labeledArgs": {},
"sourceRange": []
},
{
"type": "StdLibCall",
"name": "loft",
"unlabeledArg": {
"value": {
"type": "Array",
"value": [
{
"type": "Sketch",
"value": {
"artifactId": "[uuid]"
}
},
{
"type": "Sketch",
"value": {
"artifactId": "[uuid]"
}
},
{
"type": "Sketch",
"value": {
"artifactId": "[uuid]"
}
}
]
},
"sourceRange": []
},
"labeledArgs": {},
"sourceRange": []
},
{
"type": "StdLibCall",
"name": "clone",
"unlabeledArg": {
"value": {
"type": "Sketch",
"value": {
"artifactId": "[uuid]"
} }
}, },
"sourceRange": [] "sourceRange": []
@ -650,91 +243,6 @@ description: Operations executed prosthetic-hip.kcl
}, },
"sourceRange": [] "sourceRange": []
}, },
{
"type": "StdLibCall",
"name": "loft",
"unlabeledArg": {
"value": {
"type": "Array",
"value": [
{
"type": "Sketch",
"value": {
"artifactId": "[uuid]"
}
},
{
"type": "Sketch",
"value": {
"artifactId": "[uuid]"
}
},
{
"type": "Sketch",
"value": {
"artifactId": "[uuid]"
}
},
{
"type": "Sketch",
"value": {
"artifactId": "[uuid]"
}
}
]
},
"sourceRange": []
},
"labeledArgs": {},
"sourceRange": []
},
{
"type": "StdLibCall",
"name": "loft",
"unlabeledArg": {
"value": {
"type": "Array",
"value": [
{
"type": "Sketch",
"value": {
"artifactId": "[uuid]"
}
},
{
"type": "Sketch",
"value": {
"artifactId": "[uuid]"
}
},
{
"type": "Sketch",
"value": {
"artifactId": "[uuid]"
}
}
]
},
"sourceRange": []
},
"labeledArgs": {},
"sourceRange": []
},
{
"type": "StdLibCall",
"name": "clone",
"unlabeledArg": {
"value": {
"type": "Sketch",
"value": {
"artifactId": "[uuid]"
}
},
"sourceRange": []
},
"labeledArgs": {},
"sourceRange": []
},
{ {
"type": "StdLibCall", "type": "StdLibCall",
"name": "startSketchOn", "name": "startSketchOn",

View File

@ -556,9 +556,9 @@ description: Variables in memory after executing prosthetic-hip.kcl
-8.0 -8.0
], ],
"tag": { "tag": {
"commentStart": 2056, "commentStart": 1889,
"end": 2062, "end": 1895,
"start": 2056, "start": 1889,
"type": "TagDeclarator", "type": "TagDeclarator",
"value": "seg04" "value": "seg04"
}, },
@ -707,17 +707,17 @@ description: Variables in memory after executing prosthetic-hip.kcl
"origin": { "origin": {
"x": 0.0, "x": 0.0,
"y": 0.0, "y": 0.0,
"z": 130.0, "z": 0.0,
"units": { "units": {
"type": "Mm" "type": "Mm"
} }
}, },
"type": "plane", "type": "plane",
"value": "Custom", "value": "XY",
"xAxis": { "xAxis": {
"x": 0.8038568606172174, "x": 1.0,
"y": 0.0, "y": 0.0,
"z": 0.5948227867513414, "z": 0.0,
"units": { "units": {
"type": "Unknown" "type": "Unknown"
} }
@ -1236,514 +1236,6 @@ description: Variables in memory after executing prosthetic-hip.kcl
} }
} }
}, },
"plane003": {
"type": "Object",
"value": {
"origin": {
"type": "HomArray",
"value": [
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 110.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
}
]
},
"xAxis": {
"type": "HomArray",
"value": [
{
"type": "Number",
"value": 0.9063,
"ty": {
"type": "Known",
"type": "Count"
}
},
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 0.4226,
"ty": {
"type": "Known",
"type": "Count"
}
}
]
},
"yAxis": {
"type": "HomArray",
"value": [
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 1.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
}
]
}
}
},
"plane004": {
"type": "Object",
"value": {
"origin": {
"type": "HomArray",
"value": [
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 130.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
}
]
},
"xAxis": {
"type": "HomArray",
"value": [
{
"type": "Number",
"value": 0.8039,
"ty": {
"type": "Known",
"type": "Count"
}
},
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 0.5948,
"ty": {
"type": "Known",
"type": "Count"
}
}
]
},
"yAxis": {
"type": "HomArray",
"value": [
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 1.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
}
]
}
}
},
"plane005": {
"type": "Object",
"value": {
"origin": {
"type": "HomArray",
"value": [
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 140.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
}
]
},
"xAxis": {
"type": "HomArray",
"value": [
{
"type": "Number",
"value": 0.8039,
"ty": {
"type": "Known",
"type": "Count"
}
},
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 0.5948,
"ty": {
"type": "Known",
"type": "Count"
}
}
]
},
"yAxis": {
"type": "HomArray",
"value": [
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 1.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
}
]
}
}
},
"plane006": {
"type": "Object",
"value": {
"origin": {
"type": "HomArray",
"value": [
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 145.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
}
]
},
"xAxis": {
"type": "HomArray",
"value": [
{
"type": "Number",
"value": 0.8039,
"ty": {
"type": "Known",
"type": "Count"
}
},
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 0.5948,
"ty": {
"type": "Known",
"type": "Count"
}
}
]
},
"yAxis": {
"type": "HomArray",
"value": [
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 1.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
{
"type": "Number",
"value": 0.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
}
]
}
}
},
"polyethyleneInsert": { "polyethyleneInsert": {
"type": "Solid", "type": "Solid",
"value": { "value": {
@ -2573,9 +2065,9 @@ description: Variables in memory after executing prosthetic-hip.kcl
-16.0 -16.0
], ],
"tag": { "tag": {
"commentStart": 1467, "commentStart": 1359,
"end": 1473, "end": 1365,
"start": 1467, "start": 1359,
"type": "TagDeclarator", "type": "TagDeclarator",
"value": "seg03" "value": "seg03"
}, },
@ -2724,17 +2216,17 @@ description: Variables in memory after executing prosthetic-hip.kcl
"origin": { "origin": {
"x": 0.0, "x": 0.0,
"y": 0.0, "y": 0.0,
"z": 110.0, "z": 0.0,
"units": { "units": {
"type": "Mm" "type": "Mm"
} }
}, },
"type": "plane", "type": "plane",
"value": "Custom", "value": "XY",
"xAxis": { "xAxis": {
"x": 0.9063077870366499, "x": 1.0,
"y": 0.0, "y": 0.0,
"z": 0.42261826174069944, "z": 0.0,
"units": { "units": {
"type": "Unknown" "type": "Unknown"
} }
@ -2795,9 +2287,9 @@ description: Variables in memory after executing prosthetic-hip.kcl
-8.0 -8.0
], ],
"tag": { "tag": {
"commentStart": 2056, "commentStart": 1889,
"end": 2062, "end": 1895,
"start": 2056, "start": 1889,
"type": "TagDeclarator", "type": "TagDeclarator",
"value": "seg04" "value": "seg04"
}, },
@ -2946,17 +2438,17 @@ description: Variables in memory after executing prosthetic-hip.kcl
"origin": { "origin": {
"x": 0.0, "x": 0.0,
"y": 0.0, "y": 0.0,
"z": 130.0, "z": 0.0,
"units": { "units": {
"type": "Mm" "type": "Mm"
} }
}, },
"type": "plane", "type": "plane",
"value": "Custom", "value": "XY",
"xAxis": { "xAxis": {
"x": 0.8038568606172174, "x": 1.0,
"y": 0.0, "y": 0.0,
"z": 0.5948227867513414, "z": 0.0,
"units": { "units": {
"type": "Unknown" "type": "Unknown"
} }
@ -3017,9 +2509,9 @@ description: Variables in memory after executing prosthetic-hip.kcl
-0.8 -0.8
], ],
"tag": { "tag": {
"commentStart": 2649, "commentStart": 2423,
"end": 2655, "end": 2429,
"start": 2649, "start": 2423,
"type": "TagDeclarator", "type": "TagDeclarator",
"value": "seg05" "value": "seg05"
}, },
@ -3168,17 +2660,17 @@ description: Variables in memory after executing prosthetic-hip.kcl
"origin": { "origin": {
"x": 0.0, "x": 0.0,
"y": 0.0, "y": 0.0,
"z": 140.0, "z": 0.0,
"units": { "units": {
"type": "Mm" "type": "Mm"
} }
}, },
"type": "plane", "type": "plane",
"value": "Custom", "value": "XY",
"xAxis": { "xAxis": {
"x": 0.8038568606172174, "x": 1.0,
"y": 0.0, "y": 0.0,
"z": 0.5948227867513414, "z": 0.0,
"units": { "units": {
"type": "Unknown" "type": "Unknown"
} }
@ -3239,9 +2731,9 @@ description: Variables in memory after executing prosthetic-hip.kcl
-0.5 -0.5
], ],
"tag": { "tag": {
"commentStart": 3239, "commentStart": 2954,
"end": 3245, "end": 2960,
"start": 3239, "start": 2954,
"type": "TagDeclarator", "type": "TagDeclarator",
"value": "seg06" "value": "seg06"
}, },
@ -3390,17 +2882,17 @@ description: Variables in memory after executing prosthetic-hip.kcl
"origin": { "origin": {
"x": 0.0, "x": 0.0,
"y": 0.0, "y": 0.0,
"z": 145.0, "z": 0.0,
"units": { "units": {
"type": "Mm" "type": "Mm"
} }
}, },
"type": "plane", "type": "plane",
"value": "Custom", "value": "XY",
"xAxis": { "xAxis": {
"x": 0.8038568606172174, "x": 1.0,
"y": 0.0, "y": 0.0,
"z": 0.5948227867513414, "z": 0.0,
"units": { "units": {
"type": "Unknown" "type": "Unknown"
} }
@ -3457,9 +2949,9 @@ description: Variables in memory after executing prosthetic-hip.kcl
"id": "[uuid]", "id": "[uuid]",
"sourceRange": [], "sourceRange": [],
"tag": { "tag": {
"commentStart": 3239, "commentStart": 2954,
"end": 3245, "end": 2960,
"start": 3239, "start": 2954,
"type": "TagDeclarator", "type": "TagDeclarator",
"value": "seg06" "value": "seg06"
}, },
@ -3515,9 +3007,9 @@ description: Variables in memory after executing prosthetic-hip.kcl
-0.5 -0.5
], ],
"tag": { "tag": {
"commentStart": 3239, "commentStart": 2954,
"end": 3245, "end": 2960,
"start": 3239, "start": 2954,
"type": "TagDeclarator", "type": "TagDeclarator",
"value": "seg06" "value": "seg06"
}, },
@ -3666,17 +3158,17 @@ description: Variables in memory after executing prosthetic-hip.kcl
"origin": { "origin": {
"x": 0.0, "x": 0.0,
"y": 0.0, "y": 0.0,
"z": 145.0, "z": 0.0,
"units": { "units": {
"type": "Mm" "type": "Mm"
} }
}, },
"type": "plane", "type": "plane",
"value": "Custom", "value": "XY",
"xAxis": { "xAxis": {
"x": 0.8038568606172174, "x": 1.0,
"y": 0.0, "y": 0.0,
"z": 0.5948227867513414, "z": 0.0,
"units": { "units": {
"type": "Unknown" "type": "Unknown"
} }

View File

@ -148,7 +148,7 @@ description: Artifact commands router-template-cross-bar.kcl
"segment": { "segment": {
"type": "line", "type": "line",
"end": { "end": {
"x": 22.6312, "x": 22.6313,
"y": -10.0, "y": -10.0,
"z": 0.0 "z": 0.0
}, },
@ -182,7 +182,7 @@ description: Artifact commands router-template-cross-bar.kcl
"segment": { "segment": {
"type": "line", "type": "line",
"end": { "end": {
"x": 32.6312, "x": 32.6313,
"y": 10.9406, "y": 10.9406,
"z": 0.0 "z": 0.0
}, },
@ -199,7 +199,7 @@ description: Artifact commands router-template-cross-bar.kcl
"segment": { "segment": {
"type": "line", "type": "line",
"end": { "end": {
"x": 102.6312, "x": 102.6313,
"y": 10.9406, "y": 10.9406,
"z": 0.0 "z": 0.0
}, },
@ -233,7 +233,7 @@ description: Artifact commands router-template-cross-bar.kcl
"segment": { "segment": {
"type": "line", "type": "line",
"end": { "end": {
"x": 32.6312, "x": 32.6313,
"y": 30.9406, "y": 30.9406,
"z": 0.0 "z": 0.0
}, },
@ -250,7 +250,7 @@ description: Artifact commands router-template-cross-bar.kcl
"segment": { "segment": {
"type": "line", "type": "line",
"end": { "end": {
"x": 32.6312, "x": 32.6313,
"y": 41.8813, "y": 41.8813,
"z": 0.0 "z": 0.0
}, },
@ -284,7 +284,7 @@ description: Artifact commands router-template-cross-bar.kcl
"segment": { "segment": {
"type": "line", "type": "line",
"end": { "end": {
"x": -32.6312, "x": -32.6313,
"y": 0.0, "y": 0.0,
"z": 0.0 "z": 0.0
}, },

View File

@ -61,32 +61,32 @@ flowchart LR
50[Solid2d] 50[Solid2d]
end end
subgraph path13 [Path] subgraph path13 [Path]
13["Path<br>[2227, 2279, 0]"] 13["Path<br>[2229, 2281, 0]"]
%% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] %% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
35["Segment<br>[2285, 2318, 0]"] 35["Segment<br>[2287, 2320, 0]"]
%% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }] %% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
36["Segment<br>[2324, 2357, 0]"] 36["Segment<br>[2326, 2359, 0]"]
%% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }] %% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
37["Segment<br>[2363, 2397, 0]"] 37["Segment<br>[2365, 2399, 0]"]
%% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }] %% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
38["Segment<br>[2403, 2459, 0]"] 38["Segment<br>[2405, 2461, 0]"]
%% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }] %% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
39["Segment<br>[2465, 2473, 0]"] 39["Segment<br>[2467, 2475, 0]"]
%% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }] %% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }]
49[Solid2d] 49[Solid2d]
end end
subgraph path14 [Path] subgraph path14 [Path]
14["Path<br>[2803, 2858, 0]"] 14["Path<br>[2805, 2860, 0]"]
%% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] %% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
40["Segment<br>[2864, 2893, 0]"] 40["Segment<br>[2866, 2895, 0]"]
%% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }] %% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
41["Segment<br>[2899, 2929, 0]"] 41["Segment<br>[2901, 2931, 0]"]
%% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }] %% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
42["Segment<br>[2935, 2969, 0]"] 42["Segment<br>[2937, 2971, 0]"]
%% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }] %% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
43["Segment<br>[2975, 3031, 0]"] 43["Segment<br>[2977, 3033, 0]"]
%% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }] %% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
44["Segment<br>[3037, 3045, 0]"] 44["Segment<br>[3039, 3047, 0]"]
%% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }] %% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }]
45[Solid2d] 45[Solid2d]
end end
@ -94,17 +94,17 @@ flowchart LR
%% [ProgramBodyItem { index: 16 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] %% [ProgramBodyItem { index: 16 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
2["Plane<br>[945, 965, 0]"] 2["Plane<br>[945, 965, 0]"]
%% [ProgramBodyItem { index: 16 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] %% [ProgramBodyItem { index: 16 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
3["Plane<br>[1713, 1753, 0]"] 3["Plane<br>[1714, 1754, 0]"]
%% [ProgramBodyItem { index: 21 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }, CallKwArg { index: 0 }] %% [ProgramBodyItem { index: 21 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }, CallKwArg { index: 0 }]
4["Plane<br>[1937, 1990, 0]"] 4["Plane<br>[1939, 1992, 0]"]
%% [ProgramBodyItem { index: 22 }, VariableDeclarationDeclaration, VariableDeclarationInit, CallKwArg { index: 0 }] %% [ProgramBodyItem { index: 22 }, VariableDeclarationDeclaration, VariableDeclarationInit, CallKwArg { index: 0 }]
5["Plane<br>[2780, 2797, 0]"] 5["Plane<br>[2782, 2799, 0]"]
%% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] %% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
6["StartSketchOnPlane<br>[945, 965, 0]"] 6["StartSketchOnPlane<br>[945, 965, 0]"]
%% [ProgramBodyItem { index: 16 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] %% [ProgramBodyItem { index: 16 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
7["StartSketchOnPlane<br>[945, 965, 0]"] 7["StartSketchOnPlane<br>[945, 965, 0]"]
%% [ProgramBodyItem { index: 16 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] %% [ProgramBodyItem { index: 16 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
8["StartSketchOnFace<br>[2171, 2221, 0]"] 8["StartSketchOnFace<br>[2173, 2223, 0]"]
%% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] %% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
51["Sweep Extrusion<br>[1209, 1240, 0]"] 51["Sweep Extrusion<br>[1209, 1240, 0]"]
%% [ProgramBodyItem { index: 16 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit] %% [ProgramBodyItem { index: 16 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit]
@ -114,9 +114,9 @@ flowchart LR
%% [ProgramBodyItem { index: 16 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit] %% [ProgramBodyItem { index: 16 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit]
54["Sweep Extrusion<br>[1209, 1240, 0]"] 54["Sweep Extrusion<br>[1209, 1240, 0]"]
%% [ProgramBodyItem { index: 16 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit] %% [ProgramBodyItem { index: 16 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit]
55["Sweep Extrusion<br>[2545, 2593, 0]"] 55["Sweep Extrusion<br>[2547, 2595, 0]"]
%% [ProgramBodyItem { index: 26 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] %% [ProgramBodyItem { index: 26 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
56["Sweep Extrusion<br>[3051, 3082, 0]"] 56["Sweep Extrusion<br>[3053, 3084, 0]"]
%% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }] %% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }]
57[Wall] 57[Wall]
%% face_code_ref=Missing NodePath %% face_code_ref=Missing NodePath

View File

@ -1997,7 +1997,7 @@ description: Result of parsing spinning-highrise-tower.kcl
"id": { "id": {
"commentStart": 0, "commentStart": 0,
"end": 0, "end": 0,
"name": "goundSize", "name": "groundSize",
"start": 0, "start": 0,
"type": "Identifier" "type": "Identifier"
}, },
@ -2138,7 +2138,7 @@ description: Result of parsing spinning-highrise-tower.kcl
"name": { "name": {
"commentStart": 0, "commentStart": 0,
"end": 0, "end": 0,
"name": "goundSize", "name": "groundSize",
"start": 0, "start": 0,
"type": "Identifier" "type": "Identifier"
}, },

View File

@ -3936,19 +3936,6 @@ description: Variables in memory after executing spinning-highrise-tower.kcl
} }
} }
}, },
"goundSize": {
"type": "Number",
"value": 50.0,
"ty": {
"type": "Default",
"len": {
"type": "M"
},
"angle": {
"type": "Degrees"
}
}
},
"groundBody": { "groundBody": {
"type": "Solid", "type": "Solid",
"value": { "value": {
@ -4148,6 +4135,19 @@ description: Variables in memory after executing spinning-highrise-tower.kcl
"sectional": false "sectional": false
} }
}, },
"groundSize": {
"type": "Number",
"value": 50.0,
"ty": {
"type": "Default",
"len": {
"type": "M"
},
"angle": {
"type": "Degrees"
}
}
},
"handrailHeight": { "handrailHeight": {
"type": "Number", "type": "Number",
"value": 1.2, "value": 1.2,

View File

@ -0,0 +1,184 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Artifact commands nested_main_kcl.kcl
---
[
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "edge_lines_visible",
"hidden": false
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "object_visible",
"object_id": "[uuid]",
"hidden": true
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "object_visible",
"object_id": "[uuid]",
"hidden": true
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "make_plane",
"origin": {
"x": 0.0,
"y": 0.0,
"z": 0.0
},
"x_axis": {
"x": 1.0,
"y": 0.0,
"z": 0.0
},
"y_axis": {
"x": 0.0,
"y": 1.0,
"z": 0.0
},
"size": 60.0,
"clobber": false,
"hide": true
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "close_path",
"path_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "enable_sketch_mode",
"entity_id": "[uuid]",
"ortho": false,
"animated": false,
"adjust_camera": false,
"planar_normal": {
"x": 0.0,
"y": 0.0,
"z": 1.0
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "extend_path",
"path": "[uuid]",
"segment": {
"type": "arc",
"center": {
"x": 15.0,
"y": 0.0
},
"radius": 5.0,
"start": {
"unit": "degrees",
"value": 0.0
},
"end": {
"unit": "degrees",
"value": 360.0
},
"relative": false
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "move_path_pen",
"path": "[uuid]",
"to": {
"x": 20.0,
"y": 0.0,
"z": 0.0
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "sketch_mode_disable"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "start_path"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "object_bring_to_front",
"object_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "revolve",
"target": "[uuid]",
"origin": {
"x": 0.0,
"y": 0.0,
"z": 0.0
},
"axis": {
"x": 0.0,
"y": 1.0,
"z": 0.0
},
"axis_is_2d": true,
"angle": {
"unit": "degrees",
"value": 360.0
},
"tolerance": 0.0000001,
"opposite": "None"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_adjacency_info",
"object_id": "[uuid]",
"edge_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_extrusion_face_info",
"object_id": "[uuid]",
"edge_id": "[uuid]"
}
}
]

View File

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

View File

@ -0,0 +1,23 @@
```mermaid
flowchart LR
subgraph path2 [Path]
2["Path<br>[43, 81, 1]"]
3["Segment<br>[43, 81, 1]"]
4[Solid2d]
end
1["Plane<br>[18, 35, 1]"]
5["Sweep Revolve<br>[89, 142, 1]"]
6[Wall]
%% face_code_ref=Missing NodePath
7["SweepEdge Adjacent"]
1 --- 2
2 --- 3
2 --- 4
2 ---- 5
5 <--x 3
3 --- 6
3 --- 7
5 --- 6
5 --- 7
6 --- 7
```

View File

@ -0,0 +1,73 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Result of parsing nested_main_kcl.kcl
---
{
"Ok": {
"body": [
{
"commentStart": 0,
"end": 0,
"path": {
"type": "Kcl",
"filename": "nested/foo/bar/main.kcl"
},
"selector": {
"type": "None",
"alias": {
"commentStart": 0,
"end": 0,
"name": "bar",
"start": 0,
"type": "Identifier"
}
},
"start": 0,
"type": "ImportStatement",
"type": "ImportStatement"
},
{
"commentStart": 0,
"end": 0,
"expression": {
"abs_path": false,
"commentStart": 0,
"end": 0,
"name": {
"commentStart": 0,
"end": 0,
"name": "bar",
"start": 0,
"type": "Identifier"
},
"path": [],
"start": 0,
"type": "Name",
"type": "Name"
},
"start": 0,
"type": "ExpressionStatement",
"type": "ExpressionStatement"
}
],
"commentStart": 0,
"end": 0,
"nonCodeMeta": {
"nonCodeNodes": {
"0": [
{
"commentStart": 0,
"end": 0,
"start": 0,
"type": "NonCodeNode",
"value": {
"type": "newLine"
}
}
]
},
"startNodes": []
},
"start": 0
}
}

View File

@ -0,0 +1,3 @@
import "nested/foo/bar/main.kcl" as bar
bar

View File

@ -0,0 +1,7 @@
// A donut shape.
startSketchOn(XY)
|> circle( center = [15, 0], radius = 5 )
|> revolve(
angle = 360,
axis = Y,
)

View File

@ -0,0 +1,18 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Operations executed nested_main_kcl.kcl
---
[
{
"type": "GroupBegin",
"group": {
"type": "ModuleInstance",
"name": "main.kcl",
"moduleId": 0
},
"sourceRange": []
},
{
"type": "GroupEnd"
}
]

View File

@ -0,0 +1,10 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Variables in memory after executing nested_main_kcl.kcl
---
{
"bar": {
"type": "Module",
"value": 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

View File

@ -0,0 +1,7 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Result of unparsing nested_main_kcl.kcl
---
import "nested/foo/bar/main.kcl" as bar
bar

View File

@ -0,0 +1,8 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Result of unparsing tests/nested_main_kcl/nested/foo/bar/main.kcl
---
// A donut shape.
startSketchOn(XY)
|> circle(center = [15, 0], radius = 5)
|> revolve(angle = 360, axis = Y)

View File

@ -0,0 +1,184 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Artifact commands nested_main_kcl.kcl
---
[
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "edge_lines_visible",
"hidden": false
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "object_visible",
"object_id": "[uuid]",
"hidden": true
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "object_visible",
"object_id": "[uuid]",
"hidden": true
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "make_plane",
"origin": {
"x": 0.0,
"y": 0.0,
"z": 0.0
},
"x_axis": {
"x": 1.0,
"y": 0.0,
"z": 0.0
},
"y_axis": {
"x": 0.0,
"y": 1.0,
"z": 0.0
},
"size": 60.0,
"clobber": false,
"hide": true
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "close_path",
"path_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "enable_sketch_mode",
"entity_id": "[uuid]",
"ortho": false,
"animated": false,
"adjust_camera": false,
"planar_normal": {
"x": 0.0,
"y": 0.0,
"z": 1.0
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "extend_path",
"path": "[uuid]",
"segment": {
"type": "arc",
"center": {
"x": 15.0,
"y": 0.0
},
"radius": 5.0,
"start": {
"unit": "degrees",
"value": 0.0
},
"end": {
"unit": "degrees",
"value": 360.0
},
"relative": false
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "move_path_pen",
"path": "[uuid]",
"to": {
"x": 20.0,
"y": 0.0,
"z": 0.0
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "sketch_mode_disable"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "start_path"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "object_bring_to_front",
"object_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "revolve",
"target": "[uuid]",
"origin": {
"x": 0.0,
"y": 0.0,
"z": 0.0
},
"axis": {
"x": 0.0,
"y": 1.0,
"z": 0.0
},
"axis_is_2d": true,
"angle": {
"unit": "degrees",
"value": 360.0
},
"tolerance": 0.0000001,
"opposite": "None"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_adjacency_info",
"object_id": "[uuid]",
"edge_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_extrusion_face_info",
"object_id": "[uuid]",
"edge_id": "[uuid]"
}
}
]

View File

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

View File

@ -0,0 +1,23 @@
```mermaid
flowchart LR
subgraph path2 [Path]
2["Path<br>[43, 81, 1]"]
3["Segment<br>[43, 81, 1]"]
4[Solid2d]
end
1["Plane<br>[18, 35, 1]"]
5["Sweep Revolve<br>[89, 142, 1]"]
6[Wall]
%% face_code_ref=Missing NodePath
7["SweepEdge Adjacent"]
1 --- 2
2 --- 3
2 --- 4
2 ---- 5
5 <--x 3
3 --- 6
3 --- 7
5 --- 6
5 --- 7
6 --- 7
```

View File

@ -0,0 +1,67 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Result of parsing nested_windows_main_kcl.kcl
---
{
"Ok": {
"body": [
{
"commentStart": 0,
"end": 0,
"path": {
"type": "Kcl",
"filename": "nested/foo/bar/main.kcl"
},
"selector": {
"type": "None",
"alias": null
},
"start": 0,
"type": "ImportStatement",
"type": "ImportStatement"
},
{
"commentStart": 0,
"end": 0,
"expression": {
"abs_path": false,
"commentStart": 0,
"end": 0,
"name": {
"commentStart": 0,
"end": 0,
"name": "bar",
"start": 0,
"type": "Identifier"
},
"path": [],
"start": 0,
"type": "Name",
"type": "Name"
},
"start": 0,
"type": "ExpressionStatement",
"type": "ExpressionStatement"
}
],
"commentStart": 0,
"end": 0,
"nonCodeMeta": {
"nonCodeNodes": {
"0": [
{
"commentStart": 0,
"end": 0,
"start": 0,
"type": "NonCodeNode",
"value": {
"type": "newLine"
}
}
]
},
"startNodes": []
},
"start": 0
}
}

View File

@ -0,0 +1,3 @@
import "nested\foo\bar\main.kcl"
bar

View File

@ -0,0 +1,7 @@
// A donut shape.
startSketchOn(XY)
|> circle( center = [15, 0], radius = 5 )
|> revolve(
angle = 360,
axis = Y,
)

View File

@ -0,0 +1,18 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Operations executed nested_main_kcl.kcl
---
[
{
"type": "GroupBegin",
"group": {
"type": "ModuleInstance",
"name": "main.kcl",
"moduleId": 0
},
"sourceRange": []
},
{
"type": "GroupEnd"
}
]

View File

@ -0,0 +1,10 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Variables in memory after executing nested_main_kcl.kcl
---
{
"bar": {
"type": "Module",
"value": 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

View File

@ -0,0 +1,7 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Result of unparsing nested_windows_main_kcl.kcl
---
import "nested/foo/bar/main.kcl"
bar

View File

@ -0,0 +1,8 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Result of unparsing tests/nested_windows_main_kcl/nested/foo/bar/main.kcl
---
// A donut shape.
startSketchOn(XY)
|> circle(center = [15, 0], radius = 5)
|> revolve(angle = 360, axis = Y)

View File

@ -86,11 +86,11 @@ flowchart LR
8 --- 18 8 --- 18
8 ---- 20 8 ---- 20
8 --- 21 8 --- 21
12 --- 22 12 <--x 22
12 <--x 23 12 --- 23
12 <--x 24 12 <--x 24
16 --- 25 16 <--x 25
16 <--x 26 16 --- 26
16 <--x 27 16 <--x 27
19 --- 22 19 --- 22
19 --- 23 19 --- 23

View File

@ -0,0 +1,481 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Artifact commands subtract_regression11.kcl
---
[
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "edge_lines_visible",
"hidden": false
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "object_visible",
"object_id": "[uuid]",
"hidden": true
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "object_visible",
"object_id": "[uuid]",
"hidden": true
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "make_plane",
"origin": {
"x": 0.0,
"y": 0.0,
"z": 0.0
},
"x_axis": {
"x": 0.0,
"y": 1.0,
"z": 0.0
},
"y_axis": {
"x": 0.0,
"y": 0.0,
"z": 1.0
},
"size": 60.0,
"clobber": false,
"hide": true
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "enable_sketch_mode",
"entity_id": "[uuid]",
"ortho": false,
"animated": false,
"adjust_camera": false,
"planar_normal": {
"x": 1.0,
"y": 0.0,
"z": 0.0
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "move_path_pen",
"path": "[uuid]",
"to": {
"x": 0.0,
"y": 20.0,
"z": 0.0
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "sketch_mode_disable"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "start_path"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "extend_path",
"path": "[uuid]",
"segment": {
"type": "line",
"end": {
"x": 2.25,
"y": 0.0,
"z": 0.0
},
"relative": true
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "extend_path",
"path": "[uuid]",
"segment": {
"type": "line",
"end": {
"x": 0.75,
"y": -0.75,
"z": 0.0
},
"relative": true
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "extend_path",
"path": "[uuid]",
"segment": {
"type": "line",
"end": {
"x": 0.0,
"y": -38.5,
"z": 0.0
},
"relative": true
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "extend_path",
"path": "[uuid]",
"segment": {
"type": "line",
"end": {
"x": -0.75,
"y": -0.75,
"z": 0.0
},
"relative": true
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "extend_path",
"path": "[uuid]",
"segment": {
"type": "line",
"end": {
"x": -2.25,
"y": 0.0,
"z": 0.0
},
"relative": true
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "extend_path",
"path": "[uuid]",
"segment": {
"type": "line",
"end": {
"x": 0.0,
"y": 40.0,
"z": 0.0
},
"relative": true
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "close_path",
"path_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "object_bring_to_front",
"object_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "revolve",
"target": "[uuid]",
"origin": {
"x": 0.0,
"y": 0.0,
"z": 0.0
},
"axis": {
"x": 0.0,
"y": 1.0,
"z": 0.0
},
"axis_is_2d": true,
"angle": {
"unit": "degrees",
"value": 360.0
},
"tolerance": 0.0000001,
"opposite": "None"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_adjacency_info",
"object_id": "[uuid]",
"edge_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_extrusion_face_info",
"object_id": "[uuid]",
"edge_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "make_plane",
"origin": {
"x": 0.0,
"y": 0.0,
"z": 0.0
},
"x_axis": {
"x": 0.0,
"y": 1.0,
"z": 0.0
},
"y_axis": {
"x": 0.0,
"y": 0.0,
"z": 1.0
},
"size": 60.0,
"clobber": false,
"hide": true
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "enable_sketch_mode",
"entity_id": "[uuid]",
"ortho": false,
"animated": false,
"adjust_camera": false,
"planar_normal": {
"x": 1.0,
"y": 0.0,
"z": 0.0
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "move_path_pen",
"path": "[uuid]",
"to": {
"x": 0.65,
"y": 20.1,
"z": 0.0
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "sketch_mode_disable"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "start_path"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "extend_path",
"path": "[uuid]",
"segment": {
"type": "line",
"end": {
"x": 0.0,
"y": -1.5,
"z": 0.0
},
"relative": true
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "extend_path",
"path": "[uuid]",
"segment": {
"type": "line",
"end": {
"x": -1.1,
"y": 0.0,
"z": 0.0
},
"relative": true
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "extend_path",
"path": "[uuid]",
"segment": {
"type": "line",
"end": {
"x": 0.0,
"y": 1.5,
"z": 0.0
},
"relative": true
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "extend_path",
"path": "[uuid]",
"segment": {
"type": "line",
"end": {
"x": 1.1,
"y": 0.0,
"z": 0.0
},
"relative": true
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "close_path",
"path_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "enable_sketch_mode",
"entity_id": "[uuid]",
"ortho": false,
"animated": false,
"adjust_camera": false,
"planar_normal": {
"x": 1.0,
"y": 0.0,
"z": 0.0
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "extrude",
"target": "[uuid]",
"distance": 10.0,
"faces": null,
"opposite": {
"Other": 10.0
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "object_bring_to_front",
"object_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "sketch_mode_disable"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_adjacency_info",
"object_id": "[uuid]",
"edge_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_extrusion_face_info",
"object_id": "[uuid]",
"edge_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "boolean_subtract",
"target_ids": [
"[uuid]"
],
"tool_ids": [
"[uuid]"
],
"tolerance": 0.0000001
}
}
]

View File

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

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