Compare commits

...

12 Commits

Author SHA1 Message Date
e7d00f148b transform after fillet bug fix (#5882)
* fixes

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

* updates

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

* updates

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

* rotate

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

* updates

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

* updates

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

* its not jsut translate

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

* its not jsut translate

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

* fix

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

---------

Signed-off-by: Jess Frazelle <github@jessfraz.com>
2025-03-19 12:28:56 -07:00
d19a7df7e8 Tag and name end and start caps (#5874)
* initial commit

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

* updates

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

* update for revolve

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

* updates

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

* fixes

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

* fixes

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

---------

Signed-off-by: Jess Frazelle <github@jessfraz.com>
2025-03-19 19:18:19 +00:00
45fae52afc bump kcl friends (#5887)
* bump kcl friends

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

* update lock

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

* A snapshot a day keeps the bugs away! 📷🐛

* A snapshot a day keeps the bugs away! 📷🐛

---------

Signed-off-by: Jess Frazelle <github@jessfraz.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-03-19 11:22:36 -07:00
270f173aad fix unwrap causing panic (#5886)
updates

Signed-off-by: Jess Frazelle <github@jessfraz.com>
2025-03-19 10:19:19 -07:00
ddcff1ba63 Fix the dev target dependency name (#5879) 2025-03-19 16:49:15 +00:00
max
cb1b08d6b6 Add modelingWorkflows module with resilient update pattern for adding features (#5821)
* rule them all

* swap AST updater

* add test

* yellow colour fix

* A snapshot a day keeps the bugs away! 📷🐛

* A snapshot a day keeps the bugs away! 📷🐛

* A snapshot a day keeps the bugs away! 📷🐛

* A snapshot a day keeps the bugs away! 📷🐛

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-03-19 17:48:29 +01:00
533fa749b2 Add ability to create named constant without code (#5840)
* Add support for forcing kcl input create variable

* Command palette padding tweak

* Make traverse function work for ExpressionStatements

* Add utilities for getting earliest safe index in AST

* Fix the insertIndex logic to not be based on the selection anymore

* Add workflow to create a named constant

* Fix bug with nameEndInDigits matcher

* Tweak command config

* Add a three-dot menu to feature tree pane to create parameters

* Add E2E test for create parameter flow

* Remove edit flow oops

* Fix tsc error

* Fix E2E test

* Update named constant position in edit flow test

* Add tags into consideration for safe insert index

Per @Irev-dev's helpful feedback, with unit tests!
2025-03-19 15:58:53 +00:00
af492d2cb6 Add 9 test fixmes (#5872)
* Add 4 test fixmes

* Add 3 more test fixmes

* Another one

* Last one yo
2025-03-19 07:58:55 -04:00
26fba71abf Revolve changed to kw args (#5873)
* initial port

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

* updates

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

* more fixes

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

* fix e2e

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

* more fixes

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

* updates

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

* update js side

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

* updates

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

* fixes

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

* fix;

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

* cleanup

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-18 20:34:44 -07:00
859bfc7b28 move export to the rust side to make the interface way more clean (#5855)
* move export

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

testing

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

remove debugs

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

fix main

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

updates

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

fices

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

get rid of logs

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

* Convert async actions anti-pattern to fromPromise actors

* Fix tsc by removing a generic type

* updates

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

* updates

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

* cleanup

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

* cleanup

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

* Update rustContext.ts

* fix

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

* fix;

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

* cleanup

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

* remove weird file

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

* fix

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

* updates

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

---------

Signed-off-by: Jess Frazelle <github@jessfraz.com>
Co-authored-by: Frank Noirot <frankjohnson1993@gmail.com>
2025-03-18 20:25:51 -07:00
3b1d1307c4 transform a sketch (#5867)
* transform a sketch

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

* updates

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

* fix test

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

* updates

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

* A snapshot a day keeps the bugs away! 📷🐛

* A snapshot a day keeps the bugs away! 📷🐛

* A snapshot a day keeps the bugs away! 📷🐛

* A snapshot a day keeps the bugs away! 📷🐛

* updates

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

* A snapshot a day keeps the bugs away! 📷🐛

* A snapshot a day keeps the bugs away! 📷🐛

* updates

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

---------

Signed-off-by: Jess Frazelle <github@jessfraz.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-03-18 16:36:48 -07:00
f5a2c84ce2 Revolve around sketch line (#5870)
* show we can revolve around paths

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

* show we can revolve around paths

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

* updates

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

* A snapshot a day keeps the bugs away! 📷🐛

* A snapshot a day keeps the bugs away! 📷🐛

---------

Signed-off-by: Jess Frazelle <github@jessfraz.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-03-18 13:51:24 -07:00
244 changed files with 53792 additions and 24631 deletions

View File

@ -4,7 +4,7 @@ KCL_WASM_LIB_FILES := $(wildcard rust/**/*.rs)
TS_SRC := $(wildcard src/**/*.tsx) $(wildcard src/**/*.ts)
XSTATE_TYPEGENS := $(wildcard src/machines/*.typegen.ts)
dev: node_modules public/wasm_lib_bg.wasm $(XSTATE_TYPEGENS)
dev: node_modules public/kcl_wasm_lib_bg.wasm $(XSTATE_TYPEGENS)
yarn start
# I'm sorry this is so specific to my setup you may as well ignore this.

View File

@ -54,7 +54,7 @@ example = extrude(exampleSketch, length = 5)
// Add color to a revolved solid.
sketch001 = startSketchOn('XY')
|> circle(center = [15, 0], radius = 5)
|> revolve({ angle = 360, axis = 'y' }, %)
|> revolve(angle = 360, axis = 'y')
|> appearance(color = '#ff0000', metalness = 90, roughness = 90)
```

View File

@ -12,6 +12,8 @@ You can provide more than one sketch to extrude, and they will all be extruded i
extrude(
sketches: [Sketch],
length: number,
tagStart?: TagDeclarator,
tagEnd?: TagDeclarator,
): [Solid]
```
@ -22,6 +24,8 @@ extrude(
|----------|------|-------------|----------|
| `sketches` | [`[Sketch]`](/docs/kcl/types/Sketch) | Which sketch or sketches should be extruded | Yes |
| `length` | [`number`](/docs/kcl/types/number) | How far to extrude the given sketches | Yes |
| `tagStart` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | A named tag for the face at the start of the extrusion, i.e. the original sketch | No |
| `tagEnd` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | A named tag for the face at the end of the extrusion, i.e. the new face created by extruding the original sketch | No |
### Returns

View File

@ -15,6 +15,8 @@ loft(
bezApproximateRational: bool,
baseCurveIndex?: integer,
tolerance?: number,
tagStart?: TagDeclarator,
tagEnd?: TagDeclarator,
): Solid
```
@ -28,6 +30,8 @@ loft(
| `bezApproximateRational` | [`bool`](/docs/kcl/types/bool) | Attempt to approximate rational curves (such as arcs) using a bezier. This will remove banding around interpolations between arcs and non-arcs. It may produce errors in other scenarios Over time, this field won't be necessary. | Yes |
| `baseCurveIndex` | `integer` | This can be set to override the automatically determined topological base curve, which is usually the first section encountered. | No |
| `tolerance` | [`number`](/docs/kcl/types/number) | Tolerance for the loft operation. | No |
| `tagStart` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | A named tag for the face at the start of the loft, i.e. the original sketch | No |
| `tagEnd` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | A named tag for the face at the end of the loft, i.e. the last sketch | No |
### Returns

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,10 +1,10 @@
---
title: "scale"
excerpt: "Scale a solid."
excerpt: "Scale a solid or a sketch."
layout: manual
---
Scale a solid.
Scale a solid or a sketch.
By default the transform is applied in local sketch axis, therefore the origin will not move.
@ -12,10 +12,10 @@ If you want to apply the transform in global space, set `global` to `true`. The
```js
scale(
solids: SolidOrImportedGeometry,
objects: SolidOrSketchOrImportedGeometry,
scale: [number],
global?: bool,
): SolidOrImportedGeometry
): SolidOrSketchOrImportedGeometry
```
@ -23,13 +23,13 @@ scale(
| Name | Type | Description | Required |
|----------|------|-------------|----------|
| `solids` | [`SolidOrImportedGeometry`](/docs/kcl/types/SolidOrImportedGeometry) | The solid or set of solids to scale. | Yes |
| `objects` | [`SolidOrSketchOrImportedGeometry`](/docs/kcl/types/SolidOrSketchOrImportedGeometry) | The solid, sketch, or set of solids or sketches to scale. | Yes |
| `scale` | [`[number]`](/docs/kcl/types/number) | The scale factor for the x, y, and z axes. | Yes |
| `global` | [`bool`](/docs/kcl/types/bool) | 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. | No |
### Returns
[`SolidOrImportedGeometry`](/docs/kcl/types/SolidOrImportedGeometry) - Data for a solid or an imported geometry.
[`SolidOrSketchOrImportedGeometry`](/docs/kcl/types/SolidOrSketchOrImportedGeometry) - Data for a solid or an imported geometry.
### Examples

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -16,6 +16,8 @@ sweep(
path: SweepPath,
sectional?: bool,
tolerance?: number,
tagStart?: TagDeclarator,
tagEnd?: TagDeclarator,
): [Solid]
```
@ -28,6 +30,8 @@ sweep(
| `path` | [`SweepPath`](/docs/kcl/types/SweepPath) | The path to sweep the sketch along | Yes |
| `sectional` | [`bool`](/docs/kcl/types/bool) | If true, the sweep will be broken up into sub-sweeps (extrusions, revolves, sweeps) based on the trajectory path components. | No |
| `tolerance` | [`number`](/docs/kcl/types/number) | Tolerance for this operation | No |
| `tagStart` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | A named tag for the face at the start of the sweep, i.e. the original sketch | No |
| `tagEnd` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | A named tag for the face at the end of the sweep | No |
### Returns

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,66 @@
---
title: "SolidOrSketchOrImportedGeometry"
excerpt: "Data for a solid or an imported geometry."
layout: manual
---
Data for a solid or an imported geometry.
**This schema accepts exactly one of the following:**
Data for an imported geometry.
**Type:** `object`
## Properties
| Property | Type | Description | Required |
|----------|------|-------------|----------|
| `type` |enum: `importedGeometry`| | No |
| `id` |[`string`](/docs/kcl/types/string)| The ID of the imported geometry. | No |
| `value` |`[` [`string`](/docs/kcl/types/string) `]`| The original file paths. | No |
----
**Type:** `[object, array]`
`[` [`Solid`](/docs/kcl/types/Solid) `]`
## Properties
| Property | Type | Description | Required |
|----------|------|-------------|----------|
| `type` |enum: `solidSet`| | No |
----
**Type:** `[object, array]`
`[` [`Sketch`](/docs/kcl/types/Sketch) `]`
## Properties
| Property | Type | Description | Required |
|----------|------|-------------|----------|
| `type` |enum: `sketchSet`| | No |
----

View File

@ -2,7 +2,7 @@ import { test, expect } from './zoo-test'
import * as fsp from 'fs/promises'
import { executorInputPath, getUtils } from './test-utils'
import { KCL_DEFAULT_LENGTH } from 'lib/constants'
import path from 'path'
import path, { join } from 'path'
test.describe('Command bar tests', { tag: ['@skipWin'] }, () => {
test('Extrude from command bar selects extrude line after', async ({
@ -487,4 +487,53 @@ test.describe('Command bar tests', { tag: ['@skipWin'] }, () => {
await toolbar.expectFileTreeState(['main.kcl', 'test.kcl'])
})
})
test(`Can add a named parameter or constant`, async ({
page,
homePage,
context,
cmdBar,
scene,
editor,
}) => {
const projectName = 'test'
const beforeKclCode = `a = 5
b = a * a
c = 3 + a`
await context.folderSetupFn(async (dir) => {
const testProject = join(dir, projectName)
await fsp.mkdir(testProject, { recursive: true })
await fsp.writeFile(join(testProject, 'main.kcl'), beforeKclCode, 'utf-8')
})
await homePage.openProject(projectName)
// TODO: you probably shouldn't need an engine connection to add a parameter,
// but you do because all modeling commands have that requirement
await scene.settled(cmdBar)
await test.step(`Go through the command palette flow`, async () => {
await cmdBar.cmdBarOpenBtn.click()
await cmdBar.chooseCommand('create parameter')
await cmdBar.expectState({
stage: 'arguments',
commandName: 'Create parameter',
currentArgKey: 'value',
currentArgValue: '5',
headerArguments: {
Value: '',
},
highlightedHeaderArg: 'value',
})
await cmdBar.argumentInput.locator('[contenteditable]').fill(`b - 5`)
// TODO: we have no loading indicator for the KCL argument input calculation
await page.waitForTimeout(100)
await cmdBar.progressCmdBar()
await cmdBar.expectState({
stage: 'commandBarClosed',
})
})
await editor.expectEditor.toContain(
`a = 5b = a * amyParameter001 = b - 5c = 3 + a`
)
})
})

View File

@ -726,10 +726,10 @@ test.describe('Editor tests', { tag: ['@skipWin'] }, () => {
|> line(end = [2, 0])
|> line(end = [0, -10])
|> close()
|> revolve({
axis: revolveAxis,
angle: 90
}, %)
|> revolve(
axis = revolveAxis,
angle = 90
)
`
)
})

View File

@ -21,7 +21,7 @@ sketch001 = startSketchOn('XZ')
|> angledLine([-45, length001], %)
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
revolve001 = revolve({ axis = "X" }, sketch001)
revolve001 = revolve(sketch001, axis = "X")
triangle()
|> extrude(length = 30)
plane001 = offsetPlane('XY', offset = 10)
@ -126,7 +126,7 @@ test.describe('Feature Tree pane', () => {
await testViewSource({
operationName: 'Revolve',
operationIndex: 0,
expectedActiveLine: 'revolve001 = revolve({ axis = "X" }, sketch001)',
expectedActiveLine: 'revolve001 = revolve(sketch001, axis = "X")',
})
await testViewSource({
operationName: 'Triangle',
@ -231,10 +231,10 @@ test.describe('Feature Tree pane', () => {
|> circle(center = [0, 0], radius = 5)
renamedExtrude = extrude(sketch001, length = ${initialInput})`
const newConstantName = 'distance001'
const expectedCode = `sketch001 = startSketchOn('XZ')
const expectedCode = `${newConstantName} = 23
sketch001 = startSketchOn('XZ')
|> circle(center = [0, 0], radius = 5)
${newConstantName} = 23
renamedExtrude = extrude(sketch001, length = ${newConstantName})`
renamedExtrude = extrude(sketch001, length = ${newConstantName})`
await context.folderSetupFn(async (dir) => {
const testDir = join(dir, 'test-sample')

View File

@ -850,159 +850,157 @@ openSketch = startSketchOn('XY')
})
})
test(`Shift-click to select and deselect sketch segments`, async ({
page,
homePage,
scene,
editor,
}) => {
// Locators
const firstPointLocation = { x: 200, y: 100 }
const secondPointLocation = { x: 800, y: 100 }
const thirdPointLocation = { x: 800, y: 400 }
const fristSegmentLocation = { x: 750, y: 100 }
const secondSegmentLocation = { x: 800, y: 150 }
const planeLocation = { x: 700, y: 200 }
test.fixme(
`Shift-click to select and deselect sketch segments`,
async ({ page, homePage, scene, editor }) => {
// Locators
const firstPointLocation = { x: 200, y: 100 }
const secondPointLocation = { x: 800, y: 100 }
const thirdPointLocation = { x: 800, y: 400 }
const fristSegmentLocation = { x: 750, y: 100 }
const secondSegmentLocation = { x: 800, y: 150 }
const planeLocation = { x: 700, y: 200 }
// Click helpers
const [clickFirstPoint] = scene.makeMouseHelpers(
firstPointLocation.x,
firstPointLocation.y
)
const [clickSecondPoint] = scene.makeMouseHelpers(
secondPointLocation.x,
secondPointLocation.y
)
const [clickThirdPoint] = scene.makeMouseHelpers(
thirdPointLocation.x,
thirdPointLocation.y
)
const [clickFirstSegment] = scene.makeMouseHelpers(
fristSegmentLocation.x,
fristSegmentLocation.y
)
const [clickSecondSegment] = scene.makeMouseHelpers(
secondSegmentLocation.x,
secondSegmentLocation.y
)
const [clickPlane] = scene.makeMouseHelpers(
planeLocation.x,
planeLocation.y
)
// Colors
const edgeColorWhite: [number, number, number] = [220, 220, 220]
const edgeColorBlue: [number, number, number] = [20, 20, 200]
const backgroundColor: [number, number, number] = [30, 30, 30]
const tolerance = 40
const timeout = 150
// Setup
await test.step(`Initial test setup`, async () => {
await page.setBodyDimensions({ width: 1000, height: 500 })
await homePage.goToModelingScene()
// Wait for the scene and stream to load
await scene.expectPixelColor(
backgroundColor,
secondPointLocation,
tolerance
// Click helpers
const [clickFirstPoint] = scene.makeMouseHelpers(
firstPointLocation.x,
firstPointLocation.y
)
const [clickSecondPoint] = scene.makeMouseHelpers(
secondPointLocation.x,
secondPointLocation.y
)
const [clickThirdPoint] = scene.makeMouseHelpers(
thirdPointLocation.x,
thirdPointLocation.y
)
const [clickFirstSegment] = scene.makeMouseHelpers(
fristSegmentLocation.x,
fristSegmentLocation.y
)
const [clickSecondSegment] = scene.makeMouseHelpers(
secondSegmentLocation.x,
secondSegmentLocation.y
)
const [clickPlane] = scene.makeMouseHelpers(
planeLocation.x,
planeLocation.y
)
})
await test.step('Select and deselect a single sketch segment', async () => {
await test.step('Get into sketch mode', async () => {
await editor.closePane()
await page.waitForTimeout(timeout)
await page.getByRole('button', { name: 'Start Sketch' }).click()
await page.waitForTimeout(timeout)
await clickPlane()
await page.waitForTimeout(1000)
})
await test.step('Draw sketch', async () => {
await clickFirstPoint()
await page.waitForTimeout(timeout)
await clickSecondPoint()
await page.waitForTimeout(timeout)
await clickThirdPoint()
await page.waitForTimeout(timeout)
})
await test.step('Deselect line tool', async () => {
const btnLine = page.getByTestId('line')
const btnLineAriaPressed = await btnLine.getAttribute('aria-pressed')
if (btnLineAriaPressed === 'true') {
await btnLine.click()
}
await page.waitForTimeout(timeout)
})
await test.step('Select the first segment', async () => {
await page.waitForTimeout(timeout)
await clickFirstSegment()
await page.waitForTimeout(timeout)
// Colors
const edgeColorWhite: [number, number, number] = [220, 220, 220]
const edgeColorBlue: [number, number, number] = [20, 20, 200]
const backgroundColor: [number, number, number] = [30, 30, 30]
const tolerance = 40
const timeout = 150
// Setup
await test.step(`Initial test setup`, async () => {
await page.setBodyDimensions({ width: 1000, height: 500 })
await homePage.goToModelingScene()
// Wait for the scene and stream to load
await scene.expectPixelColor(
edgeColorBlue,
fristSegmentLocation,
tolerance
)
await scene.expectPixelColor(
edgeColorWhite,
secondSegmentLocation,
backgroundColor,
secondPointLocation,
tolerance
)
})
await test.step('Select the second segment (Shift-click)', async () => {
await page.keyboard.down('Shift')
await page.waitForTimeout(timeout)
await clickSecondSegment()
await page.waitForTimeout(timeout)
await page.keyboard.up('Shift')
await scene.expectPixelColor(
edgeColorBlue,
fristSegmentLocation,
tolerance
)
await scene.expectPixelColor(
edgeColorBlue,
secondSegmentLocation,
tolerance
)
await test.step('Select and deselect a single sketch segment', async () => {
await test.step('Get into sketch mode', async () => {
await editor.closePane()
await page.waitForTimeout(timeout)
await page.getByRole('button', { name: 'Start Sketch' }).click()
await page.waitForTimeout(timeout)
await clickPlane()
await page.waitForTimeout(1000)
})
await test.step('Draw sketch', async () => {
await clickFirstPoint()
await page.waitForTimeout(timeout)
await clickSecondPoint()
await page.waitForTimeout(timeout)
await clickThirdPoint()
await page.waitForTimeout(timeout)
})
await test.step('Deselect line tool', async () => {
const btnLine = page.getByTestId('line')
const btnLineAriaPressed = await btnLine.getAttribute('aria-pressed')
if (btnLineAriaPressed === 'true') {
await btnLine.click()
}
await page.waitForTimeout(timeout)
})
await test.step('Select the first segment', async () => {
await page.waitForTimeout(timeout)
await clickFirstSegment()
await page.waitForTimeout(timeout)
await scene.expectPixelColor(
edgeColorBlue,
fristSegmentLocation,
tolerance
)
await scene.expectPixelColor(
edgeColorWhite,
secondSegmentLocation,
tolerance
)
})
await test.step('Select the second segment (Shift-click)', async () => {
await page.keyboard.down('Shift')
await page.waitForTimeout(timeout)
await clickSecondSegment()
await page.waitForTimeout(timeout)
await page.keyboard.up('Shift')
await scene.expectPixelColor(
edgeColorBlue,
fristSegmentLocation,
tolerance
)
await scene.expectPixelColor(
edgeColorBlue,
secondSegmentLocation,
tolerance
)
})
await test.step('Deselect the first segment', async () => {
await page.keyboard.down('Shift')
await page.waitForTimeout(timeout)
await clickFirstSegment()
await page.waitForTimeout(timeout)
await page.keyboard.up('Shift')
await scene.expectPixelColor(
edgeColorWhite,
fristSegmentLocation,
tolerance
)
await scene.expectPixelColor(
edgeColorBlue,
secondSegmentLocation,
tolerance
)
})
await test.step('Deselect the second segment', async () => {
await page.keyboard.down('Shift')
await page.waitForTimeout(timeout)
await clickSecondSegment()
await page.waitForTimeout(timeout)
await page.keyboard.up('Shift')
await scene.expectPixelColor(
edgeColorWhite,
fristSegmentLocation,
tolerance
)
await scene.expectPixelColor(
edgeColorWhite,
secondSegmentLocation,
tolerance
)
})
})
await test.step('Deselect the first segment', async () => {
await page.keyboard.down('Shift')
await page.waitForTimeout(timeout)
await clickFirstSegment()
await page.waitForTimeout(timeout)
await page.keyboard.up('Shift')
await scene.expectPixelColor(
edgeColorWhite,
fristSegmentLocation,
tolerance
)
await scene.expectPixelColor(
edgeColorBlue,
secondSegmentLocation,
tolerance
)
})
await test.step('Deselect the second segment', async () => {
await page.keyboard.down('Shift')
await page.waitForTimeout(timeout)
await clickSecondSegment()
await page.waitForTimeout(timeout)
await page.keyboard.up('Shift')
await scene.expectPixelColor(
edgeColorWhite,
fristSegmentLocation,
tolerance
)
await scene.expectPixelColor(
edgeColorWhite,
secondSegmentLocation,
tolerance
)
})
})
})
}
)
test(`Offset plane point-and-click`, async ({
context,
@ -1880,6 +1878,119 @@ fillet04 = fillet(extrude001, radius = 5, tags = [getOppositeEdge(seg02)])
})
})
test(`Fillet with large radius should update code even if engine fails`, async ({
context,
page,
homePage,
scene,
editor,
toolbar,
cmdBar,
}) => {
// Create a cube with small edges that will cause some fillets to fail
const initialCode = `sketch001 = startSketchOn('XY')
profile001 = startProfileAt([0, 0], sketch001)
|> yLine(length = -1)
|> xLine(length = -10)
|> yLine(length = 10)
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
extrude001 = extrude(profile001, length = 5)
`
const taggedSegment = `yLine(length = -1, tag = $seg01)`
const filletExpression = `fillet(radius = 1000, tags = [getNextAdjacentEdge(seg01)])`
// Locators
const edgeLocation = { x: 659, y: 313 }
const bodyLocation = { x: 594, y: 313 }
// Colors
const edgeColorWhite: [number, number, number] = [248, 248, 248]
const edgeColorYellow: [number, number, number] = [251, 251, 120] // Mac:B=251,251,90 Ubuntu:240,241,180, Windows:240,241,180
const backgroundColor: [number, number, number] = [30, 30, 30]
const bodyColor: [number, number, number] = [155, 155, 155]
const lowTolerance = 20
const highTolerance = 70
// Setup
await test.step(`Initial test setup`, async () => {
await context.addInitScript((initialCode) => {
localStorage.setItem('persistCode', initialCode)
}, initialCode)
await page.setBodyDimensions({ width: 1000, height: 500 })
await homePage.goToModelingScene()
// verify modeling scene is loaded
await scene.expectPixelColor(backgroundColor, edgeLocation, lowTolerance)
// wait for stream to load
await scene.expectPixelColor(bodyColor, bodyLocation, highTolerance)
})
// Test
await test.step('Select edges and apply oversized fillet', async () => {
await test.step(`Select the edge`, async () => {
await scene.expectPixelColor(edgeColorWhite, edgeLocation, lowTolerance)
const [clickOnTheEdge] = scene.makeMouseHelpers(
edgeLocation.x,
edgeLocation.y
)
await clickOnTheEdge()
await scene.expectPixelColor(
edgeColorYellow,
edgeLocation,
highTolerance // Ubuntu color mismatch can require high tolerance
)
})
await test.step(`Apply fillet`, async () => {
await page.waitForTimeout(100)
await toolbar.filletButton.click()
await cmdBar.expectState({
commandName: 'Fillet',
highlightedHeaderArg: 'selection',
currentArgKey: 'selection',
currentArgValue: '',
headerArguments: {
Selection: '',
Radius: '',
},
stage: 'arguments',
})
await cmdBar.progressCmdBar()
await cmdBar.expectState({
commandName: 'Fillet',
highlightedHeaderArg: 'radius',
currentArgKey: 'radius',
currentArgValue: '5',
headerArguments: {
Selection: '1 sweepEdge',
Radius: '',
},
stage: 'arguments',
})
// Set a large radius (1000)
await cmdBar.currentArgumentInput.locator('.cm-content').fill('1000')
await cmdBar.progressCmdBar()
await cmdBar.expectState({
commandName: 'Fillet',
headerArguments: {
Selection: '1 sweepEdge',
Radius: '1000',
},
stage: 'review',
})
// Apply fillet with large radius
await cmdBar.progressCmdBar()
})
})
await test.step('Verify code is updated regardless of execution errors', async () => {
await editor.expectEditor.toContain(taggedSegment)
await editor.expectEditor.toContain(filletExpression)
})
})
test(`Chamfer point-and-click`, async ({
context,
page,
@ -2810,7 +2921,7 @@ segAng(rectangleSegmentA002),
await cmdBar.progressCmdBar()
await cmdBar.progressCmdBar()
const newCodeToFind = `revolve001 = revolve({ angle = 360, axis = 'X' }, sketch002)`
const newCodeToFind = `revolve001 = revolve(sketch002, angle = 360, axis = 'X')`
expect(editor.expectEditor.toContain(newCodeToFind)).toBeTruthy()
})
test('revolve surface around edge from an extruded solid2d', async ({
@ -2860,7 +2971,7 @@ radius = 8.69
await page.getByText(lineCodeToSelection).click()
await cmdBar.progressCmdBar()
const newCodeToFind = `revolve001 = revolve({angle = 360, axis = getOppositeEdge(rectangleSegmentA001)}, sketch002) `
const newCodeToFind = `revolve001 = revolve(sketch002, angle = 360, axis = getOppositeEdge(rectangleSegmentA001)) `
expect(editor.expectEditor.toContain(newCodeToFind)).toBeTruthy()
})
test('revolve sketch circle around line segment from startProfileAt sketch', async ({
@ -2911,7 +3022,7 @@ radius = 8.69
await page.getByText(lineCodeToSelection).click()
await cmdBar.progressCmdBar()
const newCodeToFind = `revolve001 = revolve({ angle = 360, axis = seg01 }, sketch003)`
const newCodeToFind = `revolve001 = revolve(sketch003, angle = 360, axis = seg01)`
expect(editor.expectEditor.toContain(newCodeToFind)).toBeTruthy()
})
})

View File

@ -196,64 +196,60 @@ test.describe('Prompt-to-edit tests', { tag: '@skipWin' }, () => {
})
})
test(`manual code selection rename`, async ({
context,
homePage,
cmdBar,
editor,
page,
scene,
}) => {
const body1CapCoords = { x: 571, y: 311 }
test.fixme(
`manual code selection rename`,
async ({ context, homePage, cmdBar, editor, page, scene }) => {
const body1CapCoords = { x: 571, y: 311 }
await context.addInitScript((file) => {
localStorage.setItem('persistCode', file)
}, file)
await homePage.goToModelingScene()
await scene.waitForExecutionDone()
await context.addInitScript((file) => {
localStorage.setItem('persistCode', file)
}, file)
await homePage.goToModelingScene()
await scene.waitForExecutionDone()
const submittingToast = page.getByText('Submitting to Text-to-CAD API...')
const successToast = page.getByText('Prompt to edit successful')
const acceptBtn = page.getByRole('button', { name: 'checkmark Accept' })
const submittingToast = page.getByText('Submitting to Text-to-CAD API...')
const successToast = page.getByText('Prompt to edit successful')
const acceptBtn = page.getByRole('button', { name: 'checkmark Accept' })
await test.step('wait for scene to load and select code in editor', async () => {
// Find and select the text "sketch002" in the editor
await editor.selectText('sketch002')
await test.step('wait for scene to load and select code in editor', async () => {
// Find and select the text "sketch002" in the editor
await editor.selectText('sketch002')
// Verify the selection was made
await editor.expectState({
highlightedCode: '',
activeLines: ["sketch002 = startSketchOn('XZ')"],
diagnostics: [],
// Verify the selection was made
await editor.expectState({
highlightedCode: '',
activeLines: ["sketch002 = startSketchOn('XZ')"],
diagnostics: [],
})
})
})
await test.step('fire off edit prompt', async () => {
await scene.expectPixelColor([134, 134, 134], body1CapCoords, 15)
await cmdBar.openCmdBar('promptToEdit')
await page
.getByTestId('cmd-bar-arg-value')
.fill('Please rename to mySketch001')
await page.waitForTimeout(100)
await cmdBar.progressCmdBar()
await expect(submittingToast).toBeVisible()
await expect(submittingToast).not.toBeVisible({
timeout: 2 * 60_000,
await test.step('fire off edit prompt', async () => {
await scene.expectPixelColor([134, 134, 134], body1CapCoords, 15)
await cmdBar.openCmdBar('promptToEdit')
await page
.getByTestId('cmd-bar-arg-value')
.fill('Please rename to mySketch001')
await page.waitForTimeout(100)
await cmdBar.progressCmdBar()
await expect(submittingToast).toBeVisible()
await expect(submittingToast).not.toBeVisible({
timeout: 2 * 60_000,
})
await expect(successToast).toBeVisible()
})
await expect(successToast).toBeVisible()
})
await test.step('verify rename change and accept it', async () => {
await editor.expectEditor.toContain('mySketch001 = startSketchOn')
await editor.expectEditor.not.toContain('sketch002 = startSketchOn')
await editor.expectEditor.toContain(
'extrude002 = extrude(mySketch001, length = 50)'
)
await test.step('verify rename change and accept it', async () => {
await editor.expectEditor.toContain('mySketch001 = startSketchOn')
await editor.expectEditor.not.toContain('sketch002 = startSketchOn')
await editor.expectEditor.toContain(
'extrude002 = extrude(mySketch001, length = 50)'
)
await acceptBtn.click()
await expect(successToast).not.toBeVisible()
})
})
await acceptBtn.click()
await expect(successToast).not.toBeVisible()
})
}
)
test('multiple body selections', async ({
context,

View File

@ -405,8 +405,9 @@ extrude001 = extrude(sketch001, length = 50)
await expect(successToastMessage).toBeVisible()
}
)
// We updated this test such that you can have multiple exports going at once.
test(
'ensure you can not export while an export is already going',
'ensure you CAN export while an export is already going',
{ tag: ['@skipLinux', '@skipWin'] },
async ({ page, homePage }) => {
const u = await getUtils(page)
@ -441,22 +442,13 @@ extrude001 = extrude(sketch001, length = 50)
const alreadyExportingToastMessage = page.getByText(`Already exporting`)
const successToastMessage = page.getByText(`Exported successfully`)
await test.step('Blocked second export', async () => {
await test.step('second export', async () => {
await clickExportButton(page)
await expect(exportingToastMessage).toBeVisible()
await clickExportButton(page)
await test.step('The second export is blocked', async () => {
// Find the toast.
// Look out for the toast message
await Promise.all([
expect(exportingToastMessage.first()).toBeVisible(),
expect(alreadyExportingToastMessage).toBeVisible(),
])
})
await test.step('The first export still succeeds', async () => {
await Promise.all([
expect(exportingToastMessage).not.toBeVisible({ timeout: 15_000 }),
@ -486,12 +478,12 @@ extrude001 = extrude(sketch001, length = 50)
expect(alreadyExportingToastMessage).not.toBeVisible(),
])
await expect(successToastMessage).toBeVisible()
await expect(successToastMessage).toHaveCount(2)
})
}
)
test(
test.fixme(
`Network health indicator only appears in modeling view`,
{ tag: '@electron' },
async ({ context, page }, testInfo) => {

View File

@ -187,7 +187,7 @@ sketch001 = startProfileAt([12.34, -12.34], sketch002)
page.getByRole('button', { name: 'Start Sketch' })
).toBeVisible()
})
test.describe('Can edit segments by dragging their handles', () => {
test.fixme('Can edit segments by dragging their handles', () => {
const doEditSegmentsByDraggingHandle = async (
page: Page,
homePage: HomePageFixture,
@ -666,7 +666,7 @@ sketch001 = startProfileAt([12.34, -12.34], sketch002)
|> line(end = [12.73, -0.09])
|> tangentialArcTo([24.95, -5.38], %)
|> close()
|> revolve({ axis = "X",}, %)`
|> revolve(axis = "X")`
)
})
@ -753,7 +753,7 @@ sketch001 = startProfileAt([12.34, -12.34], sketch002)
|> tangentialArcTo([24.95, -5.38], %)
|> line(end = [1.97, 2.06])
|> close()
|> revolve({ axis = "X" }, %)`)
|> revolve(axis = "X")`)
})
test('Can add multiple sketches', async ({ page, homePage }) => {
const u = await getUtils(page)
@ -1200,7 +1200,7 @@ profile001 = startProfileAt([${roundOff(scale * 69.6)}, ${roundOff(
|> xLine(endAbsolute = 0 + .001)
|> yLine(endAbsolute = 0)
|> close()
|> revolve({ axis = "Y" }, %)
|> revolve(axis = "Y")
return lugSketch
}
@ -1454,7 +1454,7 @@ test.describe(`Sketching with offset planes`, () => {
})
test.describe('multi-profile sketching', () => {
test(
test.fixme(
`test it removes half-finished expressions when changing tools in sketch mode`,
{ tag: ['@skipWin'] },
async ({ context, page, scene, toolbar, editor, homePage, cmdBar }) => {
@ -2570,10 +2570,11 @@ profile006 = startProfileAt([9.65, 3.82], sketch002)
|> line(end = [2.13, -5.57])
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
revolve001 = revolve({
revolve001 = revolve(
profile004,
angle = 45,
axis = getNextAdjacentEdge(seg01)
}, profile004)
)
extrude002 = extrude(profile006, length = 4)
sketch003 = startSketchOn('-XZ')
profile007 = startProfileAt([4.8, 7.55], sketch003)
@ -2608,7 +2609,7 @@ profile011 = startProfileAt([5.07, -6.39], sketch003)
|> close()
extrude003 = extrude(profile011, length = 2.5)
// TODO this breaks the test,
// revolve002 = revolve({ angle = 45, axis = seg02 }, profile008)
// revolve002 = revolve(profile008, angle = 45, axis = seg02)
`
)
})

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 68 KiB

View File

@ -142,10 +142,10 @@ sketch001 = startSketchOn(box, revolveAxis)
|> line(end = [2, 0])
|> line(end = [0, -10])
|> close()
|> revolve({
axis: revolveAxis,
angle: 90
}, %)
|> revolve(
axis = revolveAxis,
angle = 90
)
sketch001 = startSketchOn('XZ')
|> startProfileAt([0.0, 0.0], %)

View File

@ -3,7 +3,7 @@ import { commonPoints, getUtils } from './test-utils'
import { EngineCommand } from 'lang/std/artifactGraph'
import { uuidv4 } from 'lib/utils'
test.describe('Test network and connection issues', () => {
test.fixme('Test network and connection issues', () => {
test(
'simulate network down and network little widget',
{ tag: '@skipLocalEngine' },

View File

@ -323,7 +323,7 @@ part009 = startSketchOn('XY')
|> line(end = [0, pipeLength])
|> angledLineToX({ angle = 60, to = pipeLargeDia }, %)
|> close()
rev = revolve({ axis = 'y' }, part009)
rev = revolve(part009, axis = 'y')
sketch006 = startSketchOn('XY')
profile001 = circle(
sketch006,
@ -379,7 +379,7 @@ profile003 = startProfileAt([40.16, -120.48], sketch006)
await page.waitForTimeout(200)
await expect(u.codeLocator).not.toContainText(
`rev = revolve({ axis: 'y' }, part009)`
`rev = revolve(part009, axis: 'y')`
)
// FIXME (commented section below), this test would select a wall that had a sketch on it, and delete the underlying extrude
@ -451,19 +451,15 @@ profile003 = startProfileAt([40.16, -120.48], sketch006)
await page.waitForTimeout(200)
await expect(u.codeLocator).not.toContainText(codeToBeDeletedSnippet)
})
test('parent Solid should be select and deletable and uses custom planes to position children', async ({
page,
homePage,
scene,
cmdBar,
editor,
}) => {
test.setTimeout(90_000)
const u = await getUtils(page)
await page.addInitScript(async () => {
localStorage.setItem(
'persistCode',
`part001 = startSketchOn('XY')
test.fixme(
'parent Solid should be select and deletable and uses custom planes to position children',
async ({ page, homePage, scene, cmdBar, editor }) => {
test.setTimeout(90_000)
const u = await getUtils(page)
await page.addInitScript(async () => {
localStorage.setItem(
'persistCode',
`part001 = startSketchOn('XY')
yo = startProfileAt([4.83, 12.56], part001)
|> line(end = [15.1, 2.48])
|> line(end = [3.15, -9.85], tag = $seg01)
@ -494,34 +490,35 @@ profile001 = startProfileAt([7.49, 9.96], sketch001)
|> close()
`
)
}, KCL_DEFAULT_LENGTH)
await page.setBodyDimensions({ width: 1000, height: 500 })
await homePage.goToModelingScene()
await scene.settled(cmdBar)
const extrudeWall = { x: 575, y: 238 }
// DELETE with selection on face of parent
await page.mouse.click(extrudeWall.x, extrudeWall.y)
await page.waitForTimeout(100)
await expect(page.locator('.cm-activeLine')).toHaveText(
'|> line(end = [-15.17, -4.1])'
)
}, KCL_DEFAULT_LENGTH)
await page.setBodyDimensions({ width: 1000, height: 500 })
await u.openAndClearDebugPanel()
await page.keyboard.press('Delete')
await u.expectCmdLog('[data-message-type="execution-done"]', 10_000)
await page.waitForTimeout(200)
await homePage.goToModelingScene()
await scene.settled(cmdBar)
const extrudeWall = { x: 575, y: 238 }
// DELETE with selection on face of parent
await page.mouse.click(extrudeWall.x, extrudeWall.y)
await page.waitForTimeout(100)
await expect(page.locator('.cm-activeLine')).toHaveText(
'|> line(end = [-15.17, -4.1])'
)
await u.openAndClearDebugPanel()
await page.keyboard.press('Delete')
await u.expectCmdLog('[data-message-type="execution-done"]', 10_000)
await page.waitForTimeout(200)
await editor.expectEditor.not.toContain(`yoo = extrude(yo, length = 4)`, {
shouldNormalise: true,
})
await editor.expectEditor.toContain(`startSketchOn({plane={origin`, {
shouldNormalise: true,
})
await editor.snapshot()
})
await editor.expectEditor.not.toContain(`yoo = extrude(yo, length = 4)`, {
shouldNormalise: true,
})
await editor.expectEditor.toContain(`startSketchOn({plane={origin`, {
shouldNormalise: true,
})
await editor.snapshot()
}
)
test('Hovering over 3d features highlights code, clicking puts the cursor in the right place and sends selection id to engine', async ({
page,
homePage,

View File

@ -977,67 +977,63 @@ fn cube`
/**
* This test assumes that the default value of the "highlight edges" setting is "on".
*/
test(`Toggle stream settings multiple times`, async ({
page,
scene,
homePage,
context,
toolbar,
cmdBar,
}, testInfo) => {
await context.folderSetupFn(async (dir) => {
const projectDir = join(dir, 'project-000')
await fsp.mkdir(projectDir, { recursive: true })
await fsp.copyFile(
executorInputPath('cube.kcl'),
join(projectDir, 'main.kcl')
)
})
test.fixme(
`Toggle stream settings multiple times`,
async ({ page, scene, homePage, context, toolbar, cmdBar }, testInfo) => {
await context.folderSetupFn(async (dir) => {
const projectDir = join(dir, 'project-000')
await fsp.mkdir(projectDir, { recursive: true })
await fsp.copyFile(
executorInputPath('cube.kcl'),
join(projectDir, 'main.kcl')
)
})
await test.step(`First snapshot`, async () => {
await homePage.openProject('project-000')
await toolbar.closePane('code')
await expect(toolbar.startSketchBtn).toBeEnabled({ timeout: 20_000 })
await scene.clickNoWhere()
})
await test.step(`First snapshot`, async () => {
await homePage.openProject('project-000')
await toolbar.closePane('code')
await expect(toolbar.startSketchBtn).toBeEnabled({ timeout: 20_000 })
await scene.clickNoWhere()
})
const toast = (value: boolean) =>
page.getByText(
`Set highlight edges to "${String(value)}" as a user default`
const toast = (value: boolean) =>
page.getByText(
`Set highlight edges to "${String(value)}" as a user default`
)
await test.step(`Toggle highlightEdges off`, async () => {
await cmdBar.openCmdBar()
await cmdBar.chooseCommand('Settings · modeling · highlight edges')
await cmdBar.selectOption({ name: 'off' }).click()
const falseToast = toast(false)
await expect(falseToast).toBeVisible()
await falseToast.waitFor({ state: 'detached' })
})
await expect(scene.streamWrapper).not.toHaveScreenshot(
'toggle-settings-initial.png',
{
maxDiffPixels: 15,
mask: [page.getByTestId('model-state-indicator')],
}
)
await test.step(`Toggle highlightEdges off`, async () => {
await cmdBar.openCmdBar()
await cmdBar.chooseCommand('Settings · modeling · highlight edges')
await cmdBar.selectOption({ name: 'off' }).click()
const falseToast = toast(false)
await expect(falseToast).toBeVisible()
await falseToast.waitFor({ state: 'detached' })
})
await test.step(`Toggle highlightEdges on`, async () => {
await cmdBar.openCmdBar()
await cmdBar.chooseCommand('Settings · modeling · highlight edges')
await cmdBar.selectOption({ name: 'on' }).click()
const trueToast = toast(true)
await expect(trueToast).toBeVisible()
await trueToast.waitFor({ state: 'detached' })
})
await expect(scene.streamWrapper).not.toHaveScreenshot(
'toggle-settings-initial.png',
{
maxDiffPixels: 15,
mask: [page.getByTestId('model-state-indicator')],
}
)
await test.step(`Toggle highlightEdges on`, async () => {
await cmdBar.openCmdBar()
await cmdBar.chooseCommand('Settings · modeling · highlight edges')
await cmdBar.selectOption({ name: 'on' }).click()
const trueToast = toast(true)
await expect(trueToast).toBeVisible()
await trueToast.waitFor({ state: 'detached' })
})
await expect(scene.streamWrapper).toHaveScreenshot(
'toggle-settings-initial.png',
{
maxDiffPixels: 15,
mask: [page.getByTestId('model-state-indicator')],
}
)
})
await expect(scene.streamWrapper).toHaveScreenshot(
'toggle-settings-initial.png',
{
maxDiffPixels: 15,
mask: [page.getByTestId('model-state-indicator')],
}
)
}
)
})

View File

@ -619,7 +619,7 @@ async function sendPromptFromCommandBar(page: Page, promptStr: string) {
})
}
test(
test.fixme(
'Text-to-CAD functionality',
{ tag: '@electron' },
async ({ context, page }, testInfo) => {

View File

@ -36,6 +36,7 @@
"@xstate/inspect": "^0.8.0",
"@xstate/react": "^4.1.1",
"bonjour-service": "^1.3.0",
"bson": "^6.10.3",
"chokidar": "^4.0.1",
"codemirror": "^6.0.1",
"decamelize": "^6.0.0",
@ -212,6 +213,7 @@
"typescript-eslint": "^8.26.1",
"vite": "^5.4.12",
"vite-plugin-package-version": "^1.1.0",
"vite-plugin-top-level-await": "^1.5.0",
"vite-tsconfig-paths": "^4.3.2",
"vitest": "^1.6.1",
"vitest-webgl-canvas-mock": "^1.1.0",

View File

@ -41,7 +41,7 @@ ballsSketch = startSketchOn("XY")
|> close()
// Revolve the ball to make a sphere and pattern around the inside wall
balls = revolve({ axis = "X" }, ballsSketch)
balls = revolve(ballsSketch, axis = "X")
|> patternCircular3d(
arcDegrees = 360,
axis = [0, 0, 1],
@ -66,7 +66,7 @@ chainSketch = startSketchOn("XY")
|> close()
// Revolve the chain sketch
chainHead = revolve({ axis = "X" }, chainSketch)
chainHead = revolve(chainSketch, axis = "X")
|> patternCircular3d(
arcDegrees = 360,
axis = [0, 0, 1],
@ -86,7 +86,7 @@ linkSketch = startSketchOn("XZ")
)
// Revolve the link sketch
linkRevolve = revolve({ axis = 'Y', angle = 360 / nBalls }, linkSketch)
linkRevolve = revolve(linkSketch, axis = 'Y', angle = 360 / nBalls)
|> patternCircular3d(
arcDegrees = 360,
axis = [0, 0, 1],

View File

@ -82,5 +82,5 @@ brakeCaliperSketch = startSketchOn('XY')
|> close()
// Revolve the brake caliper sketch
revolve({ axis = "Y", angle = -70 }, brakeCaliperSketch)
revolve(brakeCaliperSketch, axis = "Y", angle = -70)
|> appearance(color = "#c82d2d", metalness = 90, roughness = 90)

View File

@ -40,5 +40,5 @@ tireSketch = startSketchOn("XY")
|> close()
// Revolve the sketch to create the tire
revolve({ axis = "Y" }, tireSketch)
revolve(tireSketch, axis = "Y")
|> appearance(color = "#0f0f0f", roughness = 80)

View File

@ -74,7 +74,7 @@ wheelCenterInner = startSketchOn('XY')
|> yLine(endAbsolute = 0)
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
|> revolve({ axis = 'y' }, %)
|> revolve(axis = 'y')
|> appearance(color = "#ffffff", metalness = 0, roughness = 0)
wheelCenterOuter = startSketchOn('XY')
@ -88,7 +88,7 @@ wheelCenterOuter = startSketchOn('XY')
|> yLine(endAbsolute = -wheelWidth / 20)
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
|> revolve({ axis = 'y' }, %)
|> revolve(axis = 'y')
|> appearance(color = "#ffffff", metalness = 0, roughness = 0)
// Write a function that defines the spoke geometry, patterns and extrudes it
@ -193,5 +193,5 @@ startSketchOn('XY')
|> xLine(length = wheelWidth * 0.03)
|> yLine(length = wheelWidth * 0.05)
|> close()
|> revolve({ axis = 'y' }, %)
|> revolve(axis = 'y')
|> appearance(color = "#ffffff", metalness = 0, roughness = 0)

View File

@ -34,7 +34,7 @@ fn lug(plane, length, diameter) {
|> xLine(endAbsolute = lugThreadDiameter)
|> yLine(endAbsolute = 0)
|> close()
|> revolve({ axis = "Y" }, %)
|> revolve(axis = "Y")
|> appearance(color = "#dbcd70", roughness = 90, metalness = 90)
return lugSketch
}

View File

@ -4,7 +4,7 @@
// Set units
@settings(defaultLengthUnit = in)
import 'car-wheel.kcl' as carWheel
import 'car-wheel.kcl' as carWheel
import 'car-rotor.kcl' as carRotor
import "brake-caliper.kcl" as brakeCaliper
import 'lug-nut.kcl' as lugNut

View File

@ -23,7 +23,7 @@ sketch001 = startSketchOn('XZ')
], %, $rectangleSegmentC001)
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
|> revolve({ angle = 360, axis = 'Y' }, %)
|> revolve(angle = 360, axis = 'Y')
// Create an angled plane to sketch the supports
plane001 = {
@ -135,7 +135,7 @@ sketch005 = startSketchOn('XZ')
|> xLine(endAbsolute = 0.15)
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
|> revolve({ axis = 'y' }, %)
|> revolve(axis = 'y')
// Plunger and stem
sketch006 = startSketchOn('XZ')
@ -148,7 +148,7 @@ sketch006 = startSketchOn('XZ')
|> tangentialArc({ radius = 0.6, offset = -90 }, %)
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
|> revolve({ axis = 'y' }, %)
|> revolve(axis = 'y')
// Spiral plate
sketch007 = startSketchOn(offsetPlane('XY', offset = 1.12))
@ -210,7 +210,7 @@ sketch011 = startSketchOn('XZ')
}, %)
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
|> revolve({ axis = 'y' }, %)
|> revolve(axis = 'y')
// Draw and extrude handle
sketch012 = startSketchOn(offsetPlane('XZ', offset = handleThickness / 2))

View File

@ -55,7 +55,7 @@ axis000 = {
}
// create a single corner of the bin
singleCorner = revolve({ angle = -90, axis = axis000 }, face(offsetPlane("YZ", offset = cornerRadius)))
singleCorner = revolve(face(offsetPlane("YZ", offset = cornerRadius)), angle = -90, axis = axis000)
// create the corners of the bin
corners = patternCircular3d(

View File

@ -52,7 +52,7 @@ axis000 = {
}
// create a single corner of the bin
singleCorner = revolve({ angle = -90, axis = axis000 }, face(offsetPlane("YZ", offset = cornerRadius)))
singleCorner = revolve(face(offsetPlane("YZ", offset = cornerRadius)), angle = -90, axis = axis000)
// create the corners of the bin
corners = patternCircular3d(

View File

@ -75,7 +75,7 @@ axis000 = {
}
// create a single corner of the bin
singleCorner = revolve({ angle = -90, axis = axis000 }, face(offsetPlane("YZ", offset = cornerRadius + binTol)))
singleCorner = revolve(face(offsetPlane("YZ", offset = cornerRadius + binTol)), angle = -90, axis = axis000)
// create the corners of the bin
corners = patternCircular3d(
@ -291,10 +291,10 @@ axis001 = {
}
// create a single corner of the bin
lipSingleLengthCorner = revolve({ angle = -90, axis = axis001 }, lipFace(plane000))
lipSingleLengthCorner = revolve(lipFace(plane000), angle = -90, axis = axis001)
// create a single corner of the bin
lipSingleWidthCorner = revolve({ angle = 90, axis = axis001 }, lipFace(plane002))
lipSingleWidthCorner = revolve(lipFace(plane002), angle = 90, axis = axis001)
// create the corners of the bin
lipCorners000 = patternCircular3d(

View File

@ -68,7 +68,7 @@ axis000 = {
}
// create a single corner of the bin
singleCorner = revolve({ angle = -90, axis = axis000 }, face(offsetPlane("YZ", offset = cornerRadius + binTol)))
singleCorner = revolve(face(offsetPlane("YZ", offset = cornerRadius + binTol)), angle = -90, axis = axis000)
// create the corners of the bin
corners = patternCircular3d(

View File

@ -190,7 +190,7 @@ pipe = startSketchOn('XY')
|> line(end = [0, -1])
|> angledLine({ angle = 240, length = .5 }, %)
|> close()
|> revolve({ axis = 'y' }, %)
|> revolve(axis = 'y')
|> appearance(color = "#7b79d7")
// Sketch and extrude the wall

View File

@ -32,4 +32,4 @@ pipeProfile = outerProfile
|> hole(innerProfile, %)
// revolve the pipe profile at the desired angle
pipe = revolve({ axis = "Y", angle = bendAngle }, pipeProfile)
pipe = revolve(pipeProfile, axis = "Y", angle = bendAngle)

View File

@ -33,4 +33,4 @@ pipeSketch = startSketchOn('XY')
|> close()
// Revolve the sketch to create the pipe
pipe = revolve({ axis = 'y' }, pipeSketch)
pipe = revolve(pipeSketch, axis = 'y')

View File

@ -30,7 +30,8 @@ sketch001 = startSketchOn("-YZ")
|> yLine(endAbsolute = segEndY(seg01))
|> angledLineToY({ angle = 180 - 60, to = 0 }, %)
|> close()
part001 = revolve({
part001 = revolve(
sketch001,
angle = 90,
axis = {
custom = {
@ -38,7 +39,7 @@ part001 = revolve({
origin = [0.0, height + .0001]
}
}
}, sketch001)
)
sketch002 = startSketchOn('-YZ')
|> startProfileAt([wallsWidth / 2, 0], %)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 29 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -3073,7 +3073,7 @@ DATA;
#3057 = CARTESIAN_POINT('NONE', (0.051104890518972546, -0.039940414856583686, -0.0635));
#3058 = CARTESIAN_POINT('NONE', (0.052242074077479335, -0.038876903045998674, -0.0635));
#3059 = CARTESIAN_POINT('NONE', (0.05224392753122875, -0.03887516966712757, -0.0635));
#3060 = CARTESIAN_POINT('NONE', (0.05311532463588208, -0.03767579444673181, -0.0635));
#3060 = CARTESIAN_POINT('NONE', (0.05311532463588208, -0.03767579444673182, -0.0635));
#3061 = CARTESIAN_POINT('NONE', (0.05311674489404425, -0.03767383962907501, -0.0635));
#3062 = CARTESIAN_POINT('NONE', (0.053776795686355607, -0.03626367057234418, -0.0635));
#3063 = CARTESIAN_POINT('NONE', (0.05377787147891932, -0.036261372189549286, -0.0635));
@ -3087,7 +3087,7 @@ DATA;
#3071 = CARTESIAN_POINT('NONE', (0.053252818350252196, -0.029748655756475863, -0.0635));
#3072 = CARTESIAN_POINT('NONE', (0.05233460363130192, -0.028414043632913145, -0.0635));
#3073 = CARTESIAN_POINT('NONE', (0.05233310706682834, -0.028411868397590818, -0.0635));
#3074 = CARTESIAN_POINT('NONE', (0.05123295226616701, -0.02734405921816657, -0.0635));
#3074 = CARTESIAN_POINT('NONE', (0.051232952266167, -0.02734405921816657, -0.0635));
#3075 = CARTESIAN_POINT('NONE', (0.05123115916423111, -0.027342318835171704, -0.0635));
#3076 = CARTESIAN_POINT('NONE', (0.0499865731843106, -0.02652506813979786, -0.0635));
#3077 = CARTESIAN_POINT('NONE', (0.049984544679296, -0.026523736132881105, -0.0635));
@ -3105,7 +3105,7 @@ DATA;
#3089 = CARTESIAN_POINT('NONE', (0.0407616757108459, -0.02775624333996861, -0.0635));
#3090 = CARTESIAN_POINT('NONE', (0.03976400232776854, -0.0288872140372878, -0.0635));
#3091 = CARTESIAN_POINT('NONE', (0.03976237625653429, -0.028889057364922765, -0.0635));
#3092 = B_SPLINE_CURVE_WITH_KNOTS('NONE', 2, (#3029, #3030, #3031, #3032, #3033, #3034, #3035, #3036, #3037, #3038, #3039, #3040, #3041, #3042, #3043, #3044, #3045, #3046, #3047, #3048, #3049, #3050, #3051, #3052, #3053, #3054, #3055, #3056, #3057, #3058, #3059, #3060, #3061, #3062, #3063, #3064, #3065, #3066, #3067, #3068, #3069, #3070, #3071, #3072, #3073, #3074, #3075, #3076, #3077, #3078, #3079, #3080, #3081, #3082, #3083, #3084, #3085, #3086, #3087, #3088, #3089, #3090, #3091), .UNSPECIFIED., .F., .F., (3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3), (-1, -0.9836065573770492, -0.9672131147540983, -0.9508196721311475, -0.9344262295081968, -0.9180327868852459, -0.9016393442622951, -0.8852459016393442, -0.8688524590163934, -0.8524590163934427, -0.8360655737704918, -0.819672131147541, -0.8032786885245902, -0.7868852459016393, -0.7704918032786885, -0.7540983606557377, -0.7377049180327868, -0.721311475409836, -0.7049180327868853, -0.6885245901639344, -0.6721311475409836, -0.6557377049180328, -0.639344262295082, -0.6229508196721312, -0.6065573770491803, -0.5901639344262295, -0.5737704918032787, -0.5573770491803278, -0.540983606557377, -0.5245901639344261, -0.5081967213114753, -0.49180327868852464, -0.4754098360655738, -0.45901639344262296, -0.4426229508196722, -0.42622950819672134, -0.4098360655737705, -0.39344262295081966, -0.3770491803278689, -0.36065573770491804, -0.3442622950819672, -0.3278688524590164, -0.3114754098360656, -0.29508196721311475, -0.27868852459016397, -0.26229508196721313, -0.24590163934426232, -0.22950819672131148, -0.21311475409836067, -0.19672131147540983, -0.18032786885245902, -0.1639344262295082, -0.14754098360655737, -0.13114754098360656, -0.11475409836065574, -0.09836065573770492, -0.0819672131147541, -0.06557377049180328, -0.04918032786885246, -0.03278688524590164, -0.01639344262295082, -0), .UNSPECIFIED.);
#3092 = B_SPLINE_CURVE_WITH_KNOTS('NONE', 2, (#3029, #3030, #3031, #3032, #3033, #3034, #3035, #3036, #3037, #3038, #3039, #3040, #3041, #3042, #3043, #3044, #3045, #3046, #3047, #3048, #3049, #3050, #3051, #3052, #3053, #3054, #3055, #3056, #3057, #3058, #3059, #3060, #3061, #3062, #3063, #3064, #3065, #3066, #3067, #3068, #3069, #3070, #3071, #3072, #3073, #3074, #3075, #3076, #3077, #3078, #3079, #3080, #3081, #3082, #3083, #3084, #3085, #3086, #3087, #3088, #3089, #3090, #3091), .UNSPECIFIED., .F., .F., (3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3), (0, 0.01639344262295082, 0.03278688524590164, 0.04918032786885246, 0.06557377049180328, 0.0819672131147541, 0.09836065573770492, 0.11475409836065574, 0.13114754098360656, 0.14754098360655737, 0.1639344262295082, 0.18032786885245902, 0.19672131147540983, 0.21311475409836067, 0.22950819672131148, 0.24590163934426232, 0.26229508196721313, 0.27868852459016397, 0.29508196721311475, 0.3114754098360656, 0.3278688524590164, 0.3442622950819672, 0.36065573770491804, 0.3770491803278689, 0.39344262295081966, 0.4098360655737705, 0.42622950819672134, 0.4426229508196722, 0.45901639344262296, 0.4754098360655738, 0.49180327868852464, 0.5081967213114753, 0.5245901639344261, 0.540983606557377, 0.5573770491803278, 0.5737704918032787, 0.5901639344262295, 0.6065573770491803, 0.6229508196721312, 0.639344262295082, 0.6557377049180328, 0.6721311475409836, 0.6885245901639344, 0.7049180327868853, 0.721311475409836, 0.7377049180327868, 0.7540983606557377, 0.7704918032786885, 0.7868852459016393, 0.8032786885245902, 0.819672131147541, 0.8360655737704918, 0.8524590163934427, 0.8688524590163934, 0.8852459016393442, 0.9016393442622951, 0.9180327868852459, 0.9344262295081968, 0.9508196721311475, 0.9672131147540983, 0.9836065573770492, 1), .UNSPECIFIED.);
#3093 = DIRECTION('NONE', (0, 0, 1));
#3094 = VECTOR('NONE', #3093, 1);
#3095 = CARTESIAN_POINT('NONE', (0.03976237625653429, -0.028889057364922765, -0.063501));

View File

@ -39,7 +39,7 @@ DATA;
#23 = VERTEX_POINT('NONE', #22);
#24 = CARTESIAN_POINT('NONE', (0.009555193704377126, 0.0381, 0.01030836525700516));
#25 = VERTEX_POINT('NONE', #24);
#26 = CARTESIAN_POINT('NONE', (0.011810999999999978, 0, -0.007619999999999995));
#26 = CARTESIAN_POINT('NONE', (0.011810999999999981, 0, -0.0076199999999999974));
#27 = VERTEX_POINT('NONE', #26);
#28 = CARTESIAN_POINT('NONE', (0.0037719, 0, -0));
#29 = VERTEX_POINT('NONE', #28);
@ -95,7 +95,7 @@ DATA;
#63 = AXIS2_PLACEMENT_3D('NONE', #62, #61, #60);
#64 = CIRCLE('NONE', #63, 0.00762);
#65 = CARTESIAN_POINT('NONE', (-0.008420618915550801, 0.0381, -0.011114374012594288));
#66 = CARTESIAN_POINT('NONE', (-0.016775317593923766, 0.01905, -0.003827032886274202));
#66 = CARTESIAN_POINT('NONE', (-0.016775317593923773, 0.01905, -0.003827032886274202));
#67 = CARTESIAN_POINT('NONE', (-0.012407746826993343, -0, 0.006362700000000004));
#68 = (
BOUNDED_CURVE()
@ -106,18 +106,18 @@ DATA;
RATIONAL_B_SPLINE_CURVE((1, 1, 1))
REPRESENTATION_ITEM('NONE')
);
#69 = DIRECTION('NONE', (-0.8660254037844387, 0, -0.49999999999999967));
#69 = DIRECTION('NONE', (-0.8660254037844388, 0, -0.4999999999999997));
#70 = DIRECTION('NONE', (0, 1, 0));
#71 = CARTESIAN_POINT('NONE', (-0.005808633250155917, -0, 0.010172700000000003));
#71 = CARTESIAN_POINT('NONE', (-0.0058086332501559165, -0, 0.010172700000000003));
#72 = AXIS2_PLACEMENT_3D('NONE', #71, #70, #69);
#73 = CIRCLE('NONE', #72, 0.007620000000000003);
#73 = CIRCLE('NONE', #72, 0.007620000000000002);
#74 = DIRECTION('NONE', (-0.3420201433256678, 0, 0.9396926207859089));
#75 = DIRECTION('NONE', (0, 1.0000000000000002, -0));
#76 = CARTESIAN_POINT('NONE', (-0.004068275783674349, 0.0381, -0.023072338489143286));
#77 = AXIS2_PLACEMENT_3D('NONE', #76, #75, #74);
#78 = CIRCLE('NONE', #77, 0.012725399999999994);
#79 = CARTESIAN_POINT('NONE', (0.004111453664630743, 0.0381, -0.013324116532677054));
#80 = CARTESIAN_POINT('NONE', (-0.006681894987404381, 0.01905, -0.01585590553916532));
#80 = CARTESIAN_POINT('NONE', (-0.006681894987404388, 0.01905, -0.01585590553916532));
#81 = CARTESIAN_POINT('NONE', (-0.012407746826993356, -0, -0.006362699999999989));
#82 = (
BOUNDED_CURVE()
@ -128,18 +128,18 @@ DATA;
RATIONAL_B_SPLINE_CURVE((1, 1, 1))
REPRESENTATION_ITEM('NONE')
);
#83 = DIRECTION('NONE', (0.8660254037844382, 0, -0.5000000000000007));
#84 = DIRECTION('NONE', (0, -0.9999999999999998, 0));
#85 = CARTESIAN_POINT('NONE', (-0.023428266500311844, -0, 0.00000000000000001687538997430238));
#83 = DIRECTION('NONE', (0.8660254037844384, 0, -0.5000000000000007));
#84 = DIRECTION('NONE', (0, -1.0000000000000002, 0));
#85 = CARTESIAN_POINT('NONE', (-0.02342826650031185, -0, 0.00000000000000001865174681370263));
#86 = AXIS2_PLACEMENT_3D('NONE', #85, #84, #83);
#87 = CIRCLE('NONE', #86, 0.012725399999999994);
#87 = CIRCLE('NONE', #86, 0.012725400000000001);
#88 = DIRECTION('NONE', (-0.6427876096865395, 0, -0.766044443118978));
#89 = DIRECTION('NONE', (0, -1.0000000000000002, -0));
#90 = CARTESIAN_POINT('NONE', (0.009009495250442175, 0.0381, -0.0074868578761104415));
#91 = AXIS2_PLACEMENT_3D('NONE', #90, #89, #88);
#92 = CIRCLE('NONE', #91, 0.007620000000000001);
#93 = CARTESIAN_POINT('NONE', (0.013907536836253597, 0.0381, -0.0016495992195438261));
#94 = CARTESIAN_POINT('NONE', (0.011837890161758862, 0.01905, -0.0125903677404439));
#94 = CARTESIAN_POINT('NONE', (0.011837890161758855, 0.01905, -0.0125903677404439));
#95 = CARTESIAN_POINT('NONE', (0.0007904803266814893, -0, -0.013982699999999994));
#96 = (
BOUNDED_CURVE()
@ -150,19 +150,19 @@ DATA;
RATIONAL_B_SPLINE_CURVE((1, 1, 1))
REPRESENTATION_ITEM('NONE')
);
#97 = DIRECTION('NONE', (0.8660254037844388, -0, -0.49999999999999956));
#98 = DIRECTION('NONE', (0, 0.9999999999999999, 0));
#99 = CARTESIAN_POINT('NONE', (-0.005808633250155936, 0, -0.010172699999999996));
#97 = DIRECTION('NONE', (0.866025403784439, -0, -0.4999999999999996));
#98 = DIRECTION('NONE', (0, 1, 0));
#99 = CARTESIAN_POINT('NONE', (-0.0058086332501559364, 0, -0.010172699999999996));
#100 = AXIS2_PLACEMENT_3D('NONE', #99, #98, #97);
#101 = CIRCLE('NONE', #100, 0.007620000000000001);
#101 = CIRCLE('NONE', #100, 0.00762);
#102 = DIRECTION('NONE', (-0.6427876096865413, 0, -0.7660444431189763));
#103 = DIRECTION('NONE', (0, 0.9999999999999999, 0));
#104 = CARTESIAN_POINT('NONE', (0.022087266284558753, 0.0381, 0.008098622736922445));
#105 = AXIS2_PLACEMENT_3D('NONE', #104, #103, #102);
#106 = CIRCLE('NONE', #105, 0.012725400000000064);
#107 = CARTESIAN_POINT('NONE', (0.009555193704377126, 0.0381, 0.01030836525700516));
#108 = CARTESIAN_POINT('NONE', (0.017208488154790785, 0.01905, 0.00216522897437961));
#109 = CARTESIAN_POINT('NONE', (0.011810999999999978, -0, -0.007619999999999995));
#108 = CARTESIAN_POINT('NONE', (0.01720848815479078, 0.01905, 0.0021652289743796134));
#109 = CARTESIAN_POINT('NONE', (0.011810999999999981, -0, -0.0076199999999999974));
#110 = (
BOUNDED_CURVE()
B_SPLINE_CURVE(2, (#107, #108, #109), .UNSPECIFIED., .F., .F.)
@ -172,11 +172,11 @@ DATA;
RATIONAL_B_SPLINE_CURVE((1, 1, 1))
REPRESENTATION_ITEM('NONE')
);
#111 = DIRECTION('NONE', (-0.000000000000002373054384915535, 0, 1));
#111 = DIRECTION('NONE', (-0.0000000000000018146886472883515, 0, 1));
#112 = DIRECTION('NONE', (-0, -1, 0));
#113 = CARTESIAN_POINT('NONE', (0.011811000000000009, -0, -0.02034540000000004));
#113 = CARTESIAN_POINT('NONE', (0.011811000000000004, -0, -0.020345400000000034));
#114 = AXIS2_PLACEMENT_3D('NONE', #113, #112, #111);
#115 = CIRCLE('NONE', #114, 0.012725400000000046);
#115 = CIRCLE('NONE', #114, 0.012725400000000036);
#116 = DIRECTION('NONE', (0, 1, -0));
#117 = VECTOR('NONE', #116, 1);
#118 = CARTESIAN_POINT('NONE', (0.0037719, -0, 0));
@ -256,14 +256,14 @@ DATA;
);
#177 = CARTESIAN_POINT('NONE', (0.0007904803266815029, -0, 0.013982700000000004));
#178 = CARTESIAN_POINT('NONE', (-0.0030195196733185, -0, 0.02058181357683743));
#179 = CARTESIAN_POINT('NONE', (-0.009618633250155922, -0, 0.01677181357683742));
#179 = CARTESIAN_POINT('NONE', (-0.009618633250155923, -0, 0.01677181357683742));
#180 = CARTESIAN_POINT('NONE', (-0.01621774682699334, -0, 0.012961813576837417));
#181 = CARTESIAN_POINT('NONE', (-0.012407746826993343, -0, 0.006362700000000004));
#182 = CARTESIAN_POINT('NONE', (-0.010343463710053215, 0.01905, 0.013844340424891662));
#183 = CARTESIAN_POINT('NONE', (-0.01917915036563614, 0.01905, 0.017060267366826944));
#184 = CARTESIAN_POINT('NONE', (-0.02239507730757142, 0.01905, 0.008224580711244014));
#184 = CARTESIAN_POINT('NONE', (-0.022395077307571426, 0.01905, 0.008224580711244014));
#185 = CARTESIAN_POINT('NONE', (-0.025611004249506707, 0.01905, -0.000611105944338923));
#186 = CARTESIAN_POINT('NONE', (-0.016775317593923766, 0.01905, -0.003827032886274202));
#186 = CARTESIAN_POINT('NONE', (-0.016775317593923773, 0.01905, -0.003827032886274202));
#187 = CARTESIAN_POINT('NONE', (-0.01363300589983399, 0.0381, 0.0032065415281829547));
#188 = CARTESIAN_POINT('NONE', (-0.020793463670222608, 0.0381, 0.0006003480360413621));
#189 = CARTESIAN_POINT('NONE', (-0.018187270178081014, 0.0381, -0.00656010973434726));
@ -278,12 +278,12 @@ DATA;
REPRESENTATION_ITEM('NONE')
SURFACE()
);
#193 = CARTESIAN_POINT('NONE', (-0.012407746826993344, -0, 0.006362700000000004));
#194 = CARTESIAN_POINT('NONE', (-0.00873424026922052, -0, -0.000000000000000004726054498244314));
#193 = CARTESIAN_POINT('NONE', (-0.012407746826993343, -0, 0.006362700000000004));
#194 = CARTESIAN_POINT('NONE', (-0.008734240269220523, -0, -0.000000000000000004726054498244314));
#195 = CARTESIAN_POINT('NONE', (-0.012407746826993356, -0, -0.006362699999999989));
#196 = CARTESIAN_POINT('NONE', (-0.016775317593923766, 0.01905, -0.003827032886274204));
#197 = CARTESIAN_POINT('NONE', (-0.008256169858566881, 0.019050000000000004, -0.006927749083260438));
#198 = CARTESIAN_POINT('NONE', (-0.006681894987404381, 0.01905, -0.01585590553916532));
#196 = CARTESIAN_POINT('NONE', (-0.016775317593923773, 0.01905, -0.003827032886274204));
#197 = CARTESIAN_POINT('NONE', (-0.008256169858566887, 0.019050000000000004, -0.006927749083260438));
#198 = CARTESIAN_POINT('NONE', (-0.006681894987404388, 0.01905, -0.01585590553916532));
#199 = CARTESIAN_POINT('NONE', (-0.008420618915550801, 0.0381, -0.011114374012594288));
#200 = CARTESIAN_POINT('NONE', (-0.0015166849060552505, 0.0381, -0.008601547533799802));
#201 = CARTESIAN_POINT('NONE', (0.004111453664630743, 0.0381, -0.013324116532677054));
@ -298,14 +298,14 @@ DATA;
);
#203 = CARTESIAN_POINT('NONE', (-0.012407746826993355, -0, -0.006362699999999989));
#204 = CARTESIAN_POINT('NONE', (-0.016217746826993354, -0, -0.012961813576837412));
#205 = CARTESIAN_POINT('NONE', (-0.009618633250155937, -0, -0.01677181357683742));
#206 = CARTESIAN_POINT('NONE', (-0.003019519673318509, -0, -0.020581813576837412));
#205 = CARTESIAN_POINT('NONE', (-0.009618633250155936, -0, -0.01677181357683742));
#206 = CARTESIAN_POINT('NONE', (-0.0030195196733185095, -0, -0.020581813576837412));
#207 = CARTESIAN_POINT('NONE', (0.0007904803266814893, -0, -0.013982699999999994));
#208 = CARTESIAN_POINT('NONE', (-0.006681894987404382, 0.01905, -0.01585590553916532));
#209 = CARTESIAN_POINT('NONE', (-0.0050491260880436714, 0.019049999999999997, -0.02511579811374694));
#210 = CARTESIAN_POINT('NONE', (0.0042107664865379535, 0.01905, -0.02348302921438623));
#211 = CARTESIAN_POINT('NONE', (0.01347065906111957, 0.019049999999999997, -0.02185026031502552));
#212 = CARTESIAN_POINT('NONE', (0.011837890161758862, 0.01905, -0.0125903677404439));
#208 = CARTESIAN_POINT('NONE', (-0.006681894987404389, 0.01905, -0.01585590553916532));
#209 = CARTESIAN_POINT('NONE', (-0.005049126088043679, 0.019049999999999997, -0.02511579811374694));
#210 = CARTESIAN_POINT('NONE', (0.0042107664865379466, 0.01905, -0.02348302921438623));
#211 = CARTESIAN_POINT('NONE', (0.013470659061119567, 0.019049999999999997, -0.02185026031502552));
#212 = CARTESIAN_POINT('NONE', (0.011837890161758855, 0.01905, -0.0125903677404439));
#213 = CARTESIAN_POINT('NONE', (0.004111453664630743, 0.0381, -0.013324116532677054));
#214 = CARTESIAN_POINT('NONE', (0.009948712321197359, 0.0381, -0.018222158118488478));
#215 = CARTESIAN_POINT('NONE', (0.014846753907008787, 0.0381, -0.012384899461921867));
@ -320,12 +320,12 @@ DATA;
REPRESENTATION_ITEM('NONE')
SURFACE()
);
#219 = CARTESIAN_POINT('NONE', (0.0007904803266814876, -0, -0.013982699999999994));
#220 = CARTESIAN_POINT('NONE', (0.0044639868844543245, -0, -0.007620000000000015));
#221 = CARTESIAN_POINT('NONE', (0.011810999999999978, -0, -0.007619999999999995));
#222 = CARTESIAN_POINT('NONE', (0.011837890161758862, 0.01905, -0.0125903677404439));
#223 = CARTESIAN_POINT('NONE', (0.010263615290596393, 0.019049999999999994, -0.0036622112845390324));
#224 = CARTESIAN_POINT('NONE', (0.017208488154790785, 0.01905, 0.00216522897437961));
#219 = CARTESIAN_POINT('NONE', (0.0007904803266814854, -0, -0.013982699999999997));
#220 = CARTESIAN_POINT('NONE', (0.004463986884454323, -0, -0.007620000000000017));
#221 = CARTESIAN_POINT('NONE', (0.011810999999999981, -0, -0.0076199999999999974));
#222 = CARTESIAN_POINT('NONE', (0.011837890161758858, 0.01905, -0.012590367740443899));
#223 = CARTESIAN_POINT('NONE', (0.01026361529059639, 0.019049999999999994, -0.0036622112845390306));
#224 = CARTESIAN_POINT('NONE', (0.01720848815479078, 0.01905, 0.0021652289743796134));
#225 = CARTESIAN_POINT('NONE', (0.013907536836253597, 0.0381, -0.0016495992195438261));
#226 = CARTESIAN_POINT('NONE', (0.00827939826556762, 0.038099999999999995, 0.0030729697793334247));
#227 = CARTESIAN_POINT('NONE', (0.009555193704377126, 0.0381, 0.01030836525700516));

View File

@ -161,20 +161,20 @@ DATA;
#145 = VERTEX_POINT('NONE', #144);
#146 = CARTESIAN_POINT('NONE', (-0.0186055, 0.3859187599240827, -0.2649386954314825));
#147 = VERTEX_POINT('NONE', #146);
#148 = DIRECTION('NONE', (-0.08428666399522529, 0, 0.9964415478454097));
#148 = DIRECTION('NONE', (-0.0842866639952229, 0, 0.99644154784541));
#149 = DIRECTION('NONE', (0, 1, -0));
#150 = CARTESIAN_POINT('NONE', (0.10987218406621378, 0, 0.024039844328695128));
#150 = CARTESIAN_POINT('NONE', (0.10987218406621377, 0, 0.02403984432869508));
#151 = AXIS2_PLACEMENT_3D('NONE', #150, #149, #148);
#152 = CIRCLE('NONE', #151, 0.007737689870496104);
#152 = CIRCLE('NONE', #151, 0.007737689870496156);
#153 = DIRECTION('NONE', (0, 1, 0));
#154 = VECTOR('NONE', #153, 1);
#155 = CARTESIAN_POINT('NONE', (0.11484587524256575, 0, 0.029967258656566655));
#156 = LINE('NONE', #155, #154);
#157 = DIRECTION('NONE', (-0.08428666399522529, 0, 0.9964415478454097));
#157 = DIRECTION('NONE', (-0.0842866639952229, 0, 0.99644154784541));
#158 = DIRECTION('NONE', (0, 1, -0));
#159 = CARTESIAN_POINT('NONE', (0.10987218406621378, 0.003175, 0.024039844328695128));
#159 = CARTESIAN_POINT('NONE', (0.10987218406621377, 0.003175, 0.02403984432869508));
#160 = AXIS2_PLACEMENT_3D('NONE', #159, #158, #157);
#161 = CIRCLE('NONE', #160, 0.007737689870496104);
#161 = CIRCLE('NONE', #160, 0.007737689870496156);
#162 = DIRECTION('NONE', (0, 1, 0));
#163 = VECTOR('NONE', #162, 1);
#164 = CARTESIAN_POINT('NONE', (0.10922000000000001, 0, 0.031750000000000014));
@ -1183,11 +1183,11 @@ DATA;
#1103 = EDGE_CURVE('NONE', #145, #147, #987, .T.);
#1104 = EDGE_CURVE('NONE', #145, #145, #992, .T.);
#1105 = EDGE_CURVE('NONE', #147, #147, #997, .T.);
#1106 = CARTESIAN_POINT('NONE', (0.10987218406621378, 0.0015874999999999997, 0.024039844328695128));
#1106 = CARTESIAN_POINT('NONE', (0.10987218406621377, 0.0015874999999999997, 0.02403984432869508));
#1107 = DIRECTION('NONE', (0, 1, -0));
#1108 = DIRECTION('NONE', (-0.08428666399522529, 0, 0.9964415478454097));
#1108 = DIRECTION('NONE', (-0.0842866639952229, 0, 0.99644154784541));
#1109 = AXIS2_PLACEMENT_3D('NONE', #1106, #1107, #1108);
#1110 = CYLINDRICAL_SURFACE('NONE', #1109, 0.007737689870496104);
#1110 = CYLINDRICAL_SURFACE('NONE', #1109, 0.007737689870496156);
#1111 = CARTESIAN_POINT('NONE', (0.12954000000000004, 0.0015874999999999997, 0.04747903462626646));
#1112 = DIRECTION('NONE', (0, -1.0000000000000002, -0));
#1113 = DIRECTION('NONE', (-0.6427876096865407, 0, -0.766044443118977));

View File

@ -131,9 +131,9 @@ DATA;
#115 = VERTEX_POINT('NONE', #114);
#116 = CARTESIAN_POINT('NONE', (-0.0248334258488368, 0, -0.02299722453489577));
#117 = VERTEX_POINT('NONE', #116);
#118 = CARTESIAN_POINT('NONE', (-0.025166574151163194, 0, -0.013002775465104229));
#118 = CARTESIAN_POINT('NONE', (-0.025166574151163194, 0, -0.013002775465104227));
#119 = VERTEX_POINT('NONE', #118);
#120 = CARTESIAN_POINT('NONE', (-0.025166574151163194, 0.0035, -0.013002775465104229));
#120 = CARTESIAN_POINT('NONE', (-0.025166574151163194, 0.0035, -0.013002775465104227));
#121 = VERTEX_POINT('NONE', #120);
#122 = CARTESIAN_POINT('NONE', (-0.0248334258488368, 0.0035, -0.02299722453489577));
#123 = VERTEX_POINT('NONE', #122);
@ -778,20 +778,20 @@ DATA;
#762 = VECTOR('NONE', #761, 1);
#763 = CARTESIAN_POINT('NONE', (-0.055, 0.0035, -0.005000000000000004));
#764 = LINE('NONE', #763, #762);
#765 = DIRECTION('NONE', (0.033314830232639266, 0, -0.9994449069791544));
#766 = DIRECTION('NONE', (0, -1.0000000000000002, 0));
#767 = CARTESIAN_POINT('NONE', (-0.024999999999999998, -0, -0.017999999999999995));
#765 = DIRECTION('NONE', (0.033314830232639946, 0, -0.9994449069791542));
#766 = DIRECTION('NONE', (0, -0.9999999999999999, 0));
#767 = CARTESIAN_POINT('NONE', (-0.025, -0, -0.01799999999999999));
#768 = AXIS2_PLACEMENT_3D('NONE', #767, #766, #765);
#769 = CIRCLE('NONE', #768, 0.005000000000000003);
#769 = CIRCLE('NONE', #768, 0.005000000000000007);
#770 = DIRECTION('NONE', (0, 1, 0));
#771 = VECTOR('NONE', #770, 1);
#772 = CARTESIAN_POINT('NONE', (-0.025166574151163194, 0, -0.013002775465104229));
#772 = CARTESIAN_POINT('NONE', (-0.025166574151163194, 0, -0.013002775465104227));
#773 = LINE('NONE', #772, #771);
#774 = DIRECTION('NONE', (0.033314830232639266, 0, -0.9994449069791544));
#775 = DIRECTION('NONE', (0, -1.0000000000000002, 0));
#776 = CARTESIAN_POINT('NONE', (-0.024999999999999998, 0.0035, -0.017999999999999995));
#774 = DIRECTION('NONE', (0.033314830232639946, 0, -0.9994449069791542));
#775 = DIRECTION('NONE', (0, -0.9999999999999999, 0));
#776 = CARTESIAN_POINT('NONE', (-0.025, 0.0035, -0.01799999999999999));
#777 = AXIS2_PLACEMENT_3D('NONE', #776, #775, #774);
#778 = CIRCLE('NONE', #777, 0.005000000000000003);
#778 = CIRCLE('NONE', #777, 0.005000000000000007);
#779 = DIRECTION('NONE', (0, 1, 0));
#780 = VECTOR('NONE', #779, 1);
#781 = CARTESIAN_POINT('NONE', (-0.0248334258488368, 0, -0.02299722453489577));
@ -1209,11 +1209,11 @@ DATA;
#1193 = DIRECTION('NONE', (0, 0, 1));
#1194 = AXIS2_PLACEMENT_3D('NONE', #1192, #1193, $);
#1195 = PLANE('NONE', #1194);
#1196 = CARTESIAN_POINT('NONE', (-0.024999999999999998, 0.00175, -0.017999999999999995));
#1197 = DIRECTION('NONE', (0, -1.0000000000000002, 0));
#1198 = DIRECTION('NONE', (0.033314830232639266, 0, -0.9994449069791544));
#1196 = CARTESIAN_POINT('NONE', (-0.025, 0.00175, -0.01799999999999999));
#1197 = DIRECTION('NONE', (0, -0.9999999999999999, 0));
#1198 = DIRECTION('NONE', (0.033314830232639946, 0, -0.9994449069791542));
#1199 = AXIS2_PLACEMENT_3D('NONE', #1196, #1197, #1198);
#1200 = CYLINDRICAL_SURFACE('NONE', #1199, 0.005000000000000003);
#1200 = CYLINDRICAL_SURFACE('NONE', #1199, 0.005000000000000007);
#1201 = CARTESIAN_POINT('NONE', (-0.04016657415116319, 0.00175, -0.013502775465104222));
#1202 = DIRECTION('NONE', (0.033314830232638176, -0, -0.9994449069791543));
#1203 = AXIS2_PLACEMENT_3D('NONE', #1201, #1202, $);

View File

@ -19,27 +19,27 @@ DATA;
);
#4 = CARTESIAN_POINT('NONE', (0.05841999999999999, 0.16256, -0.008255));
#5 = VERTEX_POINT('NONE', #4);
#6 = CARTESIAN_POINT('NONE', (0.05892799999999998, 0.1493519999999996, -0.008255));
#6 = CARTESIAN_POINT('NONE', (0.05892799999999998, 0.14935199999999962, -0.008255));
#7 = VERTEX_POINT('NONE', #6);
#8 = CARTESIAN_POINT('NONE', (0.05892799999999998, 0.1493519999999996, 0.008255));
#8 = CARTESIAN_POINT('NONE', (0.05892799999999998, 0.14935199999999962, 0.008255));
#9 = VERTEX_POINT('NONE', #8);
#10 = CARTESIAN_POINT('NONE', (0.05841999999999999, 0.16256, 0.008255));
#11 = VERTEX_POINT('NONE', #10);
#12 = CARTESIAN_POINT('NONE', (0.06908799999999998, 0.1493519999999996, -0.008255));
#12 = CARTESIAN_POINT('NONE', (0.06908799999999998, 0.14935199999999962, -0.008255));
#13 = VERTEX_POINT('NONE', #12);
#14 = CARTESIAN_POINT('NONE', (0.06908799999999998, 0.1493519999999996, 0.008255));
#14 = CARTESIAN_POINT('NONE', (0.06908799999999998, 0.14935199999999962, 0.008255));
#15 = VERTEX_POINT('NONE', #14);
#16 = CARTESIAN_POINT('NONE', (0.09042399999999998, 0.1308099999999996, -0.008255));
#16 = CARTESIAN_POINT('NONE', (0.09042399999999998, 0.13080999999999965, -0.008255));
#17 = VERTEX_POINT('NONE', #16);
#18 = CARTESIAN_POINT('NONE', (0.09042399999999998, 0.1308099999999996, 0.008255));
#18 = CARTESIAN_POINT('NONE', (0.09042399999999998, 0.13080999999999965, 0.008255));
#19 = VERTEX_POINT('NONE', #18);
#20 = CARTESIAN_POINT('NONE', (0.09220199999999999, 0.04064000000000004, -0.008255));
#20 = CARTESIAN_POINT('NONE', (0.09220199999999999, 0.040640000000000044, -0.008255));
#21 = VERTEX_POINT('NONE', #20);
#22 = CARTESIAN_POINT('NONE', (0.09220199999999999, 0.04064000000000004, 0.008255));
#22 = CARTESIAN_POINT('NONE', (0.09220199999999999, 0.040640000000000044, 0.008255));
#23 = VERTEX_POINT('NONE', #22);
#24 = CARTESIAN_POINT('NONE', (0.076962, 0.025908000000000028, -0.008255));
#24 = CARTESIAN_POINT('NONE', (0.076962, 0.02590800000000003, -0.008255));
#25 = VERTEX_POINT('NONE', #24);
#26 = CARTESIAN_POINT('NONE', (0.076962, 0.025908000000000028, 0.008255));
#26 = CARTESIAN_POINT('NONE', (0.076962, 0.02590800000000003, 0.008255));
#27 = VERTEX_POINT('NONE', #26);
#28 = CARTESIAN_POINT('NONE', (0.051816, 0.026416000000000033, -0.008255));
#29 = VERTEX_POINT('NONE', #28);
@ -473,15 +473,15 @@ DATA;
#457 = VERTEX_POINT('NONE', #456);
#458 = CARTESIAN_POINT('NONE', (0.056007, 0.14478, 0.000000000000000013717758655969163));
#459 = VERTEX_POINT('NONE', #458);
#460 = DIRECTION('NONE', (0.038433122101202255, -0.9992611746313144, 0));
#460 = DIRECTION('NONE', (0.03843312210120234, -0.9992611746313144, 0));
#461 = VECTOR('NONE', #460, 1);
#462 = CARTESIAN_POINT('NONE', (0.05841999999999999, 0.16256, -0.008255));
#463 = LINE('NONE', #462, #461);
#464 = DIRECTION('NONE', (0, 0, 1));
#465 = VECTOR('NONE', #464, 1);
#466 = CARTESIAN_POINT('NONE', (0.05892799999999998, 0.1493519999999996, -0.008255));
#466 = CARTESIAN_POINT('NONE', (0.05892799999999998, 0.14935199999999962, -0.008255));
#467 = LINE('NONE', #466, #465);
#468 = DIRECTION('NONE', (0.038433122101202255, -0.9992611746313144, 0));
#468 = DIRECTION('NONE', (0.03843312210120234, -0.9992611746313144, 0));
#469 = VECTOR('NONE', #468, 1);
#470 = CARTESIAN_POINT('NONE', (0.05841999999999999, 0.16256, 0.008255));
#471 = LINE('NONE', #470, #469);
@ -491,58 +491,58 @@ DATA;
#475 = LINE('NONE', #474, #473);
#476 = DIRECTION('NONE', (1, 0, 0));
#477 = VECTOR('NONE', #476, 1);
#478 = CARTESIAN_POINT('NONE', (0.05892799999999998, 0.1493519999999996, -0.008255));
#478 = CARTESIAN_POINT('NONE', (0.05892799999999998, 0.14935199999999962, -0.008255));
#479 = LINE('NONE', #478, #477);
#480 = DIRECTION('NONE', (0, 0, 1));
#481 = VECTOR('NONE', #480, 1);
#482 = CARTESIAN_POINT('NONE', (0.06908799999999998, 0.1493519999999996, -0.008255));
#482 = CARTESIAN_POINT('NONE', (0.06908799999999998, 0.14935199999999962, -0.008255));
#483 = LINE('NONE', #482, #481);
#484 = DIRECTION('NONE', (1, 0, 0));
#485 = VECTOR('NONE', #484, 1);
#486 = CARTESIAN_POINT('NONE', (0.05892799999999998, 0.1493519999999996, 0.008255));
#486 = CARTESIAN_POINT('NONE', (0.05892799999999998, 0.14935199999999962, 0.008255));
#487 = LINE('NONE', #486, #485);
#488 = DIRECTION('NONE', (-0.0866626263544473, 0.9962377172107816, -0));
#489 = DIRECTION('NONE', (0, -0, -0.9999999999999998));
#490 = CARTESIAN_POINT('NONE', (0.07079178336201049, 0.12976601099190213, -0.008255));
#488 = DIRECTION('NONE', (-0.08666262635444875, 0.9962377172107816, -0));
#489 = DIRECTION('NONE', (0, -0, -1));
#490 = CARTESIAN_POINT('NONE', (0.07079178336201052, 0.12976601099190216, -0.008255));
#491 = AXIS2_PLACEMENT_3D('NONE', #490, #489, #488);
#492 = CIRCLE('NONE', #491, 0.01965995531963333);
#493 = DIRECTION('NONE', (0, 0, 1));
#494 = VECTOR('NONE', #493, 1);
#495 = CARTESIAN_POINT('NONE', (0.09042399999999998, 0.1308099999999996, -0.008255));
#495 = CARTESIAN_POINT('NONE', (0.09042399999999998, 0.13080999999999965, -0.008255));
#496 = LINE('NONE', #495, #494);
#497 = DIRECTION('NONE', (-0.0866626263544473, 0.9962377172107816, -0));
#498 = DIRECTION('NONE', (0, -0, -0.9999999999999998));
#499 = CARTESIAN_POINT('NONE', (0.07079178336201049, 0.12976601099190213, 0.008255));
#497 = DIRECTION('NONE', (-0.08666262635444875, 0.9962377172107816, -0));
#498 = DIRECTION('NONE', (0, -0, -1));
#499 = CARTESIAN_POINT('NONE', (0.07079178336201052, 0.12976601099190216, 0.008255));
#500 = AXIS2_PLACEMENT_3D('NONE', #499, #498, #497);
#501 = CIRCLE('NONE', #500, 0.01965995531963333);
#502 = DIRECTION('NONE', (0.9985890770760726, 0.05310230827711328, -0));
#502 = DIRECTION('NONE', (0.9985890770760725, 0.05310230827711449, -0));
#503 = DIRECTION('NONE', (-0, 0, -1));
#504 = CARTESIAN_POINT('NONE', (-1.2575688405092589, 0.059127329905450624, -0.008255));
#504 = CARTESIAN_POINT('NONE', (-1.2575688405092098, 0.059127329905451644, -0.008255));
#505 = AXIS2_PLACEMENT_3D('NONE', #504, #503, #502);
#506 = CIRCLE('NONE', #505, 1.3498974417547818);
#506 = CIRCLE('NONE', #505, 1.3498974417547327);
#507 = DIRECTION('NONE', (0, 0, 1));
#508 = VECTOR('NONE', #507, 1);
#509 = CARTESIAN_POINT('NONE', (0.09220199999999999, 0.04064000000000004, -0.008255));
#509 = CARTESIAN_POINT('NONE', (0.09220199999999999, 0.040640000000000044, -0.008255));
#510 = LINE('NONE', #509, #508);
#511 = DIRECTION('NONE', (0.9985890770760726, 0.05310230827711328, -0));
#511 = DIRECTION('NONE', (0.9985890770760725, 0.05310230827711449, -0));
#512 = DIRECTION('NONE', (-0, 0, -1));
#513 = CARTESIAN_POINT('NONE', (-1.2575688405092589, 0.059127329905450624, 0.008255));
#513 = CARTESIAN_POINT('NONE', (-1.2575688405092098, 0.059127329905451644, 0.008255));
#514 = AXIS2_PLACEMENT_3D('NONE', #513, #512, #511);
#515 = CIRCLE('NONE', #514, 1.3498974417547818);
#516 = DIRECTION('NONE', (0.9999062141747909, -0.013695358872168632, -0));
#515 = CIRCLE('NONE', #514, 1.3498974417547327);
#516 = DIRECTION('NONE', (0.9999062141747909, -0.013695358872166266, -0));
#517 = DIRECTION('NONE', (0, 0, -1.0000000000000002));
#518 = CARTESIAN_POINT('NONE', (0.07726374957352439, 0.04084460388945755, -0.008255));
#518 = CARTESIAN_POINT('NONE', (0.07726374957352439, 0.04084460388945753, -0.008255));
#519 = AXIS2_PLACEMENT_3D('NONE', #518, #517, #516);
#520 = CIRCLE('NONE', #519, 0.014939651554024935);
#520 = CIRCLE('NONE', #519, 0.014939651554024921);
#521 = DIRECTION('NONE', (0, 0, 1));
#522 = VECTOR('NONE', #521, 1);
#523 = CARTESIAN_POINT('NONE', (0.076962, 0.025908000000000028, -0.008255));
#523 = CARTESIAN_POINT('NONE', (0.076962, 0.02590800000000003, -0.008255));
#524 = LINE('NONE', #523, #522);
#525 = DIRECTION('NONE', (0.9999062141747909, -0.013695358872168632, -0));
#525 = DIRECTION('NONE', (0.9999062141747909, -0.013695358872166266, -0));
#526 = DIRECTION('NONE', (0, 0, -1.0000000000000002));
#527 = CARTESIAN_POINT('NONE', (0.07726374957352439, 0.04084460388945755, 0.008255));
#527 = CARTESIAN_POINT('NONE', (0.07726374957352439, 0.04084460388945753, 0.008255));
#528 = AXIS2_PLACEMENT_3D('NONE', #527, #526, #525);
#529 = CIRCLE('NONE', #528, 0.014939651554024935);
#529 = CIRCLE('NONE', #528, 0.014939651554024921);
#530 = DIRECTION('NONE', (-0.9997960016298644, 0.0201978990228256, 0));
#531 = VECTOR('NONE', #530, 1);
#532 = CARTESIAN_POINT('NONE', (0.076962, 0.02590800000000003, -0.008255));
@ -2369,29 +2369,29 @@ DATA;
#2353 = EDGE_CURVE('NONE', #457, #457, #1992, .T.);
#2354 = EDGE_CURVE('NONE', #457, #459, #1996, .T.);
#2355 = EDGE_CURVE('NONE', #459, #459, #2001, .T.);
#2356 = CARTESIAN_POINT('NONE', (0.05867399999999999, 0.1559559999999998, -0));
#2356 = CARTESIAN_POINT('NONE', (0.05867399999999998, 0.15595599999999982, -0));
#2357 = DIRECTION('NONE', (-0.9992611746313143, -0.038433122101202415, 0));
#2358 = AXIS2_PLACEMENT_3D('NONE', #2356, #2357, $);
#2359 = PLANE('NONE', #2358);
#2360 = CARTESIAN_POINT('NONE', (0.06400799999999998, 0.1493519999999996, -0));
#2360 = CARTESIAN_POINT('NONE', (0.06400799999999998, 0.14935199999999962, -0));
#2361 = DIRECTION('NONE', (0, -1, 0));
#2362 = AXIS2_PLACEMENT_3D('NONE', #2360, #2361, $);
#2363 = PLANE('NONE', #2362);
#2364 = CARTESIAN_POINT('NONE', (0.07079178336201049, 0.12976601099190213, -0));
#2365 = DIRECTION('NONE', (0, -0, -0.9999999999999998));
#2366 = DIRECTION('NONE', (-0.0866626263544473, 0.9962377172107816, -0));
#2364 = CARTESIAN_POINT('NONE', (0.07079178336201052, 0.12976601099190216, -0));
#2365 = DIRECTION('NONE', (0, -0, -1));
#2366 = DIRECTION('NONE', (-0.08666262635444875, 0.9962377172107816, -0));
#2367 = AXIS2_PLACEMENT_3D('NONE', #2364, #2365, #2366);
#2368 = CYLINDRICAL_SURFACE('NONE', #2367, 0.01965995531963333);
#2369 = CARTESIAN_POINT('NONE', (-1.2575688405092589, 0.059127329905450624, -0));
#2369 = CARTESIAN_POINT('NONE', (-1.2575688405092098, 0.059127329905451644, -0));
#2370 = DIRECTION('NONE', (-0, 0, -1));
#2371 = DIRECTION('NONE', (0.9985890770760726, 0.05310230827711328, -0));
#2371 = DIRECTION('NONE', (0.9985890770760725, 0.05310230827711449, -0));
#2372 = AXIS2_PLACEMENT_3D('NONE', #2369, #2370, #2371);
#2373 = CYLINDRICAL_SURFACE('NONE', #2372, 1.3498974417547818);
#2374 = CARTESIAN_POINT('NONE', (0.07726374957352439, 0.04084460388945755, -0));
#2373 = CYLINDRICAL_SURFACE('NONE', #2372, 1.3498974417547327);
#2374 = CARTESIAN_POINT('NONE', (0.07726374957352439, 0.04084460388945753, -0));
#2375 = DIRECTION('NONE', (0, 0, -1.0000000000000002));
#2376 = DIRECTION('NONE', (0.9999062141747909, -0.013695358872168632, -0));
#2376 = DIRECTION('NONE', (0.9999062141747909, -0.013695358872166266, -0));
#2377 = AXIS2_PLACEMENT_3D('NONE', #2374, #2375, #2376);
#2378 = CYLINDRICAL_SURFACE('NONE', #2377, 0.014939651554024935);
#2378 = CYLINDRICAL_SURFACE('NONE', #2377, 0.014939651554024921);
#2379 = CARTESIAN_POINT('NONE', (0.064389, 0.026162000000000036, -0));
#2380 = DIRECTION('NONE', (0.020197899022825535, 0.9997960016298644, -0));
#2381 = AXIS2_PLACEMENT_3D('NONE', #2379, #2380, $);

View File

@ -17,213 +17,213 @@ DATA;
GLOBAL_UNIT_ASSIGNED_CONTEXT((#1))
REPRESENTATION_CONTEXT('', '3D')
);
#4 = CARTESIAN_POINT('NONE', (-0.000000000000000006221205739668554, -0.0508, -0));
#4 = CARTESIAN_POINT('NONE', (0, 0.0508, -0));
#5 = VERTEX_POINT('NONE', #4);
#6 = CARTESIAN_POINT('NONE', (-0.033820100000000006, -0.05079999999999999, -0));
#6 = CARTESIAN_POINT('NONE', (0.0338201, 0.0508, -0));
#7 = VERTEX_POINT('NONE', #6);
#8 = CARTESIAN_POINT('NONE', (-0.033820100000000006, -0.05079999999999999, -0.6096));
#8 = CARTESIAN_POINT('NONE', (0.0338201, 0.0508, -0.6096));
#9 = VERTEX_POINT('NONE', #8);
#10 = CARTESIAN_POINT('NONE', (-0.000000000000000006221205739668554, -0.0508, -0.6096));
#10 = CARTESIAN_POINT('NONE', (0, 0.0508, -0.6096));
#11 = VERTEX_POINT('NONE', #10);
#12 = CARTESIAN_POINT('NONE', (-0.033820100000000006, -0.04335779999999999, -0));
#12 = CARTESIAN_POINT('NONE', (0.0338201, 0.043357799999999995, -0));
#13 = VERTEX_POINT('NONE', #12);
#14 = CARTESIAN_POINT('NONE', (-0.033820100000000006, -0.04335779999999999, -0.6096));
#14 = CARTESIAN_POINT('NONE', (0.0338201, 0.043357799999999995, -0.6096));
#15 = VERTEX_POINT('NONE', #14);
#16 = CARTESIAN_POINT('NONE', (-0.0037211000000000054, -0.0433578, -0));
#16 = CARTESIAN_POINT('NONE', (0.0037210999999999998, 0.0433578, -0));
#17 = VERTEX_POINT('NONE', #16);
#18 = CARTESIAN_POINT('NONE', (-0.0037211000000000054, -0.0433578, -0.6096));
#18 = CARTESIAN_POINT('NONE', (0.0037210999999999998, 0.0433578, -0.6096));
#19 = VERTEX_POINT('NONE', #18);
#20 = CARTESIAN_POINT('NONE', (-0.0037210999999999998, 0.0433578, -0));
#20 = CARTESIAN_POINT('NONE', (0.0037211000000000054, -0.0433578, -0));
#21 = VERTEX_POINT('NONE', #20);
#22 = CARTESIAN_POINT('NONE', (-0.0037210999999999998, 0.0433578, -0.6096));
#22 = CARTESIAN_POINT('NONE', (0.0037211000000000054, -0.0433578, -0.6096));
#23 = VERTEX_POINT('NONE', #22);
#24 = CARTESIAN_POINT('NONE', (-0.0338201, 0.043357799999999995, -0));
#24 = CARTESIAN_POINT('NONE', (0.033820100000000006, -0.04335779999999999, -0));
#25 = VERTEX_POINT('NONE', #24);
#26 = CARTESIAN_POINT('NONE', (-0.0338201, 0.043357799999999995, -0.6096));
#26 = CARTESIAN_POINT('NONE', (0.033820100000000006, -0.04335779999999999, -0.6096));
#27 = VERTEX_POINT('NONE', #26);
#28 = CARTESIAN_POINT('NONE', (-0.0338201, 0.0508, -0));
#28 = CARTESIAN_POINT('NONE', (0.033820100000000006, -0.05079999999999999, -0));
#29 = VERTEX_POINT('NONE', #28);
#30 = CARTESIAN_POINT('NONE', (-0.0338201, 0.0508, -0.6096));
#30 = CARTESIAN_POINT('NONE', (0.033820100000000006, -0.05079999999999999, -0.6096));
#31 = VERTEX_POINT('NONE', #30);
#32 = CARTESIAN_POINT('NONE', (0.0338201, 0.0508, -0));
#32 = CARTESIAN_POINT('NONE', (-0.033820100000000006, -0.05079999999999999, -0));
#33 = VERTEX_POINT('NONE', #32);
#34 = CARTESIAN_POINT('NONE', (0.0338201, 0.0508, -0.6096));
#34 = CARTESIAN_POINT('NONE', (-0.033820100000000006, -0.05079999999999999, -0.6096));
#35 = VERTEX_POINT('NONE', #34);
#36 = CARTESIAN_POINT('NONE', (0.0338201, 0.043357799999999995, -0));
#36 = CARTESIAN_POINT('NONE', (-0.033820100000000006, -0.04335779999999999, -0));
#37 = VERTEX_POINT('NONE', #36);
#38 = CARTESIAN_POINT('NONE', (0.0338201, 0.043357799999999995, -0.6096));
#38 = CARTESIAN_POINT('NONE', (-0.033820100000000006, -0.04335779999999999, -0.6096));
#39 = VERTEX_POINT('NONE', #38);
#40 = CARTESIAN_POINT('NONE', (0.0037210999999999998, 0.0433578, -0));
#40 = CARTESIAN_POINT('NONE', (-0.0037211000000000054, -0.0433578, -0));
#41 = VERTEX_POINT('NONE', #40);
#42 = CARTESIAN_POINT('NONE', (0.0037210999999999998, 0.0433578, -0.6096));
#42 = CARTESIAN_POINT('NONE', (-0.0037211000000000054, -0.0433578, -0.6096));
#43 = VERTEX_POINT('NONE', #42);
#44 = CARTESIAN_POINT('NONE', (0.0037211000000000054, -0.0433578, -0));
#44 = CARTESIAN_POINT('NONE', (-0.0037210999999999998, 0.0433578, -0));
#45 = VERTEX_POINT('NONE', #44);
#46 = CARTESIAN_POINT('NONE', (0.0037211000000000054, -0.0433578, -0.6096));
#46 = CARTESIAN_POINT('NONE', (-0.0037210999999999998, 0.0433578, -0.6096));
#47 = VERTEX_POINT('NONE', #46);
#48 = CARTESIAN_POINT('NONE', (0.033820100000000006, -0.04335779999999999, -0));
#48 = CARTESIAN_POINT('NONE', (-0.0338201, 0.043357799999999995, -0));
#49 = VERTEX_POINT('NONE', #48);
#50 = CARTESIAN_POINT('NONE', (0.033820100000000006, -0.04335779999999999, -0.6096));
#50 = CARTESIAN_POINT('NONE', (-0.0338201, 0.043357799999999995, -0.6096));
#51 = VERTEX_POINT('NONE', #50);
#52 = CARTESIAN_POINT('NONE', (0.033820100000000006, -0.05079999999999999, -0));
#52 = CARTESIAN_POINT('NONE', (-0.0338201, 0.0508, -0));
#53 = VERTEX_POINT('NONE', #52);
#54 = CARTESIAN_POINT('NONE', (0.033820100000000006, -0.05079999999999999, -0.6096));
#54 = CARTESIAN_POINT('NONE', (-0.0338201, 0.0508, -0.6096));
#55 = VERTEX_POINT('NONE', #54);
#56 = DIRECTION('NONE', (-1, 0.00000000000000020517070925003855, 0));
#56 = DIRECTION('NONE', (1, 0, 0));
#57 = VECTOR('NONE', #56, 1);
#58 = CARTESIAN_POINT('NONE', (-0.000000000000000006221205739668554, -0.0508, -0));
#58 = CARTESIAN_POINT('NONE', (0, 0.0508, -0));
#59 = LINE('NONE', #58, #57);
#60 = DIRECTION('NONE', (0, 0, -1));
#61 = VECTOR('NONE', #60, 1);
#62 = CARTESIAN_POINT('NONE', (-0.033820100000000006, -0.05079999999999999, -0));
#62 = CARTESIAN_POINT('NONE', (0.0338201, 0.0508, -0));
#63 = LINE('NONE', #62, #61);
#64 = DIRECTION('NONE', (-1, 0.00000000000000020517070925003855, 0));
#64 = DIRECTION('NONE', (1, 0, 0));
#65 = VECTOR('NONE', #64, 1);
#66 = CARTESIAN_POINT('NONE', (-0.000000000000000006221205739668554, -0.0508, -0.6096));
#66 = CARTESIAN_POINT('NONE', (0, 0.0508, -0.6096));
#67 = LINE('NONE', #66, #65);
#68 = DIRECTION('NONE', (0, 0, -1));
#69 = VECTOR('NONE', #68, 1);
#70 = CARTESIAN_POINT('NONE', (-0.000000000000000006221205739668554, -0.0508, -0));
#70 = CARTESIAN_POINT('NONE', (0, 0.0508, -0));
#71 = LINE('NONE', #70, #69);
#72 = DIRECTION('NONE', (0, 1, 0));
#72 = DIRECTION('NONE', (0, -1, 0));
#73 = VECTOR('NONE', #72, 1);
#74 = CARTESIAN_POINT('NONE', (-0.033820100000000006, -0.05079999999999999, -0));
#74 = CARTESIAN_POINT('NONE', (0.0338201, 0.0508, -0));
#75 = LINE('NONE', #74, #73);
#76 = DIRECTION('NONE', (0, 0, -1));
#77 = VECTOR('NONE', #76, 1);
#78 = CARTESIAN_POINT('NONE', (-0.033820100000000006, -0.04335779999999999, -0));
#78 = CARTESIAN_POINT('NONE', (0.0338201, 0.043357799999999995, -0));
#79 = LINE('NONE', #78, #77);
#80 = DIRECTION('NONE', (0, 1, 0));
#80 = DIRECTION('NONE', (0, -1, 0));
#81 = VECTOR('NONE', #80, 1);
#82 = CARTESIAN_POINT('NONE', (-0.033820100000000006, -0.05079999999999999, -0.6096));
#82 = CARTESIAN_POINT('NONE', (0.0338201, 0.0508, -0.6096));
#83 = LINE('NONE', #82, #81);
#84 = DIRECTION('NONE', (1, -0.0000000000000004610713913357407, 0));
#84 = DIRECTION('NONE', (-1, 0.00000000000000023053569566787033, 0));
#85 = VECTOR('NONE', #84, 1);
#86 = CARTESIAN_POINT('NONE', (-0.033820100000000006, -0.04335779999999999, -0));
#86 = CARTESIAN_POINT('NONE', (0.0338201, 0.043357799999999995, -0));
#87 = LINE('NONE', #86, #85);
#88 = DIRECTION('NONE', (0, 0, -1));
#89 = VECTOR('NONE', #88, 1);
#90 = CARTESIAN_POINT('NONE', (-0.0037211000000000054, -0.0433578, -0));
#90 = CARTESIAN_POINT('NONE', (0.0037210999999999998, 0.0433578, -0));
#91 = LINE('NONE', #90, #89);
#92 = DIRECTION('NONE', (1, -0.0000000000000004610713913357407, 0));
#92 = DIRECTION('NONE', (-1, 0.00000000000000023053569566787033, 0));
#93 = VECTOR('NONE', #92, 1);
#94 = CARTESIAN_POINT('NONE', (-0.033820100000000006, -0.04335779999999999, -0.6096));
#94 = CARTESIAN_POINT('NONE', (0.0338201, 0.043357799999999995, -0.6096));
#95 = LINE('NONE', #94, #93);
#96 = DIRECTION('NONE', (0.00000000000000006501542164183402, 1, 0));
#96 = DIRECTION('NONE', (0.00000000000000006501542164183402, -1, 0));
#97 = VECTOR('NONE', #96, 1);
#98 = CARTESIAN_POINT('NONE', (-0.0037211000000000054, -0.0433578, -0));
#98 = CARTESIAN_POINT('NONE', (0.0037210999999999998, 0.0433578, -0));
#99 = LINE('NONE', #98, #97);
#100 = DIRECTION('NONE', (0, 0, -1));
#101 = VECTOR('NONE', #100, 1);
#102 = CARTESIAN_POINT('NONE', (-0.0037210999999999998, 0.0433578, -0));
#102 = CARTESIAN_POINT('NONE', (0.0037211000000000054, -0.0433578, -0));
#103 = LINE('NONE', #102, #101);
#104 = DIRECTION('NONE', (0.00000000000000006501542164183402, 1, 0));
#104 = DIRECTION('NONE', (0.00000000000000006501542164183402, -1, 0));
#105 = VECTOR('NONE', #104, 1);
#106 = CARTESIAN_POINT('NONE', (-0.0037211000000000054, -0.0433578, -0.6096));
#106 = CARTESIAN_POINT('NONE', (0.0037210999999999998, 0.0433578, -0.6096));
#107 = LINE('NONE', #106, #105);
#108 = DIRECTION('NONE', (-1, -0.00000000000000023053569566787033, 0));
#108 = DIRECTION('NONE', (1, 0.0000000000000004610713913357407, 0));
#109 = VECTOR('NONE', #108, 1);
#110 = CARTESIAN_POINT('NONE', (-0.0037210999999999998, 0.0433578, -0));
#110 = CARTESIAN_POINT('NONE', (0.0037211000000000054, -0.0433578, -0));
#111 = LINE('NONE', #110, #109);
#112 = DIRECTION('NONE', (0, 0, -1));
#113 = VECTOR('NONE', #112, 1);
#114 = CARTESIAN_POINT('NONE', (-0.0338201, 0.043357799999999995, -0));
#114 = CARTESIAN_POINT('NONE', (0.033820100000000006, -0.04335779999999999, -0));
#115 = LINE('NONE', #114, #113);
#116 = DIRECTION('NONE', (-1, -0.00000000000000023053569566787033, 0));
#116 = DIRECTION('NONE', (1, 0.0000000000000004610713913357407, 0));
#117 = VECTOR('NONE', #116, 1);
#118 = CARTESIAN_POINT('NONE', (-0.0037210999999999998, 0.0433578, -0.6096));
#118 = CARTESIAN_POINT('NONE', (0.0037211000000000054, -0.0433578, -0.6096));
#119 = LINE('NONE', #118, #117);
#120 = DIRECTION('NONE', (0, 1, 0));
#120 = DIRECTION('NONE', (0, -1, 0));
#121 = VECTOR('NONE', #120, 1);
#122 = CARTESIAN_POINT('NONE', (-0.0338201, 0.043357799999999995, -0));
#122 = CARTESIAN_POINT('NONE', (0.033820100000000006, -0.04335779999999999, -0));
#123 = LINE('NONE', #122, #121);
#124 = DIRECTION('NONE', (0, 0, -1));
#125 = VECTOR('NONE', #124, 1);
#126 = CARTESIAN_POINT('NONE', (-0.0338201, 0.0508, -0));
#126 = CARTESIAN_POINT('NONE', (0.033820100000000006, -0.05079999999999999, -0));
#127 = LINE('NONE', #126, #125);
#128 = DIRECTION('NONE', (0, 1, 0));
#128 = DIRECTION('NONE', (0, -1, 0));
#129 = VECTOR('NONE', #128, 1);
#130 = CARTESIAN_POINT('NONE', (-0.0338201, 0.043357799999999995, -0.6096));
#130 = CARTESIAN_POINT('NONE', (0.033820100000000006, -0.04335779999999999, -0.6096));
#131 = LINE('NONE', #130, #129);
#132 = DIRECTION('NONE', (1, 0, 0));
#132 = DIRECTION('NONE', (-1, 0, 0));
#133 = VECTOR('NONE', #132, 1);
#134 = CARTESIAN_POINT('NONE', (-0.0338201, 0.0508, -0));
#134 = CARTESIAN_POINT('NONE', (0.033820100000000006, -0.05079999999999999, -0));
#135 = LINE('NONE', #134, #133);
#136 = DIRECTION('NONE', (0, 0, -1));
#137 = VECTOR('NONE', #136, 1);
#138 = CARTESIAN_POINT('NONE', (0.0338201, 0.0508, -0));
#138 = CARTESIAN_POINT('NONE', (-0.033820100000000006, -0.05079999999999999, -0));
#139 = LINE('NONE', #138, #137);
#140 = DIRECTION('NONE', (1, 0, 0));
#140 = DIRECTION('NONE', (-1, 0, 0));
#141 = VECTOR('NONE', #140, 1);
#142 = CARTESIAN_POINT('NONE', (-0.0338201, 0.0508, -0.6096));
#142 = CARTESIAN_POINT('NONE', (0.033820100000000006, -0.05079999999999999, -0.6096));
#143 = LINE('NONE', #142, #141);
#144 = DIRECTION('NONE', (0, -1, 0));
#144 = DIRECTION('NONE', (0, 1, 0));
#145 = VECTOR('NONE', #144, 1);
#146 = CARTESIAN_POINT('NONE', (0.0338201, 0.0508, -0));
#146 = CARTESIAN_POINT('NONE', (-0.033820100000000006, -0.05079999999999999, -0));
#147 = LINE('NONE', #146, #145);
#148 = DIRECTION('NONE', (0, 0, -1));
#149 = VECTOR('NONE', #148, 1);
#150 = CARTESIAN_POINT('NONE', (0.0338201, 0.043357799999999995, -0));
#150 = CARTESIAN_POINT('NONE', (-0.033820100000000006, -0.04335779999999999, -0));
#151 = LINE('NONE', #150, #149);
#152 = DIRECTION('NONE', (0, -1, 0));
#152 = DIRECTION('NONE', (0, 1, 0));
#153 = VECTOR('NONE', #152, 1);
#154 = CARTESIAN_POINT('NONE', (0.0338201, 0.0508, -0.6096));
#154 = CARTESIAN_POINT('NONE', (-0.033820100000000006, -0.05079999999999999, -0.6096));
#155 = LINE('NONE', #154, #153);
#156 = DIRECTION('NONE', (-1, 0.00000000000000023053569566787033, 0));
#156 = DIRECTION('NONE', (1, -0.0000000000000004610713913357407, 0));
#157 = VECTOR('NONE', #156, 1);
#158 = CARTESIAN_POINT('NONE', (0.0338201, 0.043357799999999995, -0));
#158 = CARTESIAN_POINT('NONE', (-0.033820100000000006, -0.04335779999999999, -0));
#159 = LINE('NONE', #158, #157);
#160 = DIRECTION('NONE', (0, 0, -1));
#161 = VECTOR('NONE', #160, 1);
#162 = CARTESIAN_POINT('NONE', (0.0037210999999999998, 0.0433578, -0));
#162 = CARTESIAN_POINT('NONE', (-0.0037211000000000054, -0.0433578, -0));
#163 = LINE('NONE', #162, #161);
#164 = DIRECTION('NONE', (-1, 0.00000000000000023053569566787033, 0));
#164 = DIRECTION('NONE', (1, -0.0000000000000004610713913357407, 0));
#165 = VECTOR('NONE', #164, 1);
#166 = CARTESIAN_POINT('NONE', (0.0338201, 0.043357799999999995, -0.6096));
#166 = CARTESIAN_POINT('NONE', (-0.033820100000000006, -0.04335779999999999, -0.6096));
#167 = LINE('NONE', #166, #165);
#168 = DIRECTION('NONE', (0.00000000000000006501542164183402, -1, 0));
#168 = DIRECTION('NONE', (0.00000000000000006501542164183402, 1, 0));
#169 = VECTOR('NONE', #168, 1);
#170 = CARTESIAN_POINT('NONE', (0.0037210999999999998, 0.0433578, -0));
#170 = CARTESIAN_POINT('NONE', (-0.0037211000000000054, -0.0433578, -0));
#171 = LINE('NONE', #170, #169);
#172 = DIRECTION('NONE', (0, 0, -1));
#173 = VECTOR('NONE', #172, 1);
#174 = CARTESIAN_POINT('NONE', (0.0037211000000000054, -0.0433578, -0));
#174 = CARTESIAN_POINT('NONE', (-0.0037210999999999998, 0.0433578, -0));
#175 = LINE('NONE', #174, #173);
#176 = DIRECTION('NONE', (0.00000000000000006501542164183402, -1, 0));
#176 = DIRECTION('NONE', (0.00000000000000006501542164183402, 1, 0));
#177 = VECTOR('NONE', #176, 1);
#178 = CARTESIAN_POINT('NONE', (0.0037210999999999998, 0.0433578, -0.6096));
#178 = CARTESIAN_POINT('NONE', (-0.0037211000000000054, -0.0433578, -0.6096));
#179 = LINE('NONE', #178, #177);
#180 = DIRECTION('NONE', (1, 0.0000000000000004610713913357407, 0));
#180 = DIRECTION('NONE', (-1, -0.00000000000000023053569566787033, 0));
#181 = VECTOR('NONE', #180, 1);
#182 = CARTESIAN_POINT('NONE', (0.0037211000000000054, -0.0433578, -0));
#182 = CARTESIAN_POINT('NONE', (-0.0037210999999999998, 0.0433578, -0));
#183 = LINE('NONE', #182, #181);
#184 = DIRECTION('NONE', (0, 0, -1));
#185 = VECTOR('NONE', #184, 1);
#186 = CARTESIAN_POINT('NONE', (0.033820100000000006, -0.04335779999999999, -0));
#186 = CARTESIAN_POINT('NONE', (-0.0338201, 0.043357799999999995, -0));
#187 = LINE('NONE', #186, #185);
#188 = DIRECTION('NONE', (1, 0.0000000000000004610713913357407, 0));
#188 = DIRECTION('NONE', (-1, -0.00000000000000023053569566787033, 0));
#189 = VECTOR('NONE', #188, 1);
#190 = CARTESIAN_POINT('NONE', (0.0037211000000000054, -0.0433578, -0.6096));
#190 = CARTESIAN_POINT('NONE', (-0.0037210999999999998, 0.0433578, -0.6096));
#191 = LINE('NONE', #190, #189);
#192 = DIRECTION('NONE', (0, -1, 0));
#192 = DIRECTION('NONE', (0, 1, 0));
#193 = VECTOR('NONE', #192, 1);
#194 = CARTESIAN_POINT('NONE', (0.033820100000000006, -0.04335779999999999, -0));
#194 = CARTESIAN_POINT('NONE', (-0.0338201, 0.043357799999999995, -0));
#195 = LINE('NONE', #194, #193);
#196 = DIRECTION('NONE', (0, 0, -1));
#197 = VECTOR('NONE', #196, 1);
#198 = CARTESIAN_POINT('NONE', (0.033820100000000006, -0.05079999999999999, -0));
#198 = CARTESIAN_POINT('NONE', (-0.0338201, 0.0508, -0));
#199 = LINE('NONE', #198, #197);
#200 = DIRECTION('NONE', (0, -1, 0));
#200 = DIRECTION('NONE', (0, 1, 0));
#201 = VECTOR('NONE', #200, 1);
#202 = CARTESIAN_POINT('NONE', (0.033820100000000006, -0.04335779999999999, -0.6096));
#202 = CARTESIAN_POINT('NONE', (-0.0338201, 0.043357799999999995, -0.6096));
#203 = LINE('NONE', #202, #201);
#204 = DIRECTION('NONE', (-1, -0.00000000000000020517070925003855, 0));
#204 = DIRECTION('NONE', (1, 0, 0));
#205 = VECTOR('NONE', #204, 1);
#206 = CARTESIAN_POINT('NONE', (0.033820100000000006, -0.05079999999999999, -0));
#206 = CARTESIAN_POINT('NONE', (-0.0338201, 0.0508, -0));
#207 = LINE('NONE', #206, #205);
#208 = DIRECTION('NONE', (-1, -0.00000000000000020517070925003855, 0));
#208 = DIRECTION('NONE', (1, 0, 0));
#209 = VECTOR('NONE', #208, 1);
#210 = CARTESIAN_POINT('NONE', (0.033820100000000006, -0.05079999999999999, -0.6096));
#210 = CARTESIAN_POINT('NONE', (-0.0338201, 0.0508, -0.6096));
#211 = LINE('NONE', #210, #209);
#212 = EDGE_CURVE('NONE', #5, #7, #59, .T.);
#213 = EDGE_CURVE('NONE', #7, #9, #63, .T.);
@ -264,56 +264,56 @@ DATA;
#248 = EDGE_CURVE('NONE', #51, #55, #203, .T.);
#249 = EDGE_CURVE('NONE', #53, #5, #207, .T.);
#250 = EDGE_CURVE('NONE', #55, #11, #211, .T.);
#251 = CARTESIAN_POINT('NONE', (-0.01691004999999998, -0.0508, -0.30480000000000007));
#252 = DIRECTION('NONE', (0, -1, -0));
#251 = CARTESIAN_POINT('NONE', (0.01691005, 0.0508, -0.3048));
#252 = DIRECTION('NONE', (0, 1, 0));
#253 = AXIS2_PLACEMENT_3D('NONE', #251, #252, $);
#254 = PLANE('NONE', #253);
#255 = CARTESIAN_POINT('NONE', (-0.033820100000000006, -0.04707889999999995, -0.30479999999999996));
#256 = DIRECTION('NONE', (-1, 0, -0));
#255 = CARTESIAN_POINT('NONE', (0.0338201, 0.0470789, -0.3048));
#256 = DIRECTION('NONE', (1, 0, 0));
#257 = AXIS2_PLACEMENT_3D('NONE', #255, #256, $);
#258 = PLANE('NONE', #257);
#259 = CARTESIAN_POINT('NONE', (-0.018770600000000033, -0.043357799999999995, -0.30480000000000007));
#260 = DIRECTION('NONE', (0, 1, 0));
#259 = CARTESIAN_POINT('NONE', (0.018770600000000002, 0.043357799999999995, -0.3048));
#260 = DIRECTION('NONE', (0, -1, -0));
#261 = AXIS2_PLACEMENT_3D('NONE', #259, #260, $);
#262 = PLANE('NONE', #261);
#263 = CARTESIAN_POINT('NONE', (-0.0037211000000000024, 0, -0.3048));
#264 = DIRECTION('NONE', (-1, 0, -0));
#263 = CARTESIAN_POINT('NONE', (0.0037211000000000024, 0, -0.3048));
#264 = DIRECTION('NONE', (1, 0, 0));
#265 = AXIS2_PLACEMENT_3D('NONE', #263, #264, $);
#266 = PLANE('NONE', #265);
#267 = CARTESIAN_POINT('NONE', (-0.01877060000000003, 0.0433578, -0.30480000000000007));
#268 = DIRECTION('NONE', (0, -1, -0));
#267 = CARTESIAN_POINT('NONE', (0.018770600000000002, -0.043357799999999995, -0.3048));
#268 = DIRECTION('NONE', (0, 1, 0));
#269 = AXIS2_PLACEMENT_3D('NONE', #267, #268, $);
#270 = PLANE('NONE', #269);
#271 = CARTESIAN_POINT('NONE', (-0.0338201, 0.04707889999999997, -0.30479999999999996));
#272 = DIRECTION('NONE', (-1, 0, -0));
#271 = CARTESIAN_POINT('NONE', (0.0338201, -0.047078899999999986, -0.30479999999999996));
#272 = DIRECTION('NONE', (1, 0, 0));
#273 = AXIS2_PLACEMENT_3D('NONE', #271, #272, $);
#274 = PLANE('NONE', #273);
#275 = CARTESIAN_POINT('NONE', (0, 0.0508, -0.3048));
#276 = DIRECTION('NONE', (0, 1, 0));
#275 = CARTESIAN_POINT('NONE', (0, -0.05079999999999999, -0.3048));
#276 = DIRECTION('NONE', (0, -1, -0));
#277 = AXIS2_PLACEMENT_3D('NONE', #275, #276, $);
#278 = PLANE('NONE', #277);
#279 = CARTESIAN_POINT('NONE', (0.03382009999999999, 0.04707889999999999, -0.30479999999999996));
#280 = DIRECTION('NONE', (1, 0, 0));
#279 = CARTESIAN_POINT('NONE', (-0.033820100000000006, -0.04707889999999995, -0.30479999999999996));
#280 = DIRECTION('NONE', (-1, 0, -0));
#281 = AXIS2_PLACEMENT_3D('NONE', #279, #280, $);
#282 = PLANE('NONE', #281);
#283 = CARTESIAN_POINT('NONE', (0.018770600000000002, 0.043357799999999995, -0.3048));
#284 = DIRECTION('NONE', (0, -1, -0));
#283 = CARTESIAN_POINT('NONE', (-0.018770600000000033, -0.043357799999999995, -0.30480000000000007));
#284 = DIRECTION('NONE', (0, 1, 0));
#285 = AXIS2_PLACEMENT_3D('NONE', #283, #284, $);
#286 = PLANE('NONE', #285);
#287 = CARTESIAN_POINT('NONE', (0.0037211000000000024, 0, -0.3048));
#288 = DIRECTION('NONE', (1, 0, 0));
#287 = CARTESIAN_POINT('NONE', (-0.0037211000000000024, 0, -0.3048));
#288 = DIRECTION('NONE', (-1, 0, -0));
#289 = AXIS2_PLACEMENT_3D('NONE', #287, #288, $);
#290 = PLANE('NONE', #289);
#291 = CARTESIAN_POINT('NONE', (0.018770600000000002, -0.043357799999999995, -0.3048));
#292 = DIRECTION('NONE', (0, 1, 0));
#291 = CARTESIAN_POINT('NONE', (-0.01877060000000003, 0.0433578, -0.30480000000000007));
#292 = DIRECTION('NONE', (0, -1, -0));
#293 = AXIS2_PLACEMENT_3D('NONE', #291, #292, $);
#294 = PLANE('NONE', #293);
#295 = CARTESIAN_POINT('NONE', (0.033820100000000006, -0.04707889999999999, -0.3048));
#296 = DIRECTION('NONE', (1, 0, 0));
#295 = CARTESIAN_POINT('NONE', (-0.0338201, 0.04707889999999997, -0.30479999999999996));
#296 = DIRECTION('NONE', (-1, 0, -0));
#297 = AXIS2_PLACEMENT_3D('NONE', #295, #296, $);
#298 = PLANE('NONE', #297);
#299 = CARTESIAN_POINT('NONE', (0.016910050000000003, -0.0508, -0.3048));
#300 = DIRECTION('NONE', (0, -1, -0));
#299 = CARTESIAN_POINT('NONE', (-0.016910049999999968, 0.050800000000000005, -0.30480000000000007));
#300 = DIRECTION('NONE', (0, 1, 0));
#301 = AXIS2_PLACEMENT_3D('NONE', #299, #300, $);
#302 = PLANE('NONE', #301);
#303 = CARTESIAN_POINT('NONE', (0, 0, -0));

File diff suppressed because one or more lines are too long

View File

@ -34,5 +34,5 @@ startSketchOn(knobPlane)
}, %)
|> xLine(endAbsolute = 0.0001)
|> close()
|> revolve({ axis = "Y" }, %)
|> revolve(axis = "Y")
|> appearance(color = '#D0FF01', metalness = 90, roughness = 50)

21
rust/Cargo.lock generated
View File

@ -1780,7 +1780,7 @@ dependencies = [
[[package]]
name = "kcl-bumper"
version = "0.1.50"
version = "0.1.51"
dependencies = [
"anyhow",
"clap",
@ -1791,7 +1791,7 @@ dependencies = [
[[package]]
name = "kcl-derive-docs"
version = "0.1.50"
version = "0.1.51"
dependencies = [
"Inflector",
"anyhow",
@ -1810,7 +1810,7 @@ dependencies = [
[[package]]
name = "kcl-directory-test-macro"
version = "0.1.50"
version = "0.1.51"
dependencies = [
"proc-macro2",
"quote",
@ -1819,7 +1819,7 @@ dependencies = [
[[package]]
name = "kcl-language-server"
version = "0.2.50"
version = "0.2.51"
dependencies = [
"anyhow",
"clap",
@ -1840,7 +1840,7 @@ dependencies = [
[[package]]
name = "kcl-language-server-release"
version = "0.1.50"
version = "0.1.51"
dependencies = [
"anyhow",
"clap",
@ -1860,7 +1860,7 @@ dependencies = [
[[package]]
name = "kcl-lib"
version = "0.2.50"
version = "0.2.51"
dependencies = [
"anyhow",
"approx 0.5.1",
@ -1928,7 +1928,7 @@ dependencies = [
[[package]]
name = "kcl-python-bindings"
version = "0.3.50"
version = "0.3.51"
dependencies = [
"anyhow",
"kcl-lib",
@ -1943,7 +1943,7 @@ dependencies = [
[[package]]
name = "kcl-test-server"
version = "0.1.50"
version = "0.1.51"
dependencies = [
"anyhow",
"hyper 0.14.32",
@ -1956,7 +1956,7 @@ dependencies = [
[[package]]
name = "kcl-to-core"
version = "0.1.50"
version = "0.1.51"
dependencies = [
"anyhow",
"async-trait",
@ -1970,7 +1970,7 @@ dependencies = [
[[package]]
name = "kcl-wasm-lib"
version = "0.1.50"
version = "0.1.51"
dependencies = [
"bson",
"console_error_panic_hook",
@ -1982,6 +1982,7 @@ dependencies = [
"js-sys",
"kcl-lib",
"kittycad",
"kittycad-modeling-cmds",
"serde_json",
"tokio",
"toml",

View File

@ -30,6 +30,7 @@ debug = "line-tables-only"
[workspace.dependencies]
async-trait = "0.1.85"
anyhow = { version = "1" }
bson = { version = "2.13.0", features = ["uuid-1", "chrono"] }
clap = { version = "4.5.31", features = ["derive"] }
dashmap = { version = "6.1.0" }
http = "1"

View File

@ -1,7 +1,7 @@
[package]
name = "kcl-bumper"
version = "0.1.50"
version = "0.1.51"
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.50"
version = "0.1.51"
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.50"
version = "0.1.51"
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.50"
version = "0.1.51"
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.50"
version = "0.2.51"
edition = "2021"
license = "MIT"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

View File

@ -1,7 +1,7 @@
[package]
name = "kcl-lib"
description = "KittyCAD Language implementation and tools"
version = "0.2.50"
version = "0.2.51"
edition = "2021"
license = "MIT"
repository = "https://github.com/KittyCAD/modeling-app"
@ -24,6 +24,7 @@ anyhow = { workspace = true, features = ["backtrace"] }
async-recursion = "1.1.1"
async-trait = { workspace = true }
base64 = "0.22.1"
bson = { workspace = true }
chrono = "0.4.38"
clap = { version = "4.5.27", default-features = false, optional = true, features = [
"std",
@ -95,7 +96,6 @@ wasm-bindgen-futures = "0.4.49"
web-sys = { version = "0.3.76", features = ["console"] }
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
bson = { version = "2.13.0", features = ["uuid-1", "chrono"] }
tokio = { workspace = true, features = ["full"] }
tokio-tungstenite = { version = "0.24.0", features = [
"rustls-tls-native-roots",

View File

@ -876,7 +876,7 @@ async fn kcl_test_simple_revolve() {
|> line(end = [0, -5.5])
|> line(end = [-2, 0])
|> close()
|> revolve({axis: 'y'}, %)
|> revolve(axis = 'y')
"#;
@ -896,7 +896,7 @@ async fn kcl_test_simple_revolve_uppercase() {
|> line(end = [0, -5.5])
|> line(end = [-2, 0])
|> close()
|> revolve({axis: 'Y'}, %)
|> revolve(axis = 'Y')
"#;
@ -916,7 +916,7 @@ async fn kcl_test_simple_revolve_negative() {
|> line(end = [0, -5.5])
|> line(end = [-2, 0])
|> close()
|> revolve({axis: '-Y', angle: 180}, %)
|> revolve(axis = '-Y', angle = 180)
"#;
@ -936,7 +936,7 @@ async fn kcl_test_revolve_bad_angle_low() {
|> line(end = [0, -5.5])
|> line(end = [-2, 0])
|> close()
|> revolve({axis: 'y', angle: -455}, %)
|> revolve(axis = 'y', angle = -455)
"#;
@ -962,7 +962,7 @@ async fn kcl_test_revolve_bad_angle_high() {
|> line(end = [0, -5.5])
|> line(end = [-2, 0])
|> close()
|> revolve({axis: 'y', angle: 455}, %)
|> revolve(axis = 'y', angle = 455)
"#;
@ -988,7 +988,7 @@ async fn kcl_test_simple_revolve_custom_angle() {
|> line(end = [0, -5.5])
|> line(end = [-2, 0])
|> close()
|> revolve({axis: 'y', angle: 180}, %)
|> revolve(axis = 'y', angle = 180)
"#;
@ -1008,7 +1008,7 @@ async fn kcl_test_simple_revolve_custom_axis() {
|> line(end = [0, -5.5])
|> line(end = [-2, 0])
|> close()
|> revolve({axis: {custom: {axis: [0, -1], origin: [0,0]}}, angle: 180}, %)
|> revolve(axis = {custom: {axis: [0, -1], origin: [0,0]}}, angle = 180)
"#;
@ -1032,7 +1032,7 @@ sketch001 = startSketchOn(box, "end")
|> line(end = [2, 0])
|> line(end = [0, 10])
|> close()
|> revolve({ axis: getOppositeEdge(revolveAxis), angle: 90 }, %)
|> revolve(axis = getOppositeEdge(revolveAxis), angle = 90)
"#;
@ -1056,7 +1056,7 @@ sketch001 = startSketchOn(box, revolveAxis)
|> line(end = [2, 0])
|> line(end = [0, 10])
|> close()
|> revolve({ axis: revolveAxis, angle: 90 }, %)
|> revolve(axis = revolveAxis, angle = 90)
"#;
@ -1082,10 +1082,10 @@ async fn kcl_test_revolve_on_face_circle_edge() {
sketch001 = startSketchOn(box, "END")
|> circle(center = [10,10], radius= 4)
|> revolve({
angle: 90,
axis: getOppositeEdge(revolveAxis)
}, %)
|> revolve(
angle = 90,
axis = getOppositeEdge(revolveAxis)
)
"#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap();
@ -1104,10 +1104,10 @@ async fn kcl_test_revolve_on_face_circle() {
sketch001 = startSketchOn(box, "END")
|> circle(center = [10,10], radius= 4 )
|> revolve({
angle: -90,
axis: 'y'
}, %)
|> revolve(
angle = -90,
axis = 'y'
)
"#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap();
@ -1130,10 +1130,10 @@ sketch001 = startSketchOn(box, "end")
|> line(end = [2, 0])
|> line(end = [0, 10])
|> close()
|> revolve({
axis: 'y',
angle: -90,
}, %)
|> revolve(
axis = 'y',
angle = -90,
)
"#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap();
@ -1144,10 +1144,10 @@ sketch001 = startSketchOn(box, "end")
async fn kcl_test_basic_revolve_circle() {
let code = r#"sketch001 = startSketchOn('XY')
|> circle(center = [15, 0], radius= 5)
|> revolve({
angle: 360,
axis: 'y'
}, %)
|> revolve(
angle = 360,
axis = 'y'
)
"#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap();
@ -1166,7 +1166,7 @@ async fn kcl_test_simple_revolve_sketch_on_edge() {
|> line(end = [0, -5.5])
|> line(end = [-2, 0])
|> close()
|> revolve({axis: 'y', angle: 180}, %)
|> revolve(axis = 'y', angle = 180)
part002 = startSketchOn(part001, 'end')
|> startProfileAt([4.5, -5], %)

View File

@ -133,7 +133,7 @@ impl StdLibFnArg {
|| self.type_ == "[Solid]"
|| self.type_ == "SketchSurface"
|| self.type_ == "SketchOrSurface"
|| self.type_ == "SolidOrImportedGeometry"
|| self.type_ == "SolidOrSketchOrImportedGeometry"
{
return Ok(Some((index, format!("{label}${{{}:{}}}", index, "%"))));
} else if (self.type_ == "TagDeclarator" || self.type_ == "TagNode") && self.required {
@ -1000,12 +1000,7 @@ mod tests {
fn get_autocomplete_snippet_revolve() {
let revolve_fn: Box<dyn StdLibFn> = Box::new(crate::std::revolve::Revolve);
let snippet = revolve_fn.to_autocomplete_snippet().unwrap();
assert_eq!(
snippet,
r#"revolve({
axis = ${0:"X"},
}, ${1:%})${}"#
);
assert_eq!(snippet, r#"revolve(${0:%}, axis = ${1:"X"})${}"#);
}
#[test]

View File

@ -104,23 +104,29 @@ impl EngineConnection {
})?;
let value = crate::wasm::JsFuture::from(promise).await.map_err(|e| {
KclError::Engine(KclErrorDetails {
message: format!("Failed to wait for promise from engine: {:?}", e),
source_ranges: vec![source_range],
})
// Try to parse the error as an engine error.
let err_str = e.as_string().unwrap_or_default();
if let Ok(kittycad_modeling_cmds::websocket::FailureWebSocketResponse { errors, .. }) =
serde_json::from_str(&err_str)
{
KclError::Engine(KclErrorDetails {
message: errors.iter().map(|e| e.message.clone()).collect::<Vec<_>>().join("\n"),
source_ranges: vec![source_range],
})
} else {
KclError::Engine(KclErrorDetails {
message: format!("Failed to wait for promise from send modeling command: {:?}", e),
source_ranges: vec![source_range],
})
}
})?;
// Parse the value as a string.
let s = value.as_string().ok_or_else(|| {
KclError::Engine(KclErrorDetails {
message: format!("Failed to get string from response from engine: `{:?}`", value),
source_ranges: vec![source_range],
})
})?;
// Convert JsValue to a Uint8Array
let data = js_sys::Uint8Array::from(value);
let ws_result: WebSocketResponse = serde_json::from_str(&s).map_err(|e| {
let ws_result: WebSocketResponse = bson::from_slice(&data.to_vec()).map_err(|e| {
KclError::Engine(KclErrorDetails {
message: format!("Failed to deserialize response from engine: {:?}", e),
message: format!("Failed to deserialize bson response from engine: {:?}", e),
source_ranges: vec![source_range],
})
})?;

View File

@ -83,16 +83,17 @@ pub struct ImportedGeometry {
#[ts(export)]
#[serde(tag = "type", rename_all = "camelCase")]
#[allow(clippy::vec_box)]
pub enum SolidOrImportedGeometry {
pub enum SolidOrSketchOrImportedGeometry {
ImportedGeometry(Box<ImportedGeometry>),
SolidSet(Vec<Solid>),
SketchSet(Vec<Sketch>),
}
impl From<SolidOrImportedGeometry> for crate::execution::KclValue {
fn from(value: SolidOrImportedGeometry) -> Self {
impl From<SolidOrSketchOrImportedGeometry> for crate::execution::KclValue {
fn from(value: SolidOrSketchOrImportedGeometry) -> Self {
match value {
SolidOrImportedGeometry::ImportedGeometry(s) => crate::execution::KclValue::ImportedGeometry(*s),
SolidOrImportedGeometry::SolidSet(mut s) => {
SolidOrSketchOrImportedGeometry::ImportedGeometry(s) => crate::execution::KclValue::ImportedGeometry(*s),
SolidOrSketchOrImportedGeometry::SolidSet(mut s) => {
if s.len() == 1 {
crate::execution::KclValue::Solid {
value: Box::new(s.pop().unwrap()),
@ -107,15 +108,31 @@ impl From<SolidOrImportedGeometry> for crate::execution::KclValue {
}
}
}
SolidOrSketchOrImportedGeometry::SketchSet(mut s) => {
if s.len() == 1 {
crate::execution::KclValue::Sketch {
value: Box::new(s.pop().unwrap()),
}
} else {
crate::execution::KclValue::HomArray {
value: s
.into_iter()
.map(|s| crate::execution::KclValue::Sketch { value: Box::new(s) })
.collect(),
ty: crate::execution::PrimitiveType::Sketch,
}
}
}
}
}
}
impl SolidOrImportedGeometry {
impl SolidOrSketchOrImportedGeometry {
pub(crate) fn ids(&self) -> Vec<uuid::Uuid> {
match self {
SolidOrImportedGeometry::ImportedGeometry(s) => vec![s.id],
SolidOrImportedGeometry::SolidSet(s) => s.iter().map(|s| s.id).collect(),
SolidOrSketchOrImportedGeometry::ImportedGeometry(s) => vec![s.id],
SolidOrSketchOrImportedGeometry::SolidSet(s) => s.iter().map(|s| s.id).collect(),
SolidOrSketchOrImportedGeometry::SketchSet(s) => s.iter().map(|s| s.id).collect(),
}
}
}

View File

@ -831,8 +831,7 @@ impl ExecutorContext {
.await?;
let (module_memory, _) = self
.exec_module_for_items(id, exec_state, ExecutionKind::Isolated, source_range)
.await
.unwrap();
.await?;
exec_state.mut_stack().memory.set_std(module_memory);
}

View File

@ -167,7 +167,7 @@ async fn execute_test(test: &Test, render_to_png: bool, export_step: bool) {
if render_to_png {
twenty_twenty::assert_image(test.output_dir.join(RENDERED_MODEL_NAME), &png, 0.99);
}
if export_step {
if export_step && std::env::var("EXPECTORATE").is_ok() {
let step = step.unwrap();
// We do not use expectorate here because the output is non-deterministic
// due to SSI and GPU.
@ -2289,3 +2289,66 @@ mod bad_units_in_annotation {
super::execute(TEST_NAME, true).await
}
}
mod translate_after_fillet {
const TEST_NAME: &str = "translate_after_fillet";
/// 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 scale_after_fillet {
const TEST_NAME: &str = "scale_after_fillet";
/// 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 rotate_after_fillet {
const TEST_NAME: &str = "rotate_after_fillet";
/// 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

@ -98,7 +98,7 @@ pub async fn appearance(exec_state: &mut ExecState, args: Args) -> Result<KclVal
/// // Add color to a revolved solid.
/// sketch001 = startSketchOn('XY')
/// |> circle( center = [15, 0], radius = 5 )
/// |> revolve({ angle = 360, axis = 'y' }, %)
/// |> revolve( angle = 360, axis = 'y')
/// |> appearance(
/// color = '#ff0000',
/// metalness = 90,

View File

@ -376,7 +376,7 @@ impl Args {
pub(crate) async fn flush_batch_for_solids(
&self,
exec_state: &mut ExecState,
solids: Vec<Solid>,
solids: &[Solid],
) -> Result<(), KclError> {
// Make sure we don't traverse sketches more than once.
let mut traversed_sketches = Vec::new();
@ -1239,16 +1239,6 @@ impl<'a> FromKclValue<'a> for super::sketch::ArcToData {
}
}
impl<'a> FromKclValue<'a> for super::revolve::RevolveData {
fn from_kcl_val(arg: &'a KclValue) -> Option<Self> {
let obj = arg.as_object()?;
let angle = obj.get("angle").and_then(|x| x.as_f64());
let tolerance = obj.get("tolerance").and_then(|x| x.as_f64());
let_field_of!(obj, axis);
Some(Self { angle, axis, tolerance })
}
}
impl<'a> FromKclValue<'a> for super::sketch::TangentialArcData {
fn from_kcl_val(arg: &'a KclValue) -> Option<Self> {
let obj = arg.as_object()?;
@ -1459,13 +1449,27 @@ impl<'a> FromKclValue<'a> for crate::execution::Solid {
}
}
impl<'a> FromKclValue<'a> for crate::execution::SolidOrImportedGeometry {
impl<'a> FromKclValue<'a> for crate::execution::SolidOrSketchOrImportedGeometry {
fn from_kcl_val(arg: &'a KclValue) -> Option<Self> {
match arg {
KclValue::Solid { value } => Some(Self::SolidSet(vec![(**value).clone()])),
KclValue::HomArray { value, .. } => Some(Self::SolidSet(
value.iter().map(|v| v.as_solid().unwrap().clone()).collect(),
)),
KclValue::Sketch { value } => Some(Self::SketchSet(vec![(**value).clone()])),
KclValue::HomArray { value, .. } => {
let mut solids = vec![];
let mut sketches = vec![];
for item in value {
match item {
KclValue::Solid { value } => solids.push((**value).clone()),
KclValue::Sketch { value } => sketches.push((**value).clone()),
_ => return None,
}
}
if !solids.is_empty() {
Some(Self::SolidSet(solids))
} else {
Some(Self::SketchSet(sketches))
}
}
KclValue::ImportedGeometry(value) => Some(Self::ImportedGeometry(Box::new(value.clone()))),
_ => None,
}

View File

@ -22,6 +22,7 @@ use crate::{
kcl_value::{ArrayLen, RuntimeType},
ArtifactId, ExecState, ExtrudeSurface, GeoMeta, KclValue, Path, PrimitiveType, Sketch, SketchSurface, Solid,
},
parsing::ast::types::TagNode,
std::Args,
};
@ -33,8 +34,10 @@ pub async fn extrude(exec_state: &mut ExecState, args: Args) -> Result<KclValue,
exec_state,
)?;
let length = args.get_kw_arg("length")?;
let tag_start = args.get_kw_arg_opt("tagStart")?;
let tag_end = args.get_kw_arg_opt("tagEnd")?;
let result = inner_extrude(sketches, length, exec_state, args).await?;
let result = inner_extrude(sketches, length, tag_start, tag_end, exec_state, args).await?;
Ok(result.into())
}
@ -96,11 +99,16 @@ pub async fn extrude(exec_state: &mut ExecState, args: Args) -> Result<KclValue,
args = {
sketches = { docs = "Which sketch or sketches should be extruded"},
length = { docs = "How far to extrude the given sketches"},
tag_start = { docs = "A named tag for the face at the start of the extrusion, i.e. the original sketch" },
tag_end = { docs = "A named tag for the face at the end of the extrusion, i.e. the new face created by extruding the original sketch" },
}
}]
#[allow(clippy::too_many_arguments)]
async fn inner_extrude(
sketches: Vec<Sketch>,
length: f64,
tag_start: Option<TagNode>,
tag_end: Option<TagNode>,
exec_state: &mut ExecState,
args: Args,
) -> Result<Vec<Solid>, KclError> {
@ -121,18 +129,38 @@ async fn inner_extrude(
))
.await?;
solids.push(do_post_extrude(sketch.clone(), id.into(), length, exec_state, args.clone()).await?);
solids.push(
do_post_extrude(
sketch,
id.into(),
length,
&NamedCapTags {
start: tag_start.as_ref(),
end: tag_end.as_ref(),
},
exec_state,
&args,
)
.await?,
);
}
Ok(solids)
}
pub(crate) async fn do_post_extrude(
sketch: Sketch,
#[derive(Debug, Default)]
pub(crate) struct NamedCapTags<'a> {
pub start: Option<&'a TagNode>,
pub end: Option<&'a TagNode>,
}
pub(crate) async fn do_post_extrude<'a>(
sketch: &Sketch,
solid_id: ArtifactId,
length: f64,
named_cap_tags: &'a NamedCapTags<'a>,
exec_state: &mut ExecState,
args: Args,
args: &Args,
) -> Result<Solid, KclError> {
// Bring the object to the front of the scene.
// See: https://github.com/KittyCAD/modeling-app/issues/806
@ -217,10 +245,11 @@ pub(crate) async fn do_post_extrude(
sides: face_id_map,
start_cap_id,
end_cap_id,
} = analyze_faces(exec_state, &args, face_infos).await;
} = analyze_faces(exec_state, args, face_infos).await;
// Iterate over the sketch.value array and add face_id to GeoMeta
let no_engine_commands = args.ctx.no_engine_commands().await;
let new_value = sketch
let mut new_value: Vec<ExtrudeSurface> = sketch
.paths
.iter()
.flat_map(|path| {
@ -283,6 +312,48 @@ pub(crate) async fn do_post_extrude(
})
.collect();
// Add the tags for the start or end caps.
if let Some(tag_start) = named_cap_tags.start {
let Some(start_cap_id) = start_cap_id else {
return Err(KclError::Type(KclErrorDetails {
message: format!(
"Expected a start cap ID for tag `{}` for extrusion of sketch {:?}",
tag_start.name, sketch.id
),
source_ranges: vec![args.source_range],
}));
};
new_value.push(ExtrudeSurface::ExtrudePlane(crate::execution::ExtrudePlane {
face_id: start_cap_id,
tag: Some(tag_start.clone()),
geo_meta: GeoMeta {
id: start_cap_id,
metadata: args.source_range.into(),
},
}));
}
if let Some(tag_end) = named_cap_tags.end {
let Some(end_cap_id) = end_cap_id else {
return Err(KclError::Type(KclErrorDetails {
message: format!(
"Expected an end cap ID for tag `{}` for extrusion of sketch {:?}",
tag_end.name, sketch.id
),
source_ranges: vec![args.source_range],
}));
};
new_value.push(ExtrudeSurface::ExtrudePlane(crate::execution::ExtrudePlane {
face_id: end_cap_id,
tag: Some(tag_end.clone()),
geo_meta: GeoMeta {
id: end_cap_id,
metadata: args.source_range.into(),
},
}));
}
Ok(Solid {
// Ok so you would think that the id would be the id of the solid,
// that we passed in to the function, but it's actually the id of the

View File

@ -13,6 +13,7 @@ use crate::{
kcl_value::{ArrayLen, RuntimeType},
ExecState, KclValue, PrimitiveType, Sketch, Solid,
},
parsing::ast::types::TagNode,
std::{extrude::do_post_extrude, fillet::default_tolerance, Args},
};
@ -36,6 +37,8 @@ pub async fn loft(exec_state: &mut ExecState, args: Args) -> Result<KclValue, Kc
let base_curve_index: Option<u32> = args.get_kw_arg_opt("baseCurveIndex")?;
// Tolerance for the loft operation.
let tolerance: Option<f64> = args.get_kw_arg_opt("tolerance")?;
let tag_start = args.get_kw_arg_opt("tagStart")?;
let tag_end = args.get_kw_arg_opt("tagEnd")?;
let value = inner_loft(
sketches,
@ -43,6 +46,8 @@ pub async fn loft(exec_state: &mut ExecState, args: Args) -> Result<KclValue, Kc
bez_approximate_rational,
base_curve_index,
tolerance,
tag_start,
tag_end,
exec_state,
args,
)
@ -127,14 +132,19 @@ pub async fn loft(exec_state: &mut ExecState, args: Args) -> Result<KclValue, Kc
bez_approximate_rational = {docs = "Attempt to approximate rational curves (such as arcs) using a bezier. This will remove banding around interpolations between arcs and non-arcs. It may produce errors in other scenarios Over time, this field won't be necessary."},
base_curve_index = {docs = "This can be set to override the automatically determined topological base curve, which is usually the first section encountered."},
tolerance = {docs = "Tolerance for the loft operation."},
tag_start = { docs = "A named tag for the face at the start of the loft, i.e. the original sketch" },
tag_end = { docs = "A named tag for the face at the end of the loft, i.e. the last sketch" },
}
}]
#[allow(clippy::too_many_arguments)]
async fn inner_loft(
sketches: Vec<Sketch>,
v_degree: NonZeroU32,
bez_approximate_rational: bool,
base_curve_index: Option<u32>,
tolerance: Option<f64>,
tag_start: Option<TagNode>,
tag_end: Option<TagNode>,
exec_state: &mut ExecState,
args: Args,
) -> Result<Box<Solid>, KclError> {
@ -167,6 +177,17 @@ async fn inner_loft(
// Override its id with the loft id so we can get its faces later
sketch.id = id;
Ok(Box::new(
do_post_extrude(sketch, id.into(), 0.0, exec_state, args).await?,
do_post_extrude(
&sketch,
id.into(),
0.0,
&super::extrude::NamedCapTags {
start: tag_start.as_ref(),
end: tag_end.as_ref(),
},
exec_state,
&args,
)
.await?,
))
}

View File

@ -363,7 +363,7 @@ async fn execute_pattern_transform<T: GeometryTrait>(
// Flush the batch for our fillets/chamfers if there are any.
// If we do not flush these, then you won't be able to pattern something with fillets.
// Flush just the fillets/chamfers that apply to these solids.
T::flush_batch(args, exec_state, geo_set.clone()).await?;
T::flush_batch(args, exec_state, &geo_set).await?;
let starting: Vec<T> = geo_set.into();
if args.ctx.context_type == crate::execution::ContextType::Mock {
@ -614,7 +614,7 @@ trait GeometryTrait: Clone {
fn original_id(&self) -> Uuid;
fn set_id(&mut self, id: Uuid);
fn array_to_point3d(val: &KclValue, source_ranges: Vec<SourceRange>) -> Result<Point3d, KclError>;
async fn flush_batch(args: &Args, exec_state: &mut ExecState, set: Self::Set) -> Result<(), KclError>;
async fn flush_batch(args: &Args, exec_state: &mut ExecState, set: &Self::Set) -> Result<(), KclError>;
}
impl GeometryTrait for Sketch {
@ -633,7 +633,7 @@ impl GeometryTrait for Sketch {
Ok(Point3d { x, y, z: 0.0 })
}
async fn flush_batch(_: &Args, _: &mut ExecState, _: Self::Set) -> Result<(), KclError> {
async fn flush_batch(_: &Args, _: &mut ExecState, _: &Self::Set) -> Result<(), KclError> {
Ok(())
}
}
@ -656,7 +656,7 @@ impl GeometryTrait for Solid {
array_to_point3d(val, source_ranges)
}
async fn flush_batch(args: &Args, exec_state: &mut ExecState, solid_set: Self::Set) -> Result<(), KclError> {
async fn flush_batch(args: &Args, exec_state: &mut ExecState, solid_set: &Self::Set) -> Result<(), KclError> {
args.flush_batch_for_solids(exec_state, solid_set).await
}
}
@ -1221,7 +1221,7 @@ async fn inner_pattern_circular_3d(
// Flush the batch for our fillets/chamfers if there are any.
// If we do not flush these, then you won't be able to pattern something with fillets.
// Flush just the fillets/chamfers that apply to these solids.
args.flush_batch_for_solids(exec_state, solids.clone()).await?;
args.flush_batch_for_solids(exec_state, &solids).await?;
let starting_solids = solids;

View File

@ -4,35 +4,31 @@ use anyhow::Result;
use kcl_derive_docs::stdlib;
use kcmc::{each_cmd as mcmd, length_unit::LengthUnit, shared::Angle, ModelingCmd};
use kittycad_modeling_cmds::{self as kcmc};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use crate::{
errors::{KclError, KclErrorDetails},
execution::{ExecState, KclValue, Sketch, Solid},
execution::{
kcl_value::{ArrayLen, RuntimeType},
ExecState, KclValue, PrimitiveType, Sketch, Solid,
},
parsing::ast::types::TagNode,
std::{axis_or_reference::Axis2dOrEdgeReference, extrude::do_post_extrude, fillet::default_tolerance, Args},
};
/// Data for revolution surfaces.
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)]
#[ts(export)]
pub struct RevolveData {
/// Angle to revolve (in degrees). Default is 360.
#[serde(default)]
#[schemars(range(min = -360.0, max = 360.0))]
pub angle: Option<f64>,
/// Axis of revolution.
pub axis: Axis2dOrEdgeReference,
/// Tolerance for the revolve operation.
#[serde(default)]
pub tolerance: Option<f64>,
}
/// Revolve a sketch or set of sketches around an axis.
pub async fn revolve(exec_state: &mut ExecState, args: Args) -> Result<KclValue, KclError> {
let (data, sketches): (RevolveData, _) = args.get_data_and_sketches(exec_state)?;
let sketches = args.get_unlabeled_kw_arg_typed(
"sketches",
&RuntimeType::Array(PrimitiveType::Sketch, ArrayLen::NonEmpty),
exec_state,
)?;
let axis: Axis2dOrEdgeReference = args.get_kw_arg("axis")?;
let angle = args.get_kw_arg_opt("angle")?;
let tolerance = args.get_kw_arg_opt("tolerance")?;
let tag_start = args.get_kw_arg_opt("tagStart")?;
let tag_end = args.get_kw_arg_opt("tagEnd")?;
let value = inner_revolve(data, sketches, exec_state, args).await?;
let value = inner_revolve(sketches, axis, angle, tolerance, tag_start, tag_end, exec_state, args).await?;
Ok(value.into())
}
@ -60,17 +56,17 @@ pub async fn revolve(exec_state: &mut ExecState, args: Args) -> Result<KclValue,
/// |> line(end = [0, -5.5])
/// |> line(end = [-2, 0])
/// |> close()
/// |> revolve({axis = 'y'}, %) // default angle is 360
/// |> revolve(axis = 'y') // default angle is 360
/// ```
///
/// ```no_run
/// // A donut shape.
/// sketch001 = startSketchOn('XY')
/// |> circle( center = [15, 0], radius = 5 )
/// |> revolve({
/// |> revolve(
/// angle = 360,
/// axis = 'y'
/// }, %)
/// )
/// ```
///
/// ```no_run
@ -84,7 +80,7 @@ pub async fn revolve(exec_state: &mut ExecState, args: Args) -> Result<KclValue,
/// |> line(end = [0, -5.5])
/// |> line(end = [-2, 0])
/// |> close()
/// |> revolve({axis = 'y', angle = 180}, %)
/// |> revolve(axis = 'y', angle = 180)
/// ```
///
/// ```no_run
@ -98,7 +94,8 @@ pub async fn revolve(exec_state: &mut ExecState, args: Args) -> Result<KclValue,
/// |> line(end = [0, -5.5])
/// |> line(end = [-2, 0])
/// |> close()
/// |> revolve({axis = 'y', angle = 180}, %)
/// |> revolve(axis = 'y', angle = 180)
///
/// part002 = startSketchOn(part001, 'end')
/// |> startProfileAt([4.5, -5], %)
/// |> line(end = [0, 5])
@ -119,10 +116,10 @@ pub async fn revolve(exec_state: &mut ExecState, args: Args) -> Result<KclValue,
///
/// sketch001 = startSketchOn(box, "END")
/// |> circle( center = [10,10], radius = 4 )
/// |> revolve({
/// |> revolve(
/// angle = -90,
/// axis = 'y'
/// }, %)
/// )
/// ```
///
/// ```no_run
@ -136,10 +133,10 @@ pub async fn revolve(exec_state: &mut ExecState, args: Args) -> Result<KclValue,
///
/// sketch001 = startSketchOn(box, "END")
/// |> circle( center = [10,10], radius = 4 )
/// |> revolve({
/// |> revolve(
/// angle = 90,
/// axis = getOppositeEdge(revolveAxis)
/// }, %)
/// )
/// ```
///
/// ```no_run
@ -153,11 +150,11 @@ pub async fn revolve(exec_state: &mut ExecState, args: Args) -> Result<KclValue,
///
/// sketch001 = startSketchOn(box, "END")
/// |> circle( center = [10,10], radius = 4 )
/// |> revolve({
/// |> revolve(
/// angle = 90,
/// axis = getOppositeEdge(revolveAxis),
/// tolerance: 0.0001
/// }, %)
/// tolerance = 0.0001
/// )
/// ```
///
/// ```no_run
@ -168,14 +165,15 @@ pub async fn revolve(exec_state: &mut ExecState, args: Args) -> Result<KclValue,
/// |> line(endAbsolute = [profileStartX(%), profileStartY(%)])
/// |> close()
///
/// part001 = revolve({
/// part001 = revolve(
/// sketch001,
/// axis = {
/// custom: {
/// axis = [0.0, 1.0],
/// origin: [0.0, 0.0]
/// }
/// }
/// }, sketch001)
/// )
/// ```
///
/// ```no_run
@ -196,21 +194,65 @@ pub async fn revolve(exec_state: &mut ExecState, args: Args) -> Result<KclValue,
/// |> line(endAbsolute = [profileStartX(%), profileStartY(%)])
/// |> close()
///
/// revolve({
/// revolve(
/// [profile001, profile002],
/// axis = "X",
/// }, [profile001, profile002])
/// )
/// ```
///
/// ```no_run
/// // Revolve around a path that has not been extruded.
///
/// profile001 = startSketchOn('XY')
/// |> startProfileAt([0, 0], %)
/// |> line(end = [0, 20], tag = $revolveAxis)
/// |> line(end = [20, 0])
/// |> line(end = [0, -20])
/// |> close(%)
///
/// sketch001 = startSketchOn('XY')
/// |> circle(center = [-10, 10], radius = 4)
/// |> revolve(angle = 90, axis = revolveAxis)
/// ```
///
/// ```no_run
/// // Revolve around a path that has not been extruded or closed.
///
/// profile001 = startSketchOn('XY')
/// |> startProfileAt([0, 0], %)
/// |> line(end = [0, 20], tag = $revolveAxis)
/// |> line(end = [20, 0])
///
/// sketch001 = startSketchOn('XY')
/// |> circle(center = [-10, 10], radius = 4)
/// |> revolve(angle = 90, axis = revolveAxis)
/// ```
#[stdlib {
name = "revolve",
feature_tree_operation = true,
keywords = true,
unlabeled_first = true,
args = {
sketches = { docs = "The sketch or set of sketches that should be revolved" },
axis = { docs = "Axis of revolution." },
angle = { docs = "Angle to revolve (in degrees). Default is 360." },
tolerance = { docs = "Tolerance for the revolve operation." },
tag_start = { docs = "A named tag for the face at the start of the revolve, i.e. the original sketch" },
tag_end = { docs = "A named tag for the face at the end of the revolve" },
}
}]
#[allow(clippy::too_many_arguments)]
async fn inner_revolve(
data: RevolveData,
sketches: Vec<Sketch>,
axis: Axis2dOrEdgeReference,
angle: Option<f64>,
tolerance: Option<f64>,
tag_start: Option<TagNode>,
tag_end: Option<TagNode>,
exec_state: &mut ExecState,
args: Args,
) -> Result<Vec<Solid>, KclError> {
if let Some(angle) = data.angle {
if let Some(angle) = angle {
// Return an error if the angle is zero.
// We don't use validate() here because we want to return a specific error message that is
// nice and we use the other data in the docs, so we still need use the derive above for the json schema.
@ -222,13 +264,13 @@ async fn inner_revolve(
}
}
let angle = Angle::from_degrees(data.angle.unwrap_or(360.0));
let angle = Angle::from_degrees(angle.unwrap_or(360.0));
let mut solids = Vec::new();
for sketch in &sketches {
let id = exec_state.next_uuid();
match &data.axis {
match &axis {
Axis2dOrEdgeReference::Axis(axis) => {
let (axis, origin) = axis.axis_and_origin()?;
args.batch_modeling_cmd(
@ -238,7 +280,7 @@ async fn inner_revolve(
target: sketch.id.into(),
axis,
origin,
tolerance: LengthUnit(data.tolerance.unwrap_or(default_tolerance(&args.ctx.settings.units))),
tolerance: LengthUnit(tolerance.unwrap_or(default_tolerance(&args.ctx.settings.units))),
axis_is_2d: true,
}),
)
@ -252,14 +294,27 @@ async fn inner_revolve(
angle,
target: sketch.id.into(),
edge_id,
tolerance: LengthUnit(data.tolerance.unwrap_or(default_tolerance(&args.ctx.settings.units))),
tolerance: LengthUnit(tolerance.unwrap_or(default_tolerance(&args.ctx.settings.units))),
}),
)
.await?;
}
}
solids.push(do_post_extrude(sketch.clone(), id.into(), 0.0, exec_state, args.clone()).await?);
solids.push(
do_post_extrude(
sketch,
id.into(),
0.0,
&super::extrude::NamedCapTags {
start: tag_start.as_ref(),
end: tag_end.as_ref(),
},
exec_state,
&args,
)
.await?,
);
}
Ok(solids)

View File

@ -210,7 +210,7 @@ async fn inner_shell(
for solid in &solids {
// Flush the batch for our fillets/chamfers if there are any.
// If we do not do these for sketch on face, things will fail with face does not exist.
args.flush_batch_for_solids(exec_state, vec![solid.clone()]).await?;
args.flush_batch_for_solids(exec_state, &[solid.clone()]).await?;
for tag in &faces {
let extrude_plane_id = tag.get_face_id(solid, exec_state, &args, false).await?;
@ -320,7 +320,7 @@ async fn inner_hollow(
) -> Result<Box<Solid>, KclError> {
// Flush the batch for our fillets/chamfers if there are any.
// If we do not do these for sketch on face, things will fail with face does not exist.
args.flush_batch_for_solids(exec_state, vec![(*solid).clone()]).await?;
args.flush_batch_for_solids(exec_state, &[(*solid).clone()]).await?;
args.batch_modeling_cmd(
exec_state.next_uuid(),

View File

@ -951,6 +951,37 @@ pub async fn start_sketch_on(exec_state: &mut ExecState, args: Args) -> Result<K
/// ```
///
/// ```no_run
/// // Sketch on the end of an extruded face by tagging the end face.
///
/// exampleSketch = startSketchOn(XY)
/// |> startProfileAt([0, 0], %)
/// |> line(end = [10, 0])
/// |> line(end = [0, 10])
/// |> line(end = [-10, 0])
/// |> close()
///
/// example = extrude(exampleSketch, length = 5, tagEnd = $end01)
///
/// exampleSketch002 = startSketchOn(example, end01)
/// |> startProfileAt([1, 1], %)
/// |> line(end = [8, 0])
/// |> line(end = [0, 8])
/// |> line(end = [-8, 0])
/// |> close()
///
/// example002 = extrude(exampleSketch002, length = 5, tagEnd = $end02)
///
/// exampleSketch003 = startSketchOn(example002, end02)
/// |> startProfileAt([2, 2], %)
/// |> line(end = [6, 0])
/// |> line(end = [0, 6])
/// |> line(end = [-6, 0])
/// |> close()
///
/// example003 = extrude(exampleSketch003, length = 5)
/// ```
///
/// ```no_run
/// exampleSketch = startSketchOn(XY)
/// |> startProfileAt([0, 0], %)
/// |> line(end = [10, 0])
@ -991,7 +1022,7 @@ pub async fn start_sketch_on(exec_state: &mut ExecState, args: Args) -> Result<K
/// |> line(end = [-2, 0])
/// |> close()
///
/// example = revolve({ axis: 'y', angle: 180 }, exampleSketch)
/// example = revolve(exampleSketch, axis = 'y', angle = 180)
///
/// exampleSketch002 = startSketchOn(example, 'end')
/// |> startProfileAt([4.5, -5], %)
@ -1004,6 +1035,32 @@ pub async fn start_sketch_on(exec_state: &mut ExecState, args: Args) -> Result<K
/// ```
///
/// ```no_run
/// // Sketch on the end of a revolved face by tagging the end face.
///
/// exampleSketch = startSketchOn(XY)
/// |> startProfileAt([4, 12], %)
/// |> line(end = [2, 0])
/// |> line(end = [0, -6])
/// |> line(end = [4, -6])
/// |> line(end = [0, -6])
/// |> line(end = [-3.75, -4.5])
/// |> line(end = [0, -5.5])
/// |> line(end = [-2, 0])
/// |> close()
///
/// example = revolve(exampleSketch, axis = 'y', angle = 180, tagEnd = $end01)
///
/// exampleSketch002 = startSketchOn(example, end01)
/// |> startProfileAt([4.5, -5], %)
/// |> line(end = [0, 5])
/// |> line(end = [5, 0])
/// |> line(end = [0, -5])
/// |> close()
///
/// example002 = extrude(exampleSketch002, length = 5)
/// ```
///
/// ```no_run
/// a1 = startSketchOn({
/// plane: {
/// origin = { x = 0, y = 0, z = 0 },
@ -1212,7 +1269,7 @@ pub(crate) async fn inner_start_profile_at(
SketchSurface::Face(face) => {
// Flush the batch for our fillets/chamfers if there are any.
// If we do not do these for sketch on face, things will fail with face does not exist.
args.flush_batch_for_solids(exec_state, vec![(*face.solid).clone()])
args.flush_batch_for_solids(exec_state, &[(*face.solid).clone()])
.await?;
}
SketchSurface::Plane(plane) if !plane.is_standard() => {

View File

@ -13,6 +13,7 @@ use crate::{
kcl_value::{ArrayLen, RuntimeType},
ExecState, Helix, KclValue, PrimitiveType, Sketch, Solid,
},
parsing::ast::types::TagNode,
std::{extrude::do_post_extrude, fillet::default_tolerance, Args},
};
@ -35,8 +36,13 @@ pub async fn sweep(exec_state: &mut ExecState, args: Args) -> Result<KclValue, K
let path: SweepPath = args.get_kw_arg("path")?;
let sectional = args.get_kw_arg_opt("sectional")?;
let tolerance = args.get_kw_arg_opt("tolerance")?;
let tag_start = args.get_kw_arg_opt("tagStart")?;
let tag_end = args.get_kw_arg_opt("tagEnd")?;
let value = inner_sweep(sketches, path, sectional, tolerance, exec_state, args).await?;
let value = inner_sweep(
sketches, path, sectional, tolerance, tag_start, tag_end, exec_state, args,
)
.await?;
Ok(value.into())
}
@ -145,13 +151,18 @@ pub async fn sweep(exec_state: &mut ExecState, args: Args) -> Result<KclValue, K
path = { docs = "The path to sweep the sketch along" },
sectional = { docs = "If true, the sweep will be broken up into sub-sweeps (extrusions, revolves, sweeps) based on the trajectory path components." },
tolerance = { docs = "Tolerance for this operation" },
tag_start = { docs = "A named tag for the face at the start of the sweep, i.e. the original sketch" },
tag_end = { docs = "A named tag for the face at the end of the sweep" },
}
}]
#[allow(clippy::too_many_arguments)]
async fn inner_sweep(
sketches: Vec<Sketch>,
path: SweepPath,
sectional: Option<bool>,
tolerance: Option<f64>,
tag_start: Option<TagNode>,
tag_end: Option<TagNode>,
exec_state: &mut ExecState,
args: Args,
) -> Result<Vec<Solid>, KclError> {
@ -174,7 +185,20 @@ async fn inner_sweep(
)
.await?;
solids.push(do_post_extrude(sketch.clone(), id.into(), 0.0, exec_state, args.clone()).await?);
solids.push(
do_post_extrude(
sketch,
id.into(),
0.0,
&super::extrude::NamedCapTags {
start: tag_start.as_ref(),
end: tag_end.as_ref(),
},
exec_state,
&args,
)
.await?,
);
}
Ok(solids)

View File

@ -15,16 +15,17 @@ use crate::{
errors::{KclError, KclErrorDetails},
execution::{
kcl_value::{ArrayLen, RuntimeType},
ExecState, KclValue, PrimitiveType, SolidOrImportedGeometry,
ExecState, KclValue, PrimitiveType, SolidOrSketchOrImportedGeometry,
},
std::Args,
};
/// Scale a solid.
/// Scale a solid or a sketch.
pub async fn scale(exec_state: &mut ExecState, args: Args) -> Result<KclValue, KclError> {
let solids = args.get_unlabeled_kw_arg_typed(
"solids",
let objects = args.get_unlabeled_kw_arg_typed(
"objects",
&RuntimeType::Union(vec![
RuntimeType::Array(PrimitiveType::Sketch, ArrayLen::NonEmpty),
RuntimeType::Array(PrimitiveType::Solid, ArrayLen::NonEmpty),
RuntimeType::Primitive(PrimitiveType::ImportedGeometry),
]),
@ -33,11 +34,11 @@ pub async fn scale(exec_state: &mut ExecState, args: Args) -> Result<KclValue, K
let scale = args.get_kw_arg("scale")?;
let global = args.get_kw_arg_opt("global")?;
let solids = inner_scale(solids, scale, global, exec_state, args).await?;
Ok(solids.into())
let objects = inner_scale(objects, scale, global, exec_state, args).await?;
Ok(objects.into())
}
/// Scale a solid.
/// Scale a solid or a sketch.
///
/// By default the transform is applied in local sketch axis, therefore the origin will not move.
///
@ -134,25 +135,31 @@ pub async fn scale(exec_state: &mut ExecState, args: Args) -> Result<KclValue, K
keywords = true,
unlabeled_first = true,
args = {
solids = {docs = "The solid or set of solids to scale."},
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."},
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(
solids: SolidOrImportedGeometry,
objects: SolidOrSketchOrImportedGeometry,
scale: [f64; 3],
global: Option<bool>,
exec_state: &mut ExecState,
args: Args,
) -> Result<SolidOrImportedGeometry, KclError> {
for solid_id in solids.ids() {
) -> Result<SolidOrSketchOrImportedGeometry, KclError> {
// If we have a solid, flush the fillets and chamfers.
// Only transforms needs this, it is very odd, see: https://github.com/KittyCAD/modeling-app/issues/5880
if let SolidOrSketchOrImportedGeometry::SolidSet(solids) = &objects {
args.flush_batch_for_solids(exec_state, solids).await?;
}
for object_id in objects.ids() {
let id = exec_state.next_uuid();
args.batch_modeling_cmd(
id,
ModelingCmd::from(mcmd::SetObjectTransform {
object_id: solid_id,
object_id,
transforms: vec![shared::ComponentTransform {
scale: Some(shared::TransformBy::<Point3d<f64>> {
property: Point3d {
@ -172,14 +179,15 @@ async fn inner_scale(
.await?;
}
Ok(solids)
Ok(objects)
}
/// Move a solid.
/// Move a solid or a sketch.
pub async fn translate(exec_state: &mut ExecState, args: Args) -> Result<KclValue, KclError> {
let solids = args.get_unlabeled_kw_arg_typed(
"solids",
let objects = args.get_unlabeled_kw_arg_typed(
"objects",
&RuntimeType::Union(vec![
RuntimeType::Array(PrimitiveType::Sketch, ArrayLen::NonEmpty),
RuntimeType::Array(PrimitiveType::Solid, ArrayLen::NonEmpty),
RuntimeType::Primitive(PrimitiveType::ImportedGeometry),
]),
@ -188,11 +196,11 @@ pub async fn translate(exec_state: &mut ExecState, args: Args) -> Result<KclValu
let translate = args.get_kw_arg("translate")?;
let global = args.get_kw_arg_opt("global")?;
let solids = inner_translate(solids, translate, global, exec_state, args).await?;
Ok(solids.into())
let objects = inner_translate(objects, translate, global, exec_state, args).await?;
Ok(objects.into())
}
/// Move a solid.
/// Move a solid or a sketch.
///
/// ```no_run
/// // Move a pipe.
@ -275,31 +283,86 @@ pub async fn translate(exec_state: &mut ExecState, args: Args) -> Result<KclValu
/// // Move the sweeps.
/// translate(parts, translate = [1.0, 1.0, 2.5])
/// ```
///
/// ```no_run
/// // Move a sketch.
///
/// fn square(length){
/// l = length / 2
/// p0 = [-l, -l]
/// p1 = [-l, l]
/// p2 = [l, l]
/// p3 = [l, -l]
///
/// return startSketchOn(XY)
/// |> startProfileAt(p0, %)
/// |> line(endAbsolute = p1)
/// |> line(endAbsolute = p2)
/// |> line(endAbsolute = p3)
/// |> close()
/// }
///
/// square(10)
/// |> translate(
/// translate = [5, 5, 0],
/// )
/// |> extrude(
/// length = 10,
/// )
/// ```
///
/// ```no_run
/// // Translate and rotate a sketch to create a loft.
/// sketch001 = startSketchOn('XY')
///
/// fn square() {
/// return startProfileAt([-10, 10], sketch001)
/// |> xLine(length = 20)
/// |> yLine(length = -20)
/// |> xLine(length = -20)
/// |> line(endAbsolute = [profileStartX(%), profileStartY(%)])
/// |> close()
/// }
///
/// profile001 = square()
///
/// profile002 = square()
/// |> translate(translate = [0, 0, 20])
/// |> rotate(axis = [0, 0, 1.0], angle = 45)
///
/// loft([profile001, profile002])
/// ```
#[stdlib {
name = "translate",
feature_tree_operation = false,
keywords = true,
unlabeled_first = true,
args = {
solids = {docs = "The solid or set of solids to move."},
translate = {docs = "The amount to move the solid in all three axes."},
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."},
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(
solids: SolidOrImportedGeometry,
objects: SolidOrSketchOrImportedGeometry,
translate: [f64; 3],
global: Option<bool>,
exec_state: &mut ExecState,
args: Args,
) -> Result<SolidOrImportedGeometry, KclError> {
for solid_id in solids.ids() {
) -> Result<SolidOrSketchOrImportedGeometry, KclError> {
// If we have a solid, flush the fillets and chamfers.
// Only transforms needs this, it is very odd, see: https://github.com/KittyCAD/modeling-app/issues/5880
if let SolidOrSketchOrImportedGeometry::SolidSet(solids) = &objects {
args.flush_batch_for_solids(exec_state, solids).await?;
}
for object_id in objects.ids() {
let id = exec_state.next_uuid();
args.batch_modeling_cmd(
id,
ModelingCmd::from(mcmd::SetObjectTransform {
object_id: solid_id,
object_id,
transforms: vec![shared::ComponentTransform {
translate: Some(shared::TransformBy::<Point3d<LengthUnit>> {
property: shared::Point3d {
@ -319,14 +382,15 @@ async fn inner_translate(
.await?;
}
Ok(solids)
Ok(objects)
}
/// Rotate a solid.
/// Rotate a solid or a sketch.
pub async fn rotate(exec_state: &mut ExecState, args: Args) -> Result<KclValue, KclError> {
let solids = args.get_unlabeled_kw_arg_typed(
"solid",
let objects = args.get_unlabeled_kw_arg_typed(
"objects",
&RuntimeType::Union(vec![
RuntimeType::Array(PrimitiveType::Sketch, ArrayLen::NonEmpty),
RuntimeType::Array(PrimitiveType::Solid, ArrayLen::NonEmpty),
RuntimeType::Primitive(PrimitiveType::ImportedGeometry),
]),
@ -439,11 +503,11 @@ pub async fn rotate(exec_state: &mut ExecState, args: Args) -> Result<KclValue,
}
}
let solids = inner_rotate(solids, roll, pitch, yaw, axis, angle, global, exec_state, args).await?;
Ok(solids.into())
let objects = inner_rotate(objects, roll, pitch, yaw, axis, angle, global, exec_state, args).await?;
Ok(objects.into())
}
/// Rotate a solid.
/// Rotate a solid or a sketch.
///
/// ### Using Roll, Pitch, and Yaw
///
@ -589,13 +653,35 @@ pub async fn rotate(exec_state: &mut ExecState, args: Args) -> Result<KclValue,
/// // Rotate the sweeps.
/// rotate(parts, axis = [0, 0, 1.0], angle = 90)
/// ```
///
/// ```no_run
/// // Translate and rotate a sketch to create a loft.
/// sketch001 = startSketchOn('XY')
///
/// fn square() {
/// return startProfileAt([-10, 10], sketch001)
/// |> xLine(length = 20)
/// |> yLine(length = -20)
/// |> xLine(length = -20)
/// |> line(endAbsolute = [profileStartX(%), profileStartY(%)])
/// |> close()
/// }
///
/// profile001 = square()
///
/// profile002 = square()
/// |> translate(translate = [0, 0, 20])
/// |> rotate(axis = [0, 0, 1.0], angle = 45)
///
/// loft([profile001, profile002])
/// ```
#[stdlib {
name = "rotate",
feature_tree_operation = false,
keywords = true,
unlabeled_first = true,
args = {
solids = {docs = "The solid or set of solids to rotate."},
objects = {docs = "The solid, sketch, or set of solids or sketches to rotate."},
roll = {docs = "The roll angle in degrees. Must be used with `pitch` and `yaw`. Must be between -360 and 360.", include_in_snippet = true},
pitch = {docs = "The pitch angle in degrees. Must be used with `roll` and `yaw`. Must be between -360 and 360.", include_in_snippet = true},
yaw = {docs = "The yaw angle in degrees. Must be used with `roll` and `pitch`. Must be between -360 and 360.", include_in_snippet = true},
@ -606,7 +692,7 @@ pub async fn rotate(exec_state: &mut ExecState, args: Args) -> Result<KclValue,
}]
#[allow(clippy::too_many_arguments)]
async fn inner_rotate(
solids: SolidOrImportedGeometry,
objects: SolidOrSketchOrImportedGeometry,
roll: Option<f64>,
pitch: Option<f64>,
yaw: Option<f64>,
@ -615,15 +701,21 @@ async fn inner_rotate(
global: Option<bool>,
exec_state: &mut ExecState,
args: Args,
) -> Result<SolidOrImportedGeometry, KclError> {
for solid_id in solids.ids() {
) -> Result<SolidOrSketchOrImportedGeometry, KclError> {
// If we have a solid, flush the fillets and chamfers.
// Only transforms needs this, it is very odd, see: https://github.com/KittyCAD/modeling-app/issues/5880
if let SolidOrSketchOrImportedGeometry::SolidSet(solids) = &objects {
args.flush_batch_for_solids(exec_state, solids).await?;
}
for object_id in objects.ids() {
let id = exec_state.next_uuid();
if let (Some(roll), Some(pitch), Some(yaw)) = (roll, pitch, yaw) {
args.batch_modeling_cmd(
id,
ModelingCmd::from(mcmd::SetObjectTransform {
object_id: solid_id,
object_id,
transforms: vec![shared::ComponentTransform {
rotate_rpy: Some(shared::TransformBy::<Point3d<f64>> {
property: shared::Point3d {
@ -647,7 +739,7 @@ async fn inner_rotate(
args.batch_modeling_cmd(
id,
ModelingCmd::from(mcmd::SetObjectTransform {
object_id: solid_id,
object_id,
transforms: vec![shared::ComponentTransform {
rotate_angle_axis: Some(shared::TransformBy::<Point4d<f64>> {
property: shared::Point4d {
@ -669,7 +761,7 @@ async fn inner_rotate(
}
}
Ok(solids)
Ok(objects)
}
#[cfg(test)]

View File

@ -1,5 +1,5 @@
---
source: kcl/src/simulation_tests.rs
source: kcl-lib/src/simulation_tests.rs
description: Result of parsing array_index_oob.kcl
---
{

View File

@ -1,5 +1,5 @@
---
source: kcl/src/simulation_tests.rs
source: kcl-lib/src/simulation_tests.rs
description: Error from executing array_index_oob.kcl
---
KCL UndefinedValue error

View File

@ -977,8 +977,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1313,
1339,
1319,
1345,
0
],
"command": {
@ -992,7 +992,7 @@ description: Artifact commands crazy_multi_profile.kcl
"cmdId": "[uuid]",
"range": [
1280,
1354,
1346,
0
],
"command": {
@ -1010,7 +1010,7 @@ description: Artifact commands crazy_multi_profile.kcl
"cmdId": "[uuid]",
"range": [
1280,
1354,
1346,
0
],
"command": {
@ -1022,7 +1022,7 @@ description: Artifact commands crazy_multi_profile.kcl
"cmdId": "[uuid]",
"range": [
1280,
1354,
1346,
0
],
"command": {
@ -1035,7 +1035,7 @@ description: Artifact commands crazy_multi_profile.kcl
"cmdId": "[uuid]",
"range": [
1280,
1354,
1346,
0
],
"command": {
@ -1049,7 +1049,7 @@ description: Artifact commands crazy_multi_profile.kcl
"cmdId": "[uuid]",
"range": [
1280,
1354,
1346,
0
],
"command": {
@ -1063,7 +1063,7 @@ description: Artifact commands crazy_multi_profile.kcl
"cmdId": "[uuid]",
"range": [
1280,
1354,
1346,
0
],
"command": {
@ -1077,7 +1077,7 @@ description: Artifact commands crazy_multi_profile.kcl
"cmdId": "[uuid]",
"range": [
1280,
1354,
1346,
0
],
"command": {
@ -1091,7 +1091,7 @@ description: Artifact commands crazy_multi_profile.kcl
"cmdId": "[uuid]",
"range": [
1280,
1354,
1346,
0
],
"command": {
@ -1105,7 +1105,7 @@ description: Artifact commands crazy_multi_profile.kcl
"cmdId": "[uuid]",
"range": [
1280,
1354,
1346,
0
],
"command": {
@ -1118,8 +1118,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1368,
1399,
1360,
1391,
0
],
"command": {
@ -1134,8 +1134,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1368,
1399,
1360,
1391,
0
],
"command": {
@ -1148,8 +1148,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1368,
1399,
1360,
1391,
0
],
"command": {
@ -1159,8 +1159,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1368,
1399,
1360,
1391,
0
],
"command": {
@ -1171,8 +1171,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1368,
1399,
1360,
1391,
0
],
"command": {
@ -1184,8 +1184,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1368,
1399,
1360,
1391,
0
],
"command": {
@ -1198,8 +1198,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1368,
1399,
1360,
1391,
0
],
"command": {
@ -1212,8 +1212,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1368,
1399,
1360,
1391,
0
],
"command": {
@ -1226,8 +1226,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1368,
1399,
1360,
1391,
0
],
"command": {
@ -1240,8 +1240,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1368,
1399,
1360,
1391,
0
],
"command": {
@ -1254,8 +1254,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1368,
1399,
1360,
1391,
0
],
"command": {
@ -1268,8 +1268,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1412,
1432,
1404,
1424,
0
],
"command": {
@ -1297,8 +1297,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1446,
1484,
1438,
1476,
0
],
"command": {
@ -1317,8 +1317,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1446,
1484,
1438,
1476,
0
],
"command": {
@ -1328,8 +1328,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1446,
1484,
1438,
1476,
0
],
"command": {
@ -1345,8 +1345,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1446,
1484,
1438,
1476,
0
],
"command": {
@ -1356,8 +1356,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1490,
1514,
1482,
1506,
0
],
"command": {
@ -1377,8 +1377,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1520,
1545,
1512,
1537,
0
],
"command": {
@ -1398,8 +1398,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1559,
1598,
1551,
1590,
0
],
"command": {
@ -1418,8 +1418,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1559,
1598,
1551,
1590,
0
],
"command": {
@ -1429,8 +1429,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1559,
1598,
1551,
1590,
0
],
"command": {
@ -1446,8 +1446,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1559,
1598,
1551,
1590,
0
],
"command": {
@ -1457,8 +1457,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1604,
1628,
1596,
1620,
0
],
"command": {
@ -1478,8 +1478,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1634,
1659,
1626,
1651,
0
],
"command": {
@ -1499,8 +1499,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1665,
1721,
1657,
1713,
0
],
"command": {
@ -1520,8 +1520,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1727,
1734,
1719,
1726,
0
],
"command": {
@ -1532,8 +1532,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1748,
1787,
1740,
1779,
0
],
"command": {
@ -1552,8 +1552,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1748,
1787,
1740,
1779,
0
],
"command": {
@ -1563,8 +1563,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1748,
1787,
1740,
1779,
0
],
"command": {
@ -1580,8 +1580,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1748,
1787,
1740,
1779,
0
],
"command": {
@ -1591,8 +1591,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1793,
1816,
1785,
1808,
0
],
"command": {
@ -1612,8 +1612,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1822,
1847,
1814,
1839,
0
],
"command": {
@ -1633,8 +1633,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1853,
1909,
1845,
1901,
0
],
"command": {
@ -1654,8 +1654,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1915,
1922,
1907,
1914,
0
],
"command": {
@ -1666,8 +1666,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1936,
1992,
1928,
1984,
0
],
"command": {
@ -1686,8 +1686,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1936,
1992,
1928,
1984,
0
],
"command": {
@ -1697,8 +1697,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1936,
1992,
1928,
1984,
0
],
"command": {
@ -1714,8 +1714,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1936,
1992,
1928,
1984,
0
],
"command": {
@ -1725,8 +1725,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1936,
1992,
1928,
1984,
0
],
"command": {
@ -1754,8 +1754,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
1936,
1992,
1928,
1984,
0
],
"command": {
@ -1766,8 +1766,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2006,
2046,
1998,
2038,
0
],
"command": {
@ -1786,8 +1786,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2006,
2046,
1998,
2038,
0
],
"command": {
@ -1797,8 +1797,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2006,
2046,
1998,
2038,
0
],
"command": {
@ -1814,8 +1814,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2006,
2046,
1998,
2038,
0
],
"command": {
@ -1825,8 +1825,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2052,
2099,
2044,
2091,
0
],
"command": {
@ -1846,8 +1846,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2105,
2182,
2097,
2174,
0
],
"command": {
@ -1867,8 +1867,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2188,
2285,
2180,
2277,
0
],
"command": {
@ -1888,8 +1888,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2291,
2347,
2283,
2339,
0
],
"command": {
@ -1909,8 +1909,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2353,
2360,
2345,
2352,
0
],
"command": {
@ -1921,8 +1921,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2374,
2407,
2366,
2399,
0
],
"command": {
@ -1941,8 +1941,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2374,
2407,
2366,
2399,
0
],
"command": {
@ -1955,8 +1955,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2374,
2407,
2366,
2399,
0
],
"command": {
@ -1966,8 +1966,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2374,
2407,
2366,
2399,
0
],
"command": {
@ -1978,8 +1978,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2374,
2407,
2366,
2399,
0
],
"command": {
@ -1991,8 +1991,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2374,
2407,
2366,
2399,
0
],
"command": {
@ -2005,8 +2005,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2374,
2407,
2366,
2399,
0
],
"command": {
@ -2019,8 +2019,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2374,
2407,
2366,
2399,
0
],
"command": {
@ -2033,8 +2033,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2374,
2407,
2366,
2399,
0
],
"command": {
@ -2047,8 +2047,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2374,
2407,
2366,
2399,
0
],
"command": {
@ -2061,8 +2061,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2374,
2407,
2366,
2399,
0
],
"command": {
@ -2075,8 +2075,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2374,
2407,
2366,
2399,
0
],
"command": {
@ -2089,8 +2089,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2374,
2407,
2366,
2399,
0
],
"command": {
@ -2103,8 +2103,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2421,
2470,
2413,
2458,
0
],
"command": {
@ -2121,8 +2121,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2421,
2470,
2413,
2458,
0
],
"command": {
@ -2133,8 +2133,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2421,
2470,
2413,
2458,
0
],
"command": {
@ -2146,8 +2146,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2421,
2470,
2413,
2458,
0
],
"command": {
@ -2160,8 +2160,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2421,
2470,
2413,
2458,
0
],
"command": {
@ -2174,8 +2174,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2421,
2470,
2413,
2458,
0
],
"command": {
@ -2188,8 +2188,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2421,
2470,
2413,
2458,
0
],
"command": {
@ -2202,8 +2202,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2421,
2470,
2413,
2458,
0
],
"command": {
@ -2216,8 +2216,8 @@ description: Artifact commands crazy_multi_profile.kcl
{
"cmdId": "[uuid]",
"range": [
2421,
2470,
2413,
2458,
0
],
"command": {

View File

@ -44,38 +44,38 @@ flowchart LR
44[Solid2d]
end
subgraph path59 [Path]
59["Path<br>[1446, 1484, 0]"]
60["Segment<br>[1490, 1514, 0]"]
61["Segment<br>[1520, 1545, 0]"]
59["Path<br>[1438, 1476, 0]"]
60["Segment<br>[1482, 1506, 0]"]
61["Segment<br>[1512, 1537, 0]"]
end
subgraph path62 [Path]
62["Path<br>[1559, 1598, 0]"]
63["Segment<br>[1604, 1628, 0]"]
64["Segment<br>[1634, 1659, 0]"]
65["Segment<br>[1665, 1721, 0]"]
66["Segment<br>[1727, 1734, 0]"]
62["Path<br>[1551, 1590, 0]"]
63["Segment<br>[1596, 1620, 0]"]
64["Segment<br>[1626, 1651, 0]"]
65["Segment<br>[1657, 1713, 0]"]
66["Segment<br>[1719, 1726, 0]"]
67[Solid2d]
end
subgraph path68 [Path]
68["Path<br>[1748, 1787, 0]"]
69["Segment<br>[1793, 1816, 0]"]
70["Segment<br>[1822, 1847, 0]"]
71["Segment<br>[1853, 1909, 0]"]
72["Segment<br>[1915, 1922, 0]"]
68["Path<br>[1740, 1779, 0]"]
69["Segment<br>[1785, 1808, 0]"]
70["Segment<br>[1814, 1839, 0]"]
71["Segment<br>[1845, 1901, 0]"]
72["Segment<br>[1907, 1914, 0]"]
73[Solid2d]
end
subgraph path74 [Path]
74["Path<br>[1936, 1992, 0]"]
75["Segment<br>[1936, 1992, 0]"]
74["Path<br>[1928, 1984, 0]"]
75["Segment<br>[1928, 1984, 0]"]
76[Solid2d]
end
subgraph path77 [Path]
77["Path<br>[2006, 2046, 0]"]
78["Segment<br>[2052, 2099, 0]"]
79["Segment<br>[2105, 2182, 0]"]
80["Segment<br>[2188, 2285, 0]"]
81["Segment<br>[2291, 2347, 0]"]
82["Segment<br>[2353, 2360, 0]"]
77["Path<br>[1998, 2038, 0]"]
78["Segment<br>[2044, 2091, 0]"]
79["Segment<br>[2097, 2174, 0]"]
80["Segment<br>[2180, 2277, 0]"]
81["Segment<br>[2283, 2339, 0]"]
82["Segment<br>[2345, 2352, 0]"]
83[Solid2d]
end
1["Plane<br>[12, 31, 0]"]
@ -91,8 +91,8 @@ flowchart LR
17["SweepEdge Adjacent"]
18["SweepEdge Opposite"]
19["SweepEdge Adjacent"]
45["Sweep RevolveAboutEdge<br>[1280, 1354, 0]"]
46["Sweep Extrusion<br>[1368, 1399, 0]"]
45["Sweep RevolveAboutEdge<br>[1280, 1346, 0]"]
46["Sweep Extrusion<br>[1360, 1391, 0]"]
47[Wall]
48[Wall]
49[Wall]
@ -104,8 +104,8 @@ flowchart LR
55["SweepEdge Adjacent"]
56["SweepEdge Opposite"]
57["SweepEdge Adjacent"]
58["Plane<br>[1412, 1432, 0]"]
84["Sweep Extrusion<br>[2374, 2407, 0]"]
58["Plane<br>[1404, 1424, 0]"]
84["Sweep Extrusion<br>[2366, 2399, 0]"]
85[Wall]
86[Wall]
87[Wall]
@ -120,7 +120,7 @@ flowchart LR
96["SweepEdge Adjacent"]
97["SweepEdge Opposite"]
98["SweepEdge Adjacent"]
99["Sweep RevolveAboutEdge<br>[2421, 2470, 0]"]
99["Sweep RevolveAboutEdge<br>[2413, 2458, 0]"]
100[Wall]
101[Wall]
102[Wall]

File diff suppressed because it is too large Load Diff

View File

@ -32,10 +32,7 @@ profile006 = startProfileAt([9.65, 3.82], sketch002)
|> line(end = [2.13, -5.57])
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
revolve001 = revolve({
angle = 45,
axis = getNextAdjacentEdge(seg01)
}, profile004)
revolve001 = revolve(profile004, angle = 45, axis = getNextAdjacentEdge(seg01))
extrude002 = extrude(profile006, length = 4)
sketch003 = startSketchOn('-XZ')
profile007 = startProfileAt([4.8, 7.55], sketch003)
@ -65,4 +62,4 @@ profile011 = startProfileAt([5.07, -6.39], sketch003)
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
extrude003 = extrude(profile011, length = 2.5)
revolve002 = revolve({ angle = 45, axis = seg02 }, profile008)
revolve002 = revolve(profile008, angle = 45, axis = seg02)

View File

@ -109,45 +109,34 @@ description: Operations executed crazy_multi_profile.kcl
},
{
"labeledArgs": {
"data": {
"angle": {
"value": {
"type": "Object",
"value": {
"angle": {
"type": "Number",
"value": 45.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
"type": "Number",
"value": 45.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"axis": {
"type": "Uuid",
"value": "[uuid]"
"angle": {
"type": "Degrees"
}
}
},
"sourceRange": [
1288,
1341,
1308,
1310,
0
]
},
"sketches": {
"axis": {
"value": {
"type": "Sketch",
"value": {
"artifactId": "[uuid]"
}
"type": "Uuid",
"value": "[uuid]"
},
"sourceRange": [
1343,
1353,
1319,
1345,
0
]
}
@ -155,11 +144,23 @@ description: Operations executed crazy_multi_profile.kcl
"name": "revolve",
"sourceRange": [
1280,
1354,
1346,
0
],
"type": "StdLibCall",
"unlabeledArg": null
"unlabeledArg": {
"value": {
"type": "Sketch",
"value": {
"artifactId": "[uuid]"
}
},
"sourceRange": [
1288,
1298,
0
]
}
},
{
"labeledArgs": {
@ -178,16 +179,16 @@ description: Operations executed crazy_multi_profile.kcl
}
},
"sourceRange": [
1397,
1398,
1389,
1390,
0
]
}
},
"name": "extrude",
"sourceRange": [
1368,
1399,
1360,
1391,
0
],
"type": "StdLibCall",
@ -199,8 +200,8 @@ description: Operations executed crazy_multi_profile.kcl
}
},
"sourceRange": [
1376,
1386,
1368,
1378,
0
]
}
@ -213,16 +214,16 @@ description: Operations executed crazy_multi_profile.kcl
"value": "-XZ"
},
"sourceRange": [
1426,
1431,
1418,
1423,
0
]
}
},
"name": "startSketchOn",
"sourceRange": [
1412,
1432,
1404,
1424,
0
],
"type": "StdLibCall",
@ -245,16 +246,16 @@ description: Operations executed crazy_multi_profile.kcl
}
},
"sourceRange": [
2403,
2406,
2395,
2398,
0
]
}
},
"name": "extrude",
"sourceRange": [
2374,
2407,
2366,
2399,
0
],
"type": "StdLibCall",
@ -266,65 +267,66 @@ description: Operations executed crazy_multi_profile.kcl
}
},
"sourceRange": [
2382,
2392,
2374,
2384,
0
]
}
},
{
"labeledArgs": {
"data": {
"angle": {
"value": {
"type": "Object",
"value": {
"angle": {
"type": "Number",
"value": 45.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
"type": "Number",
"value": 45.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"axis": {
"type": "TagIdentifier",
"value": "seg02",
"artifact_id": "[uuid]"
"angle": {
"type": "Degrees"
}
}
},
"sourceRange": [
2429,
2457,
2441,
2443,
0
]
},
"sketches": {
"axis": {
"value": {
"type": "Sketch",
"value": {
"artifactId": "[uuid]"
}
"type": "TagIdentifier",
"value": "seg02",
"artifact_id": "[uuid]"
},
"sourceRange": [
2459,
2469,
2452,
2457,
0
]
}
},
"name": "revolve",
"sourceRange": [
2421,
2470,
2413,
2458,
0
],
"type": "StdLibCall",
"unlabeledArg": null
"unlabeledArg": {
"value": {
"type": "Sketch",
"value": {
"artifactId": "[uuid]"
}
},
"sourceRange": [
2421,
2431,
0
]
}
}
]

View File

@ -675,13 +675,13 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"faceId": "[uuid]",
"id": "[uuid]",
"sourceRange": [
2052,
2099,
2044,
2091,
0
],
"tag": {
"end": 2098,
"start": 2077,
"end": 2090,
"start": 2069,
"type": "TagDeclarator",
"value": "rectangleSegmentA002"
},
@ -691,8 +691,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"faceId": "[uuid]",
"id": "[uuid]",
"sourceRange": [
2105,
2182,
2097,
2174,
0
],
"tag": null,
@ -702,8 +702,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"faceId": "[uuid]",
"id": "[uuid]",
"sourceRange": [
2188,
2285,
2180,
2277,
0
],
"tag": null,
@ -713,8 +713,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"faceId": "[uuid]",
"id": "[uuid]",
"sourceRange": [
2291,
2347,
2283,
2339,
0
],
"tag": null,
@ -729,8 +729,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
2052,
2099,
2044,
2091,
0
]
},
@ -739,8 +739,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
-6.39
],
"tag": {
"end": 2098,
"start": 2077,
"end": 2090,
"start": 2069,
"type": "TagDeclarator",
"value": "rectangleSegmentA002"
},
@ -757,8 +757,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
2105,
2182,
2097,
2174,
0
]
},
@ -780,8 +780,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
2188,
2285,
2180,
2277,
0
]
},
@ -803,8 +803,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
2291,
2347,
2283,
2339,
0
]
},
@ -826,8 +826,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
2353,
2360,
2345,
2352,
0
]
},
@ -891,8 +891,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
2006,
2046,
1998,
2038,
0
]
}
@ -2939,8 +2939,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
1490,
1514,
1482,
1506,
0
]
},
@ -2962,8 +2962,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
1520,
1545,
1512,
1537,
0
]
},
@ -3027,8 +3027,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
1446,
1484,
1438,
1476,
0
]
}
@ -3050,8 +3050,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
1604,
1628,
1596,
1620,
0
]
},
@ -3073,8 +3073,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
1634,
1659,
1626,
1651,
0
]
},
@ -3096,8 +3096,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
1665,
1721,
1657,
1713,
0
]
},
@ -3119,8 +3119,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
1727,
1734,
1719,
1726,
0
]
},
@ -3184,8 +3184,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
1559,
1598,
1551,
1590,
0
]
}
@ -3207,8 +3207,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
1793,
1816,
1785,
1808,
0
]
},
@ -3230,8 +3230,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
1822,
1847,
1814,
1839,
0
]
},
@ -3253,8 +3253,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
1853,
1909,
1845,
1901,
0
]
},
@ -3276,8 +3276,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
1915,
1922,
1907,
1914,
0
]
},
@ -3341,8 +3341,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
1748,
1787,
1740,
1779,
0
]
}
@ -3364,8 +3364,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
1936,
1992,
1928,
1984,
0
]
},
@ -3435,8 +3435,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
1936,
1992,
1928,
1984,
0
]
}
@ -3458,8 +3458,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
2052,
2099,
2044,
2091,
0
]
},
@ -3468,8 +3468,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
-6.39
],
"tag": {
"end": 2098,
"start": 2077,
"end": 2090,
"start": 2069,
"type": "TagDeclarator",
"value": "rectangleSegmentA002"
},
@ -3486,8 +3486,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
2105,
2182,
2097,
2174,
0
]
},
@ -3509,8 +3509,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
2188,
2285,
2180,
2277,
0
]
},
@ -3532,8 +3532,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
2291,
2347,
2283,
2339,
0
]
},
@ -3555,8 +3555,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
2353,
2360,
2345,
2352,
0
]
},
@ -3620,8 +3620,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
2006,
2046,
1998,
2038,
0
]
}
@ -4054,8 +4054,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"faceId": "[uuid]",
"id": "[uuid]",
"sourceRange": [
1604,
1628,
1596,
1620,
0
],
"tag": null,
@ -4065,8 +4065,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"faceId": "[uuid]",
"id": "[uuid]",
"sourceRange": [
1634,
1659,
1626,
1651,
0
],
"tag": null,
@ -4076,8 +4076,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"faceId": "[uuid]",
"id": "[uuid]",
"sourceRange": [
1665,
1721,
1657,
1713,
0
],
"tag": null,
@ -4092,8 +4092,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
1604,
1628,
1596,
1620,
0
]
},
@ -4115,8 +4115,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
1634,
1659,
1626,
1651,
0
]
},
@ -4138,8 +4138,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
1665,
1721,
1657,
1713,
0
]
},
@ -4161,8 +4161,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
1727,
1734,
1719,
1726,
0
]
},
@ -4226,8 +4226,8 @@ description: Variables in memory after executing crazy_multi_profile.kcl
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
1559,
1598,
1551,
1590,
0
]
}

View File

@ -11,7 +11,7 @@ export part001 = startSketchOn('XY')
|> line(end = [0, -5.5])
|> line(end = [-2, 0])
|> close()
|> revolve({ axis = 'y' }, %) // default angle is 360
|> revolve(axis = 'y') // default angle is 360
export fn two() {
return 5

View File

@ -28,32 +28,14 @@ description: Operations executed import_function_not_sketch.kcl
},
{
"labeledArgs": {
"data": {
"axis": {
"value": {
"type": "Object",
"value": {
"axis": {
"type": "String",
"value": "y"
}
}
"type": "String",
"value": "y"
},
"sourceRange": [
313,
327,
3
]
},
"sketches": {
"value": {
"type": "Sketch",
"value": {
"artifactId": "[uuid]"
}
},
"sourceRange": [
329,
330,
320,
323,
3
]
}
@ -61,10 +43,22 @@ description: Operations executed import_function_not_sketch.kcl
"name": "revolve",
"sourceRange": [
305,
331,
324,
3
],
"type": "StdLibCall",
"unlabeledArg": null
"unlabeledArg": {
"value": {
"type": "Sketch",
"value": {
"artifactId": "[uuid]"
}
},
"sourceRange": [
305,
324,
3
]
}
}
]

View File

@ -1,5 +1,5 @@
---
source: kcl/src/simulation_tests.rs
source: kcl-lib/src/simulation_tests.rs
description: Result of parsing import_glob.kcl
---
{

View File

@ -1,5 +1,5 @@
---
source: kcl/src/simulation_tests.rs
source: kcl-lib/src/simulation_tests.rs
description: Result of parsing invalid_index_str.kcl
---
{

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