Compare commits

...

17 Commits

Author SHA1 Message Date
0bdc50c78f bump kcl-lib and friends (#6063)
* bump kcl-lib and friends

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

* expose

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

* relevant files

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

* udpates

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>

---------

Signed-off-by: Jess Frazelle <github@jessfraz.com>
2025-03-29 19:26:20 -07:00
57d78b6094 Move artifact graph out of engine connection (#6062)
* cleanups

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

* cleanups

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

* fmt

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

---------

Signed-off-by: Jess Frazelle <github@jessfraz.com>
2025-03-29 20:25:26 -04:00
db5ce7ba85 Move turns to a submodule of std (#6039)
* Move turns to a submodule of std

Signed-off-by: Nick Cameron <nrc@ncameron.org>

* Cache module infos as well as memory; fix a bug with deprecated constants

Signed-off-by: Nick Cameron <nrc@ncameron.org>

---------

Signed-off-by: Nick Cameron <nrc@ncameron.org>
2025-03-30 11:10:44 +13:00
51c16d0048 only rust changes reset scene (#6060)
Signed-off-by: Jess Frazelle <github@jessfraz.com>
2025-03-29 11:43:42 -07:00
6532b23f1c Bump tar-fs from 2.1.1 to 2.1.2 in /rust/kcl-language-server in the security group (#6056) 2025-03-29 16:35:45 +00:00
49304b9ecd fix context closes (#6058)
Signed-off-by: Jess Frazelle <github@jessfraz.com>
2025-03-28 20:31:44 -07:00
358b34de4c Fix translate scale & better docs (#6053)
* change translate & scale to be better & docs

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

* autocomplete

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

* gen std

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

* kcl-samples

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

* updates

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

---------

Signed-off-by: Jess Frazelle <github@jessfraz.com>
2025-03-28 21:14:29 +00:00
9973e5fde3 Fix to preserve comments when changing file units (#6052) 2025-03-28 21:07:53 +00:00
36875e05fd Fix .length on undefined WASM error (#6048) 2025-03-28 14:48:47 -04:00
42123383bb Add path argument error to console error whitelist (#6046)
* Add path argument error to console error whitelist

* Lint
2025-03-28 13:50:54 -04:00
ef4c606ed1 Update sweep-related icons to be less detailed, show result (#6047)
* WIP trying out various icons

* Update to use outcome bodies for icons
2025-03-28 16:42:31 +00:00
1ebb73b935 Fix 'originalCode' undefined in a test (#6027) 2025-03-28 12:36:54 -04:00
b57d31c0e7 Fix build:wasm:dev for --dev builds (#6038)
This is useful since it preserves Rust backtraces in WASM.
2025-03-28 08:40:21 -04:00
678ebbc310 Make Helix available in numbered releases (#6024)
* Helix release outside of dev and nightly

* Make length non required on edge mode so we get the edge length by default
2025-03-28 11:25:32 +00:00
cc2efd316c Add more TS lints and fix types (#6037)
* Add as const lint

* Add lint for no implied eval

* Fix incorrect type and add lints

* Add more type lints

* Remove redundant type assertions and add lint

* Fix to turn off incorrect base rules

* Fix yarn lint workflow to wait for build:wasm

* Change so that we don't build:wasm more than once in the workflow
2025-03-28 04:24:24 +00:00
d1f811f91d Boolean create UI (#5906)
* first steps, add to cmd bar etc

* cmdbar working well enough

* mvp

* lint

* fix after rebase

* intersect and union mvps

* add test

* some clean up

* further fix up

* Update src/lang/modifyAst/boolean.ts

Co-authored-by: Pierre Jacquier <pierrejacquier39@gmail.com>

* Update src/lang/modifyAst/boolean.ts

Co-authored-by: Pierre Jacquier <pierrejacquier39@gmail.com>

* pierre's comments

* tsc

* add comment

---------

Co-authored-by: Pierre Jacquier <pierrejacquier39@gmail.com>
2025-03-28 03:56:48 +00:00
7ca3afff9f Add CSG operations to the Feature Tree (#6028)
* Add operation tracking for CSG boolean functions

* Add CSG operations to the Feature Tree

* Add just command

* Add union sim test

* Update output with new sim test

* Add CSG subtract test

* Update output from subtract test

* Add intersect sim test

* Update output for intersect test
2025-03-28 09:48:55 +11:00
185 changed files with 20904 additions and 5708 deletions

View File

@ -20,9 +20,20 @@
"plugin:react-hooks/recommended"
],
"rules": {
"no-array-constructor": "off", // This is wrong; use the @typescript-eslint one instead.
"@typescript-eslint/no-array-constructor": "error",
"@typescript-eslint/no-array-delete": "error",
"@typescript-eslint/no-duplicate-enum-values": "error",
"@typescript-eslint/no-duplicate-type-constituents": "error",
"@typescript-eslint/no-empty-object-type": "error",
"@typescript-eslint/no-floating-promises": "error",
"no-implied-eval": "off", // This is wrong; use the @typescript-eslint one instead.
"@typescript-eslint/no-implied-eval": "error",
"@typescript-eslint/no-misused-promises": "error",
"@typescript-eslint/no-namespace": "error",
"@typescript-eslint/no-unnecessary-type-assertion": "error",
"@typescript-eslint/no-unnecessary-type-constraint": "error",
"no-unused-vars": "off", // This is wrong; use the @typescript-eslint one instead.
"@typescript-eslint/no-unused-vars": ["error", {
"varsIgnorePattern": "^_",
"argsIgnorePattern": "^_",
@ -30,6 +41,7 @@
"vars": "all",
"args": "none"
}],
"@typescript-eslint/prefer-as-const": "warn",
"jsx-a11y/click-events-have-key-events": "off",
"jsx-a11y/no-autofocus": "off",
"jsx-a11y/no-noninteractive-element-interactions": "off",

View File

@ -28,43 +28,57 @@ jobs:
- run: yarn fmt-check
yarn-build-wasm:
runs-on: ubuntu-22.04
# Build the wasm blob once on the fastest runner.
runs-on: runs-on=${{ github.run_id }}/family=i7ie.2xlarge/image=ubuntu22-full-x64
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
cache: 'yarn'
- run: yarn install
- name: Install dependencies
run: yarn install
- name: Use correct Rust toolchain
shell: bash
run: |
[ -e rust-toolchain.toml ] || cp rust/rust-toolchain.toml ./
- name: Install rust
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
cache: false # Configured below.
- uses: taiki-e/install-action@37bdc826eaedac215f638a96472df572feab0f9b
with:
tool: wasm-pack
- run: yarn build:wasm
yarn-tsc:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
cache: 'yarn'
- run: yarn install
- run: yarn --cwd ./rust/kcl-language-server --modules-folder node_modules install
- uses: Swatinem/rust-cache@v2
- name: Rust Cache
uses: Swatinem/rust-cache@v2
with:
workspaces: './rust'
- uses: taiki-e/install-action@37bdc826eaedac215f638a96472df572feab0f9b
with:
tool: wasm-pack
- run: yarn build:wasm
- run: yarn tsc
- name: Build Wasm
shell: bash
run: yarn build:wasm
yarn-lint:
runs-on: ubuntu-22.04
- uses: actions/upload-artifact@v4
with:
name: prepared-wasm
path: |
rust/kcl-wasm-lib/pkg/kcl_wasm_lib*
- uses: actions/upload-artifact@v4
with:
name: prepared-ts-rs-bindings
path: |
rust/kcl-lib/bindings/*
yarn-tsc:
runs-on: ubuntu-latest
needs: yarn-build-wasm
steps:
- uses: actions/checkout@v4
@ -73,7 +87,53 @@ jobs:
node-version-file: '.nvmrc'
cache: 'yarn'
- run: yarn install
- run: yarn --cwd ./rust/kcl-language-server --modules-folder node_modules install
- name: Download all artifacts
uses: actions/download-artifact@v4
- name: Copy prepared wasm
run: |
ls -R prepared-wasm
cp prepared-wasm/kcl_wasm_lib_bg.wasm public
mkdir rust/kcl-wasm-lib/pkg
cp prepared-wasm/kcl_wasm_lib* rust/kcl-wasm-lib/pkg
- name: Copy prepared ts-rs bindings
run: |
ls -R prepared-ts-rs-bindings
mkdir rust/kcl-lib/bindings
cp -r prepared-ts-rs-bindings/* rust/kcl-lib/bindings/
- run: yarn tsc
yarn-lint:
runs-on: ubuntu-latest
needs: yarn-build-wasm
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
cache: 'yarn'
- run: yarn install
- name: Download all artifacts
uses: actions/download-artifact@v4
- name: Copy prepared wasm
run: |
ls -R prepared-wasm
cp prepared-wasm/kcl_wasm_lib_bg.wasm public
mkdir rust/kcl-wasm-lib/pkg
cp prepared-wasm/kcl_wasm_lib* rust/kcl-wasm-lib/pkg
- name: Copy prepared ts-rs bindings
run: |
ls -R prepared-ts-rs-bindings
mkdir rust/kcl-lib/bindings
cp -r prepared-ts-rs-bindings/* rust/kcl-lib/bindings/
- run: yarn lint
python-codespell:
@ -91,6 +151,7 @@ jobs:
yarn-unit-test-kcl-samples:
runs-on: ubuntu-latest
needs: yarn-build-wasm
steps:
- uses: actions/checkout@v4
@ -103,7 +164,22 @@ jobs:
- uses: taiki-e/install-action@37bdc826eaedac215f638a96472df572feab0f9b
with:
tool: wasm-pack
- run: yarn build:wasm
- name: Download all artifacts
uses: actions/download-artifact@v4
- name: Copy prepared wasm
run: |
ls -R prepared-wasm
cp prepared-wasm/kcl_wasm_lib_bg.wasm public
mkdir rust/kcl-wasm-lib/pkg
cp prepared-wasm/kcl_wasm_lib* rust/kcl-wasm-lib/pkg
- name: Copy prepared ts-rs bindings
run: |
ls -R prepared-ts-rs-bindings
mkdir rust/kcl-lib/bindings
cp -r prepared-ts-rs-bindings/* rust/kcl-lib/bindings/
- run: yarn simpleserver:bg
if: ${{ github.event_name != 'release' && github.event_name != 'schedule' }}
@ -120,6 +196,7 @@ jobs:
yarn-unit-test:
runs-on: ubuntu-latest
needs: yarn-build-wasm
steps:
- uses: actions/checkout@v4
@ -132,7 +209,22 @@ jobs:
- uses: taiki-e/install-action@37bdc826eaedac215f638a96472df572feab0f9b
with:
tool: wasm-pack
- run: yarn build:wasm
- name: Download all artifacts
uses: actions/download-artifact@v4
- name: Copy prepared wasm
run: |
ls -R prepared-wasm
cp prepared-wasm/kcl_wasm_lib_bg.wasm public
mkdir rust/kcl-wasm-lib/pkg
cp prepared-wasm/kcl_wasm_lib* rust/kcl-wasm-lib/pkg
- name: Copy prepared ts-rs bindings
run: |
ls -R prepared-ts-rs-bindings
mkdir rust/kcl-lib/bindings
cp -r prepared-ts-rs-bindings/* rust/kcl-lib/bindings/
- run: yarn simpleserver:bg
if: ${{ github.event_name != 'release' && github.event_name != 'schedule' }}

View File

@ -37,7 +37,7 @@ build-web: public/kcl_wasm_lib_bg.wasm build/index.html
build-desktop: public/kcl_wasm_lib_bg.wasm .vite/build/main.js
public/kcl_wasm_lib_bg.wasm: $(CARGO_SOURCES)$(RUST_SOURCES)
yarn build:wasm
yarn build:wasm:dev
build/index.html: $(REACT_SOURCES) $(TYPESCRIPT_SOURCES) $(VITE_SOURCES)
yarn build:local
@ -99,7 +99,7 @@ test-e2e-web: install build-web ## Run the web e2e tests
.PHONY: test-e2e-desktop
test-e2e-desktop: install build-desktop ## Run the desktop e2e tests
yarn test:playwright:electron --workers=$(E2E_WORKERS) --max-failures=$(E2E_FAILURES) --grep=$(E2E_GREP)
yarn test:playwright:electron --workers=$(E2E_WORKERS) --max-failures=$(E2E_FAILURES) --grep="$(E2E_GREP)"
###############################################################################
# CLEAN

View File

@ -9,13 +9,9 @@ layout: manual
### `std`
- [`HALF_TURN`](/docs/kcl/consts/std-HALF_TURN)
- [`QUARTER_TURN`](/docs/kcl/consts/std-QUARTER_TURN)
- [`THREE_QUARTER_TURN`](/docs/kcl/consts/std-THREE_QUARTER_TURN)
- [`XY`](/docs/kcl/consts/std-XY)
- [`XZ`](/docs/kcl/consts/std-XZ)
- [`YZ`](/docs/kcl/consts/std-YZ)
- [`ZERO`](/docs/kcl/consts/std-ZERO)
### `std::math`
@ -23,3 +19,10 @@ layout: manual
- [`PI`](/docs/kcl/consts/std-math-PI)
- [`TAU`](/docs/kcl/consts/std-math-TAU)
### `std::turns`
- [`HALF_TURN`](/docs/kcl/consts/std-turns-HALF_TURN)
- [`QUARTER_TURN`](/docs/kcl/consts/std-turns-QUARTER_TURN)
- [`THREE_QUARTER_TURN`](/docs/kcl/consts/std-turns-THREE_QUARTER_TURN)
- [`ZERO`](/docs/kcl/consts/std-turns-ZERO)

View File

@ -1,15 +0,0 @@
---
title: "std::HALF_TURN"
excerpt: ""
layout: manual
---
```js
std::HALF_TURN: number(deg) = 180deg
```

View File

@ -1,15 +0,0 @@
---
title: "std::QUARTER_TURN"
excerpt: ""
layout: manual
---
```js
std::QUARTER_TURN: number(deg) = 90deg
```

View File

@ -1,15 +0,0 @@
---
title: "std::THREE_QUARTER_TURN"
excerpt: ""
layout: manual
---
```js
std::THREE_QUARTER_TURN: number(deg) = 270deg
```

View File

@ -1,15 +0,0 @@
---
title: "std::ZERO"
excerpt: ""
layout: manual
---
```js
std::ZERO: number = 0
```

View File

@ -0,0 +1,15 @@
---
title: "std::turns::HALF_TURN"
excerpt: ""
layout: manual
---
```js
std::turns::HALF_TURN: number(deg) = 180deg
```

View File

@ -0,0 +1,15 @@
---
title: "std::turns::QUARTER_TURN"
excerpt: ""
layout: manual
---
```js
std::turns::QUARTER_TURN: number(deg) = 90deg
```

View File

@ -0,0 +1,15 @@
---
title: "std::turns::THREE_QUARTER_TURN"
excerpt: ""
layout: manual
---
```js
std::turns::THREE_QUARTER_TURN: number(deg) = 270deg
```

View File

@ -0,0 +1,15 @@
---
title: "std::turns::ZERO"
excerpt: ""
layout: manual
---
```js
std::turns::ZERO: number = 0
```

View File

@ -23,19 +23,15 @@ layout: manual
* [`tag`](kcl/types/tag)
* **std**
* [`Face`](kcl/types/Face)
* [`HALF_TURN`](kcl/consts/std-HALF_TURN)
* [`Helix`](kcl/types/Helix)
* [`Plane`](kcl/types/Plane)
* [`Point2d`](kcl/types/Point2d)
* [`Point3d`](kcl/types/Point3d)
* [`QUARTER_TURN`](kcl/consts/std-QUARTER_TURN)
* [`Sketch`](kcl/types/Sketch)
* [`Solid`](kcl/types/Solid)
* [`THREE_QUARTER_TURN`](kcl/consts/std-THREE_QUARTER_TURN)
* [`XY`](kcl/consts/std-XY)
* [`XZ`](kcl/consts/std-XZ)
* [`YZ`](kcl/consts/std-YZ)
* [`ZERO`](kcl/consts/std-ZERO)
* [`abs`](kcl/abs)
* [`acos`](kcl/acos)
* [`angleToMatchLengthX`](kcl/angleToMatchLengthX)
@ -146,3 +142,8 @@ layout: manual
* [`tan`](kcl/std-math-tan)
* **std::sketch**
* [`circle`](kcl/std-sketch-circle)
* **std::turns**
* [`turns::HALF_TURN`](kcl/consts/std-turns-HALF_TURN)
* [`turns::QUARTER_TURN`](kcl/consts/std-turns-QUARTER_TURN)
* [`turns::THREE_QUARTER_TURN`](kcl/consts/std-turns-THREE_QUARTER_TURN)
* [`turns::ZERO`](kcl/consts/std-turns-ZERO)

View File

@ -6,6 +6,10 @@ layout: manual
Rotate a solid or a sketch.
This is really useful for assembling parts together. You can create a part and then rotate it to the correct orientation.
For sketches, you can use this to rotate a sketch and then loft it with another sketch.
### Using Roll, Pitch, and Yaw
When rotating a part in 3D space, "roll," "pitch," and "yaw" refer to the three rotational axes used to describe its orientation: roll is rotation around the longitudinal axis (front-to-back), pitch is rotation around the lateral axis (wing-to-wing), and yaw is rotation around the vertical axis (up-down); essentially, it's like tilting the part on its side (roll), tipping the nose up or down (pitch), and turning it left or right (yaw).
@ -166,7 +170,7 @@ fn square() {
profile001 = square()
profile002 = square()
|> translate(translate = [0, 0, 20])
|> translate(x = 0, y = 0, z = 20)
|> rotate(axis = [0, 0, 1.0], angle = 45)
loft([profile001, profile002])

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,117 @@
import { test, expect } from './zoo-test'
import fs from 'node:fs/promises'
import path from 'node:path'
test.describe('Point and click for boolean workflows', () => {
// Boolean operations to test
const booleanOperations = [
{
name: 'union',
code: 'union([extrude001, extrude006])',
},
{
name: 'subtract',
code: 'subtract([extrude001], tools = [extrude006])',
},
{
name: 'intersect',
code: 'intersect([extrude001, extrude006])',
},
] as const
for (let i = 0; i < booleanOperations.length; i++) {
const operation = booleanOperations[i]
const operationName = operation.name
const commandName = `Boolean ${
operationName.charAt(0).toUpperCase() + operationName.slice(1)
}`
test(`Create boolean operation -- ${operationName}`, async ({
context,
homePage,
cmdBar,
editor,
toolbar,
scene,
page,
}) => {
const file = await fs.readFile(
path.resolve(
__dirname,
'../../',
'./rust/kcl-lib/e2e/executor/inputs/boolean-setup-with'
),
'utf-8'
)
await context.addInitScript((file) => {
localStorage.setItem('persistCode', file)
}, file)
await homePage.goToModelingScene()
await scene.waitForExecutionDone()
await scene.settled(cmdBar)
// Test coordinates for selection - these might need adjustment based on actual scene layout
const cylinderPoint = { x: 592, y: 174 }
const secondObjectPoint = { x: 683, y: 273 }
// Create mouse helpers for selecting objects
const [clickFirstObject] = scene.makeMouseHelpers(
cylinderPoint.x,
cylinderPoint.y,
{ steps: 10 }
)
const [clickSecondObject] = scene.makeMouseHelpers(
secondObjectPoint.x,
secondObjectPoint.y,
{ steps: 10 }
)
await test.step(`Test ${operationName} operation`, async () => {
// Click the boolean operation button in the toolbar
await toolbar.selectBoolean(operationName)
// Verify command bar is showing the right command
await expect(cmdBar.page.getByTestId('command-name')).toContainText(
commandName
)
// Select first object in the scene, expect there to be a pixel diff from the selection color change
await clickFirstObject({ pixelDiff: 50 })
// For subtract, we need to proceed to the next step before selecting the second object
if (operationName !== 'subtract') {
// should down shift key to select multiple objects
await page.keyboard.down('Shift')
}
// Select second object
await clickSecondObject({ pixelDiff: 50 })
// Confirm the operation in the command bar
await cmdBar.progressCmdBar()
if (operationName === 'union' || operationName === 'intersect') {
await cmdBar.expectState({
stage: 'review',
headerArguments: {
Solids: '2 paths',
},
commandName,
})
} else if (operationName === 'subtract') {
await cmdBar.expectState({
stage: 'review',
headerArguments: {
Tool: '1 path',
Target: '1 path',
},
commandName,
})
}
await cmdBar.submit()
await editor.expectEditor.toContain(operation.code)
})
})
}
})

View File

@ -181,6 +181,14 @@ export class ToolbarFixture {
).toBeVisible()
await this.page.getByTestId('dropdown-center-rectangle').click()
}
selectBoolean = async (operation: 'union' | 'subtract' | 'intersect') => {
await this.page
.getByRole('button', { name: 'caret down Union: open menu' })
.click()
const operationTestId = `dropdown-boolean-${operation}`
await expect(this.page.getByTestId(operationTestId)).toBeVisible()
await this.page.getByTestId(operationTestId).click()
}
selectCircleThreePoint = async () => {
await this.page

View File

@ -258,14 +258,6 @@ export const isErrorWhitelisted = (exception: Error) => {
foundInSpec: 'e2e/playwright/testing-settings.spec.ts',
},
// TODO: fix this error in the code
{
name: 'TypeError',
message: "Cannot read properties of undefined (reading 'length')",
stack: '',
project: 'Google Chrome',
foundInSpec: '', // many tests are impacted by this error
},
// TODO: fix this error in the code
{
name: 'ReferenceError',
message: '_testUtils is not defined',
@ -273,7 +265,6 @@ export const isErrorWhitelisted = (exception: Error) => {
project: 'Google Chrome',
foundInSpec: 'e2e/playwright/snapshot-tests.spec.ts',
},
// TODO: fix this error in the code
{
name: 'TypeError',
message: 'Failed to fetch',
@ -282,14 +273,6 @@ export const isErrorWhitelisted = (exception: Error) => {
foundInSpec: 'e2e/playwright/snapshot-tests.spec.ts',
},
// TODO: fix this error in the code
{
name: 'ReferenceError',
message: 'originalCode is not defined',
stack: '',
project: 'Google Chrome',
foundInSpec: 'e2e/playwright/onboarding-tests.spec.ts',
},
// TODO: fix this error in the code
{
name: 'ReferenceError',
message: 'createNewVariableCheckbox is not defined',
@ -297,6 +280,14 @@ export const isErrorWhitelisted = (exception: Error) => {
project: 'Google Chrome',
foundInSpec: 'e2e/playwright/testing-constraints.spec.ts',
},
{
name: 'Error',
message: 'The "path" argument must be of type string. Received undefined',
stack:
'Error: The "path" argument must be of type string. Received undefined',
project: 'Google Chrome',
foundInSpec: '', // many tests are impacted by this error
},
]
const cleanString = (str: string) => str.replace(/[`"]/g, '')

View File

@ -230,9 +230,9 @@ test.describe('Onboarding tests', () => {
// Override beforeEach test setup
await context.addInitScript(
async ({ settingsKey, settings }) => {
async ({ settingsKey, settings, code }) => {
// Give some initial code, so we can test that it's cleared
localStorage.setItem('persistCode', originalCode)
localStorage.setItem('persistCode', code)
localStorage.setItem(settingsKey, settings)
},
{
@ -240,6 +240,7 @@ test.describe('Onboarding tests', () => {
settings: settingsToToml({
settings: TEST_SETTINGS_ONBOARDING_EXPORT,
}),
code: originalCode,
}
)

View File

@ -1097,7 +1097,6 @@ openSketch = startSketchOn(XY)
Mode: '',
AngleStart: '',
Revolutions: '',
Length: '',
Radius: '',
CounterClockWise: '',
},
@ -1194,14 +1193,14 @@ openSketch = startSketchOn(XY)
{
selectionType: 'segment',
testPoint: { x: 513, y: 221 },
expectedOutput: `helix001 = helix( axis = seg01, radius = 1, length = 100, revolutions = 20, angleStart = 0, ccw = false,)`,
expectedEditedOutput: `helix001 = helix( axis = seg01, radius = 1, length = 50, revolutions = 20, angleStart = 0, ccw = false,)`,
expectedOutput: `helix001 = helix( axis = seg01, radius = 1, revolutions = 20, angleStart = 0, ccw = false,)`,
expectedEditedOutput: `helix001 = helix( axis = seg01, radius = 5, revolutions = 20, angleStart = 0, ccw = false,)`,
},
{
selectionType: 'sweepEdge',
testPoint: { x: 564, y: 364 },
expectedOutput: `helix001 = helix( axis = getOppositeEdge(seg01), radius = 1, length = 100, revolutions = 20, angleStart = 0, ccw = false,)`,
expectedEditedOutput: `helix001 = helix( axis = getOppositeEdge(seg01), radius = 1, length = 50, revolutions = 20, angleStart = 0, ccw = false,)`,
expectedOutput: `helix001 = helix( axis = getOppositeEdge(seg01), radius = 1, revolutions = 20, angleStart = 0, ccw = false,)`,
expectedEditedOutput: `helix001 = helix( axis = getOppositeEdge(seg01), radius = 5, revolutions = 20, angleStart = 0, ccw = false,)`,
},
]
helixCases.map(
@ -1244,7 +1243,6 @@ openSketch = startSketchOn(XY)
AngleStart: '',
Mode: '',
CounterClockWise: '',
Length: '',
Radius: '',
Revolutions: '',
},
@ -1261,8 +1259,6 @@ openSketch = startSketchOn(XY)
await cmdBar.progressCmdBar()
await page.keyboard.insertText('1')
await cmdBar.progressCmdBar()
await page.keyboard.insertText('100')
await cmdBar.progressCmdBar()
await cmdBar.expectState({
stage: 'review',
headerArguments: {
@ -1271,7 +1267,6 @@ openSketch = startSketchOn(XY)
AngleStart: '0',
Revolutions: '20',
Radius: '1',
Length: '100',
CounterClockWise: '',
},
commandName: 'Helix',
@ -1292,8 +1287,8 @@ openSketch = startSketchOn(XY)
0
)
await operationButton.dblclick()
const initialInput = '100'
const newInput = '50'
const initialInput = '1'
const newInput = '5'
await cmdBar.expectState({
commandName: 'Helix',
stage: 'arguments',
@ -1302,13 +1297,14 @@ openSketch = startSketchOn(XY)
headerArguments: {
AngleStart: '0',
Revolutions: '20',
Radius: '1',
Length: initialInput,
Radius: initialInput,
CounterClockWise: '',
},
highlightedHeaderArg: 'CounterClockWise',
})
await page.keyboard.press('Shift+Backspace')
await page
.getByRole('button', { name: 'radius', exact: false })
.click()
await expect(cmdBar.currentArgumentInput).toBeVisible()
await cmdBar.currentArgumentInput
.locator('.cm-content')
@ -1319,8 +1315,7 @@ openSketch = startSketchOn(XY)
headerArguments: {
AngleStart: '0',
Revolutions: '20',
Radius: '1',
Length: newInput,
Radius: newInput,
CounterClockWise: '',
},
commandName: 'Helix',
@ -1391,7 +1386,6 @@ extrude001 = extrude(profile001, length = 100)
Mode: '',
AngleStart: '',
Revolutions: '',
Length: '',
Radius: '',
CounterClockWise: '',
},

View File

@ -76,11 +76,11 @@ part001 = startSketchOn(-XZ)
|> xLine(endAbsolute = totalLen, tag = $seg03)
|> yLine(length = -armThick, tag = $seg01)
|> angledLineThatIntersects({
angle = HALF_TURN,
angle = turns::HALF_TURN,
offset = -armThick,
intersectTag = seg04
}, %)
|> angledLineToY([segAng(seg04, %) + 180, ZERO], %)
|> angledLineToY([segAng(seg04, %) + 180, turns::ZERO], %)
|> angledLineToY({
angle = -bottomAng,
to = -totalHeightHalf - armThick,
@ -88,12 +88,12 @@ part001 = startSketchOn(-XZ)
|> xLine(length = endAbsolute = segEndX(seg03) + 0)
|> yLine(length = -segLen(seg01, %))
|> angledLineThatIntersects({
angle = HALF_TURN,
angle = turns::HALF_TURN,
offset = -armThick,
intersectTag = seg02
}, %)
|> angledLineToY([segAng(seg02, %) + 180, -baseHeight], %)
|> xLine(endAbsolute = ZERO)
|> xLine(endAbsolute = turns::ZERO)
|> close()
|> extrude(length = 4)`
)

View File

@ -486,13 +486,13 @@ test.describe('Testing constraints', { tag: ['@skipWin'] }, () => {
testName: 'Add variable, selecting axis',
addVariable: true,
axisSelect: true,
value: 'QUARTER_TURN - angle001',
value: 'turns::QUARTER_TURN - angle001',
},
{
testName: 'No variable, selecting axis',
addVariable: false,
axisSelect: true,
value: 'QUARTER_TURN - 7',
value: 'turns::QUARTER_TURN - 7',
},
] as const
for (const { testName, addVariable, value, axisSelect } of cases) {
@ -935,12 +935,12 @@ part002 = startSketchOn(XZ)
test.describe('Axis & segment - no modal constraints', () => {
const cases = [
{
codeAfter: `|> line(endAbsolute = [154.9, ZERO])`,
codeAfter: `|> line(endAbsolute = [154.9, turns::ZERO])`,
axisClick: { x: 950, y: 250 },
constraintName: 'Snap To X',
},
{
codeAfter: `|> line(endAbsolute = [ZERO, 61.34])`,
codeAfter: `|> line(endAbsolute = [turns::ZERO, 61.34])`,
axisClick: { x: 600, y: 150 },
constraintName: 'Snap To Y',
},

View File

@ -67,11 +67,11 @@ part001 = startSketchOn(-XZ)
|> xLine(endAbsolute = totalLen, tag = $seg03)
|> yLine(length = -armThick, tag = $seg01)
|> angledLineThatIntersects({
angle = HALF_TURN,
angle = turns::HALF_TURN,
offset = -armThick,
intersectTag = seg04
}, %)
|> angledLineToY([segAng(seg04) + 180, ZERO], %)
|> angledLineToY([segAng(seg04) + 180, turns::ZERO], %)
|> angledLineToY({
angle = -bottomAng,
to = -totalHeightHalf - armThick,
@ -79,12 +79,12 @@ part001 = startSketchOn(-XZ)
|> xLine(endAbsolute = segEndX(seg03) + 0)
|> yLine(length = -segLen(seg01))
|> angledLineThatIntersects({
angle = HALF_TURN,
angle = turns::HALF_TURN,
offset = -armThick,
intersectTag = seg02
}, %)
|> angledLineToY([segAng(seg02) + 180, -baseHeight], %)
|> xLine(endAbsolute = ZERO)
|> xLine(endAbsolute = turns::ZERO)
|> close()
|> extrude(length = 4)`
)

View File

@ -94,9 +94,11 @@
"fetch:wasm": "./scripts/get-latest-wasm-bundle.sh",
"fetch:wasm:windows": "./scripts/get-latest-wasm-bundle.ps1",
"fetch:samples": "rm -rf public/kcl-samples* && curl -L -o public/kcl-samples.zip https://github.com/KittyCAD/kcl-samples/archive/refs/heads/achalmers/kw-args-xylineto.zip && unzip -o public/kcl-samples.zip -d public && mv public/kcl-samples-* public/kcl-samples",
"build:wasm-dev": "yarn wasm-prep && (cd rust && wasm-pack build kcl-wasm-lib --dev --target web --out-dir pkg && cargo test -p kcl-lib export_bindings) && yarn isomorphic-copy-wasm && yarn fmt:generated",
"build:wasm": "./scripts/build-wasm.sh",
"build:wasm:windows": "./scripts/build-wasm.ps1",
"build:wasm-dev": "yarn build:wasm:dev",
"build:wasm:dev": "./scripts/build-wasm-dev.sh",
"build:wasm:dev:windows": "./scripts/build-wasm-dev.ps1",
"remove-importmeta": "sed -i 's/import.meta.url/window.location.origin/g' \"./rust/kcl-wasm-lib/pkg/kcl_wasm_lib.js\"; sed -i '' 's/import.meta.url/window.location.origin/g' \"./rust/kcl-wasm-lib/pkg/kcl_wasm_lib.js\" || echo \"sed for both mac and linux\"",
"lint-fix": "eslint --fix --ext .ts --ext .tsx src e2e packages/codemirror-lsp-client/src rust/kcl-language-server/client/src",
"lint": "eslint --max-warnings 0 --ext .ts --ext .tsx src e2e packages/codemirror-lsp-client/src rust/kcl-language-server/client/src",

View File

@ -90,7 +90,7 @@ export default class StreamDemuxer extends Queue<Uint8Array> {
}
add(bytes: Uint8Array): void {
const message = Codec.decode(bytes) as vsrpc.Message
const message = Codec.decode<vsrpc.Message>(bytes)
if (this.trace) {
Tracer.server(message)
}

View File

@ -12,7 +12,7 @@ import "car-tire.kcl" as carTire
import lugCount from "globals.kcl"
carRotor
|> translate(translate = [0, 0.5, 0])
|> translate(x = 0, y = 0.5, z = 0)
carWheel
lugNut
|> patternCircular3d(
@ -23,5 +23,5 @@ lugNut
rotateDuplicates = false,
)
brakeCaliper
|> translate(translate = [0, 0.5, 0])
|> translate(x = 0, y = 0.5, z = 0)
carTire

View File

@ -19,27 +19,27 @@ import pipe from "1120t74-pipe.kcl"
flange()
flange()
|> rotate(axis = [0, 1, 0], angle = 180)
|> translate(translate = [
0,
0,
flangeBackHeight * 2 + gasketThickness
])
|> translate(
x = 0,
y = 0,
z = flangeBackHeight * 2 + gasketThickness,
)
// place gasket between the flanges
gasket()
|> translate(translate = [
0,
0,
-flangeBackHeight - gasketThickness
])
|> translate(
x = 0,
y = 0,
z = -flangeBackHeight - gasketThickness
)
// place eight washers (four front, four back)
washer()
|> translate(translate = [
mountingHolePlacementDiameter / 2,
0,
flangeBaseThickness
])
|> translate(
x = mountingHolePlacementDiameter / 2,
y = 0,
z = flangeBaseThickness
)
|> patternCircular3d(
%,
instances = 4,
@ -57,11 +57,11 @@ washer()
// place four bolts
bolt()
|> translate(translate = [
mountingHolePlacementDiameter / 2,
0,
flangeBaseThickness + washerThickness
])
|> translate(
x = mountingHolePlacementDiameter / 2,
y = 0,
z = flangeBaseThickness + washerThickness,
)
|> rotate(roll = 90, pitch = 0, yaw = 0)
|> patternCircular3d(
%,
@ -74,11 +74,11 @@ bolt()
// place four hex nuts
hexNut()
|> translate(translate = [
mountingHolePlacementDiameter / 2,
0,
-(flangeBackHeight * 2 + gasketThickness + flangeBaseThickness + washerThickness + hexNutThickness)
])
|> translate(
x = mountingHolePlacementDiameter / 2,
y = 0,
z = -(flangeBackHeight * 2 + gasketThickness + flangeBaseThickness + washerThickness + hexNutThickness),
)
|> patternCircular3d(
%,
instances = 4,
@ -97,13 +97,11 @@ pipe()
yaw = 0,
)
|> translate(
%,
translate = [
0,
0,
flangeBaseThickness + flangeFrontHeight - 0.5
],
global = true,
%,
x = 0,
y = 0,
z = flangeBaseThickness + flangeFrontHeight - 0.5,
global = true,
)
pipe()
@ -114,11 +112,9 @@ pipe()
yaw = 0,
)
|> translate(
%,
translate = [
0,
0,
-(flangeBackHeight * 2 + gasketThickness + flangeBaseThickness + flangeFrontHeight - 0.5)
],
global = true,
%,
x = 0,
y = 0,
z = -(flangeBackHeight * 2 + gasketThickness + flangeBaseThickness + flangeFrontHeight - 0.5),
global = true,
)

View File

@ -14,7 +14,7 @@ radius = 10
depth = 30
distanceToInsideEdge = slateWidthHalf + templateThickness + templateGap
sketch001 = startSketchOn(XZ)
|> startProfileAt([ZERO, depth + templateGap], %)
|> startProfileAt([0, depth + templateGap], %)
|> xLine(length = slateWidthHalf - radius, tag = $seg01)
|> arc({
angleEnd = 0,
@ -28,7 +28,7 @@ sketch001 = startSketchOn(XZ)
|> yLine(length = templateThickness * 2, tag = $seg08)
|> xLine(endAbsolute = segEndX(seg02) + 0, tag = $seg05)
|> yLine(endAbsolute = segEndY(seg01) + templateThickness, tag = $seg10)
|> xLine(endAbsolute = ZERO, tag = $seg04)
|> xLine(endAbsolute = 0, tag = $seg04)
|> xLine(length = -segLen(seg04))
|> yLine(length = -segLen(seg10))
|> xLine(length = -segLen(seg05))

View File

@ -28,7 +28,7 @@ sketch001 = startSketchOn(XZ)
|> yLine(endAbsolute = -templateGap * 2 - (templateDiameter / 2), tag = $seg05)
|> xLine(endAbsolute = slateWidthHalf + templateThickness, tag = $seg04)
|> yLine(length = -length002, tag = $seg03)
|> xLine(endAbsolute = ZERO, tag = $seg02)
|> xLine(endAbsolute = 0, tag = $seg02)
// |> line(end = [7.78, 11.16])
|> xLine(length = -segLen(seg02))
|> yLine(length = segLen(seg03))

View File

@ -20,51 +20,36 @@ body()
// import the antenna
antenna()
|> translate(translate = [-width / 2 + .45, -0.10, height / 2])
|> translate(x = -width / 2 + .45, y = -0.10, z = height / 2)
// import the case
case()
|> translate(translate = [0, -1, 0])
|> translate(x = 0, y = -1, z = 0)
// import the talk button
talkButton()
|> translate(translate = [width / 2, -thickness / 2, .5])
|> translate(x = width / 2, y = -thickness / 2, z = .5)
// import the frequency knob
knob()
|> translate(translate = [
width / 2 - 0.70,
-thickness / 2,
height / 2
])
|> translate(
x = width / 2 - 0.70,
y = -thickness / 2,
z = height / 2
)
// import the buttons
button()
|> translate(translate = [
-(screenWidth / 2 + tolerance),
-1,
screenYPosition
])
button()
|> translate(translate = [
-(screenWidth / 2 + tolerance),
-1,
screenYPosition - buttonHeight - (tolerance * 2)
])
button()
|> rotate(
%,
roll = 0,
pitch = 180,
yaw = 0,
)
|> translate(
translate = [
screenWidth / 2 + tolerance,
-1,
screenYPosition - buttonHeight
],
global = true,
x = -(screenWidth / 2 + tolerance),
y = -1,
z = screenYPosition
)
button()
|> translate(
x = -(screenWidth / 2 + tolerance),
y = -1,
z = screenYPosition - buttonHeight - (tolerance * 2)
)
button()
|> rotate(
@ -74,10 +59,21 @@ button()
yaw = 0,
)
|> translate(
translate = [
screenWidth / 2 + tolerance,
-1,
screenYPosition - (buttonHeight * 2) - (tolerance * 2)
],
x = screenWidth / 2 + tolerance,
y = -1,
z = screenYPosition - buttonHeight,
global = true,
)
button()
|> rotate(
%,
roll = 0,
pitch = 180,
yaw = 0,
)
|> translate(
x = screenWidth / 2 + tolerance,
y = -1,
z = screenYPosition - (buttonHeight * 2) - (tolerance * 2),
global = true,
)

24
rust/Cargo.lock generated
View File

@ -1780,7 +1780,7 @@ dependencies = [
[[package]]
name = "kcl-bumper"
version = "0.1.55"
version = "0.1.56"
dependencies = [
"anyhow",
"clap",
@ -1791,7 +1791,7 @@ dependencies = [
[[package]]
name = "kcl-derive-docs"
version = "0.1.55"
version = "0.1.56"
dependencies = [
"Inflector",
"anyhow",
@ -1810,7 +1810,7 @@ dependencies = [
[[package]]
name = "kcl-directory-test-macro"
version = "0.1.55"
version = "0.1.56"
dependencies = [
"proc-macro2",
"quote",
@ -1819,7 +1819,7 @@ dependencies = [
[[package]]
name = "kcl-language-server"
version = "0.2.55"
version = "0.2.56"
dependencies = [
"anyhow",
"clap",
@ -1840,7 +1840,7 @@ dependencies = [
[[package]]
name = "kcl-language-server-release"
version = "0.1.55"
version = "0.1.56"
dependencies = [
"anyhow",
"clap",
@ -1860,7 +1860,7 @@ dependencies = [
[[package]]
name = "kcl-lib"
version = "0.2.55"
version = "0.2.56"
dependencies = [
"anyhow",
"approx 0.5.1",
@ -1928,7 +1928,7 @@ dependencies = [
[[package]]
name = "kcl-python-bindings"
version = "0.3.55"
version = "0.3.56"
dependencies = [
"anyhow",
"kcl-lib",
@ -1943,7 +1943,7 @@ dependencies = [
[[package]]
name = "kcl-test-server"
version = "0.1.55"
version = "0.1.56"
dependencies = [
"anyhow",
"hyper 0.14.32",
@ -1956,7 +1956,7 @@ dependencies = [
[[package]]
name = "kcl-to-core"
version = "0.1.55"
version = "0.1.56"
dependencies = [
"anyhow",
"async-trait",
@ -1970,7 +1970,7 @@ dependencies = [
[[package]]
name = "kcl-wasm-lib"
version = "0.1.55"
version = "0.1.56"
dependencies = [
"bson",
"console_error_panic_hook",
@ -1996,9 +1996,9 @@ dependencies = [
[[package]]
name = "kittycad"
version = "0.3.33"
version = "0.3.36"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4f6f65645cc07a8f43c34584e4979bf4da16c047cce50c4715fa9381227574d5"
checksum = "0a345fd2a4cb16205f32bd1aa41715045830c59d78c59927fca6580e2a651ac9"
dependencies = [
"anyhow",
"async-trait",

View File

@ -35,7 +35,7 @@ clap = { version = "4.5.31", features = ["derive"] }
dashmap = { version = "6.1.0" }
http = "1"
indexmap = "2.7.0"
kittycad = { version = "0.3.33", default-features = false, features = ["js", "requests"] }
kittycad = { version = "0.3.36", default-features = false, features = ["js", "requests"] }
kittycad-modeling-cmds = { version = "0.2.107", features = ["ts-rs", "websocket"] }
lazy_static = "1.5.0"
miette = "7.5.0"

View File

@ -43,6 +43,10 @@ overwrite-sim-test test_name:
EXPECTORATE=overwrite TWENTY_TWENTY=overwrite {{cita}} -p kcl-lib --no-quiet -- tests::{{test_name}}::kcl_test_execute
EXPECTORATE=overwrite {{cita}} -p kcl-lib --no-quiet -- simulation_tests::{{test_name}}::test_after_engine
# Regenerate all the simulation test output.
redo-sim-tests:
EXPECTORATE=overwrite TWENTY_TWENTY=overwrite {{cita}} -p kcl-lib --no-quiet -- simulation_tests
test:
export RUST_BRACKTRACE="full" && cargo nextest run --workspace --no-fail-fast

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2194,9 +2194,9 @@ supports-color@^8.1.1:
has-flag "^4.0.0"
tar-fs@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784"
integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==
version "2.1.2"
resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.2.tgz#425f154f3404cb16cb8ff6e671d45ab2ed9596c5"
integrity sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==
dependencies:
chownr "^1.1.1"
mkdirp-classic "^0.5.2"

View File

@ -1,7 +1,7 @@
[package]
name = "kcl-lib"
description = "KittyCAD Language implementation and tools"
version = "0.2.55"
version = "0.2.56"
edition = "2021"
license = "MIT"
repository = "https://github.com/KittyCAD/modeling-app"
@ -104,7 +104,7 @@ tower-lsp = { workspace = true, features = ["proposed", "default"] }
[features]
default = ["engine"]
cli = ["dep:clap"]
cli = ["dep:clap", "kittycad/clap"]
dhat-heap = ["dep:dhat"]
# For the lsp server, when run with stdout for rpc we want to disable println.
# This is used for editor extensions that use the lsp server.

View File

@ -1,6 +1,8 @@
//! Cache testing framework.
use kcl_lib::{bust_cache, ExecError, ExecOutcome};
use kcmc::{each_cmd as mcmd, ModelingCmd};
use kittycad_modeling_cmds as kcmc;
#[derive(Debug)]
struct Variation<'a> {
@ -253,3 +255,71 @@ extrude(sketch001, length = 4)
second.artifact_graph.len()
);
}
#[tokio::test(flavor = "multi_thread")]
async fn kcl_test_cache_empty_file_pop_cache_empty_file_planes_work() {
// Get the current working directory.
let code = "";
let ctx = kcl_lib::ExecutorContext::new_with_default_client(Default::default())
.await
.unwrap();
let program = kcl_lib::Program::parse_no_errs(code).unwrap();
let outcome = ctx.run_with_caching(program).await.unwrap();
// Ensure nothing is left in the batch
assert!(ctx.engine.batch().read().await.is_empty());
assert!(ctx.engine.batch_end().read().await.is_empty());
// Ensure the planes work, and we can show or hide them.
// Hide/show the grid.
let default_planes = ctx.engine.get_default_planes().read().await.clone().unwrap();
// Assure the outcome is the same.
assert_eq!(outcome.default_planes, Some(default_planes.clone()));
ctx.engine
.send_modeling_cmd(
uuid::Uuid::new_v4(),
Default::default(),
&ModelingCmd::from(mcmd::ObjectVisible {
hidden: false,
object_id: default_planes.xy,
}),
)
.await
.unwrap();
// Now simulate an engine pause/network disconnect.
// Raw dog clear the scene entirely.
ctx.engine
.send_modeling_cmd(
uuid::Uuid::new_v4(),
Default::default(),
&ModelingCmd::from(mcmd::SceneClearAll {}),
)
.await
.unwrap();
// Bust the cache and reset the scene.
let outcome = ctx.bust_cache_and_reset_scene().await.unwrap();
// Get the default planes.
let default_planes = ctx.engine.get_default_planes().read().await.clone().unwrap();
assert_eq!(outcome.default_planes, Some(default_planes.clone()));
// Ensure we can show a plane.
ctx.engine
.send_modeling_cmd(
uuid::Uuid::new_v4(),
Default::default(),
&ModelingCmd::from(mcmd::ObjectVisible {
hidden: false,
object_id: default_planes.xz,
}),
)
.await
.unwrap();
ctx.close().await;
}

View File

@ -0,0 +1,77 @@
@settings(defaultLengthUnit = mm)
sketch001 = startSketchOn(XZ)
profile001 = circle(sketch001, center = [154.36, 113.92], radius = 41.09)
extrude001 = extrude(profile001, length = 200)
sketch002 = startSketchOn(XY)
profile002 = startProfileAt([72.24, -52.05], sketch002)
|> angledLine([0, 181.26], %, $rectangleSegmentA001)
|> angledLine([
segAng(rectangleSegmentA001) - 90,
21.54
], %)
|> angledLine([
segAng(rectangleSegmentA001),
-segLen(rectangleSegmentA001)
], %, $mySeg)
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
extrude002 = extrude(profile002, length = 150)
|> chamfer(
%,
length = 15,
tags = [mySeg],
tag = $seg02,
)
sketch003 = startSketchOn(extrude002, mySeg)
profile003 = startProfileAt([207.36, 126.19], sketch003)
|> angledLine([0, 33.57], %, $rectangleSegmentA002)
|> angledLine([
segAng(rectangleSegmentA002) - 90,
99.11
], %)
|> angledLine([
segAng(rectangleSegmentA002),
-segLen(rectangleSegmentA002)
], %, $seg01)
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
extrude003 = extrude(profile003, length = -20)
sketch004 = startSketchOn(extrude003, seg01)
profile004 = startProfileAt([-235.38, 66.16], sketch004)
|> angledLine([0, 24.21], %, $rectangleSegmentA003)
|> angledLine([
segAng(rectangleSegmentA003) - 90,
3.72
], %)
|> angledLine([
segAng(rectangleSegmentA003),
-segLen(rectangleSegmentA003)
], %)
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
extrude004 = extrude(profile004, length = 30)
sketch005 = startSketchOn(extrude002, seg02)
profile005 = startProfileAt([-129.93, -59.19], sketch005)
|> xLine(length = 48.79)
|> line(end = [1.33, 11.03])
|> xLine(length = -60.56, tag = $seg03)
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
extrude005 = extrude(profile005, length = -10)
sketch006 = startSketchOn(extrude005, seg03)
profile006 = startProfileAt([-95.86, 38.73], sketch006)
|> angledLine([0, 3.48], %, $rectangleSegmentA004)
|> angledLine([
segAng(rectangleSegmentA004) - 90,
3.36
], %)
|> angledLine([
segAng(rectangleSegmentA004),
-segLen(rectangleSegmentA004)
], %)
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
extrude006 = extrude(profile006, length = 13)

View File

@ -53,7 +53,7 @@ pub trait CoreDump: Clone {
.meta()
.create_debug_uploads(vec![kittycad::types::multipart::Attachment {
name: "".to_string(),
filename: Some(format!(r#"modeling-app/coredump-{coredump_id}-screenshot.png"#)),
filepath: Some(format!(r#"modeling-app/coredump-{coredump_id}-screenshot.png"#).into()),
content_type: Some("image/png".to_string()),
data,
}])
@ -101,7 +101,7 @@ pub trait CoreDump: Clone {
.meta()
.create_debug_uploads(vec![kittycad::types::multipart::Attachment {
name: "".to_string(),
filename: Some(format!(r#"modeling-app/coredump-{}.json"#, coredump_id)),
filepath: Some(format!(r#"modeling-app/coredump-{}.json"#, coredump_id).into()),
content_type: Some("application/json".to_string()),
data,
}])

View File

@ -339,9 +339,9 @@ fn generate_index(combined: &IndexMap<String, Box<dyn StdLibFn>>, kcl_lib: &[Doc
}
functions.entry(d.mod_name()).or_default().push(match d {
DocData::Fn(f) => (f.name.clone(), d.file_name()),
DocData::Const(c) => (c.name.clone(), d.file_name()),
DocData::Ty(t) => (t.name.clone(), d.file_name()),
DocData::Fn(f) => (f.preferred_name.clone(), d.file_name()),
DocData::Const(c) => (c.preferred_name.clone(), d.file_name()),
DocData::Ty(t) => (t.preferred_name.clone(), d.file_name()),
});
if let DocData::Const(c) = d {

View File

@ -9,7 +9,7 @@ use tower_lsp::lsp_types::{
use crate::{
execution::annotations,
parsing::{
ast::types::{Annotation, Node, PrimitiveType, Type, VariableKind},
ast::types::{Annotation, ImportSelector, Node, PrimitiveType, Type, VariableKind},
token::NumericSuffix,
},
ModuleId,
@ -17,7 +17,7 @@ use crate::{
pub fn walk_prelude() -> Vec<DocData> {
let mut visitor = CollectionVisitor::default();
visitor.visit_module("prelude").unwrap();
visitor.visit_module("prelude", "").unwrap();
visitor.result
}
@ -29,7 +29,7 @@ struct CollectionVisitor {
}
impl CollectionVisitor {
fn visit_module(&mut self, name: &str) -> Result<(), String> {
fn visit_module(&mut self, name: &str, preferred_prefix: &str) -> Result<(), String> {
let old_name = std::mem::replace(&mut self.name, name.to_owned());
let source = crate::modules::read_std(name).unwrap();
let parsed = crate::parsing::parse_str(source, ModuleId::from_usize(self.id))
@ -40,14 +40,16 @@ impl CollectionVisitor {
for n in &parsed.body {
match n {
crate::parsing::ast::types::BodyItem::ImportStatement(import) if !import.visibility.is_default() => {
// Only supports glob imports for now.
assert!(matches!(
import.selector,
crate::parsing::ast::types::ImportSelector::Glob(..)
));
match &import.path {
crate::parsing::ast::types::ImportPath::Std { path } => {
self.visit_module(&path[1])?;
match import.selector {
ImportSelector::Glob(..) => self.visit_module(&path[1], "")?,
ImportSelector::None { .. } => {
self.visit_module(&path[1], &format!("{}::", import.module_name().unwrap()))?
}
// Only supports glob or whole-module imports for now.
_ => unimplemented!(),
}
}
p => return Err(format!("Unexpected import: `{p}`")),
}
@ -59,8 +61,8 @@ impl CollectionVisitor {
format!("std::{}::", self.name)
};
let mut dd = match var.kind {
VariableKind::Fn => DocData::Fn(FnData::from_ast(var, qual_name)),
VariableKind::Const => DocData::Const(ConstData::from_ast(var, qual_name)),
VariableKind::Fn => DocData::Fn(FnData::from_ast(var, qual_name, preferred_prefix)),
VariableKind::Const => DocData::Const(ConstData::from_ast(var, qual_name, preferred_prefix)),
};
dd.with_meta(&var.outer_attrs);
@ -77,7 +79,7 @@ impl CollectionVisitor {
} else {
format!("std::{}::", self.name)
};
let mut dd = DocData::Ty(TyData::from_ast(ty, qual_name));
let mut dd = DocData::Ty(TyData::from_ast(ty, qual_name, preferred_prefix));
dd.with_meta(&ty.outer_attrs);
for a in &ty.outer_attrs {
@ -200,6 +202,8 @@ impl DocData {
#[derive(Debug, Clone)]
pub struct ConstData {
pub name: String,
/// How the const is indexed, etc.
pub preferred_name: String,
/// The fully qualified name.
pub qual_name: String,
pub value: Option<String>,
@ -216,7 +220,11 @@ pub struct ConstData {
}
impl ConstData {
fn from_ast(var: &crate::parsing::ast::types::VariableDeclaration, mut qual_name: String) -> Self {
fn from_ast(
var: &crate::parsing::ast::types::VariableDeclaration,
mut qual_name: String,
preferred_prefix: &str,
) -> Self {
assert_eq!(var.kind, crate::parsing::ast::types::VariableKind::Const);
let (value, ty) = match &var.declaration.init {
@ -240,6 +248,7 @@ impl ConstData {
let name = var.declaration.id.name.clone();
qual_name.push_str(&name);
ConstData {
preferred_name: format!("{preferred_prefix}{name}"),
name,
qual_name,
value,
@ -272,7 +281,7 @@ impl ConstData {
detail.push_str(ty);
}
CompletionItem {
label: self.name.clone(),
label: self.preferred_name.clone(),
label_details: Some(CompletionItemLabelDetails {
detail: self.value.clone(),
description: None,
@ -306,6 +315,8 @@ impl ConstData {
pub struct FnData {
/// The name of the function.
pub name: String,
/// How the function is indexed, etc.
pub preferred_name: String,
/// The fully qualified name.
pub qual_name: String,
/// The args of the function.
@ -326,7 +337,11 @@ pub struct FnData {
}
impl FnData {
fn from_ast(var: &crate::parsing::ast::types::VariableDeclaration, mut qual_name: String) -> Self {
fn from_ast(
var: &crate::parsing::ast::types::VariableDeclaration,
mut qual_name: String,
preferred_prefix: &str,
) -> Self {
assert_eq!(var.kind, crate::parsing::ast::types::VariableKind::Fn);
let crate::parsing::ast::types::Expr::FunctionExpression(expr) = &var.declaration.init else {
unreachable!();
@ -345,6 +360,7 @@ impl FnData {
}
FnData {
preferred_name: format!("{preferred_prefix}{name}"),
name,
qual_name,
args: expr.params.iter().map(ArgData::from_ast).collect(),
@ -443,7 +459,7 @@ impl FnData {
}
// We end with ${} so you can jump to the end of the snippet.
// After the last argument.
format!("{}({})${{}}", self.name, args.join(", "))
format!("{}({})${{}}", self.preferred_name, args.join(", "))
}
fn to_signature_help(&self) -> SignatureHelp {
@ -452,7 +468,7 @@ impl FnData {
SignatureHelp {
signatures: vec![SignatureInformation {
label: self.name.clone(),
label: self.preferred_name.clone(),
documentation: self.short_docs().map(|s| {
Documentation::MarkupContent(MarkupContent {
kind: MarkupKind::Markdown,
@ -580,6 +596,8 @@ impl ArgKind {
pub struct TyData {
/// The name of the function.
pub name: String,
/// How the type is indexed, etc.
pub preferred_name: String,
/// The fully qualified name.
pub qual_name: String,
pub properties: Properties,
@ -597,7 +615,11 @@ pub struct TyData {
}
impl TyData {
fn from_ast(ty: &crate::parsing::ast::types::TypeDeclaration, mut qual_name: String) -> Self {
fn from_ast(
ty: &crate::parsing::ast::types::TypeDeclaration,
mut qual_name: String,
preferred_prefix: &str,
) -> Self {
let name = ty.name.name.clone();
qual_name.push_str(&name);
let mut referenced_types = HashSet::new();
@ -606,6 +628,7 @@ impl TyData {
}
TyData {
preferred_name: format!("{preferred_prefix}{name}"),
name,
qual_name,
properties: Properties {
@ -641,7 +664,7 @@ impl TyData {
fn to_completion_item(&self) -> CompletionItem {
CompletionItem {
label: self.name.clone(),
label: self.preferred_name.clone(),
label_details: self.alias.as_ref().map(|t| CompletionItemLabelDetails {
detail: Some(format!("type {} = {t}", self.name)),
description: None,
@ -658,7 +681,7 @@ impl TyData {
preselect: None,
sort_text: None,
filter_text: None,
insert_text: Some(self.name.clone()),
insert_text: Some(self.preferred_name.clone()),
insert_text_format: Some(InsertTextFormat::SNIPPET),
insert_text_mode: None,
text_edit: None,

View File

@ -1141,7 +1141,7 @@ mod tests {
let snippet = scale_fn.to_autocomplete_snippet().unwrap();
assert_eq!(
snippet,
r#"scale(${0:%}, scale = [${1:3.14}, ${2:3.14}, ${3:3.14}])${}"#
r#"scale(${0:%}, x = ${1:3.14}, y = ${2:3.14}, z = ${3:3.14})${}"#
);
}
@ -1152,7 +1152,7 @@ mod tests {
let snippet = translate_fn.to_autocomplete_snippet().unwrap();
assert_eq!(
snippet,
r#"translate(${0:%}, translate = [${1:3.14}, ${2:3.14}, ${3:3.14}])${}"#
r#"translate(${0:%}, x = ${1:3.14}, y = ${2:3.14}, z = ${3:3.14})${}"#
);
}

View File

@ -121,6 +121,13 @@ impl EngineConnection {
}
})?;
if value.is_null() || value.is_undefined() {
return Err(KclError::Engine(KclErrorDetails {
message: "Received null or undefined response from engine".into(),
source_ranges: vec![source_range],
}));
}
// Convert JsValue to a Uint8Array
let data = js_sys::Uint8Array::from(value);

View File

@ -6,7 +6,7 @@ use itertools::{EitherOrBoth, Itertools};
use tokio::sync::RwLock;
use crate::{
execution::{annotations, memory::Stack, EnvironmentRef, ExecState, ExecutorSettings},
execution::{annotations, memory::Stack, state::ModuleInfoMap, EnvironmentRef, ExecState, ExecutorSettings},
parsing::ast::types::{Annotation, Node, Program},
walk::Node as WalkNode,
};
@ -15,7 +15,7 @@ lazy_static::lazy_static! {
/// A static mutable lock for updating the last successful execution state for the cache.
static ref OLD_AST: Arc<RwLock<Option<OldAstState>>> = Default::default();
// The last successful run's memory. Not cleared after an unssuccessful run.
static ref PREV_MEMORY: Arc<RwLock<Option<Stack>>> = Default::default();
static ref PREV_MEMORY: Arc<RwLock<Option<(Stack, ModuleInfoMap)>>> = Default::default();
}
/// Read the old ast memory from the lock.
@ -29,12 +29,12 @@ pub(super) async fn write_old_ast(old_state: OldAstState) {
*old_ast = Some(old_state);
}
pub(crate) async fn read_old_memory() -> Option<Stack> {
pub(crate) async fn read_old_memory() -> Option<(Stack, ModuleInfoMap)> {
let old_mem = PREV_MEMORY.read().await;
old_mem.clone()
}
pub(super) async fn write_old_memory(mem: Stack) {
pub(super) async fn write_old_memory(mem: (Stack, ModuleInfoMap)) {
let mut old_mem = PREV_MEMORY.write().await;
*old_mem = Some(mem);
}

View File

@ -529,6 +529,18 @@ impl ExecutorContext {
.await
}
pub async fn bust_cache_and_reset_scene(&self) -> Result<ExecOutcome, KclErrorWithOutputs> {
cache::bust_cache().await;
// Execute an empty program to clear and reset the scene.
// We specifically want to be returned the objects after the scene is reset.
// Like the default planes so it is easier to just execute an empty program
// after the cache is busted.
let outcome = self.run_with_caching(crate::Program::empty()).await?;
Ok(outcome)
}
async fn prepare_mem(&self, exec_state: &mut ExecState) -> Result<(), KclErrorWithOutputs> {
self.eval_prelude(exec_state, SourceRange::synthetic())
.await
@ -547,7 +559,10 @@ impl ExecutorContext {
let mut exec_state = ExecState::new(self);
if use_prev_memory {
match cache::read_old_memory().await {
Some(mem) => *exec_state.mut_stack() = mem,
Some(mem) => {
*exec_state.mut_stack() = mem.0;
exec_state.global.module_infos = mem.1;
}
None => self.prepare_mem(&mut exec_state).await?,
}
} else {
@ -565,10 +580,11 @@ impl ExecutorContext {
// memory, not to the exec_state which is not cached for mock execution.
let mut mem = exec_state.stack().clone();
let module_infos = exec_state.global.module_infos.clone();
let outcome = exec_state.to_mock_wasm_outcome(result.0).await;
mem.squash_env(result.0);
cache::write_old_memory(mem).await;
cache::write_old_memory((mem, module_infos)).await;
Ok(outcome)
}
@ -758,7 +774,7 @@ impl ExecutorContext {
if !self.is_mock() {
let mut mem = exec_state.stack().deep_clone();
mem.restore_env(env_ref);
cache::write_old_memory(mem).await;
cache::write_old_memory((mem, exec_state.global.module_infos.clone())).await;
}
let session_data = self.engine.get_session_data().await;
Ok((env_ref, session_data))
@ -2044,6 +2060,8 @@ let w = f() + f()
// Ensure the settings are as expected.
assert_eq!(settings_state, ctx.settings);
ctx.close().await;
}
#[tokio::test(flavor = "multi_thread")]
@ -2057,6 +2075,9 @@ let w = f() + f()
let program2 = crate::Program::parse_no_errs("z = x + 1").unwrap();
let result = ctx2.run_mock(program2, true).await.unwrap();
assert_eq!(result.variables.get("z").unwrap().as_f64().unwrap(), 3.0);
ctx.close().await;
ctx2.close().await;
}
#[tokio::test(flavor = "multi_thread")]

View File

@ -30,6 +30,8 @@ pub struct ExecState {
pub(super) exec_context: Option<super::ExecutorContext>,
}
pub type ModuleInfoMap = IndexMap<ModuleId, ModuleInfo>;
#[derive(Debug, Clone)]
pub(super) struct GlobalState {
/// Map from source file absolute path to module ID.
@ -37,7 +39,7 @@ pub(super) struct GlobalState {
/// Map from module ID to source file.
pub id_to_source: IndexMap<ModuleId, ModuleSource>,
/// Map from module ID to module info.
pub module_infos: IndexMap<ModuleId, ModuleInfo>,
pub module_infos: ModuleInfoMap,
/// Output map of UUIDs to artifacts.
pub artifacts: IndexMap<ArtifactId, Artifact>,
/// Output commands to allow building the artifact graph by the caller.

View File

@ -97,7 +97,7 @@ pub use parsing::ast::{modify::modify_ast_for_sketch, types::FormatOptions};
pub use settings::types::{project::ProjectConfiguration, Configuration, UnitLength};
pub use source_range::SourceRange;
#[cfg(not(target_arch = "wasm32"))]
pub use unparser::recast_dir;
pub use unparser::{recast_dir, walk_dir};
// Rather than make executor public and make lots of it pub(crate), just re-export into a new module.
// Ideally we wouldn't export these things at all, they should only be used for testing.
@ -211,6 +211,14 @@ impl Program {
pub fn recast_with_options(&self, options: &FormatOptions) -> String {
self.ast.recast(options, 0)
}
/// Create an empty program.
pub fn empty() -> Self {
Self {
ast: parsing::ast::types::Node::no_src(parsing::ast::types::Program::default()),
original_file_contents: String::new(),
}
}
}
#[inline]

View File

@ -786,7 +786,7 @@ impl Backend {
vec![kittycad::types::multipart::Attachment {
// Clean the URI part.
name: "attachment".to_string(),
filename: Some("attachment.zip".to_string()),
filepath: Some("attachment.zip".into()),
content_type: Some("application/x-zip".to_string()),
data: self.create_zip().await?,
}],
@ -1635,7 +1635,7 @@ fn position_to_char_index(position: Position, code: &str) -> usize {
async fn with_cached_var<T>(name: &str, f: impl Fn(&KclValue) -> T) -> Option<T> {
let mem = cache::read_old_memory().await?;
let value = mem.get(name, SourceRange::default()).ok()?;
let value = mem.0.get(name, SourceRange::default()).ok()?;
Some(f(value))
}

View File

@ -1016,6 +1016,8 @@ startSketchOn(XY)
}
_ => unreachable!(),
}
server.executor_ctx().await.clone().unwrap().close().await;
}
#[tokio::test(flavor = "multi_thread")]
@ -2318,6 +2320,8 @@ async fn kcl_test_kcl_lsp_on_change_update_memory() {
}],
})
.await;
server.executor_ctx().await.clone().unwrap().close().await;
}
#[tokio::test(flavor = "multi_thread", worker_threads = 10)]
@ -2390,6 +2394,8 @@ part001 = cube([0,0], 20)
let units = server.executor_ctx().await.clone().unwrap().settings.units;
assert_eq!(units, crate::settings::types::UnitLength::M);
server.executor_ctx().await.clone().unwrap().close().await;
}
#[tokio::test(flavor = "multi_thread")]
@ -2506,6 +2512,8 @@ async fn kcl_test_kcl_lsp_diagnostics_on_execution_error() {
// Get the diagnostics.
assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 0);
server.executor_ctx().await.clone().unwrap().close().await;
}
#[tokio::test(flavor = "multi_thread")]
@ -2556,6 +2564,8 @@ async fn kcl_test_kcl_lsp_full_to_empty_file_updates_ast_and_memory() {
// Get the ast.
let ast = server.ast_map.get("file:///test.kcl").unwrap().clone();
assert_eq!(ast.ast, default_hashed);
server.executor_ctx().await.clone().unwrap().close().await;
}
#[tokio::test(flavor = "multi_thread")]
@ -2642,6 +2652,8 @@ async fn kcl_test_kcl_lsp_code_unchanged_but_has_diagnostics_reexecute() {
// Assure we have no diagnostics.
assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 0);
server.executor_ctx().await.clone().unwrap().close().await;
}
#[tokio::test(flavor = "multi_thread")]
@ -2717,6 +2729,8 @@ async fn kcl_test_kcl_lsp_code_and_ast_unchanged_but_has_diagnostics_reexecute()
// Assure we have no diagnostics.
assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 0);
server.executor_ctx().await.clone().unwrap().close().await;
}
#[tokio::test(flavor = "multi_thread")]
@ -2795,6 +2809,8 @@ async fn kcl_test_kcl_lsp_code_and_ast_units_unchanged_but_has_diagnostics_reexe
// Assure we have no diagnostics.
assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 0);
server.executor_ctx().await.clone().unwrap().close().await;
}
#[tokio::test(flavor = "multi_thread")]
@ -2852,6 +2868,8 @@ async fn kcl_test_kcl_lsp_code_and_ast_units_unchanged_but_has_memory_reexecute_
// Assure we have no diagnostics.
assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 0);
server.executor_ctx().await.clone().unwrap().close().await;
}
#[tokio::test(flavor = "multi_thread")]
@ -2975,6 +2993,8 @@ async fn kcl_test_kcl_lsp_cant_execute_set() {
// Assure we have no diagnostics.
assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 0);
server.executor_ctx().await.clone().unwrap().close().await;
}
#[tokio::test(flavor = "multi_thread")]
@ -3243,6 +3263,8 @@ part001 = startSketchOn(XY)
// Check the diagnostics.
assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 2);
server.executor_ctx().await.clone().unwrap().close().await;
}
#[tokio::test(flavor = "multi_thread")]
@ -3310,6 +3332,8 @@ NEW_LINT = 1"#
// Check the diagnostics.
assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 2);
server.executor_ctx().await.clone().unwrap().close().await;
}
#[tokio::test(flavor = "multi_thread")]
@ -3377,6 +3401,8 @@ NEW_LINT = 1"#
// Check the diagnostics.
assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 1);
server.executor_ctx().await.clone().unwrap().close().await;
}
#[tokio::test(flavor = "multi_thread")]
@ -3460,6 +3486,8 @@ NEW_LINT = 1"#
// Check the diagnostics.
assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 1);
server.executor_ctx().await.clone().unwrap().close().await;
}
#[tokio::test(flavor = "multi_thread")]
@ -3551,6 +3579,8 @@ part001 = startSketchOn(XY)
// Check the diagnostics.
assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 2);
server.executor_ctx().await.clone().unwrap().close().await;
}
#[tokio::test(flavor = "multi_thread")]
@ -3649,4 +3679,6 @@ async fn kcl_test_kcl_lsp_multi_file_error() {
} else {
panic!("Expected diagnostics");
}
server.executor_ctx().await.clone().unwrap().close().await;
}

View File

@ -88,6 +88,7 @@ pub(crate) fn read_std(mod_name: &str) -> Option<&'static str> {
"prelude" => Some(include_str!("../std/prelude.kcl")),
"math" => Some(include_str!("../std/math.kcl")),
"sketch" => Some(include_str!("../std/sketch.kcl")),
"turns" => Some(include_str!("../std/turns.kcl")),
_ => None,
}
}

View File

@ -133,6 +133,13 @@ impl<T> Node<T> {
})
}
fn reset_source(&mut self) {
self.start = 0;
self.end = 0;
self.module_id = ModuleId::default();
self.comment_start = 0;
}
pub fn as_source_range(&self) -> SourceRange {
SourceRange::new(self.start, self.end, self.module_id)
}
@ -345,7 +352,10 @@ impl Node<Program> {
let mut found = false;
for node in &mut new_program.inner_attrs {
if node.name() == Some(annotations::SETTINGS) {
*node = Node::no_src(Annotation::new_from_meta_settings(&settings));
node.inner = Annotation::new_from_meta_settings(&settings);
// Previous source range no longer makes sense, but we want to
// preserve other things like comments.
node.reset_source();
found = true;
break;
}
@ -1609,19 +1619,21 @@ impl ImportStatement {
return Some(alias.name.clone());
}
let mut parts = match &self.path {
ImportPath::Kcl { filename: s } | ImportPath::Foreign { path: s } => s.split('.'),
_ => return None,
};
let path = parts.next()?;
let _ext = parts.next()?;
let rest = parts.next();
match &self.path {
ImportPath::Kcl { filename: s } | ImportPath::Foreign { path: s } => {
let mut parts = s.split('.');
let path = parts.next()?;
let _ext = parts.next()?;
let rest = parts.next();
if rest.is_some() {
return None;
if rest.is_some() {
return None;
}
path.rsplit(&['/', '\\']).next().map(str::to_owned)
}
ImportPath::Std { path } => path.last().cloned(),
}
path.rsplit(&['/', '\\']).next().map(str::to_owned)
}
}
@ -4140,6 +4152,50 @@ startSketchOn(XY)
r#"@settings(defaultLengthUnit = mm)
startSketchOn(XY)
"#
);
}
#[tokio::test(flavor = "multi_thread")]
async fn test_change_meta_settings_preserves_comments() {
let code = r#"// Title
// Set Units
@settings(defaultLengthUnit = in)
// Between
// Above Code
5
"#;
let program = crate::parsing::top_level_parse(code).unwrap();
let new_program = program
.change_meta_settings(crate::execution::MetaSettings {
default_length_units: crate::execution::types::UnitLen::Cm,
..Default::default()
})
.unwrap();
let result = new_program.meta_settings().unwrap();
assert!(result.is_some());
let meta_settings = result.unwrap();
assert_eq!(meta_settings.default_length_units, crate::execution::types::UnitLen::Cm);
let formatted = new_program.recast(&Default::default(), 0);
assert_eq!(
formatted,
r#"// Title
// Set Units
@settings(defaultLengthUnit = cm)
// Between
// Above Code
5
"#
);
}

View File

@ -152,7 +152,12 @@ const STR_DEPRECATIONS: [(&str, &str); 6] = [
("-YZ", "-YZ"),
];
const FN_DEPRECATIONS: [(&str, &str); 3] = [("pi", "PI"), ("e", "E"), ("tau", "TAU")];
const CONST_DEPRECATIONS: [(&str, &str); 0] = [];
const CONST_DEPRECATIONS: [(&str, &str); 4] = [
("ZERO", "turns::ZERO"),
("QUARTER_TURN", "turns::QUARTER_TURN"),
("HALF_TURN", "turns::HALF_TURN"),
("THREE_QUARTER_TURN", "turns::THREE_QUARTER_TURN"),
];
#[derive(Clone, Copy)]
pub enum DeprecationKind {

View File

@ -1823,14 +1823,6 @@ fn import_stmt(i: &mut TokenSlice) -> PResult<BoxNode<ImportStatement>> {
)
.into(),
));
} else if matches!(path, ImportPath::Std { .. }) && matches!(selector, ImportSelector::None { .. }) {
return Err(ErrMode::Cut(
CompilationError::fatal(
SourceRange::new(start, end, module_id),
"the standard library cannot be imported as a part",
)
.into(),
));
}
Ok(Node::boxed(
@ -2341,21 +2333,6 @@ fn nameable_identifier(i: &mut TokenSlice) -> PResult<Node<Identifier>> {
));
}
if let Some(suggestion) = super::deprecation(&result.name, DeprecationKind::Const) {
ParseContext::warn(
CompilationError::err(
result.as_source_range(),
format!("Using `{}` is deprecated, prefer using `{}`.", result.name, suggestion),
)
.with_suggestion(
format!("Replace `{}` with `{}`", result.name, suggestion),
suggestion,
None,
Tag::Deprecated,
),
);
}
Ok(result)
}
@ -2374,8 +2351,7 @@ fn name(i: &mut TokenSlice) -> PResult<Node<Name>> {
let name = idents.pop().unwrap();
let end = name.end;
let module_id = name.module_id;
Ok(Node::new(
let result = Node::new(
Name {
name,
path: idents,
@ -2385,7 +2361,24 @@ fn name(i: &mut TokenSlice) -> PResult<Node<Name>> {
start,
end,
module_id,
))
);
if let Some(suggestion) = super::deprecation(&result.to_string(), DeprecationKind::Const) {
ParseContext::warn(
CompilationError::err(
result.as_source_range(),
format!("Using `{result}` is deprecated, prefer using `{suggestion}`."),
)
.with_suggestion(
format!("Replace `{result}` with `{suggestion}`"),
suggestion,
None,
Tag::Deprecated,
),
);
}
Ok(result)
}
impl TryFrom<Token> for Node<TagDeclarator> {

View File

@ -114,6 +114,8 @@ async fn unparse_test(test: &Test) {
let kcl_files = kcl_files.into_iter().filter(|f| f != &entry_point);
let futures = kcl_files
.into_iter()
.filter(|file| file.extension().is_some_and(|ext| ext == "kcl")) // We only care about kcl
// files here.
.map(|file| {
let snap_path = Path::new("..").join(&test.output_dir);
tokio::spawn(async move {
@ -2379,3 +2381,66 @@ mod rotate_after_fillet {
super::execute(TEST_NAME, true).await
}
}
mod union_cubes {
const TEST_NAME: &str = "union_cubes";
/// 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_cylinder_from_cube {
const TEST_NAME: &str = "subtract_cylinder_from_cube";
/// 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 intersect_cubes {
const TEST_NAME: &str = "intersect_cubes";
/// 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

@ -45,7 +45,7 @@ pub async fn union(exec_state: &mut ExecState, args: Args) -> Result<KclValue, K
/// ```
#[stdlib {
name = "union",
feature_tree_operation = false,
feature_tree_operation = true,
keywords = true,
unlabeled_first = true,
deprecated = true,
@ -107,7 +107,7 @@ pub async fn intersect(exec_state: &mut ExecState, args: Args) -> Result<KclValu
/// ```
#[stdlib {
name = "intersect",
feature_tree_operation = false,
feature_tree_operation = true,
keywords = true,
unlabeled_first = true,
deprecated = true,
@ -164,7 +164,7 @@ pub async fn subtract(exec_state: &mut ExecState, args: Args) -> Result<KclValue
/// ```
#[stdlib {
name = "subtract",
feature_tree_operation = false,
feature_tree_operation = true,
keywords = true,
unlabeled_first = true,
deprecated = true,

View File

@ -28,15 +28,22 @@ pub async fn scale(exec_state: &mut ExecState, args: Args) -> Result<KclValue, K
]),
exec_state,
)?;
let scale = args.get_kw_arg("scale")?;
let scale_x = args.get_kw_arg("x")?;
let scale_y = args.get_kw_arg("y")?;
let scale_z = args.get_kw_arg("z")?;
let global = args.get_kw_arg_opt("global")?;
let objects = inner_scale(objects, scale, global, exec_state, args).await?;
let objects = inner_scale(objects, scale_x, scale_y, scale_z, global, exec_state, args).await?;
Ok(objects.into())
}
/// Scale a solid or a sketch.
///
/// This is really useful for resizing parts. You can create a part and then scale it to the
/// correct size.
///
/// For sketches, you can use this to scale a sketch and then loft it with another sketch.
///
/// By default the transform is applied in local sketch axis, therefore the origin will not move.
///
/// If you want to apply the transform in global space, set `global` to `true`. The origin of the
@ -78,7 +85,9 @@ pub async fn scale(exec_state: &mut ExecState, args: Args) -> Result<KclValue, K
/// |> hole(pipeHole, %)
/// |> sweep(path = sweepPath)
/// |> scale(
/// scale = [1.0, 1.0, 2.5],
/// x = 1.0,
/// y = 1.0,
/// z = 2.5,
/// )
/// ```
///
@ -89,7 +98,9 @@ pub async fn scale(exec_state: &mut ExecState, args: Args) -> Result<KclValue, K
///
/// cube
/// |> scale(
/// scale = [1.0, 1.0, 2.5],
/// x = 1.0,
/// y = 1.0,
/// z = 2.5,
/// )
/// ```
///
@ -124,7 +135,7 @@ pub async fn scale(exec_state: &mut ExecState, args: Args) -> Result<KclValue, K
/// parts = sweep([rectangleSketch, circleSketch], path = sweepPath)
///
/// // Scale the sweep.
/// scale(parts, scale = [1.0, 1.0, 0.5])
/// scale(parts, x = 1.0, y = 1.0, z = 0.5)
/// ```
#[stdlib {
name = "scale",
@ -133,13 +144,17 @@ pub async fn scale(exec_state: &mut ExecState, args: Args) -> Result<KclValue, K
unlabeled_first = true,
args = {
objects = {docs = "The solid, sketch, or set of solids or sketches to scale."},
scale = {docs = "The scale factor for the x, y, and z axes."},
x = {docs = "The scale factor for the x axis."},
y = {docs = "The scale factor for the y axis."},
z = {docs = "The scale factor for the z axis."},
global = {docs = "If true, the transform is applied in global space. The origin of the model will move. By default, the transform is applied in local sketch axis, therefore the origin will not move."}
}
}]
async fn inner_scale(
objects: SolidOrSketchOrImportedGeometry,
scale: [f64; 3],
x: f64,
y: f64,
z: f64,
global: Option<bool>,
exec_state: &mut ExecState,
args: Args,
@ -159,11 +174,7 @@ async fn inner_scale(
object_id,
transforms: vec![shared::ComponentTransform {
scale: Some(shared::TransformBy::<Point3d<f64>> {
property: Point3d {
x: scale[0],
y: scale[1],
z: scale[2],
},
property: Point3d { x, y, z },
set: false,
is_local: !global.unwrap_or(false),
}),
@ -190,15 +201,23 @@ pub async fn translate(exec_state: &mut ExecState, args: Args) -> Result<KclValu
]),
exec_state,
)?;
let translate = args.get_kw_arg("translate")?;
let translate_x = args.get_kw_arg("x")?;
let translate_y = args.get_kw_arg("y")?;
let translate_z = args.get_kw_arg("z")?;
let global = args.get_kw_arg_opt("global")?;
let objects = inner_translate(objects, translate, global, exec_state, args).await?;
let objects = inner_translate(objects, translate_x, translate_y, translate_z, global, exec_state, args).await?;
Ok(objects.into())
}
/// Move a solid or a sketch.
///
/// This is really useful for assembling parts together. You can create a part
/// and then move it to the correct location.
///
/// Translate is really useful for sketches if you want to move a sketch
/// and then rotate it using the `rotate` function to create a loft.
///
/// ```no_run
/// // Move a pipe.
///
@ -232,7 +251,9 @@ pub async fn translate(exec_state: &mut ExecState, args: Args) -> Result<KclValu
/// |> hole(pipeHole, %)
/// |> sweep(path = sweepPath)
/// |> translate(
/// translate = [1.0, 1.0, 2.5],
/// x = 1.0,
/// y = 1.0,
/// z = 2.5,
/// )
/// ```
///
@ -243,7 +264,9 @@ pub async fn translate(exec_state: &mut ExecState, args: Args) -> Result<KclValu
///
/// cube
/// |> translate(
/// translate = [1.0, 1.0, 2.5],
/// x = 1.0,
/// y = 1.0,
/// z = 2.5,
/// )
/// ```
///
@ -278,7 +301,7 @@ pub async fn translate(exec_state: &mut ExecState, args: Args) -> Result<KclValu
/// parts = sweep([rectangleSketch, circleSketch], path = sweepPath)
///
/// // Move the sweeps.
/// translate(parts, translate = [1.0, 1.0, 2.5])
/// translate(parts, x = 1.0, y = 1.0, z = 2.5)
/// ```
///
/// ```no_run
@ -301,7 +324,9 @@ pub async fn translate(exec_state: &mut ExecState, args: Args) -> Result<KclValu
///
/// square(10)
/// |> translate(
/// translate = [5, 5, 0],
/// x = 5,
/// y = 5,
/// z = 0,
/// )
/// |> extrude(
/// length = 10,
@ -324,7 +349,7 @@ pub async fn translate(exec_state: &mut ExecState, args: Args) -> Result<KclValu
/// profile001 = square()
///
/// profile002 = square()
/// |> translate(translate = [0, 0, 20])
/// |> translate(x = 0, y = 0, z = 20)
/// |> rotate(axis = [0, 0, 1.0], angle = 45)
///
/// loft([profile001, profile002])
@ -336,13 +361,17 @@ pub async fn translate(exec_state: &mut ExecState, args: Args) -> Result<KclValu
unlabeled_first = true,
args = {
objects = {docs = "The solid, sketch, or set of solids or sketches to move."},
translate = {docs = "The amount to move the solid or sketch in all three axes."},
x = {docs = "The amount to move the solid or sketch along the x axis."},
y = {docs = "The amount to move the solid or sketch along the y axis."},
z = {docs = "The amount to move the solid or sketch along the z axis."},
global = {docs = "If true, the transform is applied in global space. The origin of the model will move. By default, the transform is applied in local sketch axis, therefore the origin will not move."}
}
}]
async fn inner_translate(
objects: SolidOrSketchOrImportedGeometry,
translate: [f64; 3],
x: f64,
y: f64,
z: f64,
global: Option<bool>,
exec_state: &mut ExecState,
args: Args,
@ -363,9 +392,9 @@ async fn inner_translate(
transforms: vec![shared::ComponentTransform {
translate: Some(shared::TransformBy::<Point3d<LengthUnit>> {
property: shared::Point3d {
x: LengthUnit(translate[0]),
y: LengthUnit(translate[1]),
z: LengthUnit(translate[2]),
x: LengthUnit(x),
y: LengthUnit(y),
z: LengthUnit(z),
},
set: false,
is_local: !global.unwrap_or(false),
@ -506,6 +535,11 @@ pub async fn rotate(exec_state: &mut ExecState, args: Args) -> Result<KclValue,
/// Rotate a solid or a sketch.
///
/// This is really useful for assembling parts together. You can create a part
/// and then rotate it to the correct orientation.
///
/// For sketches, you can use this to rotate a sketch and then loft it with another sketch.
///
/// ### Using Roll, Pitch, and Yaw
///
/// When rotating a part in 3D space, "roll," "pitch," and "yaw" refer to the
@ -667,7 +701,7 @@ pub async fn rotate(exec_state: &mut ExecState, args: Args) -> Result<KclValue,
/// profile001 = square()
///
/// profile002 = square()
/// |> translate(translate = [0, 0, 20])
/// |> translate(x = 0, y = 0, z = 20)
/// |> rotate(axis = [0, 0, 1.0], angle = 45)
///
/// loft([profile001, profile002])

View File

@ -1,5 +1,8 @@
use std::fmt::Write;
#[cfg(feature = "cli")]
use clap::ValueEnum;
use crate::parsing::{
ast::types::{
Annotation, ArrayExpression, ArrayRangeExpression, BinaryExpression, BinaryOperator, BinaryPart, BodyItem,
@ -864,10 +867,33 @@ impl Parameter {
}
}
/// Collect all the kcl files in a directory, recursively.
lazy_static::lazy_static! {
pub static ref IMPORT_FILE_EXTENSIONS: Vec<String> = {
let mut import_file_extensions = vec!["stp".to_string(), "glb".to_string(), "fbxb".to_string()];
#[cfg(feature = "cli")]
let named_extensions = kittycad::types::FileImportFormat::value_variants()
.iter()
.map(|x| format!("{}", x))
.collect::<Vec<String>>();
#[cfg(not(feature = "cli"))]
let named_extensions = vec![]; // We don't really need this outside of the CLI.
// Add all the default import formats.
import_file_extensions.extend_from_slice(&named_extensions);
import_file_extensions
};
pub static ref RELEVANT_EXTENSIONS: Vec<String> = {
let mut relevant_extensions = IMPORT_FILE_EXTENSIONS.clone();
relevant_extensions.push("kcl".to_string());
relevant_extensions
};
}
/// Collect all the kcl (and other relevant) files in a directory, recursively.
#[cfg(not(target_arch = "wasm32"))]
#[async_recursion::async_recursion]
pub(crate) async fn walk_dir(dir: &std::path::PathBuf) -> Result<Vec<std::path::PathBuf>, anyhow::Error> {
pub async fn walk_dir(dir: &std::path::PathBuf) -> Result<Vec<std::path::PathBuf>, anyhow::Error> {
// Make sure we actually have a directory.
if !dir.is_dir() {
anyhow::bail!("`{}` is not a directory", dir.display());
@ -881,7 +907,10 @@ pub(crate) async fn walk_dir(dir: &std::path::PathBuf) -> Result<Vec<std::path::
if path.is_dir() {
files.extend(walk_dir(&path).await?);
} else if path.extension().is_some_and(|ext| ext == "kcl") {
} else if path
.extension()
.is_some_and(|ext| RELEVANT_EXTENSIONS.contains(&ext.to_string_lossy().to_string()))
{
files.push(path);
}
}
@ -901,6 +930,8 @@ pub async fn recast_dir(dir: &std::path::Path, options: &crate::FormatOptions) -
let futures = files
.into_iter()
.filter(|file| file.extension().is_some_and(|ext| ext == "kcl")) // We only care about kcl
// files here.
.map(|file| {
let options = options.clone();
tokio::spawn(async move {

View File

@ -5,6 +5,7 @@
export import * from "std::math"
export import * from "std::sketch"
export import "std::turns"
/// A number
///
@ -245,11 +246,6 @@ export type Point2d = [number; 2]
/// with type `Point3d`, use an array, e.g., `[0, 0, 0]` or `[5.0, 3.14, 6.8]`.
export type Point3d = [number; 3]
export ZERO = 0
export QUARTER_TURN = 90deg
export HALF_TURN = 180deg
export THREE_QUARTER_TURN = 270deg
export XY = {
origin = { x = 0, y = 0, z = 0 },
xAxis = { x = 1, y = 0, z = 0 },

View File

@ -0,0 +1,6 @@
@no_std
export ZERO = 0
export QUARTER_TURN = 90deg
export HALF_TURN = 180deg
export THREE_QUARTER_TURN = 270deg

View File

@ -1,25 +1,25 @@
```mermaid
flowchart LR
subgraph path2 [Path]
2["Path<br>[76, 113, 4]"]
3["Segment<br>[119, 136, 4]"]
4["Segment<br>[142, 160, 4]"]
5["Segment<br>[166, 184, 4]"]
6["Segment<br>[190, 246, 4]"]
7["Segment<br>[252, 259, 4]"]
2["Path<br>[76, 113, 5]"]
3["Segment<br>[119, 136, 5]"]
4["Segment<br>[142, 160, 5]"]
5["Segment<br>[166, 184, 5]"]
6["Segment<br>[190, 246, 5]"]
7["Segment<br>[252, 259, 5]"]
8[Solid2d]
end
subgraph path25 [Path]
25["Path<br>[76, 111, 5]"]
26["Segment<br>[117, 134, 5]"]
27["Segment<br>[140, 158, 5]"]
28["Segment<br>[164, 182, 5]"]
29["Segment<br>[188, 244, 5]"]
30["Segment<br>[250, 257, 5]"]
25["Path<br>[76, 111, 6]"]
26["Segment<br>[117, 134, 6]"]
27["Segment<br>[140, 158, 6]"]
28["Segment<br>[164, 182, 6]"]
29["Segment<br>[188, 244, 6]"]
30["Segment<br>[250, 257, 6]"]
31[Solid2d]
end
1["Plane<br>[47, 66, 4]"]
9["Sweep Extrusion<br>[265, 287, 4]"]
1["Plane<br>[47, 66, 5]"]
9["Sweep Extrusion<br>[265, 287, 5]"]
10[Wall]
11[Wall]
12[Wall]
@ -34,8 +34,8 @@ flowchart LR
21["SweepEdge Adjacent"]
22["SweepEdge Opposite"]
23["SweepEdge Adjacent"]
24["Plane<br>[47, 66, 5]"]
32["Sweep Extrusion<br>[263, 285, 5]"]
24["Plane<br>[47, 66, 6]"]
32["Sweep Extrusion<br>[263, 285, 6]"]
33[Wall]
34[Wall]
35[Wall]

View File

@ -5,10 +5,10 @@ description: Variables in memory after executing assembly_mixed_units_cubes.kcl
{
"cubeIn": {
"type": "Module",
"value": 4
"value": 5
},
"cubeMm": {
"type": "Module",
"value": 5
"value": 6
}
}

View File

@ -1,17 +1,17 @@
```mermaid
flowchart LR
subgraph path2 [Path]
2["Path<br>[197, 232, 4]"]
3["Segment<br>[197, 232, 4]"]
2["Path<br>[197, 232, 5]"]
3["Segment<br>[197, 232, 5]"]
4[Solid2d]
end
subgraph path6 [Path]
6["Path<br>[113, 148, 5]"]
7["Segment<br>[113, 148, 5]"]
6["Path<br>[113, 148, 6]"]
7["Segment<br>[113, 148, 6]"]
8[Solid2d]
end
1["Plane<br>[172, 191, 4]"]
5["Plane<br>[88, 107, 5]"]
1["Plane<br>[172, 191, 5]"]
5["Plane<br>[88, 107, 6]"]
1 --- 2
2 --- 3
2 --- 4

View File

@ -5,10 +5,10 @@ description: Variables in memory after executing assembly_non_default_units.kcl
{
"other1": {
"type": "Module",
"value": 4
"value": 5
},
"other2": {
"type": "Module",
"value": 5
"value": 6
}
}

View File

@ -5,7 +5,7 @@ description: Variables in memory after executing import_foreign.kcl
{
"cube": {
"type": "Module",
"value": 4
"value": 5
},
"model": {
"type": "ImportedGeometry",

View File

@ -151,54 +151,65 @@ description: Result of parsing import_transform.kcl
"label": {
"commentStart": 159,
"end": 0,
"name": "translate",
"name": "x",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 171,
"elements": [
{
"commentStart": 172,
"end": 0,
"raw": "3.14",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 3.14,
"suffix": "None"
}
},
{
"commentStart": 178,
"end": 0,
"raw": "3.14",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 3.14,
"suffix": "None"
}
},
{
"commentStart": 184,
"end": 0,
"raw": "3.14",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 3.14,
"suffix": "None"
}
}
],
"commentStart": 163,
"end": 0,
"raw": "3.14",
"start": 0,
"type": "ArrayExpression",
"type": "ArrayExpression"
"type": "Literal",
"type": "Literal",
"value": {
"value": 3.14,
"suffix": "None"
}
}
},
{
"type": "LabeledArg",
"label": {
"commentStart": 169,
"end": 0,
"name": "y",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 173,
"end": 0,
"raw": "3.14",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 3.14,
"suffix": "None"
}
}
},
{
"type": "LabeledArg",
"label": {
"commentStart": 179,
"end": 0,
"name": "z",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 183,
"end": 0,
"raw": "3.14",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 3.14,
"suffix": "None"
}
}
}
],
@ -235,65 +246,76 @@ description: Result of parsing import_transform.kcl
{
"type": "LabeledArg",
"label": {
"commentStart": 205,
"commentStart": 203,
"end": 0,
"name": "scale",
"name": "x",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 213,
"elements": [
{
"commentStart": 214,
"end": 0,
"raw": "3.14",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 3.14,
"suffix": "None"
}
},
{
"commentStart": 220,
"end": 0,
"raw": "3.14",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 3.14,
"suffix": "None"
}
},
{
"commentStart": 226,
"end": 0,
"raw": "3.14",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 3.14,
"suffix": "None"
}
}
],
"commentStart": 207,
"end": 0,
"raw": "3.14",
"start": 0,
"type": "ArrayExpression",
"type": "ArrayExpression"
"type": "Literal",
"type": "Literal",
"value": {
"value": 3.14,
"suffix": "None"
}
}
},
{
"type": "LabeledArg",
"label": {
"commentStart": 213,
"end": 0,
"name": "y",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 217,
"end": 0,
"raw": "3.14",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 3.14,
"suffix": "None"
}
}
},
{
"type": "LabeledArg",
"label": {
"commentStart": 223,
"end": 0,
"name": "z",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 227,
"end": 0,
"raw": "3.14",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 3.14,
"suffix": "None"
}
}
}
],
"callee": {
"abs_path": false,
"commentStart": 196,
"commentStart": 194,
"end": 0,
"name": {
"commentStart": 196,
"commentStart": 194,
"end": 0,
"name": "scale",
"start": 0,
@ -303,13 +325,13 @@ description: Result of parsing import_transform.kcl
"start": 0,
"type": "Name"
},
"commentStart": 196,
"commentStart": 194,
"end": 0,
"start": 0,
"type": "CallExpressionKw",
"type": "CallExpressionKw",
"unlabeled": {
"commentStart": 202,
"commentStart": 200,
"end": 0,
"start": 0,
"type": "PipeSubstitution",

View File

@ -7,5 +7,5 @@ screw
pitch = 3.14,
yaw = 3.14,
)
|> translate(%, translate = [3.14, 3.14, 3.14])
|> scale(%, scale = [3.14, 3.14, 3.14])
|> translate(%, x = 3.14, y = 3.14, z = 3.14)
|> scale(%, x = 3.14, y = 3.14, z = 3.14)

View File

@ -5,6 +5,6 @@ description: Variables in memory after executing import_transform.kcl
{
"screw": {
"type": "Module",
"value": 4
"value": 5
}
}

View File

@ -11,5 +11,15 @@ screw
pitch = 3.14,
yaw = 3.14,
)
|> translate(%, translate = [3.14, 3.14, 3.14])
|> scale(%, scale = [3.14, 3.14, 3.14])
|> translate(
%,
x = 3.14,
y = 3.14,
z = 3.14,
)
|> scale(
%,
x = 3.14,
y = 3.14,
z = 3.14,
)

View File

@ -1,12 +1,12 @@
```mermaid
flowchart LR
subgraph path2 [Path]
2["Path<br>[83, 119, 4]"]
3["Segment<br>[83, 119, 4]"]
2["Path<br>[83, 119, 5]"]
3["Segment<br>[83, 119, 5]"]
4[Solid2d]
end
1["Plane<br>[60, 77, 4]"]
5["Sweep Extrusion<br>[125, 145, 4]"]
1["Plane<br>[60, 77, 5]"]
5["Sweep Extrusion<br>[125, 145, 5]"]
6[Wall]
7["Cap Start"]
8["Cap End"]

View File

@ -111,6 +111,6 @@ description: Variables in memory after executing import_whole.kcl
},
"foo": {
"type": "Module",
"value": 4
"value": 5
}
}

View File

@ -0,0 +1,554 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Artifact commands intersect_cubes.kcl
---
[
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "edge_lines_visible",
"hidden": false
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "set_scene_units",
"unit": "mm"
}
},
{
"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": "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": "start_path"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "move_path_pen",
"path": "[uuid]",
"to": {
"x": -10.0,
"y": -10.0,
"z": 0.0
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "sketch_mode_disable"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "extend_path",
"path": "[uuid]",
"segment": {
"type": "line",
"end": {
"x": 10.0,
"y": -10.0,
"z": 0.0
},
"relative": false
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "extend_path",
"path": "[uuid]",
"segment": {
"type": "line",
"end": {
"x": 10.0,
"y": 10.0,
"z": 0.0
},
"relative": false
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "extend_path",
"path": "[uuid]",
"segment": {
"type": "line",
"end": {
"x": -10.0,
"y": 10.0,
"z": 0.0
},
"relative": false
}
}
},
{
"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": "extrude",
"target": "[uuid]",
"distance": 10.0,
"faces": null
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "sketch_mode_disable"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "object_bring_to_front",
"object_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_extrusion_face_info",
"object_id": "[uuid]",
"edge_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_opposite_edge",
"object_id": "[uuid]",
"edge_id": "[uuid]",
"face_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_next_adjacent_edge",
"object_id": "[uuid]",
"edge_id": "[uuid]",
"face_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_opposite_edge",
"object_id": "[uuid]",
"edge_id": "[uuid]",
"face_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_next_adjacent_edge",
"object_id": "[uuid]",
"edge_id": "[uuid]",
"face_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_opposite_edge",
"object_id": "[uuid]",
"edge_id": "[uuid]",
"face_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_next_adjacent_edge",
"object_id": "[uuid]",
"edge_id": "[uuid]",
"face_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_opposite_edge",
"object_id": "[uuid]",
"edge_id": "[uuid]",
"face_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_next_adjacent_edge",
"object_id": "[uuid]",
"edge_id": "[uuid]",
"face_id": "[uuid]"
}
},
{
"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": "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": "start_path"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "move_path_pen",
"path": "[uuid]",
"to": {
"x": -2.0,
"y": -2.0,
"z": 0.0
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "sketch_mode_disable"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "extend_path",
"path": "[uuid]",
"segment": {
"type": "line",
"end": {
"x": 18.0,
"y": -2.0,
"z": 0.0
},
"relative": false
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "extend_path",
"path": "[uuid]",
"segment": {
"type": "line",
"end": {
"x": 18.0,
"y": 18.0,
"z": 0.0
},
"relative": false
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "extend_path",
"path": "[uuid]",
"segment": {
"type": "line",
"end": {
"x": -2.0,
"y": 18.0,
"z": 0.0
},
"relative": false
}
}
},
{
"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": "extrude",
"target": "[uuid]",
"distance": 10.0,
"faces": null
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "sketch_mode_disable"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "object_bring_to_front",
"object_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_extrusion_face_info",
"object_id": "[uuid]",
"edge_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_opposite_edge",
"object_id": "[uuid]",
"edge_id": "[uuid]",
"face_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_next_adjacent_edge",
"object_id": "[uuid]",
"edge_id": "[uuid]",
"face_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_opposite_edge",
"object_id": "[uuid]",
"edge_id": "[uuid]",
"face_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_next_adjacent_edge",
"object_id": "[uuid]",
"edge_id": "[uuid]",
"face_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_opposite_edge",
"object_id": "[uuid]",
"edge_id": "[uuid]",
"face_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_next_adjacent_edge",
"object_id": "[uuid]",
"edge_id": "[uuid]",
"face_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_opposite_edge",
"object_id": "[uuid]",
"edge_id": "[uuid]",
"face_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_next_adjacent_edge",
"object_id": "[uuid]",
"edge_id": "[uuid]",
"face_id": "[uuid]"
}
}
]

View File

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

View File

@ -0,0 +1,117 @@
```mermaid
flowchart LR
subgraph path2 [Path]
2["Path<br>[52, 103, 0]"]
3["Segment<br>[111, 163, 0]"]
4["Segment<br>[171, 223, 0]"]
5["Segment<br>[231, 283, 0]"]
6["Segment<br>[291, 298, 0]"]
7[Solid2d]
end
subgraph path24 [Path]
24["Path<br>[52, 103, 0]"]
25["Segment<br>[111, 163, 0]"]
26["Segment<br>[171, 223, 0]"]
27["Segment<br>[231, 283, 0]"]
28["Segment<br>[291, 298, 0]"]
29[Solid2d]
end
1["Plane<br>[27, 44, 0]"]
8["Sweep Extrusion<br>[306, 326, 0]"]
9[Wall]
10[Wall]
11[Wall]
12[Wall]
13["Cap Start"]
14["Cap End"]
15["SweepEdge Opposite"]
16["SweepEdge Adjacent"]
17["SweepEdge Opposite"]
18["SweepEdge Adjacent"]
19["SweepEdge Opposite"]
20["SweepEdge Adjacent"]
21["SweepEdge Opposite"]
22["SweepEdge Adjacent"]
23["Plane<br>[27, 44, 0]"]
30["Sweep Extrusion<br>[306, 326, 0]"]
31[Wall]
32[Wall]
33[Wall]
34[Wall]
35["Cap Start"]
36["Cap End"]
37["SweepEdge Opposite"]
38["SweepEdge Adjacent"]
39["SweepEdge Opposite"]
40["SweepEdge Adjacent"]
41["SweepEdge Opposite"]
42["SweepEdge Adjacent"]
43["SweepEdge Opposite"]
44["SweepEdge Adjacent"]
1 --- 2
2 --- 3
2 --- 4
2 --- 5
2 --- 6
2 ---- 8
2 --- 7
3 --- 9
3 --- 15
3 --- 16
4 --- 10
4 --- 17
4 --- 18
5 --- 11
5 --- 19
5 --- 20
6 --- 12
6 --- 21
6 --- 22
8 --- 9
8 --- 10
8 --- 11
8 --- 12
8 --- 13
8 --- 14
8 --- 15
8 --- 16
8 --- 17
8 --- 18
8 --- 19
8 --- 20
8 --- 21
8 --- 22
23 --- 24
24 --- 25
24 --- 26
24 --- 27
24 --- 28
24 ---- 30
24 --- 29
25 --- 31
25 --- 37
25 --- 38
26 --- 32
26 --- 39
26 --- 40
27 --- 33
27 --- 41
27 --- 42
28 --- 34
28 --- 43
28 --- 44
30 --- 31
30 --- 32
30 --- 33
30 --- 34
30 --- 35
30 --- 36
30 --- 37
30 --- 38
30 --- 39
30 --- 40
30 --- 41
30 --- 42
30 --- 43
30 --- 44
```

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,14 @@
fn cube(center) {
return startSketchOn(XY)
|> startProfileAt([center[0] - 10, center[1] - 10], %)
|> line(endAbsolute = [center[0] + 10, center[1] - 10])
|> line(endAbsolute = [center[0] + 10, center[1] + 10])
|> line(endAbsolute = [center[0] - 10, center[1] + 10])
|> close()
|> extrude(length = 10)
}
part001 = cube([0, 0])
part002 = cube([8, 8])
fullPart = intersect([part001, part002])

View File

@ -0,0 +1,158 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Operations executed intersect_cubes.kcl
---
[
{
"type": "UserDefinedFunctionCall",
"name": "cube",
"functionSourceRange": [
7,
328,
0
],
"unlabeledArg": null,
"labeledArgs": {},
"sourceRange": []
},
{
"labeledArgs": {
"data": {
"value": {
"type": "Plane",
"artifact_id": "[uuid]"
},
"sourceRange": []
}
},
"name": "startSketchOn",
"sourceRange": [],
"type": "StdLibCall",
"unlabeledArg": null
},
{
"labeledArgs": {
"length": {
"value": {
"type": "Number",
"value": 10.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
"sourceRange": []
}
},
"name": "extrude",
"sourceRange": [],
"type": "StdLibCall",
"unlabeledArg": {
"value": {
"type": "Sketch",
"value": {
"artifactId": "[uuid]"
}
},
"sourceRange": []
}
},
{
"type": "UserDefinedFunctionReturn"
},
{
"type": "UserDefinedFunctionCall",
"name": "cube",
"functionSourceRange": [
7,
328,
0
],
"unlabeledArg": null,
"labeledArgs": {},
"sourceRange": []
},
{
"labeledArgs": {
"data": {
"value": {
"type": "Plane",
"artifact_id": "[uuid]"
},
"sourceRange": []
}
},
"name": "startSketchOn",
"sourceRange": [],
"type": "StdLibCall",
"unlabeledArg": null
},
{
"labeledArgs": {
"length": {
"value": {
"type": "Number",
"value": 10.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
"sourceRange": []
}
},
"name": "extrude",
"sourceRange": [],
"type": "StdLibCall",
"unlabeledArg": {
"value": {
"type": "Sketch",
"value": {
"artifactId": "[uuid]"
}
},
"sourceRange": []
}
},
{
"type": "UserDefinedFunctionReturn"
},
{
"labeledArgs": {
"solids": {
"value": {
"type": "Array",
"value": [
{
"type": "Solid",
"value": {
"artifactId": "[uuid]"
}
},
{
"type": "Solid",
"value": {
"artifactId": "[uuid]"
}
}
]
},
"sourceRange": []
}
},
"name": "intersect",
"sourceRange": [],
"type": "StdLibCall",
"unlabeledArg": null
}
]

View File

@ -0,0 +1,543 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Variables in memory after executing intersect_cubes.kcl
---
{
"cube": {
"type": "Function"
},
"fullPart": {
"type": "Solid",
"value": {
"type": "Solid",
"id": "[uuid]",
"artifactId": "[uuid]",
"value": [
{
"faceId": "[uuid]",
"id": "[uuid]",
"sourceRange": [],
"tag": null,
"type": "extrudePlane"
},
{
"faceId": "[uuid]",
"id": "[uuid]",
"sourceRange": [],
"tag": null,
"type": "extrudePlane"
},
{
"faceId": "[uuid]",
"id": "[uuid]",
"sourceRange": [],
"tag": null,
"type": "extrudePlane"
},
{
"faceId": "[uuid]",
"id": "[uuid]",
"sourceRange": [],
"tag": null,
"type": "extrudePlane"
}
],
"sketch": {
"type": "Sketch",
"id": "[uuid]",
"paths": [
{
"__geoMeta": {
"id": "[uuid]",
"sourceRange": []
},
"from": [
-10.0,
-10.0
],
"tag": null,
"to": [
10.0,
-10.0
],
"type": "ToPoint",
"units": {
"type": "Mm"
}
},
{
"__geoMeta": {
"id": "[uuid]",
"sourceRange": []
},
"from": [
10.0,
-10.0
],
"tag": null,
"to": [
10.0,
10.0
],
"type": "ToPoint",
"units": {
"type": "Mm"
}
},
{
"__geoMeta": {
"id": "[uuid]",
"sourceRange": []
},
"from": [
10.0,
10.0
],
"tag": null,
"to": [
-10.0,
10.0
],
"type": "ToPoint",
"units": {
"type": "Mm"
}
},
{
"__geoMeta": {
"id": "[uuid]",
"sourceRange": []
},
"from": [
-10.0,
10.0
],
"tag": null,
"to": [
-10.0,
-10.0
],
"type": "ToPoint",
"units": {
"type": "Mm"
}
}
],
"on": {
"type": "plane",
"id": "[uuid]",
"artifactId": "[uuid]",
"value": "XY",
"origin": {
"x": 0.0,
"y": 0.0,
"z": 0.0
},
"xAxis": {
"x": 1.0,
"y": 0.0,
"z": 0.0
},
"yAxis": {
"x": 0.0,
"y": 1.0,
"z": 0.0
},
"zAxis": {
"x": 0.0,
"y": 0.0,
"z": 1.0
},
"units": {
"type": "Mm"
}
},
"start": {
"from": [
-10.0,
-10.0
],
"to": [
-10.0,
-10.0
],
"units": {
"type": "Mm"
},
"tag": null,
"__geoMeta": {
"id": "[uuid]",
"sourceRange": []
}
},
"artifactId": "[uuid]",
"originalId": "[uuid]",
"units": {
"type": "Mm"
}
},
"height": 10.0,
"startCapId": "[uuid]",
"endCapId": "[uuid]",
"units": {
"type": "Mm"
}
}
},
"part001": {
"type": "Solid",
"value": {
"type": "Solid",
"id": "[uuid]",
"artifactId": "[uuid]",
"value": [
{
"faceId": "[uuid]",
"id": "[uuid]",
"sourceRange": [],
"tag": null,
"type": "extrudePlane"
},
{
"faceId": "[uuid]",
"id": "[uuid]",
"sourceRange": [],
"tag": null,
"type": "extrudePlane"
},
{
"faceId": "[uuid]",
"id": "[uuid]",
"sourceRange": [],
"tag": null,
"type": "extrudePlane"
},
{
"faceId": "[uuid]",
"id": "[uuid]",
"sourceRange": [],
"tag": null,
"type": "extrudePlane"
}
],
"sketch": {
"type": "Sketch",
"id": "[uuid]",
"paths": [
{
"__geoMeta": {
"id": "[uuid]",
"sourceRange": []
},
"from": [
-10.0,
-10.0
],
"tag": null,
"to": [
10.0,
-10.0
],
"type": "ToPoint",
"units": {
"type": "Mm"
}
},
{
"__geoMeta": {
"id": "[uuid]",
"sourceRange": []
},
"from": [
10.0,
-10.0
],
"tag": null,
"to": [
10.0,
10.0
],
"type": "ToPoint",
"units": {
"type": "Mm"
}
},
{
"__geoMeta": {
"id": "[uuid]",
"sourceRange": []
},
"from": [
10.0,
10.0
],
"tag": null,
"to": [
-10.0,
10.0
],
"type": "ToPoint",
"units": {
"type": "Mm"
}
},
{
"__geoMeta": {
"id": "[uuid]",
"sourceRange": []
},
"from": [
-10.0,
10.0
],
"tag": null,
"to": [
-10.0,
-10.0
],
"type": "ToPoint",
"units": {
"type": "Mm"
}
}
],
"on": {
"type": "plane",
"id": "[uuid]",
"artifactId": "[uuid]",
"value": "XY",
"origin": {
"x": 0.0,
"y": 0.0,
"z": 0.0
},
"xAxis": {
"x": 1.0,
"y": 0.0,
"z": 0.0
},
"yAxis": {
"x": 0.0,
"y": 1.0,
"z": 0.0
},
"zAxis": {
"x": 0.0,
"y": 0.0,
"z": 1.0
},
"units": {
"type": "Mm"
}
},
"start": {
"from": [
-10.0,
-10.0
],
"to": [
-10.0,
-10.0
],
"units": {
"type": "Mm"
},
"tag": null,
"__geoMeta": {
"id": "[uuid]",
"sourceRange": []
}
},
"artifactId": "[uuid]",
"originalId": "[uuid]",
"units": {
"type": "Mm"
}
},
"height": 10.0,
"startCapId": "[uuid]",
"endCapId": "[uuid]",
"units": {
"type": "Mm"
}
}
},
"part002": {
"type": "Solid",
"value": {
"type": "Solid",
"id": "[uuid]",
"artifactId": "[uuid]",
"value": [
{
"faceId": "[uuid]",
"id": "[uuid]",
"sourceRange": [],
"tag": null,
"type": "extrudePlane"
},
{
"faceId": "[uuid]",
"id": "[uuid]",
"sourceRange": [],
"tag": null,
"type": "extrudePlane"
},
{
"faceId": "[uuid]",
"id": "[uuid]",
"sourceRange": [],
"tag": null,
"type": "extrudePlane"
},
{
"faceId": "[uuid]",
"id": "[uuid]",
"sourceRange": [],
"tag": null,
"type": "extrudePlane"
}
],
"sketch": {
"type": "Sketch",
"id": "[uuid]",
"paths": [
{
"__geoMeta": {
"id": "[uuid]",
"sourceRange": []
},
"from": [
-2.0,
-2.0
],
"tag": null,
"to": [
18.0,
-2.0
],
"type": "ToPoint",
"units": {
"type": "Mm"
}
},
{
"__geoMeta": {
"id": "[uuid]",
"sourceRange": []
},
"from": [
18.0,
-2.0
],
"tag": null,
"to": [
18.0,
18.0
],
"type": "ToPoint",
"units": {
"type": "Mm"
}
},
{
"__geoMeta": {
"id": "[uuid]",
"sourceRange": []
},
"from": [
18.0,
18.0
],
"tag": null,
"to": [
-2.0,
18.0
],
"type": "ToPoint",
"units": {
"type": "Mm"
}
},
{
"__geoMeta": {
"id": "[uuid]",
"sourceRange": []
},
"from": [
-2.0,
18.0
],
"tag": null,
"to": [
-2.0,
-2.0
],
"type": "ToPoint",
"units": {
"type": "Mm"
}
}
],
"on": {
"type": "plane",
"id": "[uuid]",
"artifactId": "[uuid]",
"value": "XY",
"origin": {
"x": 0.0,
"y": 0.0,
"z": 0.0
},
"xAxis": {
"x": 1.0,
"y": 0.0,
"z": 0.0
},
"yAxis": {
"x": 0.0,
"y": 1.0,
"z": 0.0
},
"zAxis": {
"x": 0.0,
"y": 0.0,
"z": 1.0
},
"units": {
"type": "Mm"
}
},
"start": {
"from": [
-2.0,
-2.0
],
"to": [
-2.0,
-2.0
],
"units": {
"type": "Mm"
},
"tag": null,
"__geoMeta": {
"id": "[uuid]",
"sourceRange": []
}
},
"artifactId": "[uuid]",
"originalId": "[uuid]",
"units": {
"type": "Mm"
}
},
"height": 10.0,
"startCapId": "[uuid]",
"endCapId": "[uuid]",
"units": {
"type": "Mm"
}
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

View File

@ -0,0 +1,18 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Result of unparsing intersect_cubes.kcl
---
fn cube(center) {
return startSketchOn(XY)
|> startProfileAt([center[0] - 10, center[1] - 10], %)
|> line(endAbsolute = [center[0] + 10, center[1] - 10])
|> line(endAbsolute = [center[0] + 10, center[1] + 10])
|> line(endAbsolute = [center[0] - 10, center[1] + 10])
|> close()
|> extrude(length = 10)
}
part001 = cube([0, 0])
part002 = cube([8, 8])
fullPart = intersect([part001, part002])

View File

@ -1,239 +1,239 @@
```mermaid
flowchart LR
subgraph path2 [Path]
2["Path<br>[361, 394, 4]"]
3["Segment<br>[402, 428, 4]"]
4["Segment<br>[436, 489, 4]"]
5["Segment<br>[497, 550, 4]"]
6["Segment<br>[558, 612, 4]"]
7["Segment<br>[620, 645, 4]"]
8["Segment<br>[653, 673, 4]"]
9["Segment<br>[681, 705, 4]"]
10["Segment<br>[713, 766, 4]"]
11["Segment<br>[774, 799, 4]"]
12["Segment<br>[807, 827, 4]"]
13["Segment<br>[835, 859, 4]"]
14["Segment<br>[867, 919, 4]"]
15["Segment<br>[927, 979, 4]"]
16["Segment<br>[987, 1012, 4]"]
17["Segment<br>[1020, 1044, 4]"]
18["Segment<br>[1052, 1105, 4]"]
19["Segment<br>[1113, 1138, 4]"]
20["Segment<br>[1146, 1173, 4]"]
21["Segment<br>[1181, 1233, 4]"]
22["Segment<br>[1241, 1276, 4]"]
23["Segment<br>[1284, 1291, 4]"]
2["Path<br>[361, 394, 5]"]
3["Segment<br>[402, 428, 5]"]
4["Segment<br>[436, 489, 5]"]
5["Segment<br>[497, 550, 5]"]
6["Segment<br>[558, 612, 5]"]
7["Segment<br>[620, 645, 5]"]
8["Segment<br>[653, 673, 5]"]
9["Segment<br>[681, 705, 5]"]
10["Segment<br>[713, 766, 5]"]
11["Segment<br>[774, 799, 5]"]
12["Segment<br>[807, 827, 5]"]
13["Segment<br>[835, 859, 5]"]
14["Segment<br>[867, 919, 5]"]
15["Segment<br>[927, 979, 5]"]
16["Segment<br>[987, 1012, 5]"]
17["Segment<br>[1020, 1044, 5]"]
18["Segment<br>[1052, 1105, 5]"]
19["Segment<br>[1113, 1138, 5]"]
20["Segment<br>[1146, 1173, 5]"]
21["Segment<br>[1181, 1233, 5]"]
22["Segment<br>[1241, 1276, 5]"]
23["Segment<br>[1284, 1291, 5]"]
24[Solid2d]
end
subgraph path89 [Path]
89["Path<br>[361, 394, 4]"]
90["Segment<br>[402, 428, 4]"]
91["Segment<br>[436, 489, 4]"]
92["Segment<br>[497, 550, 4]"]
93["Segment<br>[558, 612, 4]"]
94["Segment<br>[620, 645, 4]"]
95["Segment<br>[653, 673, 4]"]
96["Segment<br>[681, 705, 4]"]
97["Segment<br>[713, 766, 4]"]
98["Segment<br>[774, 799, 4]"]
99["Segment<br>[807, 827, 4]"]
100["Segment<br>[835, 859, 4]"]
101["Segment<br>[867, 919, 4]"]
102["Segment<br>[927, 979, 4]"]
103["Segment<br>[987, 1012, 4]"]
104["Segment<br>[1020, 1044, 4]"]
105["Segment<br>[1052, 1105, 4]"]
106["Segment<br>[1113, 1138, 4]"]
107["Segment<br>[1146, 1173, 4]"]
108["Segment<br>[1181, 1233, 4]"]
109["Segment<br>[1241, 1276, 4]"]
110["Segment<br>[1284, 1291, 4]"]
89["Path<br>[361, 394, 5]"]
90["Segment<br>[402, 428, 5]"]
91["Segment<br>[436, 489, 5]"]
92["Segment<br>[497, 550, 5]"]
93["Segment<br>[558, 612, 5]"]
94["Segment<br>[620, 645, 5]"]
95["Segment<br>[653, 673, 5]"]
96["Segment<br>[681, 705, 5]"]
97["Segment<br>[713, 766, 5]"]
98["Segment<br>[774, 799, 5]"]
99["Segment<br>[807, 827, 5]"]
100["Segment<br>[835, 859, 5]"]
101["Segment<br>[867, 919, 5]"]
102["Segment<br>[927, 979, 5]"]
103["Segment<br>[987, 1012, 5]"]
104["Segment<br>[1020, 1044, 5]"]
105["Segment<br>[1052, 1105, 5]"]
106["Segment<br>[1113, 1138, 5]"]
107["Segment<br>[1146, 1173, 5]"]
108["Segment<br>[1181, 1233, 5]"]
109["Segment<br>[1241, 1276, 5]"]
110["Segment<br>[1284, 1291, 5]"]
111[Solid2d]
end
subgraph path176 [Path]
176["Path<br>[361, 394, 4]"]
177["Segment<br>[402, 428, 4]"]
178["Segment<br>[436, 489, 4]"]
179["Segment<br>[497, 550, 4]"]
180["Segment<br>[558, 612, 4]"]
181["Segment<br>[620, 645, 4]"]
182["Segment<br>[653, 673, 4]"]
183["Segment<br>[681, 705, 4]"]
184["Segment<br>[713, 766, 4]"]
185["Segment<br>[774, 799, 4]"]
186["Segment<br>[807, 827, 4]"]
187["Segment<br>[835, 859, 4]"]
188["Segment<br>[867, 919, 4]"]
189["Segment<br>[927, 979, 4]"]
190["Segment<br>[987, 1012, 4]"]
191["Segment<br>[1020, 1044, 4]"]
192["Segment<br>[1052, 1105, 4]"]
193["Segment<br>[1113, 1138, 4]"]
194["Segment<br>[1146, 1173, 4]"]
195["Segment<br>[1181, 1233, 4]"]
196["Segment<br>[1241, 1276, 4]"]
197["Segment<br>[1284, 1291, 4]"]
176["Path<br>[361, 394, 5]"]
177["Segment<br>[402, 428, 5]"]
178["Segment<br>[436, 489, 5]"]
179["Segment<br>[497, 550, 5]"]
180["Segment<br>[558, 612, 5]"]
181["Segment<br>[620, 645, 5]"]
182["Segment<br>[653, 673, 5]"]
183["Segment<br>[681, 705, 5]"]
184["Segment<br>[713, 766, 5]"]
185["Segment<br>[774, 799, 5]"]
186["Segment<br>[807, 827, 5]"]
187["Segment<br>[835, 859, 5]"]
188["Segment<br>[867, 919, 5]"]
189["Segment<br>[927, 979, 5]"]
190["Segment<br>[987, 1012, 5]"]
191["Segment<br>[1020, 1044, 5]"]
192["Segment<br>[1052, 1105, 5]"]
193["Segment<br>[1113, 1138, 5]"]
194["Segment<br>[1146, 1173, 5]"]
195["Segment<br>[1181, 1233, 5]"]
196["Segment<br>[1241, 1276, 5]"]
197["Segment<br>[1284, 1291, 5]"]
198[Solid2d]
end
subgraph path262 [Path]
262["Path<br>[361, 394, 4]"]
263["Segment<br>[402, 428, 4]"]
264["Segment<br>[436, 489, 4]"]
265["Segment<br>[497, 550, 4]"]
266["Segment<br>[558, 612, 4]"]
267["Segment<br>[620, 645, 4]"]
268["Segment<br>[653, 673, 4]"]
269["Segment<br>[681, 705, 4]"]
270["Segment<br>[713, 766, 4]"]
271["Segment<br>[774, 799, 4]"]
272["Segment<br>[807, 827, 4]"]
273["Segment<br>[835, 859, 4]"]
274["Segment<br>[867, 919, 4]"]
275["Segment<br>[927, 979, 4]"]
276["Segment<br>[987, 1012, 4]"]
277["Segment<br>[1020, 1044, 4]"]
278["Segment<br>[1052, 1105, 4]"]
279["Segment<br>[1113, 1138, 4]"]
280["Segment<br>[1146, 1173, 4]"]
281["Segment<br>[1181, 1233, 4]"]
282["Segment<br>[1241, 1276, 4]"]
283["Segment<br>[1284, 1291, 4]"]
262["Path<br>[361, 394, 5]"]
263["Segment<br>[402, 428, 5]"]
264["Segment<br>[436, 489, 5]"]
265["Segment<br>[497, 550, 5]"]
266["Segment<br>[558, 612, 5]"]
267["Segment<br>[620, 645, 5]"]
268["Segment<br>[653, 673, 5]"]
269["Segment<br>[681, 705, 5]"]
270["Segment<br>[713, 766, 5]"]
271["Segment<br>[774, 799, 5]"]
272["Segment<br>[807, 827, 5]"]
273["Segment<br>[835, 859, 5]"]
274["Segment<br>[867, 919, 5]"]
275["Segment<br>[927, 979, 5]"]
276["Segment<br>[987, 1012, 5]"]
277["Segment<br>[1020, 1044, 5]"]
278["Segment<br>[1052, 1105, 5]"]
279["Segment<br>[1113, 1138, 5]"]
280["Segment<br>[1146, 1173, 5]"]
281["Segment<br>[1181, 1233, 5]"]
282["Segment<br>[1241, 1276, 5]"]
283["Segment<br>[1284, 1291, 5]"]
284[Solid2d]
end
subgraph path349 [Path]
349["Path<br>[361, 394, 4]"]
350["Segment<br>[402, 428, 4]"]
351["Segment<br>[436, 489, 4]"]
352["Segment<br>[497, 550, 4]"]
353["Segment<br>[558, 612, 4]"]
354["Segment<br>[620, 645, 4]"]
355["Segment<br>[653, 673, 4]"]
356["Segment<br>[681, 705, 4]"]
357["Segment<br>[713, 766, 4]"]
358["Segment<br>[774, 799, 4]"]
359["Segment<br>[807, 827, 4]"]
360["Segment<br>[835, 859, 4]"]
361["Segment<br>[867, 919, 4]"]
362["Segment<br>[927, 979, 4]"]
363["Segment<br>[987, 1012, 4]"]
364["Segment<br>[1020, 1044, 4]"]
365["Segment<br>[1052, 1105, 4]"]
366["Segment<br>[1113, 1138, 4]"]
367["Segment<br>[1146, 1173, 4]"]
368["Segment<br>[1181, 1233, 4]"]
369["Segment<br>[1241, 1276, 4]"]
370["Segment<br>[1284, 1291, 4]"]
349["Path<br>[361, 394, 5]"]
350["Segment<br>[402, 428, 5]"]
351["Segment<br>[436, 489, 5]"]
352["Segment<br>[497, 550, 5]"]
353["Segment<br>[558, 612, 5]"]
354["Segment<br>[620, 645, 5]"]
355["Segment<br>[653, 673, 5]"]
356["Segment<br>[681, 705, 5]"]
357["Segment<br>[713, 766, 5]"]
358["Segment<br>[774, 799, 5]"]
359["Segment<br>[807, 827, 5]"]
360["Segment<br>[835, 859, 5]"]
361["Segment<br>[867, 919, 5]"]
362["Segment<br>[927, 979, 5]"]
363["Segment<br>[987, 1012, 5]"]
364["Segment<br>[1020, 1044, 5]"]
365["Segment<br>[1052, 1105, 5]"]
366["Segment<br>[1113, 1138, 5]"]
367["Segment<br>[1146, 1173, 5]"]
368["Segment<br>[1181, 1233, 5]"]
369["Segment<br>[1241, 1276, 5]"]
370["Segment<br>[1284, 1291, 5]"]
371[Solid2d]
end
subgraph path435 [Path]
435["Path<br>[361, 394, 4]"]
436["Segment<br>[402, 428, 4]"]
437["Segment<br>[436, 489, 4]"]
438["Segment<br>[497, 550, 4]"]
439["Segment<br>[558, 612, 4]"]
440["Segment<br>[620, 645, 4]"]
441["Segment<br>[653, 673, 4]"]
442["Segment<br>[681, 705, 4]"]
443["Segment<br>[713, 766, 4]"]
444["Segment<br>[774, 799, 4]"]
445["Segment<br>[807, 827, 4]"]
446["Segment<br>[835, 859, 4]"]
447["Segment<br>[867, 919, 4]"]
448["Segment<br>[927, 979, 4]"]
449["Segment<br>[987, 1012, 4]"]
450["Segment<br>[1020, 1044, 4]"]
451["Segment<br>[1052, 1105, 4]"]
452["Segment<br>[1113, 1138, 4]"]
453["Segment<br>[1146, 1173, 4]"]
454["Segment<br>[1181, 1233, 4]"]
455["Segment<br>[1241, 1276, 4]"]
456["Segment<br>[1284, 1291, 4]"]
435["Path<br>[361, 394, 5]"]
436["Segment<br>[402, 428, 5]"]
437["Segment<br>[436, 489, 5]"]
438["Segment<br>[497, 550, 5]"]
439["Segment<br>[558, 612, 5]"]
440["Segment<br>[620, 645, 5]"]
441["Segment<br>[653, 673, 5]"]
442["Segment<br>[681, 705, 5]"]
443["Segment<br>[713, 766, 5]"]
444["Segment<br>[774, 799, 5]"]
445["Segment<br>[807, 827, 5]"]
446["Segment<br>[835, 859, 5]"]
447["Segment<br>[867, 919, 5]"]
448["Segment<br>[927, 979, 5]"]
449["Segment<br>[987, 1012, 5]"]
450["Segment<br>[1020, 1044, 5]"]
451["Segment<br>[1052, 1105, 5]"]
452["Segment<br>[1113, 1138, 5]"]
453["Segment<br>[1146, 1173, 5]"]
454["Segment<br>[1181, 1233, 5]"]
455["Segment<br>[1241, 1276, 5]"]
456["Segment<br>[1284, 1291, 5]"]
457[Solid2d]
end
subgraph path522 [Path]
522["Path<br>[1685, 1709, 4]"]
522["Path<br>[1685, 1709, 5]"]
end
subgraph path523 [Path]
523["Path<br>[1717, 1847, 4]"]
524["Segment<br>[1717, 1847, 4]"]
525["Segment<br>[1717, 1847, 4]"]
526["Segment<br>[1717, 1847, 4]"]
527["Segment<br>[1717, 1847, 4]"]
528["Segment<br>[1717, 1847, 4]"]
529["Segment<br>[1717, 1847, 4]"]
530["Segment<br>[1717, 1847, 4]"]
523["Path<br>[1717, 1847, 5]"]
524["Segment<br>[1717, 1847, 5]"]
525["Segment<br>[1717, 1847, 5]"]
526["Segment<br>[1717, 1847, 5]"]
527["Segment<br>[1717, 1847, 5]"]
528["Segment<br>[1717, 1847, 5]"]
529["Segment<br>[1717, 1847, 5]"]
530["Segment<br>[1717, 1847, 5]"]
531[Solid2d]
end
subgraph path553 [Path]
553["Path<br>[1685, 1709, 4]"]
553["Path<br>[1685, 1709, 5]"]
end
subgraph path554 [Path]
554["Path<br>[1717, 1847, 4]"]
555["Segment<br>[1717, 1847, 4]"]
556["Segment<br>[1717, 1847, 4]"]
557["Segment<br>[1717, 1847, 4]"]
558["Segment<br>[1717, 1847, 4]"]
559["Segment<br>[1717, 1847, 4]"]
560["Segment<br>[1717, 1847, 4]"]
561["Segment<br>[1717, 1847, 4]"]
554["Path<br>[1717, 1847, 5]"]
555["Segment<br>[1717, 1847, 5]"]
556["Segment<br>[1717, 1847, 5]"]
557["Segment<br>[1717, 1847, 5]"]
558["Segment<br>[1717, 1847, 5]"]
559["Segment<br>[1717, 1847, 5]"]
560["Segment<br>[1717, 1847, 5]"]
561["Segment<br>[1717, 1847, 5]"]
562[Solid2d]
end
subgraph path585 [Path]
585["Path<br>[2123, 2150, 4]"]
586["Segment<br>[2158, 2180, 4]"]
587["Segment<br>[2188, 2210, 4]"]
588["Segment<br>[2218, 2240, 4]"]
589["Segment<br>[2248, 2271, 4]"]
590["Segment<br>[2279, 2302, 4]"]
591["Segment<br>[2310, 2345, 4]"]
592["Segment<br>[2353, 2360, 4]"]
585["Path<br>[2123, 2150, 5]"]
586["Segment<br>[2158, 2180, 5]"]
587["Segment<br>[2188, 2210, 5]"]
588["Segment<br>[2218, 2240, 5]"]
589["Segment<br>[2248, 2271, 5]"]
590["Segment<br>[2279, 2302, 5]"]
591["Segment<br>[2310, 2345, 5]"]
592["Segment<br>[2353, 2360, 5]"]
593[Solid2d]
end
subgraph path618 [Path]
618["Path<br>[2632, 2661, 4]"]
619["Segment<br>[2669, 2692, 4]"]
620["Segment<br>[2700, 2725, 4]"]
621["Segment<br>[2733, 2757, 4]"]
622["Segment<br>[2765, 2789, 4]"]
623["Segment<br>[2797, 2819, 4]"]
624["Segment<br>[2827, 2862, 4]"]
625["Segment<br>[2870, 2877, 4]"]
618["Path<br>[2632, 2661, 5]"]
619["Segment<br>[2669, 2692, 5]"]
620["Segment<br>[2700, 2725, 5]"]
621["Segment<br>[2733, 2757, 5]"]
622["Segment<br>[2765, 2789, 5]"]
623["Segment<br>[2797, 2819, 5]"]
624["Segment<br>[2827, 2862, 5]"]
625["Segment<br>[2870, 2877, 5]"]
626[Solid2d]
end
subgraph path650 [Path]
650["Path<br>[3152, 3179, 4]"]
651["Segment<br>[3187, 3206, 4]"]
652["Segment<br>[3214, 3304, 4]"]
650["Path<br>[3152, 3179, 5]"]
651["Segment<br>[3187, 3206, 5]"]
652["Segment<br>[3214, 3304, 5]"]
end
subgraph path654 [Path]
654["Path<br>[3404, 3437, 4]"]
655["Segment<br>[3445, 3464, 4]"]
656["Segment<br>[3472, 3494, 4]"]
657["Segment<br>[3502, 3525, 4]"]
658["Segment<br>[3533, 3553, 4]"]
659["Segment<br>[3561, 3585, 4]"]
660["Segment<br>[3593, 3616, 4]"]
661["Segment<br>[3624, 3631, 4]"]
654["Path<br>[3404, 3437, 5]"]
655["Segment<br>[3445, 3464, 5]"]
656["Segment<br>[3472, 3494, 5]"]
657["Segment<br>[3502, 3525, 5]"]
658["Segment<br>[3533, 3553, 5]"]
659["Segment<br>[3561, 3585, 5]"]
660["Segment<br>[3593, 3616, 5]"]
661["Segment<br>[3624, 3631, 5]"]
662[Solid2d]
end
subgraph path688 [Path]
688["Path<br>[3152, 3179, 4]"]
689["Segment<br>[3187, 3206, 4]"]
690["Segment<br>[3214, 3304, 4]"]
688["Path<br>[3152, 3179, 5]"]
689["Segment<br>[3187, 3206, 5]"]
690["Segment<br>[3214, 3304, 5]"]
end
subgraph path692 [Path]
692["Path<br>[3404, 3437, 4]"]
693["Segment<br>[3445, 3464, 4]"]
694["Segment<br>[3472, 3494, 4]"]
695["Segment<br>[3502, 3525, 4]"]
696["Segment<br>[3533, 3553, 4]"]
697["Segment<br>[3561, 3585, 4]"]
698["Segment<br>[3593, 3616, 4]"]
699["Segment<br>[3624, 3631, 4]"]
692["Path<br>[3404, 3437, 5]"]
693["Segment<br>[3445, 3464, 5]"]
694["Segment<br>[3472, 3494, 5]"]
695["Segment<br>[3502, 3525, 5]"]
696["Segment<br>[3533, 3553, 5]"]
697["Segment<br>[3561, 3585, 5]"]
698["Segment<br>[3593, 3616, 5]"]
699["Segment<br>[3624, 3631, 5]"]
700[Solid2d]
end
1["Plane<br>[333, 353, 4]"]
25["Sweep Extrusion<br>[1379, 1417, 4]"]
1["Plane<br>[333, 353, 5]"]
25["Sweep Extrusion<br>[1379, 1417, 5]"]
26[Wall]
27[Wall]
28[Wall]
@ -296,8 +296,8 @@ flowchart LR
85["SweepEdge Adjacent"]
86["SweepEdge Opposite"]
87["SweepEdge Adjacent"]
88["Plane<br>[333, 353, 4]"]
112["Sweep Extrusion<br>[1455, 1494, 4]"]
88["Plane<br>[333, 353, 5]"]
112["Sweep Extrusion<br>[1455, 1494, 5]"]
113[Wall]
114[Wall]
115[Wall]
@ -361,7 +361,7 @@ flowchart LR
173["SweepEdge Opposite"]
174["SweepEdge Adjacent"]
175["Plane<br>[823, 865, 0]"]
199["Sweep Extrusion<br>[1379, 1417, 4]"]
199["Sweep Extrusion<br>[1379, 1417, 5]"]
200[Wall]
201[Wall]
202[Wall]
@ -424,7 +424,7 @@ flowchart LR
259["SweepEdge Adjacent"]
260["SweepEdge Opposite"]
261["SweepEdge Adjacent"]
285["Sweep Extrusion<br>[1455, 1494, 4]"]
285["Sweep Extrusion<br>[1455, 1494, 5]"]
286[Wall]
287[Wall]
288[Wall]
@ -488,7 +488,7 @@ flowchart LR
346["SweepEdge Opposite"]
347["SweepEdge Adjacent"]
348["Plane<br>[875, 916, 0]"]
372["Sweep Extrusion<br>[1379, 1417, 4]"]
372["Sweep Extrusion<br>[1379, 1417, 5]"]
373[Wall]
374[Wall]
375[Wall]
@ -551,7 +551,7 @@ flowchart LR
432["SweepEdge Adjacent"]
433["SweepEdge Opposite"]
434["SweepEdge Adjacent"]
458["Sweep Extrusion<br>[1455, 1494, 4]"]
458["Sweep Extrusion<br>[1455, 1494, 5]"]
459[Wall]
460[Wall]
461[Wall]
@ -615,7 +615,7 @@ flowchart LR
519["SweepEdge Opposite"]
520["SweepEdge Adjacent"]
521["Plane<br>[975, 1017, 0]"]
532["Sweep Extrusion<br>[1949, 1973, 4]"]
532["Sweep Extrusion<br>[1949, 1973, 5]"]
533[Wall]
534[Wall]
535[Wall]
@ -636,7 +636,7 @@ flowchart LR
550["SweepEdge Adjacent"]
551["SweepEdge Opposite"]
552["SweepEdge Adjacent"]
563["Sweep Extrusion<br>[2015, 2039, 4]"]
563["Sweep Extrusion<br>[2015, 2039, 5]"]
564[Wall]
565[Wall]
566[Wall]
@ -658,7 +658,7 @@ flowchart LR
582["SweepEdge Opposite"]
583["SweepEdge Adjacent"]
584["Plane<br>[1068, 1135, 0]"]
594["Sweep Extrusion<br>[2523, 2547, 4]"]
594["Sweep Extrusion<br>[2523, 2547, 5]"]
595[Wall]
596[Wall]
597[Wall]
@ -679,10 +679,10 @@ flowchart LR
612["SweepEdge Adjacent"]
613["SweepEdge Opposite"]
614["SweepEdge Adjacent"]
615["Sweep Extrusion<br>[2523, 2547, 4]"]
616["Sweep Extrusion<br>[2523, 2547, 4]"]
615["Sweep Extrusion<br>[2523, 2547, 5]"]
616["Sweep Extrusion<br>[2523, 2547, 5]"]
617["Plane<br>[1205, 1272, 0]"]
627["Sweep Extrusion<br>[3047, 3071, 4]"]
627["Sweep Extrusion<br>[3047, 3071, 5]"]
628[Wall]
629[Wall]
630[Wall]
@ -703,10 +703,10 @@ flowchart LR
645["SweepEdge Adjacent"]
646["SweepEdge Opposite"]
647["SweepEdge Adjacent"]
648["Sweep Extrusion<br>[3047, 3071, 4]"]
649["Plane<br>[3712, 3747, 4]"]
653["Plane<br>[3778, 3807, 4]"]
663["Sweep Sweep<br>[3819, 3846, 4]"]
648["Sweep Extrusion<br>[3047, 3071, 5]"]
649["Plane<br>[3712, 3747, 5]"]
653["Plane<br>[3778, 3807, 5]"]
663["Sweep Sweep<br>[3819, 3846, 5]"]
664[Wall]
665[Wall]
666[Wall]
@ -730,9 +730,9 @@ flowchart LR
684["SweepEdge Adjacent"]
685["SweepEdge Opposite"]
686["SweepEdge Adjacent"]
687["Plane<br>[3712, 3747, 4]"]
691["Plane<br>[3778, 3807, 4]"]
701["Sweep Sweep<br>[3819, 3846, 4]"]
687["Plane<br>[3712, 3747, 5]"]
691["Plane<br>[3778, 3807, 5]"]
701["Sweep Sweep<br>[3819, 3846, 5]"]
702[Wall]
703[Wall]
704[Wall]
@ -756,18 +756,18 @@ flowchart LR
722["SweepEdge Adjacent"]
723["SweepEdge Opposite"]
724["SweepEdge Adjacent"]
725["StartSketchOnPlane<br>[333, 353, 4]"]
726["StartSketchOnPlane<br>[333, 353, 4]"]
727["StartSketchOnPlane<br>[333, 353, 4]"]
728["StartSketchOnPlane<br>[333, 353, 4]"]
729["StartSketchOnPlane<br>[1657, 1677, 4]"]
730["StartSketchOnPlane<br>[1657, 1677, 4]"]
731["StartSketchOnPlane<br>[2095, 2115, 4]"]
732["StartSketchOnPlane<br>[2604, 2624, 4]"]
733["StartSketchOnPlane<br>[3124, 3144, 4]"]
734["StartSketchOnPlane<br>[3376, 3396, 4]"]
735["StartSketchOnPlane<br>[3124, 3144, 4]"]
736["StartSketchOnPlane<br>[3376, 3396, 4]"]
725["StartSketchOnPlane<br>[333, 353, 5]"]
726["StartSketchOnPlane<br>[333, 353, 5]"]
727["StartSketchOnPlane<br>[333, 353, 5]"]
728["StartSketchOnPlane<br>[333, 353, 5]"]
729["StartSketchOnPlane<br>[1657, 1677, 5]"]
730["StartSketchOnPlane<br>[1657, 1677, 5]"]
731["StartSketchOnPlane<br>[2095, 2115, 5]"]
732["StartSketchOnPlane<br>[2604, 2624, 5]"]
733["StartSketchOnPlane<br>[3124, 3144, 5]"]
734["StartSketchOnPlane<br>[3376, 3396, 5]"]
735["StartSketchOnPlane<br>[3124, 3144, 5]"]
736["StartSketchOnPlane<br>[3376, 3396, 5]"]
1 --- 2
2 --- 3
2 --- 4

View File

@ -9,7 +9,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
1331,
1606,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -21,7 +21,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
309,
1312,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -77,7 +77,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
309,
1312,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -248,7 +248,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
1331,
1606,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -260,7 +260,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
309,
1312,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -316,7 +316,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
309,
1312,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -487,7 +487,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
1331,
1606,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -499,7 +499,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
309,
1312,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -555,7 +555,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
309,
1312,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -726,7 +726,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
1889,
2052,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -738,7 +738,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
1626,
1868,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -800,7 +800,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
1626,
1868,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -889,7 +889,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
2474,
2560,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -901,7 +901,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
2071,
2453,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -1007,7 +1007,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
2993,
3084,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -1019,7 +1019,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
2580,
2972,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -1095,7 +1095,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
3671,
3859,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -1131,7 +1131,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
3100,
3325,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -1191,7 +1191,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
3344,
3652,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -1249,7 +1249,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
3671,
3859,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -1285,7 +1285,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
3100,
3325,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -1345,7 +1345,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
3344,
3652,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},

View File

@ -1,264 +1,264 @@
```mermaid
flowchart LR
subgraph path2 [Path]
2["Path<br>[567, 618, 5]"]
3["Segment<br>[567, 618, 5]"]
2["Path<br>[567, 618, 6]"]
3["Segment<br>[567, 618, 6]"]
4[Solid2d]
end
subgraph path11 [Path]
11["Path<br>[803, 859, 5]"]
12["Segment<br>[803, 859, 5]"]
11["Path<br>[803, 859, 6]"]
12["Segment<br>[803, 859, 6]"]
13[Solid2d]
end
subgraph path19 [Path]
19["Path<br>[984, 1037, 5]"]
20["Segment<br>[984, 1037, 5]"]
19["Path<br>[984, 1037, 6]"]
20["Segment<br>[984, 1037, 6]"]
21[Solid2d]
end
subgraph path30 [Path]
30["Path<br>[1420, 1460, 5]"]
31["Segment<br>[1420, 1460, 5]"]
30["Path<br>[1420, 1460, 6]"]
31["Segment<br>[1420, 1460, 6]"]
32[Solid2d]
end
subgraph path38 [Path]
38["Path<br>[1564, 1615, 5]"]
39["Segment<br>[1564, 1615, 5]"]
38["Path<br>[1564, 1615, 6]"]
39["Segment<br>[1564, 1615, 6]"]
40[Solid2d]
end
subgraph path47 [Path]
47["Path<br>[1748, 1801, 5]"]
48["Segment<br>[1748, 1801, 5]"]
47["Path<br>[1748, 1801, 6]"]
48["Segment<br>[1748, 1801, 6]"]
49[Solid2d]
end
subgraph path58 [Path]
58["Path<br>[2044, 2116, 5]"]
59["Segment<br>[2044, 2116, 5]"]
58["Path<br>[2044, 2116, 6]"]
59["Segment<br>[2044, 2116, 6]"]
60[Solid2d]
end
subgraph path81 [Path]
81["Path<br>[2373, 2404, 5]"]
82["Segment<br>[2410, 2430, 5]"]
83["Segment<br>[2436, 2456, 5]"]
84["Segment<br>[2462, 2483, 5]"]
85["Segment<br>[2489, 2545, 5]"]
86["Segment<br>[2551, 2558, 5]"]
81["Path<br>[2373, 2404, 6]"]
82["Segment<br>[2410, 2430, 6]"]
83["Segment<br>[2436, 2456, 6]"]
84["Segment<br>[2462, 2483, 6]"]
85["Segment<br>[2489, 2545, 6]"]
86["Segment<br>[2551, 2558, 6]"]
87[Solid2d]
end
subgraph path106 [Path]
106["Path<br>[2860, 2892, 5]"]
107["Segment<br>[2898, 2919, 5]"]
108["Segment<br>[2925, 2945, 5]"]
109["Segment<br>[2951, 2971, 5]"]
110["Segment<br>[2977, 3033, 5]"]
111["Segment<br>[3039, 3046, 5]"]
106["Path<br>[2860, 2892, 6]"]
107["Segment<br>[2898, 2919, 6]"]
108["Segment<br>[2925, 2945, 6]"]
109["Segment<br>[2951, 2971, 6]"]
110["Segment<br>[2977, 3033, 6]"]
111["Segment<br>[3039, 3046, 6]"]
112[Solid2d]
end
subgraph path132 [Path]
132["Path<br>[350, 406, 4]"]
133["Segment<br>[350, 406, 4]"]
132["Path<br>[350, 406, 5]"]
133["Segment<br>[350, 406, 5]"]
134[Solid2d]
end
subgraph path135 [Path]
135["Path<br>[417, 473, 4]"]
136["Segment<br>[417, 473, 4]"]
135["Path<br>[417, 473, 5]"]
136["Segment<br>[417, 473, 5]"]
137[Solid2d]
end
subgraph path144 [Path]
144["Path<br>[638, 694, 4]"]
145["Segment<br>[638, 694, 4]"]
144["Path<br>[638, 694, 5]"]
145["Segment<br>[638, 694, 5]"]
146[Solid2d]
end
subgraph path147 [Path]
147["Path<br>[705, 761, 4]"]
148["Segment<br>[705, 761, 4]"]
147["Path<br>[705, 761, 5]"]
148["Segment<br>[705, 761, 5]"]
149[Solid2d]
end
subgraph path156 [Path]
156["Path<br>[905, 959, 4]"]
157["Segment<br>[905, 959, 4]"]
156["Path<br>[905, 959, 5]"]
157["Segment<br>[905, 959, 5]"]
158[Solid2d]
end
subgraph path167 [Path]
167["Path<br>[1237, 1297, 4]"]
168["Segment<br>[1237, 1297, 4]"]
167["Path<br>[1237, 1297, 5]"]
168["Segment<br>[1237, 1297, 5]"]
169[Solid2d]
end
subgraph path179 [Path]
179["Path<br>[1655, 1701, 4]"]
180["Segment<br>[1707, 1759, 4]"]
181["Segment<br>[1765, 1870, 4]"]
182["Segment<br>[1876, 1898, 4]"]
183["Segment<br>[1904, 1960, 4]"]
184["Segment<br>[1966, 1973, 4]"]
179["Path<br>[1655, 1701, 5]"]
180["Segment<br>[1707, 1759, 5]"]
181["Segment<br>[1765, 1870, 5]"]
182["Segment<br>[1876, 1898, 5]"]
183["Segment<br>[1904, 1960, 5]"]
184["Segment<br>[1966, 1973, 5]"]
185[Solid2d]
end
subgraph path195 [Path]
195["Path<br>[2107, 2153, 4]"]
196["Segment<br>[2159, 2211, 4]"]
197["Segment<br>[2217, 2324, 4]"]
198["Segment<br>[2330, 2367, 4]"]
199["Segment<br>[2373, 2429, 4]"]
200["Segment<br>[2435, 2442, 4]"]
195["Path<br>[2107, 2153, 5]"]
196["Segment<br>[2159, 2211, 5]"]
197["Segment<br>[2217, 2324, 5]"]
198["Segment<br>[2330, 2367, 5]"]
199["Segment<br>[2373, 2429, 5]"]
200["Segment<br>[2435, 2442, 5]"]
201[Solid2d]
end
subgraph path212 [Path]
212["Path<br>[2953, 3000, 4]"]
213["Segment<br>[3008, 3348, 4]"]
214["Segment<br>[3356, 3388, 4]"]
215["Segment<br>[3396, 3740, 4]"]
216["Segment<br>[3748, 3804, 4]"]
217["Segment<br>[3812, 3819, 4]"]
212["Path<br>[2953, 3000, 5]"]
213["Segment<br>[3008, 3348, 5]"]
214["Segment<br>[3356, 3388, 5]"]
215["Segment<br>[3396, 3740, 5]"]
216["Segment<br>[3748, 3804, 5]"]
217["Segment<br>[3812, 3819, 5]"]
218[Solid2d]
end
subgraph path235 [Path]
235["Path<br>[2953, 3000, 4]"]
236["Segment<br>[3008, 3348, 4]"]
237["Segment<br>[3356, 3388, 4]"]
238["Segment<br>[3396, 3740, 4]"]
239["Segment<br>[3748, 3804, 4]"]
240["Segment<br>[3812, 3819, 4]"]
235["Path<br>[2953, 3000, 5]"]
236["Segment<br>[3008, 3348, 5]"]
237["Segment<br>[3356, 3388, 5]"]
238["Segment<br>[3396, 3740, 5]"]
239["Segment<br>[3748, 3804, 5]"]
240["Segment<br>[3812, 3819, 5]"]
241[Solid2d]
end
subgraph path258 [Path]
258["Path<br>[4347, 4442, 4]"]
259["Segment<br>[4448, 4481, 4]"]
260["Segment<br>[4487, 4538, 4]"]
261["Segment<br>[4544, 4577, 4]"]
262["Segment<br>[4583, 4633, 4]"]
263["Segment<br>[4639, 4680, 4]"]
264["Segment<br>[4686, 4735, 4]"]
265["Segment<br>[4741, 4774, 4]"]
266["Segment<br>[4780, 4814, 4]"]
267["Segment<br>[4820, 4854, 4]"]
268["Segment<br>[4860, 4912, 4]"]
269["Segment<br>[4918, 4952, 4]"]
270["Segment<br>[4958, 5034, 4]"]
271["Segment<br>[5040, 5073, 4]"]
272["Segment<br>[5079, 5155, 4]"]
273["Segment<br>[5161, 5195, 4]"]
274["Segment<br>[5201, 5275, 4]"]
275["Segment<br>[5281, 5315, 4]"]
276["Segment<br>[5321, 5372, 4]"]
277["Segment<br>[5378, 5440, 4]"]
278["Segment<br>[5446, 5497, 4]"]
279["Segment<br>[5503, 5537, 4]"]
280["Segment<br>[5543, 5576, 4]"]
281["Segment<br>[5582, 5615, 4]"]
282["Segment<br>[5621, 5628, 4]"]
258["Path<br>[4347, 4442, 5]"]
259["Segment<br>[4448, 4481, 5]"]
260["Segment<br>[4487, 4538, 5]"]
261["Segment<br>[4544, 4577, 5]"]
262["Segment<br>[4583, 4633, 5]"]
263["Segment<br>[4639, 4680, 5]"]
264["Segment<br>[4686, 4735, 5]"]
265["Segment<br>[4741, 4774, 5]"]
266["Segment<br>[4780, 4814, 5]"]
267["Segment<br>[4820, 4854, 5]"]
268["Segment<br>[4860, 4912, 5]"]
269["Segment<br>[4918, 4952, 5]"]
270["Segment<br>[4958, 5034, 5]"]
271["Segment<br>[5040, 5073, 5]"]
272["Segment<br>[5079, 5155, 5]"]
273["Segment<br>[5161, 5195, 5]"]
274["Segment<br>[5201, 5275, 5]"]
275["Segment<br>[5281, 5315, 5]"]
276["Segment<br>[5321, 5372, 5]"]
277["Segment<br>[5378, 5440, 5]"]
278["Segment<br>[5446, 5497, 5]"]
279["Segment<br>[5503, 5537, 5]"]
280["Segment<br>[5543, 5576, 5]"]
281["Segment<br>[5582, 5615, 5]"]
282["Segment<br>[5621, 5628, 5]"]
283[Solid2d]
end
subgraph path334 [Path]
334["Path<br>[740, 780, 7]"]
335["Segment<br>[788, 850, 7]"]
336["Segment<br>[858, 894, 7]"]
337["Segment<br>[902, 932, 7]"]
338["Segment<br>[940, 992, 7]"]
339["Segment<br>[1000, 1040, 7]"]
340["Segment<br>[1048, 1083, 7]"]
341["Segment<br>[1091, 1129, 7]"]
342["Segment<br>[1137, 1159, 7]"]
343["Segment<br>[1167, 1174, 7]"]
334["Path<br>[740, 780, 8]"]
335["Segment<br>[788, 850, 8]"]
336["Segment<br>[858, 894, 8]"]
337["Segment<br>[902, 932, 8]"]
338["Segment<br>[940, 992, 8]"]
339["Segment<br>[1000, 1040, 8]"]
340["Segment<br>[1048, 1083, 8]"]
341["Segment<br>[1091, 1129, 8]"]
342["Segment<br>[1137, 1159, 8]"]
343["Segment<br>[1167, 1174, 8]"]
344[Solid2d]
end
subgraph path365 [Path]
365["Path<br>[507, 588, 6]"]
366["Segment<br>[594, 695, 6]"]
367["Segment<br>[701, 786, 6]"]
368["Segment<br>[792, 876, 6]"]
369["Segment<br>[882, 968, 6]"]
370["Segment<br>[974, 1059, 6]"]
371["Segment<br>[1065, 1151, 6]"]
372["Segment<br>[1157, 1280, 6]"]
373["Segment<br>[1286, 1372, 6]"]
374["Segment<br>[1378, 1513, 6]"]
375["Segment<br>[1519, 1605, 6]"]
376["Segment<br>[1611, 1735, 6]"]
377["Segment<br>[1741, 1827, 6]"]
378["Segment<br>[1833, 1918, 6]"]
379["Segment<br>[1924, 2010, 6]"]
380["Segment<br>[2016, 2101, 6]"]
381["Segment<br>[2107, 2192, 6]"]
382["Segment<br>[2198, 2205, 6]"]
365["Path<br>[507, 588, 7]"]
366["Segment<br>[594, 695, 7]"]
367["Segment<br>[701, 786, 7]"]
368["Segment<br>[792, 876, 7]"]
369["Segment<br>[882, 968, 7]"]
370["Segment<br>[974, 1059, 7]"]
371["Segment<br>[1065, 1151, 7]"]
372["Segment<br>[1157, 1280, 7]"]
373["Segment<br>[1286, 1372, 7]"]
374["Segment<br>[1378, 1513, 7]"]
375["Segment<br>[1519, 1605, 7]"]
376["Segment<br>[1611, 1735, 7]"]
377["Segment<br>[1741, 1827, 7]"]
378["Segment<br>[1833, 1918, 7]"]
379["Segment<br>[1924, 2010, 7]"]
380["Segment<br>[2016, 2101, 7]"]
381["Segment<br>[2107, 2192, 7]"]
382["Segment<br>[2198, 2205, 7]"]
383[Solid2d]
end
subgraph path439 [Path]
439["Path<br>[483, 540, 8]"]
440["Segment<br>[546, 680, 8]"]
441["Segment<br>[686, 741, 8]"]
442["Segment<br>[747, 844, 8]"]
443["Segment<br>[850, 882, 8]"]
444["Segment<br>[888, 920, 8]"]
445["Segment<br>[926, 957, 8]"]
446["Segment<br>[963, 1078, 8]"]
447["Segment<br>[1084, 1116, 8]"]
448["Segment<br>[1122, 1154, 8]"]
449["Segment<br>[1160, 1191, 8]"]
450["Segment<br>[1197, 1290, 8]"]
451["Segment<br>[1296, 1351, 8]"]
452["Segment<br>[1357, 1430, 8]"]
453["Segment<br>[1436, 1443, 8]"]
439["Path<br>[483, 540, 9]"]
440["Segment<br>[546, 680, 9]"]
441["Segment<br>[686, 741, 9]"]
442["Segment<br>[747, 844, 9]"]
443["Segment<br>[850, 882, 9]"]
444["Segment<br>[888, 920, 9]"]
445["Segment<br>[926, 957, 9]"]
446["Segment<br>[963, 1078, 9]"]
447["Segment<br>[1084, 1116, 9]"]
448["Segment<br>[1122, 1154, 9]"]
449["Segment<br>[1160, 1191, 9]"]
450["Segment<br>[1197, 1290, 9]"]
451["Segment<br>[1296, 1351, 9]"]
452["Segment<br>[1357, 1430, 9]"]
453["Segment<br>[1436, 1443, 9]"]
454[Solid2d]
end
1["Plane<br>[544, 561, 5]"]
5["Sweep Extrusion<br>[627, 683, 5]"]
1["Plane<br>[544, 561, 6]"]
5["Sweep Extrusion<br>[627, 683, 6]"]
6[Wall]
7["Cap Start"]
8["Cap End"]
9["SweepEdge Opposite"]
10["SweepEdge Adjacent"]
14["Sweep Extrusion<br>[872, 934, 5]"]
14["Sweep Extrusion<br>[872, 934, 6]"]
15[Wall]
16["Cap End"]
17["SweepEdge Opposite"]
18["SweepEdge Adjacent"]
22["Sweep Extrusion<br>[1184, 1263, 5]"]
22["Sweep Extrusion<br>[1184, 1263, 6]"]
23[Wall]
24["SweepEdge Opposite"]
25["SweepEdge Adjacent"]
26["Sweep Extrusion<br>[1184, 1263, 5]"]
27["Sweep Extrusion<br>[1184, 1263, 5]"]
28["Sweep Extrusion<br>[1184, 1263, 5]"]
29["Sweep Extrusion<br>[1184, 1263, 5]"]
33["Sweep Extrusion<br>[1466, 1499, 5]"]
26["Sweep Extrusion<br>[1184, 1263, 6]"]
27["Sweep Extrusion<br>[1184, 1263, 6]"]
28["Sweep Extrusion<br>[1184, 1263, 6]"]
29["Sweep Extrusion<br>[1184, 1263, 6]"]
33["Sweep Extrusion<br>[1466, 1499, 6]"]
34[Wall]
35["Cap End"]
36["SweepEdge Opposite"]
37["SweepEdge Adjacent"]
41["Sweep Extrusion<br>[1630, 1695, 5]"]
41["Sweep Extrusion<br>[1630, 1695, 6]"]
42[Wall]
43["Cap Start"]
44["Cap End"]
45["SweepEdge Opposite"]
46["SweepEdge Adjacent"]
50["Sweep Extrusion<br>[1948, 1992, 5]"]
50["Sweep Extrusion<br>[1948, 1992, 6]"]
51[Wall]
52["SweepEdge Opposite"]
53["SweepEdge Adjacent"]
54["Sweep Extrusion<br>[1948, 1992, 5]"]
55["Sweep Extrusion<br>[1948, 1992, 5]"]
56["Sweep Extrusion<br>[1948, 1992, 5]"]
57["Sweep Extrusion<br>[1948, 1992, 5]"]
61["Sweep Extrusion<br>[2271, 2315, 5]"]
54["Sweep Extrusion<br>[1948, 1992, 6]"]
55["Sweep Extrusion<br>[1948, 1992, 6]"]
56["Sweep Extrusion<br>[1948, 1992, 6]"]
57["Sweep Extrusion<br>[1948, 1992, 6]"]
61["Sweep Extrusion<br>[2271, 2315, 6]"]
62[Wall]
63["Cap End"]
64["SweepEdge Opposite"]
65["SweepEdge Adjacent"]
66["Sweep Extrusion<br>[2271, 2315, 5]"]
67["Sweep Extrusion<br>[2271, 2315, 5]"]
68["Sweep Extrusion<br>[2271, 2315, 5]"]
69["Sweep Extrusion<br>[2271, 2315, 5]"]
70["Sweep Extrusion<br>[2271, 2315, 5]"]
71["Sweep Extrusion<br>[2271, 2315, 5]"]
72["Sweep Extrusion<br>[2271, 2315, 5]"]
73["Sweep Extrusion<br>[2271, 2315, 5]"]
74["Sweep Extrusion<br>[2271, 2315, 5]"]
75["Sweep Extrusion<br>[2271, 2315, 5]"]
76["Sweep Extrusion<br>[2271, 2315, 5]"]
77["Sweep Extrusion<br>[2271, 2315, 5]"]
78["Sweep Extrusion<br>[2271, 2315, 5]"]
79["Sweep Extrusion<br>[2271, 2315, 5]"]
80["Sweep Extrusion<br>[2271, 2315, 5]"]
88["Sweep Extrusion<br>[2724, 2792, 5]"]
66["Sweep Extrusion<br>[2271, 2315, 6]"]
67["Sweep Extrusion<br>[2271, 2315, 6]"]
68["Sweep Extrusion<br>[2271, 2315, 6]"]
69["Sweep Extrusion<br>[2271, 2315, 6]"]
70["Sweep Extrusion<br>[2271, 2315, 6]"]
71["Sweep Extrusion<br>[2271, 2315, 6]"]
72["Sweep Extrusion<br>[2271, 2315, 6]"]
73["Sweep Extrusion<br>[2271, 2315, 6]"]
74["Sweep Extrusion<br>[2271, 2315, 6]"]
75["Sweep Extrusion<br>[2271, 2315, 6]"]
76["Sweep Extrusion<br>[2271, 2315, 6]"]
77["Sweep Extrusion<br>[2271, 2315, 6]"]
78["Sweep Extrusion<br>[2271, 2315, 6]"]
79["Sweep Extrusion<br>[2271, 2315, 6]"]
80["Sweep Extrusion<br>[2271, 2315, 6]"]
88["Sweep Extrusion<br>[2724, 2792, 6]"]
89[Wall]
90[Wall]
91[Wall]
@ -272,11 +272,11 @@ flowchart LR
99["SweepEdge Adjacent"]
100["SweepEdge Opposite"]
101["SweepEdge Adjacent"]
102["Sweep Extrusion<br>[2724, 2792, 5]"]
103["Sweep Extrusion<br>[2724, 2792, 5]"]
104["Sweep Extrusion<br>[2724, 2792, 5]"]
105["Sweep Extrusion<br>[2724, 2792, 5]"]
113["Sweep Extrusion<br>[3198, 3272, 5]"]
102["Sweep Extrusion<br>[2724, 2792, 6]"]
103["Sweep Extrusion<br>[2724, 2792, 6]"]
104["Sweep Extrusion<br>[2724, 2792, 6]"]
105["Sweep Extrusion<br>[2724, 2792, 6]"]
113["Sweep Extrusion<br>[3198, 3272, 6]"]
114[Wall]
115[Wall]
116[Wall]
@ -290,41 +290,41 @@ flowchart LR
124["SweepEdge Adjacent"]
125["SweepEdge Opposite"]
126["SweepEdge Adjacent"]
127["Sweep Extrusion<br>[3198, 3272, 5]"]
128["Sweep Extrusion<br>[3198, 3272, 5]"]
129["Sweep Extrusion<br>[3198, 3272, 5]"]
130["Sweep Extrusion<br>[3198, 3272, 5]"]
131["Plane<br>[327, 344, 4]"]
138["Sweep Extrusion<br>[483, 516, 4]"]
127["Sweep Extrusion<br>[3198, 3272, 6]"]
128["Sweep Extrusion<br>[3198, 3272, 6]"]
129["Sweep Extrusion<br>[3198, 3272, 6]"]
130["Sweep Extrusion<br>[3198, 3272, 6]"]
131["Plane<br>[327, 344, 5]"]
138["Sweep Extrusion<br>[483, 516, 5]"]
139[Wall]
140["Cap Start"]
141["Cap End"]
142["SweepEdge Opposite"]
143["SweepEdge Adjacent"]
150["Sweep Extrusion<br>[771, 804, 4]"]
150["Sweep Extrusion<br>[771, 804, 5]"]
151[Wall]
152["Cap Start"]
153["Cap End"]
154["SweepEdge Opposite"]
155["SweepEdge Adjacent"]
159["Sweep Extrusion<br>[1106, 1140, 4]"]
159["Sweep Extrusion<br>[1106, 1140, 5]"]
160[Wall]
161["SweepEdge Opposite"]
162["SweepEdge Adjacent"]
163["Sweep Extrusion<br>[1106, 1140, 4]"]
164["Sweep Extrusion<br>[1106, 1140, 4]"]
165["Sweep Extrusion<br>[1106, 1140, 4]"]
166["Sweep Extrusion<br>[1106, 1140, 4]"]
170["Sweep Extrusion<br>[1444, 1478, 4]"]
163["Sweep Extrusion<br>[1106, 1140, 5]"]
164["Sweep Extrusion<br>[1106, 1140, 5]"]
165["Sweep Extrusion<br>[1106, 1140, 5]"]
166["Sweep Extrusion<br>[1106, 1140, 5]"]
170["Sweep Extrusion<br>[1444, 1478, 5]"]
171[Wall]
172["SweepEdge Opposite"]
173["SweepEdge Adjacent"]
174["Sweep Extrusion<br>[1444, 1478, 4]"]
175["Sweep Extrusion<br>[1444, 1478, 4]"]
176["Sweep Extrusion<br>[1444, 1478, 4]"]
177["Sweep Extrusion<br>[1444, 1478, 4]"]
178["Plane<br>[1632, 1649, 4]"]
186["Sweep Revolve<br>[1979, 1998, 4]"]
174["Sweep Extrusion<br>[1444, 1478, 5]"]
175["Sweep Extrusion<br>[1444, 1478, 5]"]
176["Sweep Extrusion<br>[1444, 1478, 5]"]
177["Sweep Extrusion<br>[1444, 1478, 5]"]
178["Plane<br>[1632, 1649, 5]"]
186["Sweep Revolve<br>[1979, 1998, 5]"]
187[Wall]
188[Wall]
189[Wall]
@ -332,8 +332,8 @@ flowchart LR
191["SweepEdge Adjacent"]
192["SweepEdge Adjacent"]
193["SweepEdge Adjacent"]
194["Plane<br>[2084, 2101, 4]"]
202["Sweep Revolve<br>[2448, 2467, 4]"]
194["Plane<br>[2084, 2101, 5]"]
202["Sweep Revolve<br>[2448, 2467, 5]"]
203[Wall]
204[Wall]
205[Wall]
@ -342,8 +342,8 @@ flowchart LR
208["SweepEdge Adjacent"]
209["SweepEdge Adjacent"]
210["SweepEdge Adjacent"]
211["Plane<br>[2922, 2945, 4]"]
219["Sweep Extrusion<br>[3867, 3913, 4]"]
211["Plane<br>[2922, 2945, 5]"]
219["Sweep Extrusion<br>[3867, 3913, 5]"]
220[Wall]
221[Wall]
222[Wall]
@ -358,8 +358,8 @@ flowchart LR
231["SweepEdge Adjacent"]
232["SweepEdge Opposite"]
233["SweepEdge Adjacent"]
234["Plane<br>[2922, 2945, 4]"]
242["Sweep Extrusion<br>[3867, 3913, 4]"]
234["Plane<br>[2922, 2945, 5]"]
242["Sweep Extrusion<br>[3867, 3913, 5]"]
243[Wall]
244[Wall]
245[Wall]
@ -374,8 +374,8 @@ flowchart LR
254["SweepEdge Adjacent"]
255["SweepEdge Opposite"]
256["SweepEdge Adjacent"]
257["Plane<br>[4324, 4341, 4]"]
284["Sweep Revolve<br>[5634, 5653, 4]"]
257["Plane<br>[4324, 4341, 5]"]
284["Sweep Revolve<br>[5634, 5653, 5]"]
285[Wall]
286[Wall]
287[Wall]
@ -424,8 +424,8 @@ flowchart LR
330["SweepEdge Adjacent"]
331["SweepEdge Adjacent"]
332["SweepEdge Adjacent"]
333["Plane<br>[706, 732, 7]"]
345["Sweep Revolve<br>[1182, 1201, 7]"]
333["Plane<br>[706, 732, 8]"]
345["Sweep Revolve<br>[1182, 1201, 8]"]
346[Wall]
347[Wall]
348[Wall]
@ -444,8 +444,8 @@ flowchart LR
361["SweepEdge Adjacent"]
362["SweepEdge Adjacent"]
363["SweepEdge Adjacent"]
364["Plane<br>[484, 501, 6]"]
384["Sweep Revolve<br>[2243, 2295, 6]"]
364["Plane<br>[484, 501, 7]"]
384["Sweep Revolve<br>[2243, 2295, 7]"]
385[Wall]
386[Wall]
387[Wall]
@ -499,8 +499,8 @@ flowchart LR
435["SweepEdge Adjacent"]
436["SweepEdge Opposite"]
437["SweepEdge Adjacent"]
438["Plane<br>[460, 477, 8]"]
455["Sweep Revolve<br>[1486, 1517, 8]"]
438["Plane<br>[460, 477, 9]"]
455["Sweep Revolve<br>[1486, 1517, 9]"]
456[Wall]
457[Wall]
458[Wall]
@ -529,17 +529,17 @@ flowchart LR
481["SweepEdge Adjacent"]
482["SweepEdge Adjacent"]
483["SweepEdge Adjacent"]
484["StartSketchOnFace<br>[770, 797, 5]"]
485["StartSketchOnFace<br>[947, 978, 5]"]
486["StartSketchOnFace<br>[1385, 1414, 5]"]
487["StartSketchOnFace<br>[1524, 1558, 5]"]
488["StartSketchOnFace<br>[1709, 1742, 5]"]
489["StartSketchOnFace<br>[2009, 2038, 5]"]
490["StartSketchOnFace<br>[2338, 2367, 5]"]
491["StartSketchOnFace<br>[2821, 2854, 5]"]
492["StartSketchOnFace<br>[603, 632, 4]"]
493["StartSketchOnFace<br>[865, 899, 4]"]
494["StartSketchOnFace<br>[1202, 1231, 4]"]
484["StartSketchOnFace<br>[770, 797, 6]"]
485["StartSketchOnFace<br>[947, 978, 6]"]
486["StartSketchOnFace<br>[1385, 1414, 6]"]
487["StartSketchOnFace<br>[1524, 1558, 6]"]
488["StartSketchOnFace<br>[1709, 1742, 6]"]
489["StartSketchOnFace<br>[2009, 2038, 6]"]
490["StartSketchOnFace<br>[2338, 2367, 6]"]
491["StartSketchOnFace<br>[2821, 2854, 6]"]
492["StartSketchOnFace<br>[603, 632, 5]"]
493["StartSketchOnFace<br>[865, 899, 5]"]
494["StartSketchOnFace<br>[1202, 1231, 5]"]
1 --- 2
2 --- 3
2 ---- 5

View File

@ -168,54 +168,65 @@ description: Result of parsing car-wheel-assembly.kcl
"label": {
"commentStart": 366,
"end": 0,
"name": "translate",
"name": "x",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 378,
"elements": [
{
"commentStart": 379,
"end": 0,
"raw": "0",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 0.0,
"suffix": "None"
}
},
{
"commentStart": 382,
"end": 0,
"raw": "0.5",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 0.5,
"suffix": "None"
}
},
{
"commentStart": 387,
"end": 0,
"raw": "0",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 0.0,
"suffix": "None"
}
}
],
"commentStart": 370,
"end": 0,
"raw": "0",
"start": 0,
"type": "ArrayExpression",
"type": "ArrayExpression"
"type": "Literal",
"type": "Literal",
"value": {
"value": 0.0,
"suffix": "None"
}
}
},
{
"type": "LabeledArg",
"label": {
"commentStart": 373,
"end": 0,
"name": "y",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 377,
"end": 0,
"raw": "0.5",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 0.5,
"suffix": "None"
}
}
},
{
"type": "LabeledArg",
"label": {
"commentStart": 382,
"end": 0,
"name": "z",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 386,
"end": 0,
"raw": "0",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 0.0,
"suffix": "None"
}
}
}
],
@ -253,14 +264,14 @@ description: Result of parsing car-wheel-assembly.kcl
"type": "ExpressionStatement"
},
{
"commentStart": 391,
"commentStart": 389,
"end": 0,
"expression": {
"abs_path": false,
"commentStart": 391,
"commentStart": 389,
"end": 0,
"name": {
"commentStart": 391,
"commentStart": 389,
"end": 0,
"name": "carWheel",
"start": 0,
@ -276,16 +287,16 @@ description: Result of parsing car-wheel-assembly.kcl
"type": "ExpressionStatement"
},
{
"commentStart": 400,
"commentStart": 398,
"end": 0,
"expression": {
"body": [
{
"abs_path": false,
"commentStart": 400,
"commentStart": 398,
"end": 0,
"name": {
"commentStart": 400,
"commentStart": 398,
"end": 0,
"name": "lugNut",
"start": 0,
@ -301,14 +312,14 @@ description: Result of parsing car-wheel-assembly.kcl
{
"type": "LabeledArg",
"label": {
"commentStart": 438,
"commentStart": 436,
"end": 0,
"name": "arcDegrees",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 451,
"commentStart": 449,
"end": 0,
"raw": "360",
"start": 0,
@ -323,17 +334,17 @@ description: Result of parsing car-wheel-assembly.kcl
{
"type": "LabeledArg",
"label": {
"commentStart": 463,
"commentStart": 461,
"end": 0,
"name": "axis",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 470,
"commentStart": 468,
"elements": [
{
"commentStart": 471,
"commentStart": 469,
"end": 0,
"raw": "0",
"start": 0,
@ -345,7 +356,7 @@ description: Result of parsing car-wheel-assembly.kcl
}
},
{
"commentStart": 474,
"commentStart": 472,
"end": 0,
"raw": "1",
"start": 0,
@ -357,7 +368,7 @@ description: Result of parsing car-wheel-assembly.kcl
}
},
{
"commentStart": 477,
"commentStart": 475,
"end": 0,
"raw": "0",
"start": 0,
@ -378,17 +389,17 @@ description: Result of parsing car-wheel-assembly.kcl
{
"type": "LabeledArg",
"label": {
"commentStart": 488,
"commentStart": 486,
"end": 0,
"name": "center",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 497,
"commentStart": 495,
"elements": [
{
"commentStart": 498,
"commentStart": 496,
"end": 0,
"raw": "0",
"start": 0,
@ -400,7 +411,7 @@ description: Result of parsing car-wheel-assembly.kcl
}
},
{
"commentStart": 501,
"commentStart": 499,
"end": 0,
"raw": "0",
"start": 0,
@ -412,7 +423,7 @@ description: Result of parsing car-wheel-assembly.kcl
}
},
{
"commentStart": 504,
"commentStart": 502,
"end": 0,
"raw": "0",
"start": 0,
@ -433,7 +444,7 @@ description: Result of parsing car-wheel-assembly.kcl
{
"type": "LabeledArg",
"label": {
"commentStart": 515,
"commentStart": 513,
"end": 0,
"name": "instances",
"start": 0,
@ -441,10 +452,10 @@ description: Result of parsing car-wheel-assembly.kcl
},
"arg": {
"abs_path": false,
"commentStart": 527,
"commentStart": 525,
"end": 0,
"name": {
"commentStart": 527,
"commentStart": 525,
"end": 0,
"name": "lugCount",
"start": 0,
@ -459,14 +470,14 @@ description: Result of parsing car-wheel-assembly.kcl
{
"type": "LabeledArg",
"label": {
"commentStart": 544,
"commentStart": 542,
"end": 0,
"name": "rotateDuplicates",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 563,
"commentStart": 561,
"end": 0,
"raw": "false",
"start": 0,
@ -478,10 +489,10 @@ description: Result of parsing car-wheel-assembly.kcl
],
"callee": {
"abs_path": false,
"commentStart": 412,
"commentStart": 410,
"end": 0,
"name": {
"commentStart": 412,
"commentStart": 410,
"end": 0,
"name": "patternCircular3d",
"start": 0,
@ -491,7 +502,7 @@ description: Result of parsing car-wheel-assembly.kcl
"start": 0,
"type": "Name"
},
"commentStart": 412,
"commentStart": 410,
"end": 0,
"start": 0,
"type": "CallExpressionKw",
@ -499,7 +510,7 @@ description: Result of parsing car-wheel-assembly.kcl
"unlabeled": null
}
],
"commentStart": 400,
"commentStart": 398,
"end": 0,
"start": 0,
"type": "PipeExpression",
@ -510,16 +521,16 @@ description: Result of parsing car-wheel-assembly.kcl
"type": "ExpressionStatement"
},
{
"commentStart": 577,
"commentStart": 575,
"end": 0,
"expression": {
"body": [
{
"abs_path": false,
"commentStart": 577,
"commentStart": 575,
"end": 0,
"name": {
"commentStart": 577,
"commentStart": 575,
"end": 0,
"name": "brakeCaliper",
"start": 0,
@ -535,65 +546,76 @@ description: Result of parsing car-wheel-assembly.kcl
{
"type": "LabeledArg",
"label": {
"commentStart": 605,
"commentStart": 603,
"end": 0,
"name": "translate",
"name": "x",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 617,
"elements": [
{
"commentStart": 618,
"end": 0,
"raw": "0",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 0.0,
"suffix": "None"
}
},
{
"commentStart": 621,
"end": 0,
"raw": "0.5",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 0.5,
"suffix": "None"
}
},
{
"commentStart": 626,
"end": 0,
"raw": "0",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 0.0,
"suffix": "None"
}
}
],
"commentStart": 607,
"end": 0,
"raw": "0",
"start": 0,
"type": "ArrayExpression",
"type": "ArrayExpression"
"type": "Literal",
"type": "Literal",
"value": {
"value": 0.0,
"suffix": "None"
}
}
},
{
"type": "LabeledArg",
"label": {
"commentStart": 610,
"end": 0,
"name": "y",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 614,
"end": 0,
"raw": "0.5",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 0.5,
"suffix": "None"
}
}
},
{
"type": "LabeledArg",
"label": {
"commentStart": 619,
"end": 0,
"name": "z",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 623,
"end": 0,
"raw": "0",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 0.0,
"suffix": "None"
}
}
}
],
"callee": {
"abs_path": false,
"commentStart": 595,
"commentStart": 593,
"end": 0,
"name": {
"commentStart": 595,
"commentStart": 593,
"end": 0,
"name": "translate",
"start": 0,
@ -603,7 +625,7 @@ description: Result of parsing car-wheel-assembly.kcl
"start": 0,
"type": "Name"
},
"commentStart": 595,
"commentStart": 593,
"end": 0,
"start": 0,
"type": "CallExpressionKw",
@ -611,7 +633,7 @@ description: Result of parsing car-wheel-assembly.kcl
"unlabeled": null
}
],
"commentStart": 577,
"commentStart": 575,
"end": 0,
"start": 0,
"type": "PipeExpression",
@ -622,14 +644,14 @@ description: Result of parsing car-wheel-assembly.kcl
"type": "ExpressionStatement"
},
{
"commentStart": 630,
"commentStart": 626,
"end": 0,
"expression": {
"abs_path": false,
"commentStart": 630,
"commentStart": 626,
"end": 0,
"name": {
"commentStart": 630,
"commentStart": 626,
"end": 0,
"name": "carTire",
"start": 0,

View File

@ -1848,7 +1848,7 @@ description: Operations executed car-wheel-assembly.kcl
"functionSourceRange": [
2620,
4193,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -2235,7 +2235,7 @@ description: Operations executed car-wheel-assembly.kcl
"functionSourceRange": [
2620,
4193,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -2660,7 +2660,7 @@ description: Operations executed car-wheel-assembly.kcl
"functionSourceRange": [
664,
1291,
7
8
],
"unlabeledArg": null,
"labeledArgs": {},

View File

@ -5,7 +5,7 @@ description: Variables in memory after executing car-wheel-assembly.kcl
{
"brakeCaliper": {
"type": "Module",
"value": 6
"value": 7
},
"c1": {
"type": "TagIdentifier",
@ -14,15 +14,15 @@ description: Variables in memory after executing car-wheel-assembly.kcl
},
"carRotor": {
"type": "Module",
"value": 5
"value": 6
},
"carTire": {
"type": "Module",
"value": 8
"value": 9
},
"carWheel": {
"type": "Module",
"value": 4
"value": 5
},
"lugCount": {
"type": "Number",
@ -39,6 +39,6 @@ description: Variables in memory after executing car-wheel-assembly.kcl
},
"lugNut": {
"type": "Module",
"value": 7
"value": 8
}
}

View File

@ -1,162 +1,162 @@
```mermaid
flowchart LR
subgraph path2 [Path]
2["Path<br>[224, 279, 4]"]
3["Segment<br>[285, 347, 4]"]
4["Segment<br>[353, 468, 4]"]
5["Segment<br>[474, 594, 4]"]
6["Segment<br>[600, 685, 4]"]
7["Segment<br>[691, 698, 4]"]
2["Path<br>[224, 279, 5]"]
3["Segment<br>[285, 347, 5]"]
4["Segment<br>[353, 468, 5]"]
5["Segment<br>[474, 594, 5]"]
6["Segment<br>[600, 685, 5]"]
7["Segment<br>[691, 698, 5]"]
8[Solid2d]
end
subgraph path28 [Path]
28["Path<br>[1134, 1191, 4]"]
29["Segment<br>[1134, 1191, 4]"]
28["Path<br>[1134, 1191, 5]"]
29["Segment<br>[1134, 1191, 5]"]
30[Solid2d]
end
subgraph path36 [Path]
36["Path<br>[1389, 1426, 4]"]
37["Segment<br>[1389, 1426, 4]"]
36["Path<br>[1389, 1426, 5]"]
37["Segment<br>[1389, 1426, 5]"]
38[Solid2d]
end
subgraph path44 [Path]
44["Path<br>[1558, 1698, 4]"]
45["Segment<br>[1558, 1698, 4]"]
44["Path<br>[1558, 1698, 5]"]
45["Segment<br>[1558, 1698, 5]"]
46[Solid2d]
end
subgraph path54 [Path]
54["Path<br>[1944, 2084, 4]"]
55["Segment<br>[1944, 2084, 4]"]
54["Path<br>[1944, 2084, 5]"]
55["Segment<br>[1944, 2084, 5]"]
56[Solid2d]
end
subgraph path65 [Path]
65["Path<br>[203, 263, 5]"]
66["Segment<br>[203, 263, 5]"]
65["Path<br>[203, 263, 6]"]
66["Segment<br>[203, 263, 6]"]
67[Solid2d]
end
subgraph path75 [Path]
75["Path<br>[493, 529, 5]"]
76["Segment<br>[535, 579, 5]"]
77["Segment<br>[585, 673, 5]"]
78["Segment<br>[679, 728, 5]"]
79["Segment<br>[734, 790, 5]"]
80["Segment<br>[796, 803, 5]"]
75["Path<br>[493, 529, 6]"]
76["Segment<br>[535, 579, 6]"]
77["Segment<br>[585, 673, 6]"]
78["Segment<br>[679, 728, 6]"]
79["Segment<br>[734, 790, 6]"]
80["Segment<br>[796, 803, 6]"]
81[Solid2d]
end
subgraph path97 [Path]
97["Path<br>[900, 1075, 5]"]
98["Segment<br>[900, 1075, 5]"]
97["Path<br>[900, 1075, 6]"]
98["Segment<br>[900, 1075, 6]"]
99[Solid2d]
end
subgraph path105 [Path]
105["Path<br>[1279, 1426, 5]"]
106["Segment<br>[1279, 1426, 5]"]
105["Path<br>[1279, 1426, 6]"]
106["Segment<br>[1279, 1426, 6]"]
107[Solid2d]
end
subgraph path116 [Path]
116["Path<br>[1743, 1917, 5]"]
117["Segment<br>[1743, 1917, 5]"]
116["Path<br>[1743, 1917, 6]"]
117["Segment<br>[1743, 1917, 6]"]
118[Solid2d]
end
subgraph path125 [Path]
125["Path<br>[2142, 2182, 5]"]
126["Segment<br>[2142, 2182, 5]"]
125["Path<br>[2142, 2182, 6]"]
126["Segment<br>[2142, 2182, 6]"]
127[Solid2d]
end
subgraph path137 [Path]
137["Path<br>[251, 394, 6]"]
138["Segment<br>[400, 516, 6]"]
139["Segment<br>[522, 600, 6]"]
140["Segment<br>[606, 722, 6]"]
141["Segment<br>[728, 784, 6]"]
142["Segment<br>[790, 797, 6]"]
137["Path<br>[251, 394, 7]"]
138["Segment<br>[400, 516, 7]"]
139["Segment<br>[522, 600, 7]"]
140["Segment<br>[606, 722, 7]"]
141["Segment<br>[728, 784, 7]"]
142["Segment<br>[790, 797, 7]"]
143[Solid2d]
end
subgraph path159 [Path]
159["Path<br>[913, 977, 6]"]
160["Segment<br>[913, 977, 6]"]
159["Path<br>[913, 977, 7]"]
160["Segment<br>[913, 977, 7]"]
161[Solid2d]
end
subgraph path167 [Path]
167["Path<br>[1146, 1354, 6]"]
168["Segment<br>[1146, 1354, 6]"]
167["Path<br>[1146, 1354, 7]"]
168["Segment<br>[1146, 1354, 7]"]
169[Solid2d]
end
subgraph path175 [Path]
175["Path<br>[1557, 1601, 6]"]
176["Segment<br>[1557, 1601, 6]"]
175["Path<br>[1557, 1601, 7]"]
176["Segment<br>[1557, 1601, 7]"]
177[Solid2d]
end
subgraph path190 [Path]
190["Path<br>[1839, 2031, 6]"]
191["Segment<br>[1839, 2031, 6]"]
190["Path<br>[1839, 2031, 7]"]
191["Segment<br>[1839, 2031, 7]"]
192[Solid2d]
end
subgraph path201 [Path]
201["Path<br>[2384, 2559, 6]"]
202["Segment<br>[2384, 2559, 6]"]
201["Path<br>[2384, 2559, 7]"]
202["Segment<br>[2384, 2559, 7]"]
203[Solid2d]
end
subgraph path210 [Path]
210["Path<br>[271, 504, 7]"]
211["Segment<br>[510, 629, 7]"]
212["Segment<br>[635, 715, 7]"]
213["Segment<br>[721, 840, 7]"]
214["Segment<br>[846, 916, 7]"]
215["Segment<br>[922, 929, 7]"]
210["Path<br>[271, 504, 8]"]
211["Segment<br>[510, 629, 8]"]
212["Segment<br>[635, 715, 8]"]
213["Segment<br>[721, 840, 8]"]
214["Segment<br>[846, 916, 8]"]
215["Segment<br>[922, 929, 8]"]
216[Solid2d]
end
subgraph path232 [Path]
232["Path<br>[1043, 1252, 7]"]
233["Segment<br>[1043, 1252, 7]"]
232["Path<br>[1043, 1252, 8]"]
233["Segment<br>[1043, 1252, 8]"]
234[Solid2d]
end
subgraph path240 [Path]
240["Path<br>[1457, 1646, 7]"]
241["Segment<br>[1457, 1646, 7]"]
240["Path<br>[1457, 1646, 8]"]
241["Segment<br>[1457, 1646, 8]"]
242[Solid2d]
end
subgraph path255 [Path]
255["Path<br>[2067, 2353, 7]"]
256["Segment<br>[2067, 2353, 7]"]
255["Path<br>[2067, 2353, 8]"]
256["Segment<br>[2067, 2353, 8]"]
257[Solid2d]
end
subgraph path264 [Path]
264["Path<br>[2452, 2736, 7]"]
265["Segment<br>[2452, 2736, 7]"]
264["Path<br>[2452, 2736, 8]"]
265["Segment<br>[2452, 2736, 8]"]
266[Solid2d]
end
subgraph path273 [Path]
273["Path<br>[2890, 2928, 7]"]
274["Segment<br>[2890, 2928, 7]"]
273["Path<br>[2890, 2928, 8]"]
274["Segment<br>[2890, 2928, 8]"]
275[Solid2d]
end
subgraph path282 [Path]
282["Path<br>[3058, 3283, 7]"]
283["Segment<br>[3289, 3383, 7]"]
284["Segment<br>[3389, 3532, 7]"]
285["Segment<br>[3538, 3632, 7]"]
286["Segment<br>[3638, 3740, 7]"]
287["Segment<br>[3746, 3848, 7]"]
288["Segment<br>[3854, 3954, 7]"]
289["Segment<br>[3960, 4016, 7]"]
290["Segment<br>[4022, 4029, 7]"]
282["Path<br>[3058, 3283, 8]"]
283["Segment<br>[3289, 3383, 8]"]
284["Segment<br>[3389, 3532, 8]"]
285["Segment<br>[3538, 3632, 8]"]
286["Segment<br>[3638, 3740, 8]"]
287["Segment<br>[3746, 3848, 8]"]
288["Segment<br>[3854, 3954, 8]"]
289["Segment<br>[3960, 4016, 8]"]
290["Segment<br>[4022, 4029, 8]"]
291[Solid2d]
end
subgraph path316 [Path]
316["Path<br>[4158, 4383, 7]"]
317["Segment<br>[4389, 4485, 7]"]
318["Segment<br>[4491, 4639, 7]"]
319["Segment<br>[4645, 4741, 7]"]
320["Segment<br>[4747, 4851, 7]"]
321["Segment<br>[4857, 4961, 7]"]
322["Segment<br>[4967, 5069, 7]"]
323["Segment<br>[5075, 5131, 7]"]
324["Segment<br>[5137, 5144, 7]"]
316["Path<br>[4158, 4383, 8]"]
317["Segment<br>[4389, 4485, 8]"]
318["Segment<br>[4491, 4639, 8]"]
319["Segment<br>[4645, 4741, 8]"]
320["Segment<br>[4747, 4851, 8]"]
321["Segment<br>[4857, 4961, 8]"]
322["Segment<br>[4967, 5069, 8]"]
323["Segment<br>[5075, 5131, 8]"]
324["Segment<br>[5137, 5144, 8]"]
325[Solid2d]
end
1["Plane<br>[201, 218, 4]"]
9["Sweep Extrusion<br>[712, 759, 4]"]
1["Plane<br>[201, 218, 5]"]
9["Sweep Extrusion<br>[712, 759, 5]"]
10[Wall]
11[Wall]
12[Wall]
@ -171,43 +171,43 @@ flowchart LR
21["SweepEdge Adjacent"]
22["SweepEdge Opposite"]
23["SweepEdge Adjacent"]
24["EdgeCut Chamfer<br>[765, 1042, 4]"]
25["EdgeCut Chamfer<br>[765, 1042, 4]"]
26["EdgeCut Chamfer<br>[765, 1042, 4]"]
27["EdgeCut Chamfer<br>[765, 1042, 4]"]
31["Sweep Extrusion<br>[1205, 1271, 4]"]
24["EdgeCut Chamfer<br>[765, 1042, 5]"]
25["EdgeCut Chamfer<br>[765, 1042, 5]"]
26["EdgeCut Chamfer<br>[765, 1042, 5]"]
27["EdgeCut Chamfer<br>[765, 1042, 5]"]
31["Sweep Extrusion<br>[1205, 1271, 5]"]
32[Wall]
33["Cap End"]
34["SweepEdge Opposite"]
35["SweepEdge Adjacent"]
39["Sweep Extrusion<br>[1440, 1470, 4]"]
39["Sweep Extrusion<br>[1440, 1470, 5]"]
40[Wall]
41["Cap End"]
42["SweepEdge Opposite"]
43["SweepEdge Adjacent"]
47["Sweep Extrusion<br>[1846, 1893, 4]"]
47["Sweep Extrusion<br>[1846, 1893, 5]"]
48[Wall]
49["SweepEdge Opposite"]
50["SweepEdge Adjacent"]
51["Sweep Extrusion<br>[1846, 1893, 4]"]
52["Sweep Extrusion<br>[1846, 1893, 4]"]
53["Sweep Extrusion<br>[1846, 1893, 4]"]
57["Sweep Extrusion<br>[2220, 2267, 4]"]
51["Sweep Extrusion<br>[1846, 1893, 5]"]
52["Sweep Extrusion<br>[1846, 1893, 5]"]
53["Sweep Extrusion<br>[1846, 1893, 5]"]
57["Sweep Extrusion<br>[2220, 2267, 5]"]
58[Wall]
59["SweepEdge Opposite"]
60["SweepEdge Adjacent"]
61["Sweep Extrusion<br>[2220, 2267, 4]"]
62["Sweep Extrusion<br>[2220, 2267, 4]"]
63["Sweep Extrusion<br>[2220, 2267, 4]"]
64["Plane<br>[174, 197, 5]"]
68["Sweep Extrusion<br>[277, 315, 5]"]
61["Sweep Extrusion<br>[2220, 2267, 5]"]
62["Sweep Extrusion<br>[2220, 2267, 5]"]
63["Sweep Extrusion<br>[2220, 2267, 5]"]
64["Plane<br>[174, 197, 6]"]
68["Sweep Extrusion<br>[277, 315, 6]"]
69[Wall]
70["Cap Start"]
71["Cap End"]
72["SweepEdge Opposite"]
73["SweepEdge Adjacent"]
74["Plane<br>[464, 487, 5]"]
82["Sweep Extrusion<br>[818, 848, 5]"]
74["Plane<br>[464, 487, 6]"]
82["Sweep Extrusion<br>[818, 848, 6]"]
83[Wall]
84[Wall]
85[Wall]
@ -222,35 +222,35 @@ flowchart LR
94["SweepEdge Adjacent"]
95["SweepEdge Opposite"]
96["SweepEdge Adjacent"]
100["Sweep Extrusion<br>[1089, 1121, 5]"]
100["Sweep Extrusion<br>[1089, 1121, 6]"]
101[Wall]
102["Cap End"]
103["SweepEdge Opposite"]
104["SweepEdge Adjacent"]
108["Sweep Extrusion<br>[1659, 1691, 5]"]
108["Sweep Extrusion<br>[1659, 1691, 6]"]
109[Wall]
110["Cap End"]
111["SweepEdge Opposite"]
112["SweepEdge Adjacent"]
113["Sweep Extrusion<br>[1659, 1691, 5]"]
114["Sweep Extrusion<br>[1659, 1691, 5]"]
115["Sweep Extrusion<br>[1659, 1691, 5]"]
119["Sweep Extrusion<br>[1931, 1964, 5]"]
113["Sweep Extrusion<br>[1659, 1691, 6]"]
114["Sweep Extrusion<br>[1659, 1691, 6]"]
115["Sweep Extrusion<br>[1659, 1691, 6]"]
119["Sweep Extrusion<br>[1931, 1964, 6]"]
120[Wall]
121["Cap End"]
122["SweepEdge Opposite"]
123["SweepEdge Adjacent"]
124["Plane<br>[2113, 2136, 5]"]
128["Sweep Extrusion<br>[2184, 2215, 5]"]
124["Plane<br>[2113, 2136, 6]"]
128["Sweep Extrusion<br>[2184, 2215, 6]"]
129[Wall]
130["Cap Start"]
131["Cap End"]
132["SweepEdge Opposite"]
133["SweepEdge Adjacent"]
134["EdgeCut Fillet<br>[321, 383, 5]"]
135["EdgeCut Fillet<br>[1970, 2032, 5]"]
136["Plane<br>[222, 245, 6]"]
144["Sweep Extrusion<br>[811, 859, 6]"]
134["EdgeCut Fillet<br>[321, 383, 6]"]
135["EdgeCut Fillet<br>[1970, 2032, 6]"]
136["Plane<br>[222, 245, 7]"]
144["Sweep Extrusion<br>[811, 859, 7]"]
145[Wall]
146[Wall]
147[Wall]
@ -265,43 +265,43 @@ flowchart LR
156["SweepEdge Adjacent"]
157["SweepEdge Opposite"]
158["SweepEdge Adjacent"]
162["Sweep Extrusion<br>[992, 1025, 6]"]
162["Sweep Extrusion<br>[992, 1025, 7]"]
163[Wall]
164["Cap End"]
165["SweepEdge Opposite"]
166["SweepEdge Adjacent"]
170["Sweep Extrusion<br>[1369, 1399, 6]"]
170["Sweep Extrusion<br>[1369, 1399, 7]"]
171[Wall]
172["Cap End"]
173["SweepEdge Opposite"]
174["SweepEdge Adjacent"]
178["Sweep Extrusion<br>[1754, 1787, 6]"]
178["Sweep Extrusion<br>[1754, 1787, 7]"]
179[Wall]
180["Cap End"]
181["SweepEdge Opposite"]
182["SweepEdge Adjacent"]
183["Sweep Extrusion<br>[1754, 1787, 6]"]
184["Sweep Extrusion<br>[1754, 1787, 6]"]
185["Sweep Extrusion<br>[1754, 1787, 6]"]
186["Sweep Extrusion<br>[1754, 1787, 6]"]
187["Sweep Extrusion<br>[1754, 1787, 6]"]
188["Sweep Extrusion<br>[1754, 1787, 6]"]
189["Sweep Extrusion<br>[1754, 1787, 6]"]
193["Sweep Extrusion<br>[2299, 2332, 6]"]
183["Sweep Extrusion<br>[1754, 1787, 7]"]
184["Sweep Extrusion<br>[1754, 1787, 7]"]
185["Sweep Extrusion<br>[1754, 1787, 7]"]
186["Sweep Extrusion<br>[1754, 1787, 7]"]
187["Sweep Extrusion<br>[1754, 1787, 7]"]
188["Sweep Extrusion<br>[1754, 1787, 7]"]
189["Sweep Extrusion<br>[1754, 1787, 7]"]
193["Sweep Extrusion<br>[2299, 2332, 7]"]
194[Wall]
195["Cap End"]
196["SweepEdge Opposite"]
197["SweepEdge Adjacent"]
198["Sweep Extrusion<br>[2299, 2332, 6]"]
199["Sweep Extrusion<br>[2299, 2332, 6]"]
200["Sweep Extrusion<br>[2299, 2332, 6]"]
204["Sweep Extrusion<br>[2561, 2591, 6]"]
198["Sweep Extrusion<br>[2299, 2332, 7]"]
199["Sweep Extrusion<br>[2299, 2332, 7]"]
200["Sweep Extrusion<br>[2299, 2332, 7]"]
204["Sweep Extrusion<br>[2561, 2591, 7]"]
205[Wall]
206["Cap End"]
207["SweepEdge Opposite"]
208["SweepEdge Adjacent"]
209["Plane<br>[242, 265, 7]"]
217["Sweep Extrusion<br>[943, 991, 7]"]
209["Plane<br>[242, 265, 8]"]
217["Sweep Extrusion<br>[943, 991, 8]"]
218[Wall]
219[Wall]
220[Wall]
@ -316,42 +316,42 @@ flowchart LR
229["SweepEdge Adjacent"]
230["SweepEdge Opposite"]
231["SweepEdge Adjacent"]
235["Sweep Extrusion<br>[1267, 1300, 7]"]
235["Sweep Extrusion<br>[1267, 1300, 8]"]
236[Wall]
237["Cap End"]
238["SweepEdge Opposite"]
239["SweepEdge Adjacent"]
243["Sweep Extrusion<br>[1911, 1944, 7]"]
243["Sweep Extrusion<br>[1911, 1944, 8]"]
244[Wall]
245["Cap End"]
246["SweepEdge Opposite"]
247["SweepEdge Adjacent"]
248["Sweep Extrusion<br>[1911, 1944, 7]"]
249["Sweep Extrusion<br>[1911, 1944, 7]"]
250["Sweep Extrusion<br>[1911, 1944, 7]"]
251["Sweep Extrusion<br>[1911, 1944, 7]"]
252["Sweep Extrusion<br>[1911, 1944, 7]"]
253["Sweep Extrusion<br>[1911, 1944, 7]"]
254["Sweep Extrusion<br>[1911, 1944, 7]"]
258["Sweep Extrusion<br>[2367, 2400, 7]"]
248["Sweep Extrusion<br>[1911, 1944, 8]"]
249["Sweep Extrusion<br>[1911, 1944, 8]"]
250["Sweep Extrusion<br>[1911, 1944, 8]"]
251["Sweep Extrusion<br>[1911, 1944, 8]"]
252["Sweep Extrusion<br>[1911, 1944, 8]"]
253["Sweep Extrusion<br>[1911, 1944, 8]"]
254["Sweep Extrusion<br>[1911, 1944, 8]"]
258["Sweep Extrusion<br>[2367, 2400, 8]"]
259[Wall]
260["Cap Start"]
261["Cap End"]
262["SweepEdge Opposite"]
263["SweepEdge Adjacent"]
267["Sweep Extrusion<br>[2751, 2784, 7]"]
267["Sweep Extrusion<br>[2751, 2784, 8]"]
268[Wall]
269["Cap Start"]
270["Cap End"]
271["SweepEdge Opposite"]
272["SweepEdge Adjacent"]
276["Sweep Extrusion<br>[2943, 2977, 7]"]
276["Sweep Extrusion<br>[2943, 2977, 8]"]
277[Wall]
278["Cap Start"]
279["Cap End"]
280["SweepEdge Opposite"]
281["SweepEdge Adjacent"]
292["Sweep Extrusion<br>[4044, 4077, 7]"]
292["Sweep Extrusion<br>[4044, 4077, 8]"]
293[Wall]
294[Wall]
295[Wall]
@ -375,7 +375,7 @@ flowchart LR
313["SweepEdge Adjacent"]
314["SweepEdge Opposite"]
315["SweepEdge Adjacent"]
326["Sweep Extrusion<br>[5146, 5179, 7]"]
326["Sweep Extrusion<br>[5146, 5179, 8]"]
327[Wall]
328[Wall]
329[Wall]
@ -399,25 +399,25 @@ flowchart LR
347["SweepEdge Adjacent"]
348["SweepEdge Opposite"]
349["SweepEdge Adjacent"]
350["StartSketchOnFace<br>[1096, 1128, 4]"]
351["StartSketchOnFace<br>[1351, 1383, 4]"]
352["StartSketchOnFace<br>[1520, 1552, 4]"]
353["StartSketchOnFace<br>[1906, 1938, 4]"]
354["StartSketchOnFace<br>[862, 894, 5]"]
355["StartSketchOnFace<br>[1241, 1273, 5]"]
356["StartSketchOnFace<br>[1705, 1737, 5]"]
357["StartSketchOnFace<br>[873, 907, 6]"]
358["StartSketchOnFace<br>[1106, 1140, 6]"]
359["StartSketchOnFace<br>[1519, 1551, 6]"]
360["StartSketchOnFace<br>[1801, 1833, 6]"]
361["StartSketchOnFace<br>[2346, 2378, 6]"]
362["StartSketchOnFace<br>[1005, 1037, 7]"]
363["StartSketchOnFace<br>[1419, 1451, 7]"]
364["StartSketchOnFace<br>[2027, 2061, 7]"]
365["StartSketchOnFace<br>[2414, 2446, 7]"]
366["StartSketchOnFace<br>[2850, 2884, 7]"]
367["StartSketchOnFace<br>[3018, 3052, 7]"]
368["StartSketchOnFace<br>[4118, 4152, 7]"]
350["StartSketchOnFace<br>[1096, 1128, 5]"]
351["StartSketchOnFace<br>[1351, 1383, 5]"]
352["StartSketchOnFace<br>[1520, 1552, 5]"]
353["StartSketchOnFace<br>[1906, 1938, 5]"]
354["StartSketchOnFace<br>[862, 894, 6]"]
355["StartSketchOnFace<br>[1241, 1273, 6]"]
356["StartSketchOnFace<br>[1705, 1737, 6]"]
357["StartSketchOnFace<br>[873, 907, 7]"]
358["StartSketchOnFace<br>[1106, 1140, 7]"]
359["StartSketchOnFace<br>[1519, 1551, 7]"]
360["StartSketchOnFace<br>[1801, 1833, 7]"]
361["StartSketchOnFace<br>[2346, 2378, 7]"]
362["StartSketchOnFace<br>[1005, 1037, 8]"]
363["StartSketchOnFace<br>[1419, 1451, 8]"]
364["StartSketchOnFace<br>[2027, 2061, 8]"]
365["StartSketchOnFace<br>[2414, 2446, 8]"]
366["StartSketchOnFace<br>[2850, 2884, 8]"]
367["StartSketchOnFace<br>[3018, 3052, 8]"]
368["StartSketchOnFace<br>[4118, 4152, 8]"]
1 --- 2
2 --- 3
2 --- 4

View File

@ -5,18 +5,18 @@ description: Variables in memory after executing multi-axis-robot.kcl
{
"j2RobotArm": {
"type": "Module",
"value": 6
"value": 7
},
"j3RobotArm": {
"type": "Module",
"value": 7
"value": 8
},
"robotArmBase": {
"type": "Module",
"value": 4
"value": 5
},
"rotatingBase": {
"type": "Module",
"value": 5
"value": 6
}
}

View File

@ -1,206 +1,206 @@
```mermaid
flowchart LR
subgraph path2 [Path]
2["Path<br>[537, 630, 5]"]
3["Segment<br>[537, 630, 5]"]
2["Path<br>[537, 630, 6]"]
3["Segment<br>[537, 630, 6]"]
4[Solid2d]
end
subgraph path6 [Path]
6["Path<br>[859, 914, 5]"]
7["Segment<br>[859, 914, 5]"]
6["Path<br>[859, 914, 6]"]
7["Segment<br>[859, 914, 6]"]
8[Solid2d]
end
subgraph path15 [Path]
15["Path<br>[1129, 1188, 5]"]
16["Segment<br>[1129, 1188, 5]"]
15["Path<br>[1129, 1188, 6]"]
16["Segment<br>[1129, 1188, 6]"]
17[Solid2d]
end
subgraph path23 [Path]
23["Path<br>[1290, 1350, 5]"]
24["Segment<br>[1290, 1350, 5]"]
23["Path<br>[1290, 1350, 6]"]
24["Segment<br>[1290, 1350, 6]"]
25[Solid2d]
end
subgraph path31 [Path]
31["Path<br>[1507, 1560, 5]"]
32["Segment<br>[1507, 1560, 5]"]
31["Path<br>[1507, 1560, 6]"]
32["Segment<br>[1507, 1560, 6]"]
33[Solid2d]
end
subgraph path39 [Path]
39["Path<br>[537, 630, 5]"]
40["Segment<br>[537, 630, 5]"]
39["Path<br>[537, 630, 6]"]
40["Segment<br>[537, 630, 6]"]
41[Solid2d]
end
subgraph path43 [Path]
43["Path<br>[859, 914, 5]"]
44["Segment<br>[859, 914, 5]"]
43["Path<br>[859, 914, 6]"]
44["Segment<br>[859, 914, 6]"]
45[Solid2d]
end
subgraph path52 [Path]
52["Path<br>[1129, 1188, 5]"]
53["Segment<br>[1129, 1188, 5]"]
52["Path<br>[1129, 1188, 6]"]
53["Segment<br>[1129, 1188, 6]"]
54[Solid2d]
end
subgraph path60 [Path]
60["Path<br>[1290, 1350, 5]"]
61["Segment<br>[1290, 1350, 5]"]
60["Path<br>[1290, 1350, 6]"]
61["Segment<br>[1290, 1350, 6]"]
62[Solid2d]
end
subgraph path68 [Path]
68["Path<br>[1507, 1560, 5]"]
69["Segment<br>[1507, 1560, 5]"]
68["Path<br>[1507, 1560, 6]"]
69["Segment<br>[1507, 1560, 6]"]
70[Solid2d]
end
subgraph path76 [Path]
76["Path<br>[494, 556, 6]"]
77["Segment<br>[494, 556, 6]"]
76["Path<br>[494, 556, 7]"]
77["Segment<br>[494, 556, 7]"]
78[Solid2d]
end
subgraph path85 [Path]
85["Path<br>[706, 766, 6]"]
86["Segment<br>[706, 766, 6]"]
85["Path<br>[706, 766, 7]"]
86["Segment<br>[706, 766, 7]"]
87[Solid2d]
end
subgraph path93 [Path]
93["Path<br>[355, 407, 7]"]
94["Segment<br>[355, 407, 7]"]
93["Path<br>[355, 407, 8]"]
94["Segment<br>[355, 407, 8]"]
95[Solid2d]
end
subgraph path102 [Path]
102["Path<br>[540, 592, 7]"]
103["Segment<br>[540, 592, 7]"]
102["Path<br>[540, 592, 8]"]
103["Segment<br>[540, 592, 8]"]
104[Solid2d]
end
subgraph path110 [Path]
110["Path<br>[446, 516, 8]"]
111["Segment<br>[446, 516, 8]"]
110["Path<br>[446, 516, 9]"]
111["Segment<br>[446, 516, 9]"]
112[Solid2d]
end
subgraph path121 [Path]
121["Path<br>[780, 867, 8]"]
122["Segment<br>[875, 958, 8]"]
123["Segment<br>[966, 1049, 8]"]
124["Segment<br>[1057, 1140, 8]"]
125["Segment<br>[1148, 1230, 8]"]
126["Segment<br>[1238, 1320, 8]"]
127["Segment<br>[1328, 1335, 8]"]
121["Path<br>[780, 867, 9]"]
122["Segment<br>[875, 958, 9]"]
123["Segment<br>[966, 1049, 9]"]
124["Segment<br>[1057, 1140, 9]"]
125["Segment<br>[1148, 1230, 9]"]
126["Segment<br>[1238, 1320, 9]"]
127["Segment<br>[1328, 1335, 9]"]
128[Solid2d]
end
subgraph path149 [Path]
149["Path<br>[1469, 1538, 8]"]
150["Segment<br>[1469, 1538, 8]"]
149["Path<br>[1469, 1538, 9]"]
150["Segment<br>[1469, 1538, 9]"]
151[Solid2d]
end
subgraph path158 [Path]
158["Path<br>[378, 468, 9]"]
159["Segment<br>[476, 558, 9]"]
160["Segment<br>[566, 648, 9]"]
161["Segment<br>[656, 738, 9]"]
162["Segment<br>[746, 827, 9]"]
163["Segment<br>[835, 916, 9]"]
164["Segment<br>[924, 931, 9]"]
158["Path<br>[378, 468, 10]"]
159["Segment<br>[476, 558, 10]"]
160["Segment<br>[566, 648, 10]"]
161["Segment<br>[656, 738, 10]"]
162["Segment<br>[746, 827, 10]"]
163["Segment<br>[835, 916, 10]"]
164["Segment<br>[924, 931, 10]"]
165[Solid2d]
end
subgraph path187 [Path]
187["Path<br>[1075, 1127, 9]"]
188["Segment<br>[1075, 1127, 9]"]
187["Path<br>[1075, 1127, 10]"]
188["Segment<br>[1075, 1127, 10]"]
189[Solid2d]
end
subgraph path195 [Path]
195["Path<br>[313, 371, 10]"]
196["Segment<br>[313, 371, 10]"]
195["Path<br>[313, 371, 11]"]
196["Segment<br>[313, 371, 11]"]
197[Solid2d]
end
subgraph path204 [Path]
204["Path<br>[510, 565, 10]"]
205["Segment<br>[510, 565, 10]"]
204["Path<br>[510, 565, 11]"]
205["Segment<br>[510, 565, 11]"]
206[Solid2d]
end
subgraph path212 [Path]
212["Path<br>[313, 371, 10]"]
213["Segment<br>[313, 371, 10]"]
212["Path<br>[313, 371, 11]"]
213["Segment<br>[313, 371, 11]"]
214[Solid2d]
end
subgraph path221 [Path]
221["Path<br>[510, 565, 10]"]
222["Segment<br>[510, 565, 10]"]
221["Path<br>[510, 565, 11]"]
222["Segment<br>[510, 565, 11]"]
223[Solid2d]
end
1["Plane<br>[512, 529, 5]"]
5["Plane<br>[834, 851, 5]"]
9["Sweep Extrusion<br>[952, 992, 5]"]
1["Plane<br>[512, 529, 6]"]
5["Plane<br>[834, 851, 6]"]
9["Sweep Extrusion<br>[952, 992, 6]"]
10[Wall]
11["Cap Start"]
12["Cap End"]
13["SweepEdge Opposite"]
14["SweepEdge Adjacent"]
18["Sweep Extrusion<br>[1196, 1233, 5]"]
18["Sweep Extrusion<br>[1196, 1233, 6]"]
19[Wall]
20["Cap End"]
21["SweepEdge Opposite"]
22["SweepEdge Adjacent"]
26["Sweep Extrusion<br>[1358, 1396, 5]"]
26["Sweep Extrusion<br>[1358, 1396, 6]"]
27[Wall]
28["Cap End"]
29["SweepEdge Opposite"]
30["SweepEdge Adjacent"]
34["Sweep Extrusion<br>[1568, 1610, 5]"]
34["Sweep Extrusion<br>[1568, 1610, 6]"]
35[Wall]
36["SweepEdge Opposite"]
37["SweepEdge Adjacent"]
38["Plane<br>[512, 529, 5]"]
42["Plane<br>[834, 851, 5]"]
46["Sweep Extrusion<br>[952, 992, 5]"]
38["Plane<br>[512, 529, 6]"]
42["Plane<br>[834, 851, 6]"]
46["Sweep Extrusion<br>[952, 992, 6]"]
47[Wall]
48["Cap Start"]
49["Cap End"]
50["SweepEdge Opposite"]
51["SweepEdge Adjacent"]
55["Sweep Extrusion<br>[1196, 1233, 5]"]
55["Sweep Extrusion<br>[1196, 1233, 6]"]
56[Wall]
57["Cap End"]
58["SweepEdge Opposite"]
59["SweepEdge Adjacent"]
63["Sweep Extrusion<br>[1358, 1396, 5]"]
63["Sweep Extrusion<br>[1358, 1396, 6]"]
64[Wall]
65["Cap End"]
66["SweepEdge Opposite"]
67["SweepEdge Adjacent"]
71["Sweep Extrusion<br>[1568, 1610, 5]"]
71["Sweep Extrusion<br>[1568, 1610, 6]"]
72[Wall]
73["SweepEdge Opposite"]
74["SweepEdge Adjacent"]
75["Plane<br>[469, 486, 6]"]
79["Sweep Extrusion<br>[564, 600, 6]"]
75["Plane<br>[469, 486, 7]"]
79["Sweep Extrusion<br>[564, 600, 7]"]
80[Wall]
81["Cap Start"]
82["Cap End"]
83["SweepEdge Opposite"]
84["SweepEdge Adjacent"]
88["Sweep Extrusion<br>[774, 811, 6]"]
88["Sweep Extrusion<br>[774, 811, 7]"]
89[Wall]
90["SweepEdge Opposite"]
91["SweepEdge Adjacent"]
92["Plane<br>[330, 347, 7]"]
96["Sweep Extrusion<br>[415, 448, 7]"]
92["Plane<br>[330, 347, 8]"]
96["Sweep Extrusion<br>[415, 448, 8]"]
97[Wall]
98["Cap Start"]
99["Cap End"]
100["SweepEdge Opposite"]
101["SweepEdge Adjacent"]
105["Sweep Extrusion<br>[600, 637, 7]"]
105["Sweep Extrusion<br>[600, 637, 8]"]
106[Wall]
107["SweepEdge Opposite"]
108["SweepEdge Adjacent"]
109["Plane<br>[421, 438, 8]"]
113["Sweep Extrusion<br>[524, 557, 8]"]
109["Plane<br>[421, 438, 9]"]
113["Sweep Extrusion<br>[524, 557, 9]"]
114[Wall]
115["Cap Start"]
116["Cap End"]
117["SweepEdge Opposite"]
118["SweepEdge Adjacent"]
119["EdgeCut Fillet<br>[565, 631, 8]"]
120["EdgeCut Fillet<br>[565, 631, 8]"]
129["Sweep Extrusion<br>[1343, 1383, 8]"]
119["EdgeCut Fillet<br>[565, 631, 9]"]
120["EdgeCut Fillet<br>[565, 631, 9]"]
129["Sweep Extrusion<br>[1343, 1383, 9]"]
130[Wall]
131[Wall]
132[Wall]
@ -220,13 +220,13 @@ flowchart LR
146["SweepEdge Adjacent"]
147["SweepEdge Opposite"]
148["SweepEdge Adjacent"]
152["Sweep Extrusion<br>[1546, 1574, 8]"]
152["Sweep Extrusion<br>[1546, 1574, 9]"]
153[Wall]
154["Cap End"]
155["SweepEdge Opposite"]
156["SweepEdge Adjacent"]
157["Plane<br>[353, 370, 9]"]
166["Sweep Extrusion<br>[939, 972, 9]"]
157["Plane<br>[353, 370, 10]"]
166["Sweep Extrusion<br>[939, 972, 10]"]
167[Wall]
168[Wall]
169[Wall]
@ -247,45 +247,45 @@ flowchart LR
184["SweepEdge Adjacent"]
185["SweepEdge Opposite"]
186["SweepEdge Adjacent"]
190["Sweep Extrusion<br>[1135, 1172, 9]"]
190["Sweep Extrusion<br>[1135, 1172, 10]"]
191[Wall]
192["SweepEdge Opposite"]
193["SweepEdge Adjacent"]
194["Plane<br>[288, 305, 10]"]
198["Sweep Extrusion<br>[379, 410, 10]"]
194["Plane<br>[288, 305, 11]"]
198["Sweep Extrusion<br>[379, 410, 11]"]
199[Wall]
200["Cap Start"]
201["Cap End"]
202["SweepEdge Opposite"]
203["SweepEdge Adjacent"]
207["Sweep Extrusion<br>[573, 605, 10]"]
207["Sweep Extrusion<br>[573, 605, 11]"]
208[Wall]
209["SweepEdge Opposite"]
210["SweepEdge Adjacent"]
211["Plane<br>[288, 305, 10]"]
215["Sweep Extrusion<br>[379, 410, 10]"]
211["Plane<br>[288, 305, 11]"]
215["Sweep Extrusion<br>[379, 410, 11]"]
216[Wall]
217["Cap Start"]
218["Cap End"]
219["SweepEdge Opposite"]
220["SweepEdge Adjacent"]
224["Sweep Extrusion<br>[573, 605, 10]"]
224["Sweep Extrusion<br>[573, 605, 11]"]
225[Wall]
226["SweepEdge Opposite"]
227["SweepEdge Adjacent"]
228["StartSketchOnFace<br>[1087, 1121, 5]"]
229["StartSketchOnFace<br>[1250, 1282, 5]"]
230["StartSketchOnFace<br>[1466, 1499, 5]"]
231["StartSketchOnFace<br>[1087, 1121, 5]"]
232["StartSketchOnFace<br>[1250, 1282, 5]"]
233["StartSketchOnFace<br>[1466, 1499, 5]"]
234["StartSketchOnFace<br>[666, 698, 6]"]
235["StartSketchOnFace<br>[500, 532, 7]"]
236["StartSketchOnFace<br>[740, 772, 8]"]
237["StartSketchOnFace<br>[1431, 1461, 8]"]
238["StartSketchOnFace<br>[1035, 1067, 9]"]
239["StartSketchOnFace<br>[472, 502, 10]"]
240["StartSketchOnFace<br>[472, 502, 10]"]
228["StartSketchOnFace<br>[1087, 1121, 6]"]
229["StartSketchOnFace<br>[1250, 1282, 6]"]
230["StartSketchOnFace<br>[1466, 1499, 6]"]
231["StartSketchOnFace<br>[1087, 1121, 6]"]
232["StartSketchOnFace<br>[1250, 1282, 6]"]
233["StartSketchOnFace<br>[1466, 1499, 6]"]
234["StartSketchOnFace<br>[666, 698, 7]"]
235["StartSketchOnFace<br>[500, 532, 8]"]
236["StartSketchOnFace<br>[740, 772, 9]"]
237["StartSketchOnFace<br>[1431, 1461, 9]"]
238["StartSketchOnFace<br>[1035, 1067, 10]"]
239["StartSketchOnFace<br>[472, 502, 11]"]
240["StartSketchOnFace<br>[472, 502, 11]"]
1 --- 2
2 --- 3
2 --- 4

File diff suppressed because it is too large Load Diff

View File

@ -39,7 +39,7 @@ description: Operations executed pipe-flange-assembly.kcl
"functionSourceRange": [
451,
1670,
5
6
],
"unlabeledArg": null,
"labeledArgs": {},
@ -657,7 +657,7 @@ description: Operations executed pipe-flange-assembly.kcl
"functionSourceRange": [
451,
1670,
5
6
],
"unlabeledArg": null,
"labeledArgs": {},
@ -1275,7 +1275,7 @@ description: Operations executed pipe-flange-assembly.kcl
"functionSourceRange": [
414,
870,
6
7
],
"unlabeledArg": null,
"labeledArgs": {},
@ -1525,7 +1525,7 @@ description: Operations executed pipe-flange-assembly.kcl
"functionSourceRange": [
275,
696,
7
8
],
"unlabeledArg": null,
"labeledArgs": {},
@ -2024,7 +2024,7 @@ description: Operations executed pipe-flange-assembly.kcl
"functionSourceRange": [
365,
1664,
8
9
],
"unlabeledArg": null,
"labeledArgs": {},
@ -2524,7 +2524,7 @@ description: Operations executed pipe-flange-assembly.kcl
"functionSourceRange": [
297,
1231,
9
10
],
"unlabeledArg": null,
"labeledArgs": {},
@ -2839,7 +2839,7 @@ description: Operations executed pipe-flange-assembly.kcl
"functionSourceRange": [
244,
658,
10
11
],
"unlabeledArg": null,
"labeledArgs": {},
@ -3083,7 +3083,7 @@ description: Operations executed pipe-flange-assembly.kcl
"functionSourceRange": [
244,
658,
10
11
],
"unlabeledArg": null,
"labeledArgs": {},

View File

@ -1,59 +1,59 @@
```mermaid
flowchart LR
subgraph path2 [Path]
2["Path<br>[460, 506, 0]"]
3["Segment<br>[512, 565, 0]"]
4["Segment<br>[571, 673, 0]"]
5["Segment<br>[679, 732, 0]"]
6["Segment<br>[738, 785, 0]"]
7["Segment<br>[791, 886, 0]"]
8["Segment<br>[892, 963, 0]"]
9["Segment<br>[969, 1020, 0]"]
10["Segment<br>[1026, 1079, 0]"]
11["Segment<br>[1085, 1154, 0]"]
12["Segment<br>[1160, 1199, 0]"]
13["Segment<br>[1205, 1235, 0]"]
14["Segment<br>[1241, 1271, 0]"]
15["Segment<br>[1277, 1307, 0]"]
16["Segment<br>[1313, 1343, 0]"]
17["Segment<br>[1349, 1378, 0]"]
18["Segment<br>[1384, 1414, 0]"]
19["Segment<br>[1420, 1449, 0]"]
20["Segment<br>[1455, 1484, 0]"]
21["Segment<br>[1490, 1586, 0]"]
22["Segment<br>[1592, 1648, 0]"]
23["Segment<br>[1654, 1661, 0]"]
2["Path<br>[460, 503, 0]"]
3["Segment<br>[509, 562, 0]"]
4["Segment<br>[568, 670, 0]"]
5["Segment<br>[676, 729, 0]"]
6["Segment<br>[735, 782, 0]"]
7["Segment<br>[788, 883, 0]"]
8["Segment<br>[889, 960, 0]"]
9["Segment<br>[966, 1017, 0]"]
10["Segment<br>[1023, 1076, 0]"]
11["Segment<br>[1082, 1151, 0]"]
12["Segment<br>[1157, 1193, 0]"]
13["Segment<br>[1199, 1229, 0]"]
14["Segment<br>[1235, 1265, 0]"]
15["Segment<br>[1271, 1301, 0]"]
16["Segment<br>[1307, 1337, 0]"]
17["Segment<br>[1343, 1372, 0]"]
18["Segment<br>[1378, 1408, 0]"]
19["Segment<br>[1414, 1443, 0]"]
20["Segment<br>[1449, 1478, 0]"]
21["Segment<br>[1484, 1580, 0]"]
22["Segment<br>[1586, 1642, 0]"]
23["Segment<br>[1648, 1655, 0]"]
24[Solid2d]
end
subgraph path85 [Path]
85["Path<br>[1759, 1803, 0]"]
86["Segment<br>[1809, 1871, 0]"]
87["Segment<br>[1877, 1990, 0]"]
88["Segment<br>[1996, 2116, 0]"]
89["Segment<br>[2122, 2178, 0]"]
90["Segment<br>[2184, 2191, 0]"]
85["Path<br>[1753, 1797, 0]"]
86["Segment<br>[1803, 1865, 0]"]
87["Segment<br>[1871, 1984, 0]"]
88["Segment<br>[1990, 2110, 0]"]
89["Segment<br>[2116, 2172, 0]"]
90["Segment<br>[2178, 2185, 0]"]
91[Solid2d]
end
subgraph path107 [Path]
107["Path<br>[2290, 2335, 0]"]
108["Segment<br>[2341, 2401, 0]"]
109["Segment<br>[2407, 2520, 0]"]
110["Segment<br>[2526, 2646, 0]"]
111["Segment<br>[2652, 2708, 0]"]
112["Segment<br>[2714, 2721, 0]"]
107["Path<br>[2284, 2329, 0]"]
108["Segment<br>[2335, 2395, 0]"]
109["Segment<br>[2401, 2514, 0]"]
110["Segment<br>[2520, 2640, 0]"]
111["Segment<br>[2646, 2702, 0]"]
112["Segment<br>[2708, 2715, 0]"]
113[Solid2d]
end
subgraph path129 [Path]
129["Path<br>[2819, 2864, 0]"]
130["Segment<br>[2870, 2937, 0]"]
131["Segment<br>[2943, 3056, 0]"]
132["Segment<br>[3062, 3182, 0]"]
133["Segment<br>[3188, 3244, 0]"]
134["Segment<br>[3250, 3257, 0]"]
129["Path<br>[2813, 2858, 0]"]
130["Segment<br>[2864, 2931, 0]"]
131["Segment<br>[2937, 3050, 0]"]
132["Segment<br>[3056, 3176, 0]"]
133["Segment<br>[3182, 3238, 0]"]
134["Segment<br>[3244, 3251, 0]"]
135[Solid2d]
end
1["Plane<br>[437, 454, 0]"]
25["Sweep Extrusion<br>[1675, 1705, 0]"]
25["Sweep Extrusion<br>[1669, 1699, 0]"]
26[Wall]
27[Wall]
28[Wall]
@ -113,7 +113,7 @@ flowchart LR
82["SweepEdge Adjacent"]
83["SweepEdge Opposite"]
84["SweepEdge Adjacent"]
92["Sweep Extrusion<br>[2205, 2236, 0]"]
92["Sweep Extrusion<br>[2199, 2230, 0]"]
93[Wall]
94[Wall]
95[Wall]
@ -128,7 +128,7 @@ flowchart LR
104["SweepEdge Adjacent"]
105["SweepEdge Opposite"]
106["SweepEdge Adjacent"]
114["Sweep Extrusion<br>[2736, 2767, 0]"]
114["Sweep Extrusion<br>[2730, 2761, 0]"]
115[Wall]
116[Wall]
117[Wall]
@ -143,7 +143,7 @@ flowchart LR
126["SweepEdge Adjacent"]
127["SweepEdge Opposite"]
128["SweepEdge Adjacent"]
136["Sweep Extrusion<br>[3271, 3301, 0]"]
136["Sweep Extrusion<br>[3265, 3295, 0]"]
137[Wall]
138[Wall]
139[Wall]
@ -158,9 +158,9 @@ flowchart LR
148["SweepEdge Adjacent"]
149["SweepEdge Opposite"]
150["SweepEdge Adjacent"]
151["StartSketchOnFace<br>[1719, 1753, 0]"]
152["StartSketchOnFace<br>[2250, 2284, 0]"]
153["StartSketchOnFace<br>[2781, 2813, 0]"]
151["StartSketchOnFace<br>[1713, 1747, 0]"]
152["StartSketchOnFace<br>[2244, 2278, 0]"]
153["StartSketchOnFace<br>[2775, 2807, 0]"]
1 --- 2
2 --- 3
2 --- 4

View File

@ -7,36 +7,36 @@ flowchart LR
5["Segment<br>[705, 781, 0]"]
6["Segment<br>[787, 856, 0]"]
7["Segment<br>[862, 902, 0]"]
8["Segment<br>[908, 947, 0]"]
9["Segment<br>[987, 1017, 0]"]
10["Segment<br>[1023, 1052, 0]"]
11["Segment<br>[1058, 1087, 0]"]
12["Segment<br>[1093, 1122, 0]"]
13["Segment<br>[1128, 1228, 0]"]
14["Segment<br>[1234, 1290, 0]"]
15["Segment<br>[1296, 1303, 0]"]
8["Segment<br>[908, 944, 0]"]
9["Segment<br>[984, 1014, 0]"]
10["Segment<br>[1020, 1049, 0]"]
11["Segment<br>[1055, 1084, 0]"]
12["Segment<br>[1090, 1119, 0]"]
13["Segment<br>[1125, 1225, 0]"]
14["Segment<br>[1231, 1287, 0]"]
15["Segment<br>[1293, 1300, 0]"]
16[Solid2d]
end
subgraph path52 [Path]
52["Path<br>[1458, 1558, 0]"]
53["Segment<br>[1564, 1611, 0]"]
54["Segment<br>[1617, 1732, 0]"]
55["Segment<br>[1738, 1858, 0]"]
56["Segment<br>[1864, 1920, 0]"]
57["Segment<br>[1926, 1933, 0]"]
52["Path<br>[1455, 1555, 0]"]
53["Segment<br>[1561, 1608, 0]"]
54["Segment<br>[1614, 1729, 0]"]
55["Segment<br>[1735, 1855, 0]"]
56["Segment<br>[1861, 1917, 0]"]
57["Segment<br>[1923, 1930, 0]"]
58[Solid2d]
end
subgraph path74 [Path]
74["Path<br>[2090, 2189, 0]"]
75["Segment<br>[2195, 2241, 0]"]
76["Segment<br>[2247, 2339, 0]"]
77["Segment<br>[2345, 2442, 0]"]
78["Segment<br>[2448, 2504, 0]"]
79["Segment<br>[2510, 2517, 0]"]
74["Path<br>[2087, 2186, 0]"]
75["Segment<br>[2192, 2238, 0]"]
76["Segment<br>[2244, 2336, 0]"]
77["Segment<br>[2342, 2439, 0]"]
78["Segment<br>[2445, 2501, 0]"]
79["Segment<br>[2507, 2514, 0]"]
80[Solid2d]
end
1["Plane<br>[484, 501, 0]"]
17["Sweep Extrusion<br>[1346, 1376, 0]"]
17["Sweep Extrusion<br>[1343, 1373, 0]"]
18[Wall]
19[Wall]
20[Wall]
@ -71,7 +71,7 @@ flowchart LR
49["SweepEdge Opposite"]
50["SweepEdge Adjacent"]
51["SweepEdge Opposite"]
59["Sweep Extrusion<br>[1977, 2009, 0]"]
59["Sweep Extrusion<br>[1974, 2006, 0]"]
60[Wall]
61[Wall]
62[Wall]
@ -86,7 +86,7 @@ flowchart LR
71["SweepEdge Adjacent"]
72["SweepEdge Opposite"]
73["SweepEdge Adjacent"]
81["Sweep Extrusion<br>[2560, 2592, 0]"]
81["Sweep Extrusion<br>[2557, 2589, 0]"]
82[Wall]
83[Wall]
84[Wall]
@ -101,8 +101,8 @@ flowchart LR
93["SweepEdge Adjacent"]
94["SweepEdge Opposite"]
95["SweepEdge Adjacent"]
96["StartSketchOnFace<br>[1418, 1452, 0]"]
97["StartSketchOnFace<br>[2050, 2084, 0]"]
96["StartSketchOnFace<br>[1415, 1449, 0]"]
97["StartSketchOnFace<br>[2047, 2081, 0]"]
1 --- 2
2 --- 3
2 --- 4

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