Compare commits
16 Commits
revert-580
...
kcl-51
Author | SHA1 | Date | |
---|---|---|---|
e7d00f148b | |||
d19a7df7e8 | |||
45fae52afc | |||
270f173aad | |||
ddcff1ba63 | |||
cb1b08d6b6 | |||
533fa749b2 | |||
af492d2cb6 | |||
26fba71abf | |||
859bfc7b28 | |||
3b1d1307c4 | |||
f5a2c84ce2 | |||
cccb71fd30 | |||
44be072d04 | |||
86beb6ebf1 | |||
6d72104faa |
@ -22,6 +22,13 @@
|
||||
"rules": {
|
||||
"@typescript-eslint/no-floating-promises": "error",
|
||||
"@typescript-eslint/no-misused-promises": "error",
|
||||
"@typescript-eslint/no-unused-vars": ["error", {
|
||||
"varsIgnorePattern": "^_",
|
||||
"argsIgnorePattern": "^_",
|
||||
"ignoreRestSiblings": true,
|
||||
"vars": "all",
|
||||
"args": "none"
|
||||
}],
|
||||
"jsx-a11y/click-events-have-key-events": "off",
|
||||
"jsx-a11y/no-autofocus": "off",
|
||||
"jsx-a11y/no-noninteractive-element-interactions": "off",
|
||||
|
2
Makefile
@ -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.
|
||||
|
10
README.md
@ -105,7 +105,7 @@ Finally, to run the web app only, run:
|
||||
yarn start
|
||||
```
|
||||
|
||||
If you're not a Zoo employee you won't be able to access the dev environment, you should copy everything from `.env.production` to `.env.development` to make it point to production instead, then when you navigate to `localhost:3000` the easiest way to sign in is to paste `localStorage.setItem('TOKEN_PERSIST_KEY', "your-token-from-https://zoo.dev/account/api-tokens")` replacing the with a real token from https://zoo.dev/account/api-tokens of course, then navigate to localhost:3000 again. Note that navigating to `localhost:3000/signin` removes your token so you will need to set the token again.
|
||||
If you're not a Zoo employee you won't be able to access the dev environment, you should copy everything from `.env.production` to `.env.development.local` to make it point to production instead, then when you navigate to `localhost:3000` the easiest way to sign in is to paste `localStorage.setItem('TOKEN_PERSIST_KEY', "your-token-from-https://zoo.dev/account/api-tokens")` replacing the with a real token from https://zoo.dev/account/api-tokens of course, then navigate to `localhost:3000` again. Note that navigating to `localhost:3000/signin` removes your token so you will need to set the token again.
|
||||
|
||||
### Development environment variables
|
||||
|
||||
@ -122,7 +122,7 @@ Third-Party Cookies".
|
||||
|
||||
## Desktop
|
||||
|
||||
To spin up the desktop app, `yarn install` and `yarn build:wasm` need to have been done before hand then
|
||||
To spin up the desktop app, `yarn install` and `yarn build:wasm` need to have been done before hand then:
|
||||
|
||||
```
|
||||
yarn tron:start
|
||||
@ -130,13 +130,13 @@ yarn tron:start
|
||||
|
||||
This will start the application and hot-reload on changes.
|
||||
|
||||
Devtools can be opened with the usual Cmd-Opt-I (Mac) or Ctrl-Shift-I (Linux and Windows).
|
||||
Devtools can be opened with the usual Command-Option-I (macOS) or Ctrl-Shift-I (Linux and Windows).
|
||||
|
||||
To package the app for your platform with electron-builder, run `yarn tronb:package:dev` (or `yarn tronb:package:prod` to point to the .env.production variables)
|
||||
To package the app for your platform with electron-builder, run `yarn tronb:package:dev` (or `yarn tronb:package:prod` to point to the .env.production variables).
|
||||
|
||||
## Checking out commits / Bisecting
|
||||
|
||||
Which commands from setup are one off vs need to be run every time?
|
||||
Which commands from setup are one off vs. need to be run every time?
|
||||
|
||||
The following will need to be run when checking out a new commit and guarantees the build is not stale:
|
||||
|
||||
|
@ -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)
|
||||
```
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
18638
docs/kcl/std.json
@ -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
|
||||
|
||||
|
66
docs/kcl/types/SolidOrSketchOrImportedGeometry.md
Normal 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 |
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
|
||||
|
@ -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`
|
||||
)
|
||||
})
|
||||
})
|
||||
|
@ -100,7 +100,8 @@ test(
|
||||
try {
|
||||
const outputGltf = await fsp.readFile(firstFileFullPath)
|
||||
return outputGltf.byteLength
|
||||
} catch (e) {
|
||||
} catch (error: unknown) {
|
||||
void error
|
||||
return 0
|
||||
}
|
||||
},
|
||||
@ -179,7 +180,8 @@ test(
|
||||
try {
|
||||
const outputGltf = await fsp.readFile(secondFileFullPath)
|
||||
return outputGltf.byteLength
|
||||
} catch (e) {
|
||||
} catch (error: unknown) {
|
||||
void error
|
||||
return 0
|
||||
}
|
||||
},
|
||||
|
@ -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
|
||||
)
|
||||
`
|
||||
)
|
||||
})
|
||||
|
@ -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')
|
||||
|
@ -1197,7 +1197,7 @@ test.describe('Undo and redo do not keep history when navigating between files',
|
||||
`cloned file has an incremented name and same contents`,
|
||||
{ tag: '@electron' },
|
||||
async ({ page, context, homePage }, testInfo) => {
|
||||
const { panesOpen, createNewFile, cloneFile } = await getUtils(page, test)
|
||||
const { panesOpen, cloneFile } = await getUtils(page, test)
|
||||
|
||||
const { dir } = await context.folderSetupFn(async (dir) => {
|
||||
const finalDir = join(dir, 'testDefault')
|
||||
|
@ -3,25 +3,15 @@
|
||||
import type {
|
||||
BrowserContext,
|
||||
ElectronApplication,
|
||||
Fixtures as PlaywrightFixtures,
|
||||
TestInfo,
|
||||
Page,
|
||||
} from '@playwright/test'
|
||||
|
||||
import {
|
||||
_electron as electron,
|
||||
PlaywrightTestArgs,
|
||||
PlaywrightWorkerArgs,
|
||||
} from '@playwright/test'
|
||||
import { _electron as electron } from '@playwright/test'
|
||||
|
||||
import * as TOML from '@iarna/toml'
|
||||
import {
|
||||
TEST_SETTINGS_KEY,
|
||||
TEST_SETTINGS_CORRUPTED,
|
||||
TEST_SETTINGS,
|
||||
TEST_SETTINGS_DEFAULT_THEME,
|
||||
} from '../storageStates'
|
||||
import { SETTINGS_FILE_NAME, PROJECT_SETTINGS_FILE_NAME } from 'lib/constants'
|
||||
import { TEST_SETTINGS } from '../storageStates'
|
||||
import { SETTINGS_FILE_NAME } from 'lib/constants'
|
||||
import { getUtils, setup } from '../test-utils'
|
||||
import fsp from 'fs/promises'
|
||||
import fs from 'node:fs'
|
||||
@ -31,7 +21,6 @@ import { EditorFixture } from './editorFixture'
|
||||
import { ToolbarFixture } from './toolbarFixture'
|
||||
import { SceneFixture } from './sceneFixture'
|
||||
import { HomePageFixture } from './homePageFixture'
|
||||
import { unsafeTypedKeys } from 'lib/utils'
|
||||
import { DeepPartial } from 'lib/types'
|
||||
import { Settings } from '@rust/kcl-lib/bindings/Settings'
|
||||
|
||||
@ -278,13 +267,14 @@ export class ElectronZoo {
|
||||
if (fs.existsSync(this.projectDirName)) {
|
||||
await fsp.rm(this.projectDirName, { recursive: true })
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
} catch (_e) {
|
||||
console.error(_e)
|
||||
}
|
||||
|
||||
try {
|
||||
await fsp.mkdir(this.projectDirName)
|
||||
} catch (e) {
|
||||
} catch (error: unknown) {
|
||||
void error
|
||||
// Not a problem if it already exists.
|
||||
}
|
||||
|
||||
|
@ -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,
|
||||
@ -1906,7 +2017,6 @@ extrude001 = extrude(sketch001, length = -12)
|
||||
// Locators
|
||||
const firstEdgeLocation = { x: 600, y: 193 }
|
||||
const secondEdgeLocation = { x: 600, y: 383 }
|
||||
const bodyLocation = { x: 630, y: 290 }
|
||||
const [clickOnFirstEdge] = scene.makeMouseHelpers(
|
||||
firstEdgeLocation.x,
|
||||
firstEdgeLocation.y
|
||||
@ -1919,7 +2029,6 @@ extrude001 = extrude(sketch001, length = -12)
|
||||
// Colors
|
||||
const edgeColorWhite: [number, number, number] = [248, 248, 248]
|
||||
const edgeColorYellow: [number, number, number] = [251, 251, 40] // Mac:B=67 Ubuntu:B=12
|
||||
const bodyColor: [number, number, number] = [155, 155, 155]
|
||||
const chamferColor: [number, number, number] = [168, 168, 168]
|
||||
const backgroundColor: [number, number, number] = [30, 30, 30]
|
||||
const lowTolerance = 20
|
||||
@ -2812,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 ({
|
||||
@ -2862,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 ({
|
||||
@ -2913,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()
|
||||
})
|
||||
})
|
||||
|
@ -539,7 +539,8 @@ test.describe('Can export from electron app', () => {
|
||||
try {
|
||||
const outputGltf = await fsp.readFile(filepath)
|
||||
return outputGltf.byteLength
|
||||
} catch (e) {
|
||||
} catch (error: unknown) {
|
||||
void error
|
||||
return 0
|
||||
}
|
||||
},
|
||||
|
@ -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,
|
||||
|
@ -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) => {
|
||||
|
@ -14,7 +14,8 @@ try {
|
||||
// prefer env vars over secrets file
|
||||
secrets[key] = process.env[key] || (value as any).replaceAll('"', '')
|
||||
})
|
||||
} catch (err) {
|
||||
} catch (error: unknown) {
|
||||
void error
|
||||
// probably running in CI
|
||||
console.warn(
|
||||
`Error reading ${secretsPath}; environment variables will be used`
|
||||
|
@ -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)
|
||||
`
|
||||
)
|
||||
})
|
||||
@ -2626,11 +2627,6 @@ extrude003 = extrude(profile011, length = 2.5)
|
||||
{ x: 834, y: -680, z: 534 },
|
||||
{ x: -54, y: -476, z: 148 }
|
||||
)
|
||||
const camPositionForSelectingSketchOnCapProfiles = () =>
|
||||
scene.moveCameraTo(
|
||||
{ x: 404, y: 690, z: 38 },
|
||||
{ x: 16, y: -140, z: -10 }
|
||||
)
|
||||
const wallSelectionOptions = [
|
||||
{
|
||||
title: 'select wall segment',
|
||||
@ -2653,29 +2649,6 @@ extrude003 = extrude(profile011, length = 2.5)
|
||||
selectClick: scene.makeMouseHelpers(836, 103)[0],
|
||||
},
|
||||
] as const
|
||||
const capSelectionOptions = [
|
||||
{
|
||||
title: 'select cap segment',
|
||||
selectClick: scene.makeMouseHelpers(688, 91)[0],
|
||||
},
|
||||
{
|
||||
title: 'select cap solid 2d',
|
||||
selectClick: scene.makeMouseHelpers(733, 204)[0],
|
||||
},
|
||||
// TODO keeps failing
|
||||
// {
|
||||
// title: 'select cap circle',
|
||||
// selectClick: scene.makeMouseHelpers(679, 290)[0],
|
||||
// },
|
||||
{
|
||||
title: 'select cap extrude wall',
|
||||
selectClick: scene.makeMouseHelpers(649, 402)[0],
|
||||
},
|
||||
{
|
||||
title: 'select cap extrude cap',
|
||||
selectClick: scene.makeMouseHelpers(693, 408)[0],
|
||||
},
|
||||
] as const
|
||||
|
||||
const verifyWallProfilesAreDrawn = async () =>
|
||||
test.step('verify wall profiles are drawn', async () => {
|
||||
@ -2697,44 +2670,6 @@ extrude003 = extrude(profile011, length = 2.5)
|
||||
])
|
||||
})
|
||||
|
||||
const verifyCapProfilesAreDrawn = async () =>
|
||||
test.step('verify cap profiles are drawn', async () => {
|
||||
// open polygon
|
||||
await scene.expectPixelColor(
|
||||
TEST_COLORS.WHITE,
|
||||
// TEST_COLORS.BLUE, // When entering via the circle, it's selected and therefore blue
|
||||
{ x: 620, y: 58 },
|
||||
15
|
||||
)
|
||||
// revolved profile
|
||||
await scene.expectPixelColor(
|
||||
TEST_COLORS.WHITE,
|
||||
{ x: 641, y: 110 },
|
||||
15
|
||||
)
|
||||
// closed polygon
|
||||
await scene.expectPixelColor(
|
||||
TEST_COLORS.WHITE,
|
||||
{ x: 632, y: 200 },
|
||||
15
|
||||
)
|
||||
// extruded profile
|
||||
await scene.expectPixelColor(
|
||||
TEST_COLORS.WHITE,
|
||||
{ x: 628, y: 410 },
|
||||
15
|
||||
)
|
||||
// circle
|
||||
await scene.expectPixelColor(
|
||||
[
|
||||
TEST_COLORS.WHITE,
|
||||
TEST_COLORS.BLUE, // When entering via the circle, it's selected and therefore blue
|
||||
],
|
||||
{ x: 681, y: 303 },
|
||||
15
|
||||
)
|
||||
})
|
||||
|
||||
await test.step('select wall profiles', async () => {
|
||||
for (const { title, selectClick } of wallSelectionOptions) {
|
||||
await test.step(title, async () => {
|
||||
|
@ -7,12 +7,7 @@ import { spawn } from 'child_process'
|
||||
import { KCL_DEFAULT_LENGTH } from 'lib/constants'
|
||||
import JSZip from 'jszip'
|
||||
import path from 'path'
|
||||
import {
|
||||
IS_PLAYWRIGHT_KEY,
|
||||
TEST_SETTINGS,
|
||||
TEST_SETTINGS_KEY,
|
||||
} from './storageStates'
|
||||
import * as TOML from '@iarna/toml'
|
||||
import { TEST_SETTINGS, TEST_SETTINGS_KEY } from './storageStates'
|
||||
import { SceneFixture } from './fixtures/sceneFixture'
|
||||
import { CmdBarFixture } from './fixtures/cmdBarFixture'
|
||||
|
||||
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 45 KiB |
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 55 KiB |
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 68 KiB |
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB |
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 76 KiB |
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 66 KiB |
Before Width: | Height: | Size: 143 KiB After Width: | Height: | Size: 143 KiB |
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 68 KiB |
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 74 KiB |
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 69 KiB |
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 72 KiB |
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 68 KiB |
@ -29,5 +29,5 @@
|
||||
}
|
||||
}
|
||||
],
|
||||
"kcl_version": "0.2.50"
|
||||
"kcl_version": "0.2.51"
|
||||
}
|
@ -1,4 +1,3 @@
|
||||
import { MouseControlType } from '@rust/kcl-lib/bindings/MouseControlType'
|
||||
import { Settings } from '@rust/kcl-lib/bindings/Settings'
|
||||
import { SaveSettingsPayload } from 'lib/settings/settingsTypes'
|
||||
import { Themes } from 'lib/theme'
|
||||
@ -143,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], %)
|
||||
|
@ -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' },
|
||||
|
@ -2,15 +2,12 @@ import {
|
||||
expect,
|
||||
BrowserContext,
|
||||
TestInfo,
|
||||
_electron as electron,
|
||||
ElectronApplication,
|
||||
Locator,
|
||||
Page,
|
||||
} from '@playwright/test'
|
||||
import { test } from './zoo-test'
|
||||
import { EngineCommand } from 'lang/std/artifactGraph'
|
||||
import fsp from 'fs/promises'
|
||||
import fsSync from 'fs'
|
||||
import path from 'path'
|
||||
import pixelMatch from 'pixelmatch'
|
||||
import { PNG } from 'pngjs'
|
||||
@ -24,14 +21,11 @@ import {
|
||||
IS_PLAYWRIGHT_KEY,
|
||||
} from './storageStates'
|
||||
import * as TOML from '@iarna/toml'
|
||||
import { SaveSettingsPayload } from 'lib/settings/settingsTypes'
|
||||
import { SETTINGS_FILE_NAME } from 'lib/constants'
|
||||
import { isErrorWhitelisted } from './lib/console-error-whitelist'
|
||||
import { isArray } from 'lib/utils'
|
||||
import { reportRejection } from 'lib/trap'
|
||||
import { DeepPartial } from 'lib/types'
|
||||
import { Configuration } from 'lang/wasm'
|
||||
import { Settings } from '@rust/kcl-lib/bindings/Settings'
|
||||
|
||||
const toNormalizedCode = (text: string) => {
|
||||
return text.replace(/\s+/g, '')
|
||||
@ -928,10 +922,6 @@ export async function setup(
|
||||
// await page.reload()
|
||||
}
|
||||
|
||||
let electronApp: ElectronApplication | undefined = undefined
|
||||
let context: BrowserContext | undefined = undefined
|
||||
let page: Page | undefined = undefined
|
||||
|
||||
function failOnConsoleErrors(page: Page, testInfo?: TestInfo) {
|
||||
// enabled for chrome for now
|
||||
if (page.context().browser()?.browserType().name() === 'chromium') {
|
||||
|
@ -4,7 +4,6 @@ import { bracket } from 'lib/exampleKcl'
|
||||
import * as fsp from 'fs/promises'
|
||||
import { join } from 'path'
|
||||
import { FILE_EXT } from 'lib/constants'
|
||||
import { UnitLength_type } from '@kittycad/lib/dist/types/src/models'
|
||||
|
||||
test.describe('Testing in-app sample loading', () => {
|
||||
/**
|
||||
@ -49,8 +48,6 @@ test.describe('Testing in-app sample loading', () => {
|
||||
})
|
||||
const warningText = page.getByText('Overwrite current file and units?')
|
||||
const confirmButton = page.getByRole('button', { name: 'Submit command' })
|
||||
const unitsToast = (unit: UnitLength_type) =>
|
||||
page.getByText(`Set default unit to "${unit}" for this project`)
|
||||
|
||||
await test.step(`Precondition: check the initial code`, async () => {
|
||||
await u.openKclCodePanel()
|
||||
@ -125,8 +122,6 @@ test.describe('Testing in-app sample loading', () => {
|
||||
page.getByRole('listitem').filter({
|
||||
has: page.getByRole('button', { name }),
|
||||
})
|
||||
const unitsToast = (unit: UnitLength_type) =>
|
||||
page.getByText(`Set default unit to "${unit}" for this project`)
|
||||
|
||||
await test.step(`Test setup`, async () => {
|
||||
await page.setBodyDimensions({ width: 1200, height: 500 })
|
||||
|
@ -1386,7 +1386,8 @@ profile001 = startProfileAt([56.37, 120.33], sketch001)
|
||||
page.getByRole('button', { name: 'Edit Sketch' })
|
||||
).toBeVisible()
|
||||
return true
|
||||
} catch (_) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
} catch (_e) {
|
||||
return false
|
||||
}
|
||||
})
|
||||
|
@ -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,
|
||||
@ -364,7 +364,6 @@ profile003 = startProfileAt([40.16, -120.48], sketch006)
|
||||
await camPosition1()
|
||||
|
||||
const revolve = { x: 635, y: 253 }
|
||||
const parentExtrude = { x: 915, y: 133 }
|
||||
const solid2d = { x: 770, y: 167 }
|
||||
const individualProfile = { x: 694, y: 432 }
|
||||
|
||||
@ -380,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
|
||||
@ -452,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)
|
||||
@ -495,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,
|
||||
|
@ -7,7 +7,7 @@ import {
|
||||
createProject,
|
||||
tomlToSettings,
|
||||
} from './test-utils'
|
||||
import { SaveSettingsPayload, SettingsLevel } from 'lib/settings/settingsTypes'
|
||||
import { SettingsLevel } from 'lib/settings/settingsTypes'
|
||||
import { SETTINGS_FILE_NAME, PROJECT_SETTINGS_FILE_NAME } from 'lib/constants'
|
||||
import {
|
||||
TEST_SETTINGS_KEY,
|
||||
@ -15,7 +15,6 @@ import {
|
||||
TEST_SETTINGS,
|
||||
TEST_SETTINGS_DEFAULT_THEME,
|
||||
} from './storageStates'
|
||||
import * as TOML from '@iarna/toml'
|
||||
import { DeepPartial } from 'lib/types'
|
||||
import { Settings } from '@rust/kcl-lib/bindings/Settings'
|
||||
|
||||
@ -978,72 +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()
|
||||
})
|
||||
|
||||
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(`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(`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' })
|
||||
})
|
||||
|
||||
const toast = (value: boolean) =>
|
||||
page.getByText(
|
||||
`Set highlight edges to "${String(value)}" as a user default`
|
||||
await expect(scene.streamWrapper).toHaveScreenshot(
|
||||
'toggle-settings-initial.png',
|
||||
{
|
||||
maxDiffPixels: 15,
|
||||
mask: [page.getByTestId('model-state-indicator')],
|
||||
}
|
||||
)
|
||||
const initialPath = testInfo.snapshotPath('toggle-settings-initial.png')
|
||||
const initialScreenshot = await scene.streamWrapper.screenshot({
|
||||
path: initialPath,
|
||||
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 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')],
|
||||
}
|
||||
)
|
||||
})
|
||||
}
|
||||
)
|
||||
})
|
||||
|
@ -619,7 +619,7 @@ async function sendPromptFromCommandBar(page: Page, promptStr: string) {
|
||||
})
|
||||
}
|
||||
|
||||
test(
|
||||
test.fixme(
|
||||
'Text-to-CAD functionality',
|
||||
{ tag: '@electron' },
|
||||
async ({ context, page }, testInfo) => {
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* eslint-disable react-hooks/rules-of-hooks */
|
||||
|
||||
import { test as playwrightTestFn, ElectronApplication } from '@playwright/test'
|
||||
import { test as playwrightTestFn } from '@playwright/test'
|
||||
|
||||
import {
|
||||
fixturesBasedOnProcessEnvPlatform,
|
||||
@ -8,8 +8,6 @@ import {
|
||||
ElectronZoo,
|
||||
} from './fixtures/fixtureSetup'
|
||||
|
||||
import { Settings } from '@rust/kcl-lib/bindings/Settings'
|
||||
import { DeepPartial } from 'lib/types'
|
||||
export { expect } from '@playwright/test'
|
||||
|
||||
declare module '@playwright/test' {
|
||||
|
@ -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",
|
||||
@ -71,7 +72,7 @@
|
||||
"scripts": {
|
||||
"install:rust": "curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain none && source \"$HOME/.cargo/env\" && (cd rust && (rustup show active-toolchain || rustup toolchain install))",
|
||||
"install:rust:windows": "winget install Microsoft.VisualStudio.2022.Community --silent --override \"--wait --quiet --add ProductLang En-us --add Microsoft.VisualStudio.Workload.NativeDesktop --includeRecommended\" && winget install Rustlang.Rustup",
|
||||
"install:wasm-pack:sh": ". $HOME/.cargo/env && curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh -s -- -y",
|
||||
"install:wasm-pack:sh": ". $HOME/.cargo/env && curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh -s -- -f",
|
||||
"install:wasm-pack:cargo": "cargo install wasm-pack",
|
||||
"install:tools:windows": "winget install jqlang.jq MikeFarah.yq GitHub.cli",
|
||||
"start": "vite --port=3000 --host=0.0.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",
|
||||
|
@ -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],
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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))
|
||||
|
@ -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(
|
||||
|
@ -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(
|
||||
|
@ -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(
|
||||
|
@ -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(
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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')
|
||||
|
@ -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], %)
|
||||
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 29 KiB |
@ -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));
|
||||
|
@ -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));
|
||||
|
@ -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));
|
||||
|
@ -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, $);
|
||||
|
@ -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, $);
|
||||
|
@ -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));
|
||||
|
@ -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
@ -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",
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -248,6 +248,7 @@ export class Ctx {
|
||||
this.clientSubscriptions = []
|
||||
try {
|
||||
await this._client?.dispose(2000)
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
} catch (e) {
|
||||
// DO nothing.
|
||||
}
|
||||
|
@ -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",
|
||||
|
@ -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], %)
|
||||
|
@ -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]
|
||||
|
@ -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],
|
||||
})
|
||||
})?;
|
||||
|
@ -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(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
}
|
||||
|
@ -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
|
||||
|