Add edge and segment selection in point-and-click Helix flow

Fixes #5393
This commit is contained in:
Pierre Jacquier
2025-03-20 18:38:13 -04:00
501 changed files with 132399 additions and 65605 deletions

View File

@ -4,7 +4,7 @@
"main": "main.js",
"dependencies": {
"@actions/core": "^1.6",
"@actions/github": "^5.0",
"glob": "^7.1.5"
"@actions/github": "^6.0",
"glob": "^11.0.1"
}
}

View File

@ -4,27 +4,27 @@
set -euo pipefail
if [[ ! -f "test-results/.last-run.json" ]]; then
# if no last run artifact, than run plawright normally
# If no last run artifact, than run Playwright normally
echo "run playwright normally"
if [[ "$3" == *ubuntu* ]]; then
xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- yarn test:playwright:electron:ubuntu -- --shard=$1/$2 || true
elif [[ "$3" == *windows* ]]; then
yarn test:playwright:electron:windows -- --shard=$1/$2 || true
elif [[ "$3" == *macos* ]]; then
yarn test:playwright:electron:macos -- --shard=$1/$2 || true
else
echo "Do not run playwright. Unable to detect os runtime."
exit 1
fi
# # send to axiom
node playwrightProcess.mjs | tee /tmp/github-actions.log > /dev/null 2>&1
if [[ "$3" == *ubuntu* ]]; then
xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- yarn test:playwright:electron:ubuntu -- --shard=$1/$2 || true
elif [[ "$3" == *windows* ]]; then
yarn test:playwright:electron:windows -- --shard=$1/$2 || true
elif [[ "$3" == *macos* ]]; then
yarn test:playwright:electron:macos -- --shard=$1/$2 || true
else
echo "Do not run Playwright. Unable to detect os runtime."
exit 1
fi
# Log failures for Axiom to pick up
node playwrightProcess.mjs > /tmp/github-actions.log
fi
retry=1
max_retrys=1
max_retries=1
# retry failed tests, doing our own retries because using inbuilt playwright retries causes connection issues
while [[ $retry -le $max_retrys ]]; do
# Retry failed tests, doing our own retries because using inbuilt Playwright retries causes connection issues
while [[ $retry -le $max_retries ]]; do
if [[ -f "test-results/.last-run.json" ]]; then
failed_tests=$(jq '.failedTests | length' test-results/.last-run.json)
if [[ $failed_tests -gt 0 ]]; then
@ -40,8 +40,8 @@ while [[ $retry -le $max_retrys ]]; do
echo "Do not run playwright. Unable to detect os runtime."
exit 1
fi
# send to axiom
node playwrightProcess.mjs | tee /tmp/github-actions.log > /dev/null 2>&1
# Log failures for Axiom to pick up
node playwrightProcess.mjs > /tmp/github-actions.log
retry=$((retry + 1))
else
echo "retried=false" >>$GITHUB_OUTPUT
@ -58,7 +58,7 @@ echo "retried=false" >>$GITHUB_OUTPUT
if [[ -f "test-results/.last-run.json" ]]; then
failed_tests=$(jq '.failedTests | length' test-results/.last-run.json)
if [[ $failed_tests -gt 0 ]]; then
# if it still fails after 3 retrys, then fail the job
# If it still fails after 3 retries, then fail the job
exit 1
fi
fi

View File

@ -230,39 +230,6 @@ updates:
update-types:
- minor
- patch
- package-ecosystem: pip
directory: /public/kcl-samples
schedule:
interval: weekly
day: monday
time: '03:00'
timezone: America/Los_Angeles
open-pull-requests-limit: 5
reviewers:
- adamchalmers
- franknoirot
- irev-dev
- jessfraz
groups:
security:
applies-to: security-updates
update-types:
- major
- minor
- patch
patch:
applies-to: version-updates
update-types:
- patch
major:
applies-to: version-updates
update-types:
- major
minor:
applies-to: version-updates
update-types:
- minor
- patch
- package-ecosystem: pip
directory: /rust/kcl-python-bindings
schedule:

View File

@ -24,7 +24,7 @@ jobs:
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
cache: false # Configured below.
- uses: taiki-e/install-action@955a6ff1416eae278c9f833008a9beb4b7f9afe3
- uses: taiki-e/install-action@37bdc826eaedac215f638a96472df572feab0f9b
with:
tool: wasm-pack
- name: Rust Cache

View File

@ -77,7 +77,7 @@ jobs:
with:
cache: false # Configured below.
- uses: taiki-e/install-action@955a6ff1416eae278c9f833008a9beb4b7f9afe3
- uses: taiki-e/install-action@37bdc826eaedac215f638a96472df572feab0f9b
if: ${{ steps.wasm.outputs.should-build-wasm == 'true' }}
with:
tool: wasm-pack

View File

@ -100,9 +100,14 @@ jobs:
shell: bash
run: |
set -euo pipefail
cd rust
pushd rust
just overwrite-sim-test kcl_samples
git add kcl-lib/tests
popd
git add \
rust/kcl-lib/tests \
public/kcl-samples/manifest.json \
public/kcl-samples/README.md \
public/kcl-samples/screenshots
git config --local user.email "github-actions[bot]@users.noreply.github.com"
git config --local user.name "github-actions[bot]"
git remote set-url origin https://${{ github.actor }}:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git

View File

@ -137,7 +137,7 @@ jobs:
with:
cache: false # Configured below.
- uses: taiki-e/install-action@955a6ff1416eae278c9f833008a9beb4b7f9afe3
- uses: taiki-e/install-action@37bdc826eaedac215f638a96472df572feab0f9b
if: ${{ needs.conditions.outputs.should-run == 'true' && steps.wasm.outputs.should-build-wasm == 'true' }}
with:
tool: wasm-pack
@ -340,14 +340,22 @@ jobs:
if: needs.conditions.outputs.should-run == 'true'
run: yarn tronb:vite:dev
- name: Install good sed
if: startsWith(matrix.os, 'macos')
- name: Install vector
if: contains(matrix.os, 'ubuntu')
shell: bash
run: |
brew install gnu-sed
echo "/opt/homebrew/opt/gnu-sed/libexec/gnubin" >> $GITHUB_PATH
# TODO: Add back axiom logs
curl --proto '=https' --tlsv1.2 -sSfL https://sh.vector.dev > /tmp/vector.sh
chmod +x /tmp/vector.sh
/tmp/vector.sh -y -no-modify-path
mkdir -p /tmp/vector
cp .github/workflows/vector.toml /tmp/vector.toml
sed -i "s#GITHUB_WORKFLOW#${GITHUB_WORKFLOW}#g" /tmp/vector.toml
sed -i "s#GITHUB_REPOSITORY#${GITHUB_REPOSITORY}#g" /tmp/vector.toml
sed -i "s#GITHUB_SHA#${GITHUB_SHA}#g" /tmp/vector.toml
sed -i "s#GITHUB_REF_NAME#${GITHUB_REF_NAME}#g" /tmp/vector.toml
sed -i "s#GH_ACTIONS_AXIOM_TOKEN#${{secrets.GH_ACTIONS_AXIOM_TOKEN}}#g" /tmp/vector.toml
cat /tmp/vector.toml
${HOME}/.vector/bin/vector --config /tmp/vector.toml &
- uses: actions/download-artifact@v4
if: ${{ needs.conditions.outputs.should-run == 'true' && !cancelled() && (success() || failure()) }}

View File

@ -376,7 +376,7 @@ jobs:
with:
credentials_json: "${{ secrets.GOOGLE_CLOUD_DL_SA }}"
- name: Set up Cloud SDK
uses: google-github-actions/setup-gcloud@v2.1.2
uses: google-github-actions/setup-gcloud@v2.1.4
with:
project_id: kittycadapi
- name: "upload files to gcp"

View File

@ -37,7 +37,7 @@ jobs:
node-version-file: '.nvmrc'
cache: 'yarn'
- run: yarn install
- uses: taiki-e/install-action@955a6ff1416eae278c9f833008a9beb4b7f9afe3
- uses: taiki-e/install-action@37bdc826eaedac215f638a96472df572feab0f9b
with:
tool: wasm-pack
- run: yarn build:wasm
@ -57,7 +57,7 @@ jobs:
with:
workspaces: './rust'
- uses: taiki-e/install-action@955a6ff1416eae278c9f833008a9beb4b7f9afe3
- uses: taiki-e/install-action@37bdc826eaedac215f638a96472df572feab0f9b
with:
tool: wasm-pack
- run: yarn build:wasm
@ -100,7 +100,7 @@ jobs:
cache: 'yarn'
- run: yarn install
- uses: taiki-e/install-action@955a6ff1416eae278c9f833008a9beb4b7f9afe3
- uses: taiki-e/install-action@37bdc826eaedac215f638a96472df572feab0f9b
with:
tool: wasm-pack
- run: yarn build:wasm
@ -129,7 +129,7 @@ jobs:
cache: 'yarn'
- run: yarn install
- uses: taiki-e/install-action@955a6ff1416eae278c9f833008a9beb4b7f9afe3
- uses: taiki-e/install-action@37bdc826eaedac215f638a96472df572feab0f9b
with:
tool: wasm-pack
- run: yarn build:wasm

1
.gitignore vendored
View File

@ -50,6 +50,7 @@ e2e/playwright/**/*.png
e2e/playwright/export-snapshots/*
!e2e/playwright/export-snapshots/*.png
!e2e/playwright/snapshot-tests.spec.ts-snapshots/*.png
trace.zip
/public/kcl-samples.zip
/public/kcl-samples/.github

117
Makefile
View File

@ -1,12 +1,110 @@
.PHONY: dev
.PHONY: all
all: install build check
KCL_WASM_LIB_FILES := $(wildcard rust/**/*.rs)
TS_SRC := $(wildcard src/**/*.tsx) $(wildcard src/**/*.ts)
XSTATE_TYPEGENS := $(wildcard src/machines/*.typegen.ts)
###############################################################################
# INSTALL
dev: node_modules public/kcl_wasm_lib_bg.wasm $(XSTATE_TYPEGENS)
WASM_PACK ?= ~/.cargo/bin/wasm-pack
.PHONY: install
install: node_modules/.yarn-integrity $(WASM_PACK) ## Install dependencies
node_modules/.yarn-integrity: package.json yarn.lock
yarn install
@ touch $@
$(WASM_PACK):
yarn install:rust
yarn install:wasm-pack:sh
###############################################################################
# BUILD
RUST_SOURCES := $(wildcard rust/*) $(wildcard rust/**/*)
TYPESCRIPT_SOURCES := $(wildcard src/**/*.tsx) $(wildcard src/**/*.ts)
.PHONY: build
build: build-web build-desktop
.PHONY: build-web
build-web: public/kcl_wasm_lib_bg.wasm build/index.html
.PHONY: build-desktop
build-desktop: public/kcl_wasm_lib_bg.wasm .vite/build/main.js
public/kcl_wasm_lib_bg.wasm: $(RUST_SOURCES)
yarn build:wasm
build/index.html: $(TYPESCRIPT_SOURCES)
yarn build:local
.vite/build/main.js: $(TYPESCRIPT_SOURCES)
yarn tronb:vite:dev
###############################################################################
# CHECK
.PHONY: check
check: format lint
.PHONY: format
format: install ## Format the code
yarn fmt
.PHONY: lint
lint: install ## Lint the code
yarn lint
###############################################################################
# RUN
.PHONY: run
run: run-web
.PHONY: run-web
run-web: install build-web ## Start the web app
yarn start
.PHONY: run-desktop
run-desktop: install build-desktop ## Start the desktop app
yarn tron:start
###############################################################################
# TEST
GREP ?= ""
.PHONY: test
test: test-unit test-e2e
.PHONY: test-unit
test-unit: install ## Run the unit tests
@ nc -z localhost 3000 || ( echo "Error: localhost:3000 not available, 'make run-web' first" && exit 1 )
yarn test:unit
.PHONY: test-e2e
test-e2e: install build-desktop ## Run the e2e tests
yarn test:playwright:electron --workers=1 --grep=$(GREP)
###############################################################################
# CLEAN
.PHONY: clean
clean: ## Delete all artifacts
rm -rf .vite/ build/
rm -rf trace.zip playwright-report/ test-results/
rm -rf public/kcl_wasm_lib_bg.wasm
rm -rf rust/*/bindings/ rust/*/pkg/ rust/target/
rm -rf node_modules/ rust/*/node_modules/
.PHONY: help
help: install
@ grep -E '^[^[:space:]]+:.*## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
.DEFAULT_GOAL := help
###############################################################################
# I'm sorry this is so specific to my setup you may as well ignore this.
# This is so you don't have to deal with electron windows popping up constantly.
# It should work for you other Linux users.
@ -14,12 +112,3 @@ lee-electron-test:
Xephyr -br -ac -noreset -screen 1200x500 :2 &
DISPLAY=:2 NODE_ENV=development PW_TEST_CONNECT_WS_ENDPOINT=ws://127.0.0.1:4444/ yarn tron:test -g "when using the file tree"
killall Xephyr
$(XSTATE_TYPEGENS): $(TS_SRC)
yarn xstate typegen 'src/**/*.ts?(x)'
public/kcl_wasm_lib_bg.wasm: $(KCL_WASM_LIB_FILES)
yarn build:wasm
node_modules: package.json yarn.lock
yarn install

View File

@ -184,7 +184,6 @@ example = extrude(exampleSketch, length = 1)
```js
// Color the result of a sweep.
// Create a path for the sweep.
sweepPath = startSketchOn('XZ')
|> startProfileAt([0.05, 0.05], %)

View File

@ -22,8 +22,12 @@ layout: manual
* [`string`](kcl/types/string)
* [`tag`](kcl/types/tag)
* **std**
* [`Face`](kcl/types/Face)
* [`HALF_TURN`](kcl/consts/std-HALF_TURN)
* [`Helix`](kcl/types/Helix)
* [`Plane`](kcl/types/Plane)
* [`Point2d`](kcl/types/Point2d)
* [`Point3d`](kcl/types/Point3d)
* [`QUARTER_TURN`](kcl/consts/std-QUARTER_TURN)
* [`Sketch`](kcl/types/Sketch)
* [`Solid`](kcl/types/Solid)

50
docs/kcl/intersect.md Normal file

File diff suppressed because one or more lines are too long

View File

@ -52,7 +52,6 @@ fn sum(arr):
sumSoFar = add(sumSoFar, i)
return sumSoFar */
// We use `assertEqual` to check that our `sum` function gives the
// expected result. It's good to check your work!
assertEqual(sum([1, 2, 3]), 6, 0.00001, "1 + 2 + 3 summed is 6")
@ -114,7 +113,6 @@ fn decagon(radius):
fullDecagon = partialDecagon // it's now full
return fullDecagon */
// Use the `decagon` function declared above, to sketch a decagon with radius 5.
decagon(5.0)
|> close()

View File

@ -57,7 +57,6 @@ rotate(
```js
// Rotate a pipe with roll, pitch, and yaw.
// Create a path for the sweep.
sweepPath = startSketchOn('XZ')
|> startProfileAt([0.05, 0.05], %)
@ -83,7 +82,6 @@ sweepSketch = startSketchOn('XY')
```js
// Rotate a pipe about an axis with an angle.
// Create a path for the sweep.
sweepPath = startSketchOn('XZ')
|> startProfileAt([0.05, 0.05], %)

View File

@ -37,7 +37,6 @@ scale(
```js
// Scale a pipe.
// Create a path for the sweep.
sweepPath = startSketchOn('XZ')
|> startProfileAt([0.05, 0.05], %)

File diff suppressed because it is too large Load Diff

56
docs/kcl/subtract.md Normal file

File diff suppressed because one or more lines are too long

View File

@ -43,7 +43,6 @@ sweep(
```js
// Create a pipe using a sweep.
// Create a path for the sweep.
sweepPath = startSketchOn('XZ')
|> startProfileAt([0.05, 0.05], %)
@ -68,7 +67,6 @@ sweepSketch = startSketchOn('XY')
```js
// Create a spring by sweeping around a helix path.
// Create a helix around the Z axis.
helixPath = helix(
angleStart = 0,

View File

@ -35,7 +35,6 @@ translate(
```js
// Move a pipe.
// Create a path for the sweep.
sweepPath = startSketchOn('XZ')
|> startProfileAt([0.05, 0.05], %)

View File

@ -1,28 +1,12 @@
---
title: "Face"
title: "std::Face"
excerpt: "A face."
layout: manual
---
A face.
**Type:** `object`
## Properties
| Property | Type | Description | Required |
|----------|------|-------------|----------|
| `id` |[`string`](/docs/kcl/types/string)| The id of the face. | No |
| `artifactId` |[`ArtifactId`](/docs/kcl/types/ArtifactId)| The artifact ID. | No |
| `value` |[`string`](/docs/kcl/types/string)| The tag of the face. | No |
| `xAxis` |[`Point3d`](/docs/kcl/types/Point3d)| What should the face's X axis be? | No |
| `yAxis` |[`Point3d`](/docs/kcl/types/Point3d)| What should the face's Y axis be? | No |
| `zAxis` |[`Point3d`](/docs/kcl/types/Point3d)| The z-axis (normal). | No |
| `solid` |[`Solid`](/docs/kcl/types/Solid)| The solid the face is on. | No |
| `units` |[`UnitLen`](/docs/kcl/types/UnitLen)| A unit of length. | No |

View File

@ -1,26 +1,12 @@
---
title: "Helix"
title: "std::Helix"
excerpt: "A helix."
layout: manual
---
A helix.
**Type:** `object`
## Properties
| Property | Type | Description | Required |
|----------|------|-------------|----------|
| `value` |[`string`](/docs/kcl/types/string)| The id of the helix. | No |
| `artifactId` |[`ArtifactId`](/docs/kcl/types/ArtifactId)| The artifact ID. | No |
| `revolutions` |[`number`](/docs/kcl/types/number)| Number of revolutions. | No |
| `angleStart` |[`number`](/docs/kcl/types/number)| Start angle (in degrees). | No |
| `ccw` |`boolean`| Is the helix rotation counter clockwise? | No |
| `units` |[`UnitLen`](/docs/kcl/types/UnitLen)| A unit of length. | No |

View File

@ -188,7 +188,7 @@ Any KCL value.
| Property | Type | Description | Required |
|----------|------|-------------|----------|
| `type` |enum: [`Face`](/docs/kcl/types/Face)| | No |
| `value` |[`Face`](/docs/kcl/types/Face)| A face. | No |
| `value` |[`Face`](/docs/kcl/types/Face)| | No |
----
@ -236,7 +236,7 @@ Any KCL value.
| Property | Type | Description | Required |
|----------|------|-------------|----------|
| `type` |enum: [`Helix`](/docs/kcl/types/Helix)| | No |
| `value` |[`Helix`](/docs/kcl/types/Helix)| A helix. | No |
| `value` |[`Helix`](/docs/kcl/types/Helix)| | No |
----

17
docs/kcl/types/Point2d.md Normal file
View File

@ -0,0 +1,17 @@
---
title: "std::Point2d"
excerpt: "A point in two dimensional space."
layout: manual
---
A point in two dimensional space.
```kcl
type Point2d = [number; 2]
```
`Point2d` is an alias for a two-element array of [number](/docs/kcl/types/number)s. To write a value
with type `Point2d`, use an array, e.g., `[0, 0]` or `[5.0, 3.14]`.

View File

@ -1,22 +1,17 @@
---
title: "Point3d"
excerpt: ""
title: "std::Point3d"
excerpt: "A point in three dimensional space."
layout: manual
---
A point in three dimensional space.
**Type:** `object`
```kcl
type Point3d = [number; 3]
```
`Point3d` is an alias for a three-element array of [number](/docs/kcl/types/number)s. To write a value
with type `Point3d`, use an array, e.g., `[0, 0, 0]` or `[5.0, 3.14, 6.8]`.
## Properties
| Property | Type | Description | Required |
|----------|------|-------------|----------|
| `x` |[`number`](/docs/kcl/types/number)| | No |
| `y` |[`number`](/docs/kcl/types/number)| | No |
| `z` |[`number`](/docs/kcl/types/number)| | No |

View File

@ -22,7 +22,6 @@ A path to sweep along.
----
A helix.
[`Helix`](/docs/kcl/types/Helix)

50
docs/kcl/union.md Normal file

File diff suppressed because one or more lines are too long

View File

@ -153,7 +153,8 @@ async function doBasicSketch(
}
test.describe('Basic sketch', { tag: ['@skipWin'] }, () => {
test.fixme('code pane open at start', async ({ page, homePage }) => {
test('code pane open at start', async ({ page, homePage }) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
await doBasicSketch(page, homePage, ['code'])
})

View File

@ -46,11 +46,12 @@ test.describe('Code pane and errors', { tag: ['@skipWin'] }, () => {
await expect(codePaneButtonHolder).toContainText('notification')
})
test.skip('Opening and closing the code pane will consistently show error diagnostics', async ({
test('Opening and closing the code pane will consistently show error diagnostics', async ({
page,
homePage,
editor,
}) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
const u = await getUtils(page)
// Load the app with the working starter code
@ -119,45 +120,47 @@ test.describe('Code pane and errors', { tag: ['@skipWin'] }, () => {
await expect(page.locator('.cm-tooltip').first()).toBeVisible()
})
test.fixme(
'When error is not in view you can click the badge to scroll to it',
async ({ page, homePage, context }) => {
// Load the app with the working starter code
await context.addInitScript((code) => {
localStorage.setItem('persistCode', code)
}, TEST_CODE_LONG_WITH_ERROR_OUT_OF_VIEW)
test('When error is not in view you can click the badge to scroll to it', async ({
page,
homePage,
context,
}) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
// Load the app with the working starter code
await context.addInitScript((code) => {
localStorage.setItem('persistCode', code)
}, TEST_CODE_LONG_WITH_ERROR_OUT_OF_VIEW)
await page.setBodyDimensions({ width: 1200, height: 500 })
await homePage.goToModelingScene()
await page.setBodyDimensions({ width: 1200, height: 500 })
await homePage.goToModelingScene()
await page.waitForTimeout(1000)
await page.waitForTimeout(1000)
// Ensure badge is present
const codePaneButtonHolder = page.locator('#code-button-holder')
await expect(codePaneButtonHolder).toContainText('notification')
// Ensure badge is present
const codePaneButtonHolder = page.locator('#code-button-holder')
await expect(codePaneButtonHolder).toContainText('notification')
// Ensure we have no errors in the gutter, since error out of view.
await expect(page.locator('.cm-lint-marker-error')).not.toBeVisible()
// Ensure we have no errors in the gutter, since error out of view.
await expect(page.locator('.cm-lint-marker-error')).not.toBeVisible()
// Click the badge.
const badge = page.locator('#code-badge')
await expect(badge).toBeVisible()
await badge.click()
// Click the badge.
const badge = page.locator('#code-badge')
await expect(badge).toBeVisible()
await badge.click()
// Ensure we have an error diagnostic.
await expect(page.locator('.cm-lint-marker-error').first()).toBeVisible()
// Ensure we have an error diagnostic.
await expect(page.locator('.cm-lint-marker-error').first()).toBeVisible()
// Hover over the error to see the error message
await page.hover('.cm-lint-marker-error')
await expect(
page
.getByText(
'Modeling command failed: [ApiError { error_code: InternalEngine, message: "Solid3D revolve failed: sketch profile must lie entirely on one side of the revolution axis" }]'
)
.first()
).toBeVisible()
}
)
// Hover over the error to see the error message
await page.hover('.cm-lint-marker-error')
await expect(
page
.getByText(
'Modeling command failed: [ApiError { error_code: InternalEngine, message: "Solid3D revolve failed: sketch profile must lie entirely on one side of the revolution axis" }]'
)
.first()
).toBeVisible()
})
test('When error is not in view WITH LINTS you can click the badge to scroll to it', async ({
context,

View File

@ -47,7 +47,8 @@ test.describe('Command bar tests', { tag: ['@skipWin'] }, () => {
})
// TODO: fix this test after the electron migration
test.fixme('Fillet from command bar', async ({ page, homePage }) => {
test('Fillet from command bar', async ({ page, homePage }) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
await page.addInitScript(async () => {
localStorage.setItem(
'persistCode',
@ -488,7 +489,7 @@ test.describe('Command bar tests', { tag: ['@skipWin'] }, () => {
})
})
test(`Can add a named parameter or constant`, async ({
test(`Can add and edit a named parameter or constant`, async ({
page,
homePage,
context,
@ -510,7 +511,7 @@ c = 3 + a`
// 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 test.step(`Create a parameter via command bar`, async () => {
await cmdBar.cmdBarOpenBtn.click()
await cmdBar.chooseCommand('create parameter')
await cmdBar.expectState({
@ -535,5 +536,57 @@ c = 3 + a`
await editor.expectEditor.toContain(
`a = 5b = a * amyParameter001 = b - 5c = 3 + a`
)
const newValue = `2 * b + a`
await test.step(`Edit the parameter via command bar`, async () => {
await cmdBar.cmdBarOpenBtn.click()
await cmdBar.chooseCommand('edit parameter')
await cmdBar.expectState({
stage: 'arguments',
commandName: 'Edit parameter',
currentArgKey: 'Name',
currentArgValue: '',
headerArguments: {
Name: '',
Value: '',
},
highlightedHeaderArg: 'Name',
})
await cmdBar
.selectOption({
name: 'myParameter001',
})
.click()
await cmdBar.expectState({
stage: 'arguments',
commandName: 'Edit parameter',
currentArgKey: 'value',
currentArgValue: 'b - 5',
headerArguments: {
Name: 'myParameter001',
Value: '',
},
highlightedHeaderArg: 'value',
})
await cmdBar.argumentInput.locator('[contenteditable]').fill(newValue)
await cmdBar.progressCmdBar()
await cmdBar.expectState({
stage: 'review',
commandName: 'Edit parameter',
headerArguments: {
Name: 'myParameter001',
// KCL inputs show the *computed* value, not the input value, in the command palette header
Value: '55',
},
})
await cmdBar.progressCmdBar()
await cmdBar.expectState({
stage: 'commandBarClosed',
})
})
await editor.expectEditor.toContain(
`a = 5b = a * amyParameter001 = ${newValue}c = 3 + a`
)
})
})

View File

@ -635,14 +635,16 @@ test.describe('Editor tests', { tag: ['@skipWin'] }, () => {
await expect(page.locator('.cm-lint-marker-error')).not.toBeVisible()
})
test.fixme(
'error with 2 source ranges gets 2 diagnostics',
async ({ page, homePage }) => {
const u = await getUtils(page)
await page.addInitScript(async () => {
localStorage.setItem(
'persistCode',
`length = .750
test('error with 2 source ranges gets 2 diagnostics', async ({
page,
homePage,
}) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
const u = await getUtils(page)
await page.addInitScript(async () => {
localStorage.setItem(
'persistCode',
`length = .750
width = 0.500
height = 0.500
dia = 4
@ -657,53 +659,52 @@ test.describe('Editor tests', { tag: ['@skipWin'] }, () => {
return squareHoleSketch
}
`
)
})
await page.setBodyDimensions({ width: 1000, height: 500 })
)
})
await page.setBodyDimensions({ width: 1000, height: 500 })
await homePage.goToModelingScene()
await u.waitForPageLoad()
await page.waitForTimeout(1000)
await homePage.goToModelingScene()
await u.waitForPageLoad()
await page.waitForTimeout(1000)
await u.openDebugPanel()
await u.expectCmdLog('[data-message-type="execution-done"]')
await u.closeDebugPanel()
await u.openDebugPanel()
await u.expectCmdLog('[data-message-type="execution-done"]')
await u.closeDebugPanel()
// check no error to begin with
await expect(page.locator('.cm-lint-marker-error')).not.toBeVisible()
// check no error to begin with
await expect(page.locator('.cm-lint-marker-error')).not.toBeVisible()
// Click on the bottom of the code editor to add a new line
await u.codeLocator.click()
await page.keyboard.press('ArrowDown')
await page.keyboard.press('ArrowDown')
await page.keyboard.press('ArrowDown')
await page.keyboard.press('ArrowDown')
await page.keyboard.press('ArrowDown')
await page.keyboard.press('ArrowDown')
await page.keyboard.press('ArrowDown')
await page.keyboard.press('ArrowDown')
await page.keyboard.press('ArrowDown')
await page.keyboard.press('ArrowDown')
await page.keyboard.press('ArrowDown')
await page.keyboard.press('ArrowDown')
await page.keyboard.press('ArrowDown')
await page.keyboard.press('Enter')
await page.keyboard.type(`extrusion = startSketchOn('XY')
// Click on the bottom of the code editor to add a new line
await u.codeLocator.click()
await page.keyboard.press('ArrowDown')
await page.keyboard.press('ArrowDown')
await page.keyboard.press('ArrowDown')
await page.keyboard.press('ArrowDown')
await page.keyboard.press('ArrowDown')
await page.keyboard.press('ArrowDown')
await page.keyboard.press('ArrowDown')
await page.keyboard.press('ArrowDown')
await page.keyboard.press('ArrowDown')
await page.keyboard.press('ArrowDown')
await page.keyboard.press('ArrowDown')
await page.keyboard.press('ArrowDown')
await page.keyboard.press('ArrowDown')
await page.keyboard.press('Enter')
await page.keyboard.type(`extrusion = startSketchOn('XY')
|> circle(center: [0, 0], radius: dia/2)
|> hole(squareHole(length, width, height), %)
|> extrude(length = height)`)
// error in gutter
await expect(page.locator('.cm-lint-marker-error').first()).toBeVisible()
await page.hover('.cm-lint-marker-error:first-child')
await expect(
page.getByText('Expected 2 arguments, got 3').first()
).toBeVisible()
// error in gutter
await expect(page.locator('.cm-lint-marker-error').first()).toBeVisible()
await page.hover('.cm-lint-marker-error:first-child')
await expect(
page.getByText('Expected 2 arguments, got 3').first()
).toBeVisible()
// Make sure there are two diagnostics
await expect(page.locator('.cm-lint-marker-error')).toHaveCount(2)
}
)
// Make sure there are two diagnostics
await expect(page.locator('.cm-lint-marker-error')).toHaveCount(2)
})
test('if your kcl gets an error from the engine it is inlined', async ({
context,
page,
@ -1121,10 +1122,11 @@ test.describe('Editor tests', { tag: ['@skipWin'] }, () => {
}
)
test.fixme(
test(
`Can use the import stdlib function on a local OBJ file`,
{ tag: '@electron' },
async ({ page, context }, testInfo) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
await context.folderSetupFn(async (dir) => {
const bracketDir = join(dir, 'cube')
await fsp.mkdir(bracketDir, { recursive: true })

View File

@ -266,12 +266,13 @@ test.describe('when using the file tree to', () => {
}
)
test.fixme(
test(
'loading small file, then large, then back to small',
{
tag: '@electron',
},
async ({ page }, testInfo) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
const {
panesOpen,
pasteCodeInEditor,

View File

@ -1,4 +1,4 @@
import type { Page, Locator } from '@playwright/test'
import { type Page, type Locator, test } from '@playwright/test'
import { expect } from '../zoo-test'
import {
checkIfPaneIsOpen,
@ -76,10 +76,6 @@ export class ToolbarFixture {
this.gizmoDisabled = page.getByTestId('gizmo-disabled')
}
get editSketchBtn() {
return this.page.locator('[name="Edit Sketch"]')
}
get logoLink() {
return this.page.getByTestId('app-logo')
}
@ -115,11 +111,20 @@ export class ToolbarFixture {
).not.toBeDisabled()
}
editSketch = async () => {
await this.editSketchBtn.first().click()
// One of the rare times we want to allow a arbitrary wait
// this is for the engine animation, as it takes 500ms to complete
await this.page.waitForTimeout(600)
editSketch = async (operationIndex = 0) => {
await test.step(`Editing sketch`, async () => {
await this.openFeatureTreePane()
const operation = await this.getFeatureTreeOperation(
'Sketch',
operationIndex
)
await operation.dblclick()
// One of the rare times we want to allow a arbitrary wait
// this is for the engine animation, as it takes 500ms to complete
await this.page.waitForTimeout(600)
await expect(this.exitSketchBtn).toBeEnabled()
await this.closeFeatureTreePane()
})
}
private _getMode = () =>
this.page.locator('[data-current-mode]').getAttribute('data-current-mode')

View File

@ -319,237 +319,240 @@ test.describe('Onboarding tests', () => {
// (lee) The two avatar tests are weird because even on main, we don't have
// anything to do with the avatar inside the onboarding test. Due to the
// low impact of an avatar not showing I'm changing this to fixme.
test.fixme(
'Avatar text updates depending on image load success',
async ({ context, page, homePage, tronApp }) => {
if (!tronApp) {
fail()
}
await tronApp.cleanProjectDir({
app: {
onboarding_status: '',
},
})
// Override beforeEach test setup
await context.addInitScript(
async ({ settingsKey, settings }) => {
localStorage.setItem(settingsKey, settings)
},
{
settingsKey: TEST_SETTINGS_KEY,
settings: settingsToToml({
settings: TEST_SETTINGS_ONBOARDING_USER_MENU,
}),
}
)
await page.setBodyDimensions({ width: 1200, height: 500 })
await homePage.goToModelingScene()
// Test that the text in this step is correct
const avatarLocator = page
.getByTestId('user-sidebar-toggle')
.locator('img')
const onboardingOverlayLocator = page
.getByTestId('onboarding-content')
.locator('div')
.nth(1)
// Expect the avatar to be visible and for the text to reference it
await expect(avatarLocator).toBeVisible()
await expect(onboardingOverlayLocator).toBeVisible()
await expect(onboardingOverlayLocator).toContainText('your avatar')
// This is to force the avatar to 404.
// For our test image (only triggers locally. on CI, it's Kurt's /
// gravatar image )
await page.route('/cat.jpg', async (route) => {
await route.fulfill({
status: 404,
contentType: 'text/plain',
body: 'Not Found!',
})
})
// 404 the CI avatar image
await page.route(
'https://lh3.googleusercontent.com/**',
async (route) => {
await route.fulfill({
status: 404,
contentType: 'text/plain',
body: 'Not Found!',
})
}
)
await page.reload({ waitUntil: 'domcontentloaded' })
// Now expect the text to be different
await expect(avatarLocator).not.toBeVisible()
await expect(onboardingOverlayLocator).toBeVisible()
await expect(onboardingOverlayLocator).toContainText('the menu button')
}
)
test.fixme(
"Avatar text doesn't mention avatar when no avatar",
async ({ context, page, homePage, tronApp }) => {
if (!tronApp) {
fail()
}
await tronApp.cleanProjectDir({
app: {
onboarding_status: '',
},
})
// Override beforeEach test setup
await context.addInitScript(
async ({ settingsKey, settings }) => {
localStorage.setItem(settingsKey, settings)
localStorage.setItem('FORCE_NO_IMAGE', 'FORCE_NO_IMAGE')
},
{
settingsKey: TEST_SETTINGS_KEY,
settings: settingsToToml({
settings: TEST_SETTINGS_ONBOARDING_USER_MENU,
}),
}
)
await page.setBodyDimensions({ width: 1200, height: 500 })
await homePage.goToModelingScene()
// Test that the text in this step is correct
const sidebar = page.getByTestId('user-sidebar-toggle')
const avatar = sidebar.locator('img')
const onboardingOverlayLocator = page
.getByTestId('onboarding-content')
.locator('div')
.nth(1)
// Expect the avatar to be visible and for the text to reference it
await expect(avatar).not.toBeVisible()
await expect(onboardingOverlayLocator).toBeVisible()
await expect(onboardingOverlayLocator).toContainText('the menu button')
// Test we mention what else is in this menu for https://github.com/KittyCAD/modeling-app/issues/2939
// which doesn't deserver its own full test spun up
const userMenuFeatures = [
'manage your account',
'report a bug',
'request a feature',
'sign out',
]
for (const feature of userMenuFeatures) {
await expect(onboardingOverlayLocator).toContainText(feature)
}
}
)
})
test.fixme(
'Restarting onboarding on desktop takes one attempt',
async ({ context, page, tronApp }) => {
test('Avatar text updates depending on image load success', async ({
context,
page,
homePage,
tronApp,
}) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
if (!tronApp) {
fail()
}
await tronApp.cleanProjectDir({
app: {
onboarding_status: 'dismissed',
onboarding_status: '',
},
})
await context.folderSetupFn(async (dir) => {
const routerTemplateDir = join(dir, 'router-template-slate')
await fsp.mkdir(routerTemplateDir, { recursive: true })
await fsp.copyFile(
executorInputPath('router-template-slate.kcl'),
join(routerTemplateDir, 'main.kcl')
)
})
// Override beforeEach test setup
await context.addInitScript(
async ({ settingsKey, settings }) => {
localStorage.setItem(settingsKey, settings)
},
{
settingsKey: TEST_SETTINGS_KEY,
settings: settingsToToml({
settings: TEST_SETTINGS_ONBOARDING_USER_MENU,
}),
}
)
// Our constants
const u = await getUtils(page)
const projectCard = page.getByText('router-template-slate')
const helpMenuButton = page.getByRole('button', {
name: 'Help and resources',
})
const restartOnboardingButton = page.getByRole('button', {
name: 'Reset onboarding',
})
const nextButton = page.getByTestId('onboarding-next')
await page.setBodyDimensions({ width: 1200, height: 500 })
await homePage.goToModelingScene()
const tutorialProjectIndicator = page
.getByTestId('project-sidebar-toggle')
.filter({ hasText: 'Tutorial Project 00' })
const tutorialModalText = page.getByText('Welcome to Modeling App!')
const tutorialDismissButton = page.getByRole('button', { name: 'Dismiss' })
const userMenuButton = page.getByTestId('user-sidebar-toggle')
const userMenuSettingsButton = page.getByRole('button', {
name: 'User settings',
})
const settingsHeading = page.getByRole('heading', {
name: 'Settings',
exact: true,
})
const restartOnboardingSettingsButton = page.getByRole('button', {
name: 'Replay onboarding',
})
// Test that the text in this step is correct
const avatarLocator = page.getByTestId('user-sidebar-toggle').locator('img')
const onboardingOverlayLocator = page
.getByTestId('onboarding-content')
.locator('div')
.nth(1)
await test.step('Navigate into project', async () => {
await expect(
page.getByRole('heading', { name: 'Your Projects' })
).toBeVisible()
await expect(projectCard).toBeVisible()
await projectCard.click()
await u.waitForPageLoad()
})
// Expect the avatar to be visible and for the text to reference it
await expect(avatarLocator).toBeVisible()
await expect(onboardingOverlayLocator).toBeVisible()
await expect(onboardingOverlayLocator).toContainText('your avatar')
await test.step('Restart the onboarding from help menu', async () => {
await helpMenuButton.click()
await restartOnboardingButton.click()
await nextButton.hover()
await nextButton.click()
})
await test.step('Confirm that the onboarding has restarted', async () => {
await expect(tutorialProjectIndicator).toBeVisible()
await expect(tutorialModalText).toBeVisible()
// Make sure the model loaded
const XYPlanePoint = { x: 988, y: 523 } as const
const modelColor: [number, number, number] = [76, 76, 76]
await page.mouse.move(XYPlanePoint.x, XYPlanePoint.y)
await expectPixelColor(page, modelColor, XYPlanePoint, 8)
await tutorialDismissButton.click()
// Make sure model still there.
await expectPixelColor(page, modelColor, XYPlanePoint, 8)
})
await test.step('Clear code and restart onboarding from settings', async () => {
await u.openKclCodePanel()
await expect(u.codeLocator).toContainText('// Shelf Bracket')
await u.codeLocator.selectText()
await u.codeLocator.fill('')
await test.step('Navigate to settings', async () => {
await userMenuButton.click()
await userMenuSettingsButton.click()
await expect(settingsHeading).toBeVisible()
await expect(restartOnboardingSettingsButton).toBeVisible()
// This is to force the avatar to 404.
// For our test image (only triggers locally. on CI, it's Kurt's /
// gravatar image )
await page.route('/cat.jpg', async (route) => {
await route.fulfill({
status: 404,
contentType: 'text/plain',
body: 'Not Found!',
})
await restartOnboardingSettingsButton.click()
// Since the code is empty, we should not see the confirmation dialog
await expect(nextButton).not.toBeVisible()
await expect(tutorialProjectIndicator).toBeVisible()
await expect(tutorialModalText).toBeVisible()
})
// 404 the CI avatar image
await page.route('https://lh3.googleusercontent.com/**', async (route) => {
await route.fulfill({
status: 404,
contentType: 'text/plain',
body: 'Not Found!',
})
})
await page.reload({ waitUntil: 'domcontentloaded' })
// Now expect the text to be different
await expect(avatarLocator).not.toBeVisible()
await expect(onboardingOverlayLocator).toBeVisible()
await expect(onboardingOverlayLocator).toContainText('the menu button')
})
test("Avatar text doesn't mention avatar when no avatar", async ({
context,
page,
homePage,
tronApp,
}) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
if (!tronApp) {
fail()
}
await tronApp.cleanProjectDir({
app: {
onboarding_status: '',
},
})
// Override beforeEach test setup
await context.addInitScript(
async ({ settingsKey, settings }) => {
localStorage.setItem(settingsKey, settings)
localStorage.setItem('FORCE_NO_IMAGE', 'FORCE_NO_IMAGE')
},
{
settingsKey: TEST_SETTINGS_KEY,
settings: settingsToToml({
settings: TEST_SETTINGS_ONBOARDING_USER_MENU,
}),
}
)
await page.setBodyDimensions({ width: 1200, height: 500 })
await homePage.goToModelingScene()
// Test that the text in this step is correct
const sidebar = page.getByTestId('user-sidebar-toggle')
const avatar = sidebar.locator('img')
const onboardingOverlayLocator = page
.getByTestId('onboarding-content')
.locator('div')
.nth(1)
// Expect the avatar to be visible and for the text to reference it
await expect(avatar).not.toBeVisible()
await expect(onboardingOverlayLocator).toBeVisible()
await expect(onboardingOverlayLocator).toContainText('the menu button')
// Test we mention what else is in this menu for https://github.com/KittyCAD/modeling-app/issues/2939
// which doesn't deserver its own full test spun up
const userMenuFeatures = [
'manage your account',
'report a bug',
'request a feature',
'sign out',
]
for (const feature of userMenuFeatures) {
await expect(onboardingOverlayLocator).toContainText(feature)
}
})
})
test('Restarting onboarding on desktop takes one attempt', async ({
context,
page,
tronApp,
}) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
if (!tronApp) {
fail()
}
)
await tronApp.cleanProjectDir({
app: {
onboarding_status: 'dismissed',
},
})
await context.folderSetupFn(async (dir) => {
const routerTemplateDir = join(dir, 'router-template-slate')
await fsp.mkdir(routerTemplateDir, { recursive: true })
await fsp.copyFile(
executorInputPath('router-template-slate.kcl'),
join(routerTemplateDir, 'main.kcl')
)
})
// Our constants
const u = await getUtils(page)
const projectCard = page.getByText('router-template-slate')
const helpMenuButton = page.getByRole('button', {
name: 'Help and resources',
})
const restartOnboardingButton = page.getByRole('button', {
name: 'Reset onboarding',
})
const nextButton = page.getByTestId('onboarding-next')
const tutorialProjectIndicator = page
.getByTestId('project-sidebar-toggle')
.filter({ hasText: 'Tutorial Project 00' })
const tutorialModalText = page.getByText('Welcome to Modeling App!')
const tutorialDismissButton = page.getByRole('button', { name: 'Dismiss' })
const userMenuButton = page.getByTestId('user-sidebar-toggle')
const userMenuSettingsButton = page.getByRole('button', {
name: 'User settings',
})
const settingsHeading = page.getByRole('heading', {
name: 'Settings',
exact: true,
})
const restartOnboardingSettingsButton = page.getByRole('button', {
name: 'Replay onboarding',
})
await test.step('Navigate into project', async () => {
await expect(
page.getByRole('heading', { name: 'Your Projects' })
).toBeVisible()
await expect(projectCard).toBeVisible()
await projectCard.click()
await u.waitForPageLoad()
})
await test.step('Restart the onboarding from help menu', async () => {
await helpMenuButton.click()
await restartOnboardingButton.click()
await nextButton.hover()
await nextButton.click()
})
await test.step('Confirm that the onboarding has restarted', async () => {
await expect(tutorialProjectIndicator).toBeVisible()
await expect(tutorialModalText).toBeVisible()
// Make sure the model loaded
const XYPlanePoint = { x: 988, y: 523 } as const
const modelColor: [number, number, number] = [76, 76, 76]
await page.mouse.move(XYPlanePoint.x, XYPlanePoint.y)
await expectPixelColor(page, modelColor, XYPlanePoint, 8)
await tutorialDismissButton.click()
// Make sure model still there.
await expectPixelColor(page, modelColor, XYPlanePoint, 8)
})
await test.step('Clear code and restart onboarding from settings', async () => {
await u.openKclCodePanel()
await expect(u.codeLocator).toContainText('// Shelf Bracket')
await u.codeLocator.selectText()
await u.codeLocator.fill('')
await test.step('Navigate to settings', async () => {
await userMenuButton.click()
await userMenuSettingsButton.click()
await expect(settingsHeading).toBeVisible()
await expect(restartOnboardingSettingsButton).toBeVisible()
})
await restartOnboardingSettingsButton.click()
// Since the code is empty, we should not see the confirmation dialog
await expect(nextButton).not.toBeVisible()
await expect(tutorialProjectIndicator).toBeVisible()
await expect(tutorialModalText).toBeVisible()
})
})

View File

@ -850,157 +850,160 @@ openSketch = startSketchOn('XY')
})
})
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 }
test(`Shift-click to select and deselect sketch segments`, async ({
page,
homePage,
scene,
editor,
}) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
// 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
)
// 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
// 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()
// 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
// Wait for the scene and stream to load
await scene.expectPixelColor(
backgroundColor,
secondPointLocation,
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(
backgroundColor,
secondPointLocation,
edgeColorBlue,
fristSegmentLocation,
tolerance
)
await scene.expectPixelColor(
edgeColorWhite,
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('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
)
})
})
})
test(`Offset plane point-and-click`, async ({
context,

View File

@ -1244,10 +1244,11 @@ test(
}
)
test.fixme(
test(
'Deleting projects, can delete individual project, can still create projects after deleting all',
{ tag: '@electron' },
async ({ context, page }, testInfo) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
const projectData = [
['router-template-slate', 'cylinder.kcl'],
['bracket', 'focusrite_scarlett_mounting_braket.kcl'],
@ -1466,10 +1467,11 @@ test(
}
)
test.fixme(
test(
'When the project folder is empty, user can create new project and open it.',
{ tag: '@electron' },
async ({ page }, testInfo) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
const u = await getUtils(page)
await page.setBodyDimensions({ width: 1200, height: 500 })
@ -2050,10 +2052,11 @@ test(
)
// Flaky
test.fixme(
test(
'Original project name persist after onboarding',
{ tag: '@electron' },
async ({ page }, testInfo) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
await page.setBodyDimensions({ width: 1200, height: 500 })
const getAllProjects = () => page.getByTestId('project-link').all()

View File

@ -196,60 +196,65 @@ test.describe('Prompt-to-edit tests', { tag: '@skipWin' }, () => {
})
})
test.fixme(
`manual code selection rename`,
async ({ context, homePage, cmdBar, editor, page, scene }) => {
const body1CapCoords = { x: 571, y: 311 }
test(`manual code selection rename`, async ({
context,
homePage,
cmdBar,
editor,
page,
scene,
}) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
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 expect(successToast).toBeVisible()
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 test.step('verify rename change and accept it', async () => {
await editor.expectEditor.toContain('mySketch001 = startSketchOn')
await editor.expectEditor.not.toContain('sketch002 = startSketchOn')
await editor.expectEditor.toContain(
'extrude002 = extrude(mySketch001, length = 50)'
)
await test.step('verify rename change and accept it', async () => {
await editor.expectEditor.toContain('mySketch001 = startSketchOn')
await editor.expectEditor.not.toContain('sketch002 = startSketchOn')
await editor.expectEditor.toContain(
'extrude002 = extrude(mySketch001, length = 50)'
)
await acceptBtn.click()
await expect(successToast).not.toBeVisible()
})
}
)
await acceptBtn.click()
await expect(successToast).not.toBeVisible()
})
})
test('multiple body selections', async ({
context,

View File

@ -483,10 +483,11 @@ extrude001 = extrude(sketch001, length = 50)
}
)
test.fixme(
test(
`Network health indicator only appears in modeling view`,
{ tag: '@electron' },
async ({ context, page }, testInfo) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
await context.folderSetupFn(async (dir) => {
const bracketDir = path.join(dir, 'bracket')
await fsp.mkdir(bracketDir, { recursive: true })

View File

@ -12,6 +12,7 @@ import {
} from './test-utils'
import { uuidv4, roundOff } from 'lib/utils'
import { SceneFixture } from './fixtures/sceneFixture'
import { ToolbarFixture } from './fixtures/toolbarFixture'
import { CmdBarFixture } from './fixtures/cmdBarFixture'
test.describe('Sketch tests', { tag: ['@skipWin'] }, () => {
@ -187,12 +188,14 @@ sketch001 = startProfileAt([12.34, -12.34], sketch002)
page.getByRole('button', { name: 'Start Sketch' })
).toBeVisible()
})
test.fixme('Can edit segments by dragging their handles', () => {
test('Can edit segments by dragging their handles', () => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
const doEditSegmentsByDraggingHandle = async (
page: Page,
homePage: HomePageFixture,
openPanes: string[],
scene: SceneFixture,
toolbar: ToolbarFixture,
cmdBar: CmdBarFixture
) => {
// Load the app with the code panes
@ -282,11 +285,7 @@ sketch001 = startProfileAt([12.34, -12.34], sketch002)
// Select the sketch
await page.mouse.click(700, 370)
}
await expect(
page.getByRole('button', { name: 'Edit Sketch' })
).toBeVisible()
await page.getByRole('button', { name: 'Edit Sketch' }).click()
await page.waitForTimeout(400)
await toolbar.editSketch()
if (openPanes.includes('code')) {
prevContent = await page.locator('.cm-content').innerText()
}
@ -417,7 +416,7 @@ sketch001 = startProfileAt([12.34, -12.34], sketch002)
test(
'code pane open at start-handles',
{ tag: ['@skipWin'] },
async ({ page, homePage, scene, cmdBar }) => {
async ({ page, homePage, scene, toolbar, cmdBar }) => {
// Load the app with the code panes
await page.addInitScript(async () => {
localStorage.setItem(
@ -435,6 +434,7 @@ sketch001 = startProfileAt([12.34, -12.34], sketch002)
homePage,
['code'],
scene,
toolbar,
cmdBar
)
}
@ -443,7 +443,7 @@ sketch001 = startProfileAt([12.34, -12.34], sketch002)
test(
'code pane closed at start-handles',
{ tag: ['@skipWin'] },
async ({ page, homePage, scene, cmdBar }) => {
async ({ page, homePage, scene, toolbar, cmdBar }) => {
// Load the app with the code panes
await page.addInitScript(async (persistModelingContext) => {
localStorage.setItem(
@ -451,7 +451,14 @@ sketch001 = startProfileAt([12.34, -12.34], sketch002)
JSON.stringify({ openPanes: [] })
)
}, PERSIST_MODELING_CONTEXT)
await doEditSegmentsByDraggingHandle(page, homePage, [], scene, cmdBar)
await doEditSegmentsByDraggingHandle(
page,
homePage,
[],
scene,
toolbar,
cmdBar
)
}
)
})
@ -1080,107 +1087,108 @@ profile001 = startProfileAt([${roundOff(scale * 69.6)}, ${roundOff(
)
})
// TODO: fix after electron migration is merged
test.fixme(
'empty-scene default-planes act as expected',
async ({ page, homePage }) => {
/**
* Tests the following things
* 1) The the planes are there on load because the scene is empty
* 2) The planes don't changes color when hovered initially
* 3) Putting something in the scene makes the planes hidden
* 4) Removing everything from the scene shows the plans again
* 3) Once "start sketch" is click, the planes do respond to hovers
* 4) Selecting a plan works as expected, i.e. sketch mode
* 5) Reloading the scene with something already in the scene means the planes are hidden
*/
test('empty-scene default-planes act as expected', async ({
page,
homePage,
}) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
/**
* Tests the following things
* 1) The the planes are there on load because the scene is empty
* 2) The planes don't changes color when hovered initially
* 3) Putting something in the scene makes the planes hidden
* 4) Removing everything from the scene shows the plans again
* 3) Once "start sketch" is click, the planes do respond to hovers
* 4) Selecting a plan works as expected, i.e. sketch mode
* 5) Reloading the scene with something already in the scene means the planes are hidden
*/
const u = await getUtils(page)
await homePage.goToModelingScene()
const u = await getUtils(page)
await homePage.goToModelingScene()
await u.openDebugPanel()
await u.expectCmdLog('[data-message-type="execution-done"]')
await u.closeDebugPanel()
await u.openDebugPanel()
await u.expectCmdLog('[data-message-type="execution-done"]')
await u.closeDebugPanel()
const XYPlanePoint = { x: 774, y: 116 } as const
const unHoveredColor: [number, number, number] = [47, 47, 93]
expect(
await u.getGreatestPixDiff(XYPlanePoint, unHoveredColor)
).toBeLessThan(8)
const XYPlanePoint = { x: 774, y: 116 } as const
const unHoveredColor: [number, number, number] = [47, 47, 93]
expect(
await u.getGreatestPixDiff(XYPlanePoint, unHoveredColor)
).toBeLessThan(8)
await page.mouse.move(XYPlanePoint.x, XYPlanePoint.y)
await page.waitForTimeout(200)
await page.mouse.move(XYPlanePoint.x, XYPlanePoint.y)
await page.waitForTimeout(200)
// color should not change for having been hovered
expect(
await u.getGreatestPixDiff(XYPlanePoint, unHoveredColor)
).toBeLessThan(8)
// color should not change for having been hovered
expect(
await u.getGreatestPixDiff(XYPlanePoint, unHoveredColor)
).toBeLessThan(8)
await u.openAndClearDebugPanel()
await u.openAndClearDebugPanel()
await u.codeLocator.fill(`sketch001 = startSketchOn('XY')
await u.codeLocator.fill(`sketch001 = startSketchOn('XY')
|> startProfileAt([-10, -10], %)
|> line(end = [20, 0])
|> line(end = [0, 20])
|> xLine(length = -20)
`)
await u.expectCmdLog('[data-message-type="execution-done"]')
await u.expectCmdLog('[data-message-type="execution-done"]')
const noPlanesColor: [number, number, number] = [30, 30, 30]
expect(
await u.getGreatestPixDiff(XYPlanePoint, noPlanesColor)
).toBeLessThan(3)
const noPlanesColor: [number, number, number] = [30, 30, 30]
expect(
await u.getGreatestPixDiff(XYPlanePoint, noPlanesColor)
).toBeLessThan(3)
await u.clearCommandLogs()
await u.removeCurrentCode()
await u.expectCmdLog('[data-message-type="execution-done"]')
await u.clearCommandLogs()
await u.removeCurrentCode()
await u.expectCmdLog('[data-message-type="execution-done"]')
await expect
.poll(() => u.getGreatestPixDiff(XYPlanePoint, unHoveredColor), {
timeout: 5_000,
})
.toBeLessThan(8)
await expect
.poll(() => u.getGreatestPixDiff(XYPlanePoint, unHoveredColor), {
timeout: 5_000,
})
.toBeLessThan(8)
// click start Sketch
await page.getByRole('button', { name: 'Start Sketch' }).click()
await page.mouse.move(XYPlanePoint.x, XYPlanePoint.y, { steps: 50 })
const hoveredColor: [number, number, number] = [93, 93, 127]
// now that we're expecting the user to select a plan, it does respond to hover
await expect
.poll(() => u.getGreatestPixDiff(XYPlanePoint, hoveredColor))
.toBeLessThan(8)
// click start Sketch
await page.getByRole('button', { name: 'Start Sketch' }).click()
await page.mouse.move(XYPlanePoint.x, XYPlanePoint.y, { steps: 50 })
const hoveredColor: [number, number, number] = [93, 93, 127]
// now that we're expecting the user to select a plan, it does respond to hover
await expect
.poll(() => u.getGreatestPixDiff(XYPlanePoint, hoveredColor))
.toBeLessThan(8)
await page.mouse.click(XYPlanePoint.x, XYPlanePoint.y)
await page.waitForTimeout(600)
await page.mouse.click(XYPlanePoint.x, XYPlanePoint.y)
await page.waitForTimeout(600)
await page.mouse.click(XYPlanePoint.x, XYPlanePoint.y)
await page.waitForTimeout(200)
await page.mouse.click(XYPlanePoint.x + 50, XYPlanePoint.y + 50)
await expect(u.codeLocator).toHaveText(`sketch001 = startSketchOn('XZ')
await page.mouse.click(XYPlanePoint.x, XYPlanePoint.y)
await page.waitForTimeout(200)
await page.mouse.click(XYPlanePoint.x + 50, XYPlanePoint.y + 50)
await expect(u.codeLocator).toHaveText(`sketch001 = startSketchOn('XZ')
|> startProfileAt([11.8, 9.09], %)
|> line(end = [3.39, -3.39])
`)
await page.addInitScript(async () => {
localStorage.setItem(
'persistCode',
`sketch001 = startSketchOn('XZ')
await page.addInitScript(async () => {
localStorage.setItem(
'persistCode',
`sketch001 = startSketchOn('XZ')
|> startProfileAt([11.8, 9.09], %)
|> line(end = [3.39, -3.39])
`
)
})
)
})
await u.openDebugPanel()
await u.expectCmdLog('[data-message-type="execution-done"]')
await u.closeDebugPanel()
await u.openDebugPanel()
await u.expectCmdLog('[data-message-type="execution-done"]')
await u.closeDebugPanel()
// expect there to be no planes on load since there's something in the scene
expect(
await u.getGreatestPixDiff(XYPlanePoint, noPlanesColor)
).toBeLessThan(3)
}
)
// expect there to be no planes on load since there's something in the scene
expect(
await u.getGreatestPixDiff(XYPlanePoint, noPlanesColor)
).toBeLessThan(3)
})
test('Can attempt to sketch on revolved face', async ({ page, homePage }) => {
const u = await getUtils(page)
@ -1454,10 +1462,11 @@ test.describe(`Sketching with offset planes`, () => {
})
test.describe('multi-profile sketching', () => {
test.fixme(
test(
`test it removes half-finished expressions when changing tools in sketch mode`,
{ tag: ['@skipWin'] },
async ({ context, page, scene, toolbar, editor, homePage, cmdBar }) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
// We seed the scene with a single offset plane
await context.addInitScript(() => {
localStorage.setItem(
@ -2545,7 +2554,7 @@ profile002 = startProfileAt([85.81, 52.55], sketch002)
const [startProfileAt] = scene.makeMouseHelpers(606, 184)
const [nextPoint] = scene.makeMouseHelpers(763, 130)
await page.getByText('startProfileAt([85.81, 52.55], sketch002)').click()
await toolbar.editSketch()
await toolbar.editSketch(1)
// timeout wait for engine animation is unavoidable
await page.waitForTimeout(600)
@ -2765,7 +2774,7 @@ extrude003 = extrude(profile011, length = 2.5)
await test.step(title, async () => {
await camPositionForSelectingSketchOnWallProfiles()
await selectClick()
await toolbar.editSketch()
await toolbar.editSketch(1)
await page.waitForTimeout(600)
await verifyWallProfilesAreDrawn()
await toolbar.exitSketchBtn.click()
@ -2846,13 +2855,18 @@ loft([profile001, profile002])
)
}
)
test.fixme(
'Can enter sketch loft edges offsetPlane and continue sketch',
async ({ scene, toolbar, editor, page, homePage }) => {
await page.addInitScript(async () => {
localStorage.setItem(
'persistCode',
`sketch001 = startSketchOn('XZ')
test('Can enter sketch loft edges offsetPlane and continue sketch', async ({
scene,
toolbar,
editor,
page,
homePage,
}) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
await page.addInitScript(async () => {
localStorage.setItem(
'persistCode',
`sketch001 = startSketchOn('XZ')
profile001 = startProfileAt([34, 42.66], sketch001)
|> line(end = [102.65, 151.99])
|> line(end = [76, -138.66])
@ -2868,51 +2882,50 @@ profile002 = startProfileAt([39.43, 172.21], sketch002)
loft([profile001, profile002])
`
)
})
await page.setBodyDimensions({ width: 1000, height: 500 })
await homePage.goToModelingScene()
await expect(
page.getByRole('button', { name: 'Start Sketch' })
).not.toBeDisabled()
const topProfileEdgeClickCoords = { x: 602, y: 185 } as const
const [topProfileEdgeClick] = scene.makeMouseHelpers(
topProfileEdgeClickCoords.x,
topProfileEdgeClickCoords.y
)
const [sideProfileEdgeClick] = scene.makeMouseHelpers(788, 188)
})
const [rect1Crn1] = scene.makeMouseHelpers(592, 283)
const [rect1Crn2] = scene.makeMouseHelpers(797, 268)
await page.setBodyDimensions({ width: 1000, height: 500 })
await homePage.goToModelingScene()
await expect(
page.getByRole('button', { name: 'Start Sketch' })
).not.toBeDisabled()
await scene.moveCameraTo(
{ x: 8171, y: -7740, z: 1624 },
{ x: 3302, y: -627, z: 2892 }
)
const topProfileEdgeClickCoords = { x: 602, y: 185 } as const
const [topProfileEdgeClick] = scene.makeMouseHelpers(
topProfileEdgeClickCoords.x,
topProfileEdgeClickCoords.y
)
const [sideProfileEdgeClick] = scene.makeMouseHelpers(788, 188)
await topProfileEdgeClick()
await page.waitForTimeout(300)
await toolbar.editSketch()
await page.waitForTimeout(600)
await sideProfileEdgeClick()
await page.waitForTimeout(300)
await scene.expectPixelColor(TEST_COLORS.BLUE, { x: 788, y: 188 }, 15)
const [rect1Crn1] = scene.makeMouseHelpers(592, 283)
const [rect1Crn2] = scene.makeMouseHelpers(797, 268)
await toolbar.rectangleBtn.click()
await page.waitForTimeout(100)
await rect1Crn1()
await editor.expectEditor.toContain(
`profile003 = startProfileAt([47.76, -17.13], plane001)`
)
await rect1Crn2()
await editor.expectEditor.toContain(
`angledLine([0, 106.42], %, $rectangleSegmentA001)`
)
await page.waitForTimeout(100)
}
)
await scene.moveCameraTo(
{ x: 8171, y: -7740, z: 1624 },
{ x: 3302, y: -627, z: 2892 }
)
await topProfileEdgeClick()
await page.waitForTimeout(300)
await toolbar.editSketch()
await page.waitForTimeout(600)
await sideProfileEdgeClick()
await page.waitForTimeout(300)
await scene.expectPixelColor(TEST_COLORS.BLUE, { x: 788, y: 188 }, 15)
await toolbar.rectangleBtn.click()
await page.waitForTimeout(100)
await rect1Crn1()
await editor.expectEditor.toContain(
`profile003 = startProfileAt([47.76, -17.13], plane001)`
)
await rect1Crn2()
await editor.expectEditor.toContain(
`angledLine([0, 106.42], %, $rectangleSegmentA001)`
)
await page.waitForTimeout(100)
})
})
// Regression test for https://github.com/KittyCAD/modeling-app/issues/4891

View File

@ -36,10 +36,11 @@ test.setTimeout(60_000)
// a snapshot of it feels weird. I'd rather our regular tests fail.
// The primary failure is doExport now relies on the filesystem. We can follow
// up with another PR if we want this back.
test.skip(
test(
'exports of each format should work',
{ tag: ['@snapshot', '@skipWin', '@skipMacos'] },
async ({ page, context, scene, cmdBar, tronApp }) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
if (!tronApp) {
fail()
}
@ -406,9 +407,6 @@ test(
'Draft segments should look right',
{ tag: '@snapshot' },
async ({ page, scene, toolbar }) => {
// FIXME: Skip on macos its being weird.
// test.skip(process.platform === 'darwin', 'Skip on macos')
const u = await getUtils(page)
await page.setViewportSize({ width: 1200, height: 500 })
const PUR = 400 / 37.5 //pixeltoUnitRatio
@ -585,9 +583,6 @@ test(
'Draft circle should look right',
{ tag: '@snapshot' },
async ({ page, context, cmdBar, scene }) => {
// FIXME: Skip on macos its being weird.
// test.skip(process.platform === 'darwin', 'Skip on macos')
const u = await getUtils(page)
await page.setViewportSize({ width: 1200, height: 500 })
const PUR = 400 / 37.5 //pixeltoUnitRatio
@ -952,9 +947,6 @@ test(
)
test.describe('Grid visibility', { tag: '@snapshot' }, () => {
// FIXME: Skip on macos its being weird.
// test.skip(process.platform === 'darwin', 'Skip on macos')
test('Grid turned off to on via command bar', async ({
page,
cmdBar,
@ -1097,7 +1089,8 @@ test.describe('Grid visibility', { tag: '@snapshot' }, () => {
})
})
test.fixme('theme persists', async ({ page, context }) => {
test('theme persists', async ({ page, context }) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
const u = await getUtils(page)
await context.addInitScript(async () => {
localStorage.setItem(

View File

@ -3,11 +3,12 @@ import { commonPoints, getUtils } from './test-utils'
import { EngineCommand } from 'lang/std/artifactGraph'
import { uuidv4 } from 'lib/utils'
test.fixme('Test network and connection issues', () => {
test.describe('Test network and connection issues', () => {
test(
'simulate network down and network little widget',
{ tag: '@skipLocalEngine' },
async ({ page, homePage }) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
const u = await getUtils(page)
await page.setBodyDimensions({ width: 1200, height: 500 })
@ -83,7 +84,8 @@ test.fixme('Test network and connection issues', () => {
test(
'Engine disconnect & reconnect in sketch mode',
{ tag: '@skipLocalEngine' },
async ({ page, homePage }) => {
async ({ page, homePage, toolbar }) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
const networkToggle = page.getByTestId('network-toggle')
const u = await getUtils(page)
@ -173,11 +175,7 @@ test.fixme('Test network and connection issues', () => {
.click()
// enter sketch again
await u.doAndWaitForCmd(
() => page.getByRole('button', { name: 'Edit Sketch' }).click(),
'default_camera_get_settings'
)
await page.waitForTimeout(150)
await toolbar.editSketch()
// Click the line tool
await page.getByRole('button', { name: 'line Line', exact: true }).click()
@ -201,6 +199,7 @@ test.fixme('Test network and connection issues', () => {
type: 'default_camera_get_settings',
},
}
await toolbar.openPane('debug')
await u.sendCustomCmd(camCommand)
await page.waitForTimeout(100)
await u.sendCustomCmd(updateCamCommand)

View File

@ -179,169 +179,170 @@ test.describe('Testing Camera Movement', { tag: ['@skipWin'] }, () => {
})
// TODO: fix after electron migration is merged
test.fixme(
'Zoom should be consistent when exiting or entering sketches',
async ({ page, homePage }) => {
// start new sketch pan and zoom before exiting, when exiting the sketch should stay in the same place
// than zoom and pan outside of sketch mode and enter again and it should not change from where it is
// than again for sketching
test('Zoom should be consistent when exiting or entering sketches', async ({
page,
homePage,
}) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
// start new sketch pan and zoom before exiting, when exiting the sketch should stay in the same place
// than zoom and pan outside of sketch mode and enter again and it should not change from where it is
// than again for sketching
const u = await getUtils(page)
await page.setBodyDimensions({ width: 1200, height: 500 })
const u = await getUtils(page)
await page.setBodyDimensions({ width: 1200, height: 500 })
await homePage.goToModelingScene()
await u.waitForPageLoad()
await u.openDebugPanel()
await homePage.goToModelingScene()
await u.waitForPageLoad()
await u.openDebugPanel()
await expect(
page.getByRole('button', { name: 'Start Sketch' })
).not.toBeDisabled()
await expect(
page.getByRole('button', { name: 'Start Sketch' })
).toBeVisible()
await expect(
page.getByRole('button', { name: 'Start Sketch' })
).not.toBeDisabled()
await expect(
page.getByRole('button', { name: 'Start Sketch' })
).toBeVisible()
// click on "Start Sketch" button
await u.clearCommandLogs()
await page.getByRole('button', { name: 'Start Sketch' }).click()
// click on "Start Sketch" button
await u.clearCommandLogs()
await page.getByRole('button', { name: 'Start Sketch' }).click()
await page.waitForTimeout(100)
// select a plane
await page.mouse.click(700, 325)
let code = `sketch001 = startSketchOn('XY')`
await expect(u.codeLocator).toHaveText(code)
await u.closeDebugPanel()
await page.waitForTimeout(500) // TODO detect animation ending, or disable animation
// move the camera slightly
await page.keyboard.down('Shift')
await page.mouse.move(700, 300)
await page.mouse.down({ button: 'right' })
await page.mouse.move(800, 200)
await page.mouse.up({ button: 'right' })
await page.keyboard.up('Shift')
let y = 350,
x = 948
await u.canvasLocator.click({ position: { x: 783, y } })
code += `\n |> startProfileAt([8.12, -12.98], %)`
// await expect(u.codeLocator).toHaveText(code)
await u.canvasLocator.click({ position: { x, y } })
code += `\n |> line(end = [11.18, 0])`
// await expect(u.codeLocator).toHaveText(code)
await u.canvasLocator.click({ position: { x, y: 275 } })
code += `\n |> line(end = [0, 6.99])`
// await expect(u.codeLocator).toHaveText(code)
// click the line button
await page.getByRole('button', { name: 'line Line', exact: true }).click()
const hoverOverNothing = async () => {
// await u.canvasLocator.hover({position: {x: 700, y: 325}})
await page.mouse.move(700, 325)
await page.waitForTimeout(100)
// select a plane
await page.mouse.click(700, 325)
let code = `sketch001 = startSketchOn('XY')`
await expect(u.codeLocator).toHaveText(code)
await u.closeDebugPanel()
await page.waitForTimeout(500) // TODO detect animation ending, or disable animation
// move the camera slightly
await page.keyboard.down('Shift')
await page.mouse.move(700, 300)
await page.mouse.down({ button: 'right' })
await page.mouse.move(800, 200)
await page.mouse.up({ button: 'right' })
await page.keyboard.up('Shift')
let y = 350,
x = 948
await u.canvasLocator.click({ position: { x: 783, y } })
code += `\n |> startProfileAt([8.12, -12.98], %)`
// await expect(u.codeLocator).toHaveText(code)
await u.canvasLocator.click({ position: { x, y } })
code += `\n |> line(end = [11.18, 0])`
// await expect(u.codeLocator).toHaveText(code)
await u.canvasLocator.click({ position: { x, y: 275 } })
code += `\n |> line(end = [0, 6.99])`
// await expect(u.codeLocator).toHaveText(code)
// click the line button
await page.getByRole('button', { name: 'line Line', exact: true }).click()
const hoverOverNothing = async () => {
// await u.canvasLocator.hover({position: {x: 700, y: 325}})
await page.mouse.move(700, 325)
await page.waitForTimeout(100)
await expect(page.getByTestId('hover-highlight')).not.toBeVisible({
timeout: 10_000,
})
}
await expect(page.getByTestId('hover-highlight')).not.toBeVisible()
await page.waitForTimeout(200)
// hover over horizontal line
await u.canvasLocator.hover({ position: { x: 800, y } })
await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
timeout: 10_000,
})
await page.waitForTimeout(200)
await hoverOverNothing()
await page.waitForTimeout(200)
// hover over vertical line
await u.canvasLocator.hover({ position: { x, y: 325 } })
await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
timeout: 10_000,
})
await hoverOverNothing()
// click exit sketch
await page.getByRole('button', { name: 'Exit Sketch' }).click()
await page.waitForTimeout(400)
await hoverOverNothing()
await page.waitForTimeout(200)
// hover over horizontal line
await page.mouse.move(858, y, { steps: 5 })
await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
timeout: 10_000,
})
await hoverOverNothing()
// hover over vertical line
await page.mouse.move(x, 325)
await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
timeout: 10_000,
})
await hoverOverNothing()
// hover over vertical line
await page.mouse.move(857, y)
await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
timeout: 10_000,
})
// now click it
await page.mouse.click(857, y)
await expect(
page.getByRole('button', { name: 'Edit Sketch' })
).toBeVisible()
await hoverOverNothing()
await page.getByRole('button', { name: 'Edit Sketch' }).click()
await page.waitForTimeout(400)
x = 975
y = 468
await page.waitForTimeout(100)
await page.mouse.move(x, 419, { steps: 5 })
await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
timeout: 10_000,
})
await hoverOverNothing()
await page.mouse.move(855, y)
await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
timeout: 10_000,
})
await hoverOverNothing()
await page.getByRole('button', { name: 'Exit Sketch' }).click()
await page.waitForTimeout(200)
await hoverOverNothing()
await page.waitForTimeout(200)
await page.mouse.move(x, 419)
await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
timeout: 10_000,
})
await hoverOverNothing()
await page.mouse.move(855, y)
await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
await expect(page.getByTestId('hover-highlight')).not.toBeVisible({
timeout: 10_000,
})
}
)
await expect(page.getByTestId('hover-highlight')).not.toBeVisible()
await page.waitForTimeout(200)
// hover over horizontal line
await u.canvasLocator.hover({ position: { x: 800, y } })
await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
timeout: 10_000,
})
await page.waitForTimeout(200)
await hoverOverNothing()
await page.waitForTimeout(200)
// hover over vertical line
await u.canvasLocator.hover({ position: { x, y: 325 } })
await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
timeout: 10_000,
})
await hoverOverNothing()
// click exit sketch
await page.getByRole('button', { name: 'Exit Sketch' }).click()
await page.waitForTimeout(400)
await hoverOverNothing()
await page.waitForTimeout(200)
// hover over horizontal line
await page.mouse.move(858, y, { steps: 5 })
await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
timeout: 10_000,
})
await hoverOverNothing()
// hover over vertical line
await page.mouse.move(x, 325)
await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
timeout: 10_000,
})
await hoverOverNothing()
// hover over vertical line
await page.mouse.move(857, y)
await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
timeout: 10_000,
})
// now click it
await page.mouse.click(857, y)
await expect(
page.getByRole('button', { name: 'Edit Sketch' })
).toBeVisible()
await hoverOverNothing()
await page.getByRole('button', { name: 'Edit Sketch' }).click()
await page.waitForTimeout(400)
x = 975
y = 468
await page.waitForTimeout(100)
await page.mouse.move(x, 419, { steps: 5 })
await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
timeout: 10_000,
})
await hoverOverNothing()
await page.mouse.move(855, y)
await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
timeout: 10_000,
})
await hoverOverNothing()
await page.getByRole('button', { name: 'Exit Sketch' }).click()
await page.waitForTimeout(200)
await hoverOverNothing()
await page.waitForTimeout(200)
await page.mouse.move(x, 419)
await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
timeout: 10_000,
})
await hoverOverNothing()
await page.mouse.move(855, y)
await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
timeout: 10_000,
})
})
test(`Zoom by scroll should not fire while orbiting`, async ({
homePage,

View File

@ -1005,114 +1005,108 @@ part002 = startSketchOn('XZ')
}
})
test.fixme(
'Horizontally constrained line remains selected after applying constraint',
async ({ page, homePage }) => {
test.setTimeout(70_000)
await page.addInitScript(async () => {
localStorage.setItem(
'persistCode',
`sketch001 = startSketchOn('XY')
test('Horizontally constrained line remains selected after applying constraint', async ({
page,
homePage,
}) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
test.setTimeout(70_000)
await page.addInitScript(async () => {
localStorage.setItem(
'persistCode',
`sketch001 = startSketchOn('XY')
|> startProfileAt([-1.05, -1.07], %)
|> line(end = [3.79, 2.68], tag = $seg01)
|> line(end = [3.13, -2.4])`
)
)
})
const u = await getUtils(page)
await page.setBodyDimensions({ width: 1200, height: 500 })
await homePage.goToModelingScene()
await u.waitForPageLoad()
await page.getByText('line(end = [3.79, 2.68], tag = $seg01)').click()
await expect(page.getByRole('button', { name: 'Edit Sketch' })).toBeEnabled(
{ timeout: 10_000 }
)
await page.getByRole('button', { name: 'Edit Sketch' }).click()
// Wait for overlays to populate
await page.waitForTimeout(1000)
await page.waitForTimeout(100)
const lineBefore = await u.getSegmentBodyCoords(
`[data-overlay-index="1"]`,
0
)
expect(
await u.getGreatestPixDiff(lineBefore, TEST_COLORS.WHITE)
).toBeLessThan(3)
await page.mouse.move(lineBefore.x, lineBefore.y)
await page.waitForTimeout(50)
await page.mouse.click(lineBefore.x, lineBefore.y)
expect(
await u.getGreatestPixDiff(lineBefore, TEST_COLORS.BLUE)
).toBeLessThan(3)
await page
.getByRole('button', {
name: 'Length: open menu',
})
const u = await getUtils(page)
await page.setBodyDimensions({ width: 1200, height: 500 })
.click()
await page.waitForTimeout(500)
await page.getByRole('button', { name: 'Horizontal', exact: true }).click()
await page.waitForTimeout(500)
await homePage.goToModelingScene()
await u.waitForPageLoad()
await pollEditorLinesSelectedLength(page, 1)
let activeLinesContent = await page.locator('.cm-activeLine').all()
await expect(activeLinesContent[0]).toHaveText(`|> xLine(length = 3.13)`)
await page.getByText('line(end = [3.79, 2.68], tag = $seg01)').click()
await expect(
page.getByRole('button', { name: 'Edit Sketch' })
).toBeEnabled({ timeout: 10_000 })
await page.getByRole('button', { name: 'Edit Sketch' }).click()
// Wait for code editor to settle.
await page.waitForTimeout(2000)
// Wait for overlays to populate
await page.waitForTimeout(1000)
// If the overlay-angle is updated the THREE.js scene is in a good state
await expect(
await page.locator('[data-overlay-index="1"]')
).toHaveAttribute('data-overlay-angle', '0')
await page.waitForTimeout(100)
const lineBefore = await u.getSegmentBodyCoords(
`[data-overlay-index="1"]`,
0
)
expect(
await u.getGreatestPixDiff(lineBefore, TEST_COLORS.WHITE)
).toBeLessThan(3)
await page.mouse.move(lineBefore.x, lineBefore.y)
await page.waitForTimeout(50)
await page.mouse.click(lineBefore.x, lineBefore.y)
expect(
await u.getGreatestPixDiff(lineBefore, TEST_COLORS.BLUE)
).toBeLessThan(3)
const lineAfter = await u.getSegmentBodyCoords(
`[data-overlay-index="1"]`,
0
)
await page
.getByRole('button', {
name: 'Length: open menu',
})
.click()
await page.waitForTimeout(500)
await page
.getByRole('button', { name: 'Horizontal', exact: true })
.click()
await page.waitForTimeout(500)
const linebb = await u.getBoundingBox('[data-overlay-index="1"]')
await page.mouse.move(linebb.x, linebb.y, { steps: 25 })
await page.mouse.click(linebb.x, linebb.y)
await pollEditorLinesSelectedLength(page, 1)
let activeLinesContent = await page.locator('.cm-activeLine').all()
await expect(activeLinesContent[0]).toHaveText(`|> xLine(length = 3.13)`)
await expect
.poll(async () => await u.getGreatestPixDiff(lineAfter, TEST_COLORS.BLUE))
.toBeLessThan(3)
// Wait for code editor to settle.
await page.waitForTimeout(2000)
await page.waitForTimeout(500)
// If the overlay-angle is updated the THREE.js scene is in a good state
await expect(
await page.locator('[data-overlay-index="1"]')
).toHaveAttribute('data-overlay-angle', '0')
// await expect(page.getByRole('button', { name: 'length', exact: true })).toBeVisible()
await page.waitForTimeout(200)
// await page.getByRole('button', { name: 'length', exact: true }).click()
await page.getByTestId('constraint-length').click()
const lineAfter = await u.getSegmentBodyCoords(
`[data-overlay-index="1"]`,
0
)
await page.getByTestId('cmd-bar-arg-value').getByRole('textbox').fill('10')
await page
.getByRole('button', {
name: 'arrow right Continue',
})
.click()
const linebb = await u.getBoundingBox('[data-overlay-index="1"]')
await page.mouse.move(linebb.x, linebb.y, { steps: 25 })
await page.mouse.click(linebb.x, linebb.y)
await pollEditorLinesSelectedLength(page, 1)
activeLinesContent = await page.locator('.cm-activeLine').all()
await expect(activeLinesContent[0]).toHaveText(
`|> xLine(length = length001)`
)
await expect
.poll(
async () => await u.getGreatestPixDiff(lineAfter, TEST_COLORS.BLUE)
)
.toBeLessThan(3)
await page.waitForTimeout(500)
// await expect(page.getByRole('button', { name: 'length', exact: true })).toBeVisible()
await page.waitForTimeout(200)
// await page.getByRole('button', { name: 'length', exact: true }).click()
await page.getByTestId('constraint-length').click()
await page
.getByTestId('cmd-bar-arg-value')
.getByRole('textbox')
.fill('10')
await page
.getByRole('button', {
name: 'arrow right Continue',
})
.click()
await pollEditorLinesSelectedLength(page, 1)
activeLinesContent = await page.locator('.cm-activeLine').all()
await expect(activeLinesContent[0]).toHaveText(
`|> xLine(length = length001)`
)
// checking the count of the overlays is a good proxy check that the client sketch scene is in a good state
await expect(page.getByTestId('segment-overlay')).toHaveCount(2)
}
)
// checking the count of the overlays is a good proxy check that the client sketch scene is in a good state
await expect(page.getByTestId('segment-overlay')).toHaveCount(2)
})
})
test.describe('Electron constraint tests', () => {
test(

View File

@ -316,14 +316,11 @@ test.describe(`Testing gizmo, fixture-based`, () => {
})
await test.step(`Gizmo should be disabled when in sketch mode`, async () => {
const sketchModeButton = page.getByRole('button', {
name: 'Edit sketch',
})
const exitSketchButton = page.getByRole('button', {
name: 'Exit sketch',
})
await sketchModeButton.click()
await toolbar.editSketch()
await expect(exitSketchButton).toBeVisible()
const gizmoPopoverButton = page.getByRole('button', {
name: 'view settings',

View File

@ -2,7 +2,8 @@ import { test, expect } from './zoo-test'
import { getUtils } from './test-utils'
test.describe('Test toggling perspective', () => {
test.fixme('via command palette and toggle', async ({ page, homePage }) => {
test('via command palette and toggle', async ({ page, homePage }) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
const u = await getUtils(page)
// Locators and constants

File diff suppressed because it is too large Load Diff

View File

@ -10,6 +10,7 @@ test.describe('Testing selections', { tag: ['@skipWin'] }, () => {
test('Selections work on fresh and edited sketch', async ({
page,
homePage,
toolbar,
}) => {
// tests mapping works on fresh sketch and edited sketch
// tests using hovers which is the same as selections, because if
@ -216,12 +217,7 @@ test.describe('Testing selections', { tag: ['@skipWin'] }, () => {
await emptySpaceHover()
// enter sketch again
await u.doAndWaitForCmd(
() => page.getByRole('button', { name: 'Edit Sketch' }).click(),
'default_camera_get_settings'
)
await page.waitForTimeout(450) // wait for animation
await toolbar.editSketch()
await u.openAndClearDebugPanel()
await u.sendCustomCmd({
@ -452,15 +448,20 @@ profile003 = startProfileAt([40.16, -120.48], sketch006)
await page.waitForTimeout(200)
await expect(u.codeLocator).not.toContainText(codeToBeDeletedSnippet)
})
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')
test('parent Solid should be select and deletable and uses custom planes to position children', async ({
page,
homePage,
scene,
cmdBar,
editor,
}) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
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)
@ -491,35 +492,34 @@ 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])'
)
await u.openAndClearDebugPanel()
await page.keyboard.press('Delete')
await u.expectCmdLog('[data-message-type="execution-done"]', 10_000)
await page.waitForTimeout(200)
}, KCL_DEFAULT_LENGTH)
await page.setBodyDimensions({ width: 1000, height: 500 })
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 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()
})
test('Hovering over 3d features highlights code, clicking puts the cursor in the right place and sends selection id to engine', async ({
page,
homePage,

View File

@ -55,91 +55,87 @@ test.describe('Testing settings', () => {
})
// The behavior is actually broken. Parent always takes precedence
test.fixme(
'Project settings can be set and override user settings',
async ({ page, homePage }) => {
const u = await getUtils(page)
await test.step(`Setup`, async () => {
await page.setBodyDimensions({ width: 1200, height: 500 })
await homePage.goToModelingScene()
await page
.getByRole('button', { name: 'Start Sketch' })
.waitFor({ state: 'visible' })
})
// Selectors and constants
const paneButtonLocator = page.getByTestId('debug-pane-button')
const headingLocator = page.getByRole('heading', {
name: 'Settings',
exact: true,
})
const inputLocator = page.locator('input[name="app-showDebugPanel"]')
await test.step('Open settings dialog and set "Show debug panel" to on', async () => {
await page.keyboard.press('ControlOrMeta+,')
await expect(headingLocator).toBeVisible()
/** Test to close https://github.com/KittyCAD/modeling-app/issues/2713 */
await test.step(`Confirm that this dialog has a solid background`, async () => {
await expect
.poll(
() => u.getGreatestPixDiff({ x: 600, y: 250 }, [28, 28, 28]),
{
timeout: 1000,
message:
'Checking for solid background, should not see default plane colors',
}
)
.toBeLessThan(15)
})
await page.locator('#showDebugPanel').getByText('OffOn').click()
})
// Close it and open again with keyboard shortcut, while KCL editor is focused
// Put the cursor in the editor
await test.step('Open settings with keyboard shortcut', async () => {
await page.getByTestId('settings-close-button').click()
await page.locator('.cm-content').click()
await page.keyboard.press('ControlOrMeta+,')
await expect(headingLocator).toBeVisible()
})
// Verify the toast appeared
await expect(
page.getByText(`Set show debug panel to "false" for this project`)
).toBeVisible()
await expect(
page.getByText(`Set show debug panel to "false" for this project`)
).not.toBeVisible()
// Check that the debug panel button is gone
await expect(paneButtonLocator).not.toBeVisible()
// Check that the user setting was not changed
await page.getByRole('radio', { name: 'User' }).click()
await expect(inputLocator).toBeChecked()
// Roll back to default of "off"
await await page
.getByText(
'show debug panelRoll back show debug panelRoll back to match'
)
.hover()
test('Project settings can be set and override user settings', async ({
page,
homePage,
}) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
const u = await getUtils(page)
await test.step(`Setup`, async () => {
await page.setBodyDimensions({ width: 1200, height: 500 })
await homePage.goToModelingScene()
await page
.getByRole('button', {
name: 'Roll back show debug panel',
})
.click()
await expect(inputLocator).not.toBeChecked()
.getByRole('button', { name: 'Start Sketch' })
.waitFor({ state: 'visible' })
})
// Check that the project setting did not change
await page.getByRole('radio', { name: 'Project' }).click()
await expect(
page.locator('input[name="app-showDebugPanel"]')
).not.toBeChecked()
}
)
// Selectors and constants
const paneButtonLocator = page.getByTestId('debug-pane-button')
const headingLocator = page.getByRole('heading', {
name: 'Settings',
exact: true,
})
const inputLocator = page.locator('input[name="app-showDebugPanel"]')
await test.step('Open settings dialog and set "Show debug panel" to on', async () => {
await page.keyboard.press('ControlOrMeta+,')
await expect(headingLocator).toBeVisible()
/** Test to close https://github.com/KittyCAD/modeling-app/issues/2713 */
await test.step(`Confirm that this dialog has a solid background`, async () => {
await expect
.poll(() => u.getGreatestPixDiff({ x: 600, y: 250 }, [28, 28, 28]), {
timeout: 1000,
message:
'Checking for solid background, should not see default plane colors',
})
.toBeLessThan(15)
})
await page.locator('#showDebugPanel').getByText('OffOn').click()
})
// Close it and open again with keyboard shortcut, while KCL editor is focused
// Put the cursor in the editor
await test.step('Open settings with keyboard shortcut', async () => {
await page.getByTestId('settings-close-button').click()
await page.locator('.cm-content').click()
await page.keyboard.press('ControlOrMeta+,')
await expect(headingLocator).toBeVisible()
})
// Verify the toast appeared
await expect(
page.getByText(`Set show debug panel to "false" for this project`)
).toBeVisible()
await expect(
page.getByText(`Set show debug panel to "false" for this project`)
).not.toBeVisible()
// Check that the debug panel button is gone
await expect(paneButtonLocator).not.toBeVisible()
// Check that the user setting was not changed
await page.getByRole('radio', { name: 'User' }).click()
await expect(inputLocator).toBeChecked()
// Roll back to default of "off"
await await page
.getByText('show debug panelRoll back show debug panelRoll back to match')
.hover()
await page
.getByRole('button', {
name: 'Roll back show debug panel',
})
.click()
await expect(inputLocator).not.toBeChecked()
// Check that the project setting did not change
await page.getByRole('radio', { name: 'Project' }).click()
await expect(
page.locator('input[name="app-showDebugPanel"]')
).not.toBeChecked()
})
test('Keybindings display the correct hotkey for Command Palette', async ({
page,
@ -175,103 +171,98 @@ test.describe('Testing settings', () => {
await expect(hotkey).toHaveText(text)
})
test.fixme(
'Project and user settings can be reset',
async ({ page, homePage }) => {
const u = await getUtils(page)
await test.step(`Setup`, async () => {
await page.setBodyDimensions({ width: 1200, height: 500 })
await homePage.goToModelingScene()
await u.waitForPageLoad()
await page.waitForTimeout(1000)
})
// Selectors and constants
const projectSettingsTab = page.getByRole('radio', { name: 'Project' })
const userSettingsTab = page.getByRole('radio', { name: 'User' })
const resetButton = (level: SettingsLevel) =>
page.getByRole('button', {
name: `Reset ${level}-level settings`,
})
const themeColorSetting = page.locator('#themeColor').getByRole('slider')
const settingValues = {
default: '259',
user: '120',
project: '50',
}
const resetToast = (level: SettingsLevel) =>
page.getByText(`${level}-level settings were reset`)
await test.step(`Open the settings modal`, async () => {
await page.getByRole('link', { name: 'Settings' }).last().click()
await expect(
page.getByRole('heading', { name: 'Settings', exact: true })
).toBeVisible()
})
await test.step('Set up theme color', async () => {
// Verify we're looking at the project-level settings,
// and it's set to default value
await expect(projectSettingsTab).toBeChecked()
await expect(themeColorSetting).toHaveValue(settingValues.default)
// Set project-level value to 50
await themeColorSetting.fill(settingValues.project)
// Set user-level value to 120
await userSettingsTab.click()
await themeColorSetting.fill(settingValues.user)
await projectSettingsTab.click()
})
await test.step('Reset project settings', async () => {
// Click the reset settings button.
await resetButton('project').click()
await expect(resetToast('project')).toBeVisible()
await expect(resetToast('project')).not.toBeVisible()
// Verify it is now set to the inherited user value
await expect(themeColorSetting).toHaveValue(settingValues.user)
await test.step(`Check that the user settings did not change`, async () => {
await userSettingsTab.click()
await expect(themeColorSetting).toHaveValue(settingValues.user)
})
await test.step(`Set project-level again to test the user-level reset`, async () => {
await projectSettingsTab.click()
await themeColorSetting.fill(settingValues.project)
await userSettingsTab.click()
})
})
await test.step('Reset user settings', async () => {
// Click the reset settings button.
await resetButton('user').click()
await expect(resetToast('user')).toBeVisible()
await expect(resetToast('user')).not.toBeVisible()
// Verify it is now set to the default value
await expect(themeColorSetting).toHaveValue(settingValues.default)
await test.step(`Check that the project settings did not change`, async () => {
await projectSettingsTab.click()
await expect(themeColorSetting).toHaveValue(settingValues.project)
})
test('Project and user settings can be reset', async ({ page, homePage }) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
const u = await getUtils(page)
await test.step(`Setup`, async () => {
await page.setBodyDimensions({ width: 1200, height: 500 })
await homePage.goToModelingScene()
await u.waitForPageLoad()
await page.waitForTimeout(1000)
})
// Selectors and constants
const projectSettingsTab = page.getByRole('radio', { name: 'Project' })
const userSettingsTab = page.getByRole('radio', { name: 'User' })
const resetButton = (level: SettingsLevel) =>
page.getByRole('button', {
name: `Reset ${level}-level settings`,
})
const themeColorSetting = page.locator('#themeColor').getByRole('slider')
const settingValues = {
default: '259',
user: '120',
project: '50',
}
)
const resetToast = (level: SettingsLevel) =>
page.getByText(`${level}-level settings were reset`)
test.fixme(
await test.step(`Open the settings modal`, async () => {
await page.getByRole('link', { name: 'Settings' }).last().click()
await expect(
page.getByRole('heading', { name: 'Settings', exact: true })
).toBeVisible()
})
await test.step('Set up theme color', async () => {
// Verify we're looking at the project-level settings,
// and it's set to default value
await expect(projectSettingsTab).toBeChecked()
await expect(themeColorSetting).toHaveValue(settingValues.default)
// Set project-level value to 50
await themeColorSetting.fill(settingValues.project)
// Set user-level value to 120
await userSettingsTab.click()
await themeColorSetting.fill(settingValues.user)
await projectSettingsTab.click()
})
await test.step('Reset project settings', async () => {
// Click the reset settings button.
await resetButton('project').click()
await expect(resetToast('project')).toBeVisible()
await expect(resetToast('project')).not.toBeVisible()
// Verify it is now set to the inherited user value
await expect(themeColorSetting).toHaveValue(settingValues.user)
await test.step(`Check that the user settings did not change`, async () => {
await userSettingsTab.click()
await expect(themeColorSetting).toHaveValue(settingValues.user)
})
await test.step(`Set project-level again to test the user-level reset`, async () => {
await projectSettingsTab.click()
await themeColorSetting.fill(settingValues.project)
await userSettingsTab.click()
})
})
await test.step('Reset user settings', async () => {
// Click the reset settings button.
await resetButton('user').click()
await expect(resetToast('user')).toBeVisible()
await expect(resetToast('user')).not.toBeVisible()
// Verify it is now set to the default value
await expect(themeColorSetting).toHaveValue(settingValues.default)
await test.step(`Check that the project settings did not change`, async () => {
await projectSettingsTab.click()
await expect(themeColorSetting).toHaveValue(settingValues.project)
})
})
})
test(
`Project settings override user settings on desktop`,
{ tag: ['@electron', '@skipWin'] },
async ({ context, page }, testInfo) => {
test.skip(
process.platform === 'win32',
'TODO: remove this skip https://github.com/KittyCAD/modeling-app/issues/3557'
)
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
const projectName = 'bracket'
const { dir: projectDirName } = await context.folderSetupFn(
async (dir) => {
@ -407,12 +398,13 @@ test.describe('Testing settings', () => {
)
// It was much easier to test the logo color than the background stream color.
test.fixme(
test(
'user settings reload on external change, on project and modeling view',
{
tag: '@electron',
},
async ({ context, page, tronApp }, testInfo) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
if (!tronApp) {
fail()
}
@ -466,10 +458,11 @@ test.describe('Testing settings', () => {
}
)
test.fixme(
test(
'project settings reload on external change',
{ tag: '@electron' },
async ({ context, page }, testInfo) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
const { dir: projectDirName } = await context.folderSetupFn(
async () => {}
)
@ -724,7 +717,14 @@ test.describe('Testing settings', () => {
})
})
test('Changing theme in sketch mode', async ({ context, page, homePage }) => {
test('Changing theme in sketch mode', async ({
context,
page,
homePage,
toolbar,
scene,
cmdBar,
}) => {
// TODO: fix this test on windows after the electron migration
test.skip(process.platform === 'win32', 'Skip on windows')
const u = await getUtils(page)
@ -744,11 +744,10 @@ test.describe('Testing settings', () => {
})
await page.setBodyDimensions({ width: 1200, height: 500 })
await homePage.goToModelingScene()
await u.waitForPageLoad()
await scene.settled(cmdBar)
await page.waitForTimeout(1000)
// Selectors and constants
const editSketchButton = page.getByRole('button', { name: 'Edit Sketch' })
const lineToolButton = page.getByTestId('line')
const segmentOverlays = page.getByTestId('segment-overlay')
const sketchOriginLocation = { x: 600, y: 250 }
@ -757,8 +756,7 @@ test.describe('Testing settings', () => {
await test.step(`Get into sketch mode`, async () => {
await page.mouse.click(700, 200)
await expect(editSketchButton).toBeVisible()
await editSketchButton.click()
await toolbar.editSketch()
// We use the line tool as a proxy for sketch mode
await expect(lineToolButton).toBeVisible()
@ -977,63 +975,68 @@ fn cube`
/**
* This test assumes that the default value of the "highlight edges" setting is "on".
*/
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')
)
})
test(`Toggle stream settings multiple times`, async ({
page,
scene,
homePage,
context,
toolbar,
cmdBar,
}, testInfo) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
await context.folderSetupFn(async (dir) => {
const projectDir = join(dir, 'project-000')
await fsp.mkdir(projectDir, { recursive: true })
await fsp.copyFile(
executorInputPath('cube.kcl'),
join(projectDir, 'main.kcl')
)
})
await test.step(`First snapshot`, async () => {
await homePage.openProject('project-000')
await toolbar.closePane('code')
await expect(toolbar.startSketchBtn).toBeEnabled({ timeout: 20_000 })
await scene.clickNoWhere()
})
await test.step(`First snapshot`, async () => {
await homePage.openProject('project-000')
await toolbar.closePane('code')
await expect(toolbar.startSketchBtn).toBeEnabled({ timeout: 20_000 })
await scene.clickNoWhere()
})
const toast = (value: boolean) =>
page.getByText(
`Set highlight edges to "${String(value)}" as a user default`
)
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')],
}
const toast = (value: boolean) =>
page.getByText(
`Set highlight edges to "${String(value)}" as a user default`
)
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 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).toHaveScreenshot(
'toggle-settings-initial.png',
{
maxDiffPixels: 15,
mask: [page.getByTestId('model-state-indicator')],
}
)
}
)
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')],
}
)
})
})

View File

@ -431,10 +431,11 @@ test.describe('Text-to-CAD tests', { tag: ['@skipWin'] }, () => {
})
// This will be fine once greg makes prompt at top of file deterministic
test.fixme(
test(
'can do many at once and get many prompts back, and interact with many',
{ tag: ['@skipWin'] },
async ({ page, homePage }) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
// Let this test run longer since we've seen it timeout.
test.setTimeout(180_000)
@ -619,10 +620,11 @@ async function sendPromptFromCommandBar(page: Page, promptStr: string) {
})
}
test.fixme(
test(
'Text-to-CAD functionality',
{ tag: '@electron' },
async ({ context, page }, testInfo) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
const projectName = 'project-000'
const prompt = 'lego 2x4'
const textToCadFileName = 'lego-2x4.kcl'

View File

@ -2,7 +2,8 @@ import { test, expect } from './zoo-test'
import { doExport, getUtils, makeTemplate } from './test-utils'
test.fixme('Units menu', async ({ page, homePage }) => {
test('Units menu', async ({ page, homePage }) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
await page.setBodyDimensions({ width: 1200, height: 500 })
await homePage.goToModelingScene()
@ -263,186 +264,187 @@ test('First escape in tool pops you out of tool, second exits sketch mode', asyn
).not.toBeVisible()
})
test.fixme(
'Basic default modeling and sketch hotkeys work',
async ({ page, homePage }) => {
const u = await getUtils(page)
test('Basic default modeling and sketch hotkeys work', async ({
page,
homePage,
}) => {
test.fixme(process.env.GITHUB_HEAD_REF !== 'all-e2e')
const u = await getUtils(page)
// This test can run long if it takes a little too long to load
// the engine.
test.setTimeout(90000)
// This test has a weird bug on ubuntu
// Funny, it's flaking on Windows too :). I think there is just something
// actually wrong.
test.skip(
process.platform === 'linux',
'weird playwright bug on ubuntu https://github.com/KittyCAD/modeling-app/issues/2444'
)
// Load the app with the code pane open
// This test can run long if it takes a little too long to load
// the engine.
test.setTimeout(90000)
// This test has a weird bug on ubuntu
// Funny, it's flaking on Windows too :). I think there is just something
// actually wrong.
test.skip(
process.platform === 'linux',
'weird playwright bug on ubuntu https://github.com/KittyCAD/modeling-app/issues/2444'
)
// Load the app with the code pane open
await test.step(`Set up test`, async () => {
await page.addInitScript(async () => {
localStorage.setItem(
'store',
JSON.stringify({
state: {
openPanes: ['code'],
},
version: 0,
})
)
})
await page.setBodyDimensions({ width: 1200, height: 500 })
await homePage.goToModelingScene()
await u.openDebugPanel()
await u.expectCmdLog('[data-message-type="execution-done"]')
await u.closeDebugPanel()
})
const codePane = page.locator('.cm-content')
const lineButton = page.getByRole('button', {
name: 'line Line',
exact: true,
})
const arcButton = page.getByRole('button', {
name: 'arc Tangential Arc',
exact: true,
})
const extrudeButton = page.getByRole('button', { name: 'Extrude' })
const commandBarComboBox = page.getByPlaceholder('Search commands')
const exitSketchButton = page.getByRole('button', { name: 'Exit Sketch' })
await test.step(`Type code with modeling hotkeys, shouldn't fire`, async () => {
await codePane.click()
await page.keyboard.type('//')
await page.keyboard.press('s')
await expect(commandBarComboBox).not.toBeVisible()
await page.keyboard.press('e')
await expect(commandBarComboBox).not.toBeVisible()
await expect(codePane).toHaveText('//se')
})
// Blur focus from the code editor, use the s command to sketch
await test.step(`Blur editor focus, enter sketch`, async () => {
/**
* TODO: There is a bug somewhere that causes this test to fail
* if you toggle the codePane closed before your trigger the
* start of the sketch.
* and a separate Safari-only bug that causes the test to fail
* if the pane is open the entire test. The maintainer of CodeMirror
* has pinpointed this to the unusual browser behavior:
* https://discuss.codemirror.net/t/how-to-force-unfocus-of-the-codemirror-element-in-safari/8095/3
*/
await blurCodeEditor()
await page.waitForTimeout(1000)
await page.keyboard.press('s')
await page.waitForTimeout(1000)
await page.mouse.move(800, 300, { steps: 5 })
await page.mouse.click(800, 300)
await page.waitForTimeout(1000)
await expect(lineButton).toHaveAttribute('aria-pressed', 'true', {
timeout: 15_000,
})
})
// Use some sketch hotkeys to create a sketch (l and a for now)
await test.step(`Incomplete sketch with hotkeys`, async () => {
await test.step(`Draw a line`, async () => {
await page.mouse.move(700, 200, { steps: 5 })
await page.mouse.click(700, 200)
await page.mouse.move(800, 250, { steps: 5 })
await page.mouse.click(800, 250)
})
await test.step(`Unequip line tool`, async () => {
await page.keyboard.press('l')
await expect(lineButton).not.toHaveAttribute('aria-pressed', 'true')
})
await test.step(`Draw a tangential arc`, async () => {
await page.keyboard.press('a')
await expect(arcButton).toHaveAttribute('aria-pressed', 'true', {
timeout: 10_000,
await test.step(`Set up test`, async () => {
await page.addInitScript(async () => {
localStorage.setItem(
'store',
JSON.stringify({
state: {
openPanes: ['code'],
},
version: 0,
})
await page.mouse.move(1000, 100, { steps: 5 })
await page.mouse.click(1000, 100)
})
await test.step(`Unequip with escape, equip line tool`, async () => {
await page.keyboard.press('Escape')
await page.keyboard.press('l')
await page.waitForTimeout(50)
await expect(lineButton).toHaveAttribute('aria-pressed', 'true')
})
)
})
await page.setBodyDimensions({ width: 1200, height: 500 })
await homePage.goToModelingScene()
await u.openDebugPanel()
await u.expectCmdLog('[data-message-type="execution-done"]')
await u.closeDebugPanel()
})
await test.step(`Type code with sketch hotkeys, shouldn't fire`, async () => {
// Since there's code now, we have to get to the end of the line
await page.locator('.cm-line').last().click()
await page.keyboard.down('ControlOrMeta')
await page.keyboard.press('ArrowRight')
await page.keyboard.up('ControlOrMeta')
const codePane = page.locator('.cm-content')
const lineButton = page.getByRole('button', {
name: 'line Line',
exact: true,
})
const arcButton = page.getByRole('button', {
name: 'arc Tangential Arc',
exact: true,
})
const extrudeButton = page.getByRole('button', { name: 'Extrude' })
const commandBarComboBox = page.getByPlaceholder('Search commands')
const exitSketchButton = page.getByRole('button', { name: 'Exit Sketch' })
await page.keyboard.press('Enter')
await page.keyboard.type('//')
await page.keyboard.press('l')
await expect(lineButton).toHaveAttribute('aria-pressed', 'true')
await page.keyboard.press('a')
await expect(lineButton).toHaveAttribute('aria-pressed', 'true')
await expect(codePane).toContainText('//la')
await page.keyboard.press('Backspace')
await page.keyboard.press('Backspace')
await page.keyboard.press('Backspace')
await page.keyboard.press('Backspace')
await test.step(`Type code with modeling hotkeys, shouldn't fire`, async () => {
await codePane.click()
await page.keyboard.type('//')
await page.keyboard.press('s')
await expect(commandBarComboBox).not.toBeVisible()
await page.keyboard.press('e')
await expect(commandBarComboBox).not.toBeVisible()
await expect(codePane).toHaveText('//se')
})
// Blur focus from the code editor, use the s command to sketch
await test.step(`Blur editor focus, enter sketch`, async () => {
/**
* TODO: There is a bug somewhere that causes this test to fail
* if you toggle the codePane closed before your trigger the
* start of the sketch.
* and a separate Safari-only bug that causes the test to fail
* if the pane is open the entire test. The maintainer of CodeMirror
* has pinpointed this to the unusual browser behavior:
* https://discuss.codemirror.net/t/how-to-force-unfocus-of-the-codemirror-element-in-safari/8095/3
*/
await blurCodeEditor()
await page.waitForTimeout(1000)
await page.keyboard.press('s')
await page.waitForTimeout(1000)
await page.mouse.move(800, 300, { steps: 5 })
await page.mouse.click(800, 300)
await page.waitForTimeout(1000)
await expect(lineButton).toHaveAttribute('aria-pressed', 'true', {
timeout: 15_000,
})
})
await test.step(`Close profile and exit sketch`, async () => {
await blurCodeEditor()
// Use some sketch hotkeys to create a sketch (l and a for now)
await test.step(`Incomplete sketch with hotkeys`, async () => {
await test.step(`Draw a line`, async () => {
await page.mouse.move(700, 200, { steps: 5 })
await page.mouse.click(700, 200)
// On close it will unequip the line tool.
await expect(lineButton).toHaveAttribute('aria-pressed', 'false')
await expect(exitSketchButton).toBeEnabled()
await page.keyboard.press('Escape')
await expect(
page.getByRole('button', { name: 'Exit Sketch' })
).not.toBeVisible()
await page.mouse.move(800, 250, { steps: 5 })
await page.mouse.click(800, 250)
})
// Extrude with e
await test.step(`Extrude the sketch`, async () => {
await page.mouse.click(750, 150)
await blurCodeEditor()
await expect(extrudeButton).toBeEnabled()
await page.keyboard.press('e')
await page.waitForTimeout(500)
await page.mouse.move(800, 200, { steps: 5 })
await page.mouse.click(800, 200)
await expect(page.getByRole('button', { name: 'Continue' })).toBeVisible({
timeout: 20_000,
await test.step(`Unequip line tool`, async () => {
await page.keyboard.press('l')
await expect(lineButton).not.toHaveAttribute('aria-pressed', 'true')
})
await test.step(`Draw a tangential arc`, async () => {
await page.keyboard.press('a')
await expect(arcButton).toHaveAttribute('aria-pressed', 'true', {
timeout: 10_000,
})
await page.getByRole('button', { name: 'Continue' }).click()
await expect(
page.getByRole('button', { name: 'Submit command' })
).toBeVisible()
await page.getByRole('button', { name: 'Submit command' }).click()
await expect(page.locator('.cm-content')).toContainText('extrude(')
await page.mouse.move(1000, 100, { steps: 5 })
await page.mouse.click(1000, 100)
})
// await codePaneButton.click()
// await expect(u.codeLocator).not.toBeVisible()
/**
* work-around: to stop `keyboard.press()` from typing in the editor even when it should be blurred
*/
async function blurCodeEditor() {
await page.getByRole('button', { name: 'Commands' }).click()
await page.waitForTimeout(100)
await test.step(`Unequip with escape, equip line tool`, async () => {
await page.keyboard.press('Escape')
await page.waitForTimeout(100)
}
await page.keyboard.press('l')
await page.waitForTimeout(50)
await expect(lineButton).toHaveAttribute('aria-pressed', 'true')
})
})
await test.step(`Type code with sketch hotkeys, shouldn't fire`, async () => {
// Since there's code now, we have to get to the end of the line
await page.locator('.cm-line').last().click()
await page.keyboard.down('ControlOrMeta')
await page.keyboard.press('ArrowRight')
await page.keyboard.up('ControlOrMeta')
await page.keyboard.press('Enter')
await page.keyboard.type('//')
await page.keyboard.press('l')
await expect(lineButton).toHaveAttribute('aria-pressed', 'true')
await page.keyboard.press('a')
await expect(lineButton).toHaveAttribute('aria-pressed', 'true')
await expect(codePane).toContainText('//la')
await page.keyboard.press('Backspace')
await page.keyboard.press('Backspace')
await page.keyboard.press('Backspace')
await page.keyboard.press('Backspace')
})
await test.step(`Close profile and exit sketch`, async () => {
await blurCodeEditor()
await page.mouse.move(700, 200, { steps: 5 })
await page.mouse.click(700, 200)
// On close it will unequip the line tool.
await expect(lineButton).toHaveAttribute('aria-pressed', 'false')
await expect(exitSketchButton).toBeEnabled()
await page.keyboard.press('Escape')
await expect(
page.getByRole('button', { name: 'Exit Sketch' })
).not.toBeVisible()
})
// Extrude with e
await test.step(`Extrude the sketch`, async () => {
await page.mouse.click(750, 150)
await blurCodeEditor()
await expect(extrudeButton).toBeEnabled()
await page.keyboard.press('e')
await page.waitForTimeout(500)
await page.mouse.move(800, 200, { steps: 5 })
await page.mouse.click(800, 200)
await expect(page.getByRole('button', { name: 'Continue' })).toBeVisible({
timeout: 20_000,
})
await page.getByRole('button', { name: 'Continue' }).click()
await expect(
page.getByRole('button', { name: 'Submit command' })
).toBeVisible()
await page.getByRole('button', { name: 'Submit command' }).click()
await expect(page.locator('.cm-content')).toContainText('extrude(')
})
// await codePaneButton.click()
// await expect(u.codeLocator).not.toBeVisible()
/**
* work-around: to stop `keyboard.press()` from typing in the editor even when it should be blurred
*/
async function blurCodeEditor() {
await page.getByRole('button', { name: 'Commands' }).click()
await page.waitForTimeout(100)
await page.keyboard.press('Escape')
await page.waitForTimeout(100)
}
)
})
test('Delete key does not navigate back', async ({ page, homePage }) => {
await page.setBodyDimensions({ width: 1200, height: 500 })

View File

@ -20,7 +20,7 @@ statement[@isGroup=Statement] {
ImportStatement { kw<"import"> ImportItems ImportFrom String } |
FunctionDeclaration { kw<"export">? kw<"fn"> VariableDefinition Equals? ParamList Arrow? Body } |
VariableDeclaration { kw<"export">? (kw<"var"> | kw<"let"> | kw<"const">)? VariableDefinition Equals expression } |
TypeDeclaration { kw<"export">? kw<"type"> identifier } |
TypeDeclaration { kw<"export">? kw<"type"> identifier ("=" type)? } |
ReturnStatement { kw<"return"> expression } |
ExpressionStatement { expression } |
Annotation { AnnotationName AnnotationList? }
@ -79,7 +79,7 @@ type[@isGroup=Type] {
identifier,
"bool" | "number" | "string" | "tag" | "Sketch" | "SketchSurface" | "Solid" | "Plane"
> |
ArrayType { type !member "[" "]" } |
ArrayType { "[" type !member (";" Number "+"?)? "]" } |
ObjectType { "{" commaSep<ObjectProperty { PropertyName ":" type }> "}" }
}
@ -137,7 +137,7 @@ commaSep1NoTrailingComma<term> { term ("," term)* }
"(" ")"
"{" "}"
"[" "]"
"," "?" ":" "." ".."
"," "?" ":" "." ".." ";"
}
@external propSource kclHighlight from "./highlight"

View File

@ -21,7 +21,7 @@
"@codemirror/autocomplete": "6.18.6",
"@codemirror/language": "^6.11.0",
"@codemirror/state": "^6.5.2",
"@lezer/highlight": "^1.2.0",
"@lezer/highlight": "^1.2.1",
"@ts-stack/markdown": "^1.5.0",
"json-rpc-2.0": "^1.7.0",
"typescript": "^5.8.2",
@ -29,7 +29,7 @@
"vscode-uri": "^3.1.0"
},
"devDependencies": {
"@types/node": "^22.13.9",
"@types/node": "^22.13.10",
"ts-node": "^10.9.2"
}
}

View File

@ -70,10 +70,10 @@
resolved "https://registry.yarnpkg.com/@lezer/common/-/common-1.2.1.tgz#198b278b7869668e1bebbe687586e12a42731049"
integrity sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==
"@lezer/highlight@^1.0.0", "@lezer/highlight@^1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@lezer/highlight/-/highlight-1.2.0.tgz#e5898c3644208b4b589084089dceeea2966f7780"
integrity sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==
"@lezer/highlight@^1.0.0", "@lezer/highlight@^1.2.1":
version "1.2.1"
resolved "https://registry.yarnpkg.com/@lezer/highlight/-/highlight-1.2.1.tgz#596fa8f9aeb58a608be0a563e960c373cbf23f8b"
integrity sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==
dependencies:
"@lezer/common" "^1.0.0"
@ -116,10 +116,10 @@
resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9"
integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==
"@types/node@^22.13.9":
version "22.13.9"
resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.9.tgz#5d9a8f7a975a5bd3ef267352deb96fb13ec02eca"
integrity sha512-acBjXdRJ3A6Pb3tqnw9HZmyR3Fiol3aGxRCK1x3d+6CDAMjl7I649wpSd+yNURCjbOUGu9tqtLKnTGxmK6CyGw==
"@types/node@^22.13.10":
version "22.13.10"
resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.10.tgz#df9ea358c5ed991266becc3109dc2dc9125d77e4"
integrity sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==
dependencies:
undici-types "~6.20.0"

View File

@ -69,6 +69,8 @@ When you submit a PR to add or modify KCL samples, images and STEP files will be
[![hex-nut](screenshots/hex-nut.png)](hex-nut/main.kcl)
#### [i-beam](i-beam/main.kcl) ([screenshot](screenshots/i-beam.png))
[![i-beam](screenshots/i-beam.png)](i-beam/main.kcl)
#### [keyboard](keyboard/main.kcl) ([screenshot](screenshots/keyboard.png))
[![keyboard](screenshots/keyboard.png)](keyboard/main.kcl)
#### [kitt](kitt/main.kcl) ([screenshot](screenshots/kitt.png))
[![kitt](screenshots/kitt.png)](kitt/main.kcl)
#### [lego](lego/main.kcl) ([screenshot](screenshots/lego.png))

View File

@ -0,0 +1,233 @@
// Zoo Keyboard
// A custom keyboard with Zoo brand lettering
// Set Units
@settings(defaultLengthUnit = in)
// Define constants
baseColor = "#0f0f0f"
highlightColor1 = "#b0b0b0"
highlightColor2 = "#23af93"
keyHeight = 0.8
keyDepth = 0.1
spacing = 0.1
row1 = spacing * 3
row2 = row1 + keyHeight + spacing
row3 = row2 + keyHeight + spacing
row4 = row3 + keyHeight + spacing
row5 = row4 + keyHeight + spacing
row6 = row5 + keyHeight + spacing
// Sketch the side profile of the keyboard base and extrude to total width
sketch001 = startSketchOn('YZ')
|> startProfileAt([0, 0], %)
|> line(end = [-0.14, 0.68], tag = $seg01)
|> angledLine([7, row6 + 3 * spacing + keyHeight], %, $seg02)
|> line(endAbsolute = [5.13, 0], tag = $seg03)
|> line(endAbsolute = [profileStartX(%), profileStartY(%)], tag = $seg04)
|> close()
|> extrude(length = 13.6)
|> appearance(color = baseColor)
|> fillet(
radius = .6,
tags = [
getOppositeEdge(seg01),
getOppositeEdge(seg03),
seg01,
seg03
],
)
// Create a short cylindrical foot at each corner of the keyboard
sketch003 = startSketchOn(sketch001, seg04)
profile001 = circle(sketch003, center = [0.75, 0.75], radius = 0.4)
profile003 = circle(sketch003, center = [4.4, 0.75], radius = 0.4)
profile004 = circle(sketch003, center = [0.73, 13.6 - .75], radius = 0.4)
profile005 = circle(sketch003, center = [4.4, 13.6 - .75], radius = 0.4)
extrude(
[
profile001,
profile003,
profile004,
profile005
],
length = .15,
)
// Define the plane to sketch keyboard keys on
plane001 = {
plane = {
origin = [0.0, 0.0, 0.7],
xAxis = [1.0, 0.0, 0.0],
yAxis = [0.0, 1.0, sin(toRadians(7))],
zAxis = [0.0, 0.0, 1.0]
}
}
// Create a function to build a key. Parameterize for position, width, height, number of instances, and appearance color.
fn keyFn(originStart, keyWidth, keyHeight, repeats, color) {
sketch002 = startSketchOn(plane001)
profile002 = startProfileAt([originStart[0], originStart[1]], sketch002)
|> arc({
angleStart = 180,
angleEnd = 270,
radius = 0.1
}, %)
|> angledLine([0, keyWidth - .2], %, $rectangleSegmentA001)
|> tangentialArc({ radius = 0.1, offset = 90 }, %)
|> angledLine([
segAng(rectangleSegmentA001) + 90,
keyHeight - .2
], %, $rectangleSegmentB001)
|> tangentialArc({ radius = 0.1, offset = 90 }, %)
|> angledLine([
segAng(rectangleSegmentA001),
-segLen(rectangleSegmentA001)
], %, $rectangleSegmentC001)
|> tangentialArc({ radius = 0.1, offset = 90 }, %)
|> line(endAbsolute = [profileStartX(%), profileStartY(%)], tag = $rectangleSegmentD001)
|> close()
|> extrude(length = keyDepth)
|> appearance(color = color)
// Repeat key when desired. This will default to zero
|> patternLinear3d(
%,
instances = repeats + 1,
distance = keyWidth + spacing,
axis = [1, 0, 0],
)
return sketch001
}
// Build the first row of keys
keyFn([0.3, row1], 1.1, keyHeight, 0, highlightColor2)
keyFn([1.5, row1], 0.8, keyHeight, 2, highlightColor1)
keyFn([spacing * 7 + 3.5, row1], 5.2, keyHeight, 0, highlightColor2)
keyFn([spacing * 8 + 8.7, row1], 0.8, keyHeight, 0, highlightColor1)
keyFn([spacing * 8 + 9.6, row1], 0.8, keyHeight, 0, highlightColor1)
keyFn([spacing * 10 + 10.3, row1], 1.1, keyHeight, 0, highlightColor1)
keyFn([spacing * 12 + 10.3 + 1, row1], 0.8, keyHeight, 0, highlightColor2)
// Build the second row of keys
keyFn([spacing * 3, row2], 1.7, keyHeight, 0, highlightColor2)
keyFn([spacing * 4 + 1.7, row2], 0.8, keyHeight, 9, highlightColor1)
keyFn([spacing * 14 + 1.7 + 0.8 * 10, row2], 2.2, keyHeight, 0, highlightColor2)
// Build the third row of keys
keyFn([spacing * 3, row3], 1.1 + .1, keyHeight, 0, highlightColor1)
keyFn([spacing * 4 + 1.1 + .1, row3], 0.8, keyHeight, 10, highlightColor1)
keyFn([spacing * 3 + 11.1 + .1, row3], 1.4 + .4, keyHeight, 0, highlightColor2)
// Build the fourth row of keys
keyFn([spacing * 3, row4], 0.9, keyHeight, 0, highlightColor1)
keyFn([spacing * 4 + 0.9, row4], 0.8, keyHeight, 11, highlightColor1)
keyFn([spacing * 3 + 11.8, row4], 1.2, keyHeight, 0, highlightColor1)
// Build the fifth row of keys
keyFn([spacing * 3, row5], 0.8, keyHeight, 12, highlightColor1)
keyFn([spacing * 3 + 11.7, row5], 1.3, keyHeight, 0, highlightColor2)
// Build the sixth row of keys
keyFn([spacing * 3, row6], 1.1, keyHeight * .6, 0, highlightColor2)
keyFn([spacing * 4 + 1.1, row6], 0.8, keyHeight * .6, 11, highlightColor1)
keyFn([spacing * 3 + 12, row6], 1, keyHeight * .6, 0, highlightColor2)
// Create a plane to sketch ZOO brand letters on
plane002 = {
plane = {
origin = [0.0, 0.0, .81],
xAxis = [1.0, 0.0, 0.0],
yAxis = [0.0, 1.0, sin(toRadians(7))],
zAxis = [0.0, 0.0, 1.0]
}
}
// Define a function to draw the ZOO 'Z'
fn z(origin, scale, depth) {
z = startSketchOn(plane002)
|> startProfileAt([
0 + origin[0],
0.15 * scale + origin[1]
], %)
|> yLine(length = -0.15 * scale)
|> xLine(length = 0.15 * scale)
|> angledLineToX({
angle = 47.15,
to = 0.3 * scale + origin[0]
}, %, $seg1)
|> yLine(endAbsolute = 0 + origin[1], tag = $seg3)
|> xLine(length = 0.63 * scale)
|> yLine(length = 0.225 * scale)
|> xLine(length = -0.57 * scale)
|> angledLineToX({
angle = 47.15,
to = 0.93 * scale + origin[0]
}, %)
|> yLine(length = 0.15 * scale)
|> xLine(length = -0.15 * scale)
|> angledLine({
angle = 47.15,
length = -segLen(seg1)
}, %, $seg2)
|> yLine(length = segLen(seg3))
|> xLine(endAbsolute = 0 + origin[0])
|> yLine(length = -0.225 * scale)
|> angledLineThatIntersects({
angle = 0,
intersectTag = seg2,
offset = 0
}, %)
|> close()
|> extrude(length = -depth)
|> appearance(color = baseColor)
return z
}
// Define a function to draw the ZOO 'O'
fn o(origin, scale, depth) {
oSketch001 = startSketchOn(plane002)
|> startProfileAt([
.788 * scale + origin[0],
.921 * scale + origin[1]
], %)
|> arc({
angleStart = 47.15 + 6,
angleEnd = 47.15 - 6 + 180,
radius = .525 * scale
}, %)
|> angledLine({ angle = 47.15, length = .24 * scale }, %)
|> arc({
angleStart = 47.15 - 11 + 180,
angleEnd = 47.15 + 11,
radius = .288 * scale
}, %)
|> close()
|> extrude(length = -depth)
|> appearance(color = baseColor)
o = startSketchOn(plane002)
|> startProfileAt([
.16 * scale + origin[0],
.079 * scale + origin[1]
], %)
|> arc({
angleStart = 47.15 + 6 - 180,
angleEnd = 47.15 - 6,
radius = .525 * scale
}, %)
|> angledLine({ angle = 47.15, length = -.24 * scale }, %)
|> arc({
angleStart = 47.15 - 11,
angleEnd = 47.15 + 11 - 180,
radius = .288 * scale
}, %)
|> close()
|> extrude(length = -depth)
|> appearance(color = baseColor)
return o
}
// Place the Z logo on the Z key. Place the O logo on the O and P keys
z([2.3, 1.3], .4, 0.03)
o([8.71, row4 + .08], 0.4, 0.03)
o([8.71 + 0.9, row4 + .08], 0.4, 0.03)

View File

@ -5,8 +5,8 @@
@settings(defaultLengthUnit = in)
// Define constants
lbumps = 10 // number of bumps long
wbumps = 5 // number of bumps wide
lbumps = 4 // number of bumps long
wbumps = 2 // number of bumps wide
pitch = 8.0
clearance = 0.1
bumpDiam = 4.8

View File

@ -160,6 +160,13 @@
"title": "I-beam",
"description": "A structural metal beam with an I shaped cross section. Often used in construction"
},
{
"file": "main.kcl",
"pathFromProjectDirectoryToFirstFile": "keyboard/main.kcl",
"multipleFiles": false,
"title": "Zoo Keyboard",
"description": "A custom keyboard with Zoo brand lettering"
},
{
"file": "main.kcl",
"pathFromProjectDirectoryToFirstFile": "kitt/main.kcl",
@ -198,7 +205,7 @@
{
"file": "main.kcl",
"pathFromProjectDirectoryToFirstFile": "pipe-flange-assembly/main.kcl",
"multipleFiles": false,
"multipleFiles": true,
"title": "Pipe and Flange Assembly",
"description": "A crucial component in various piping systems, designed to facilitate the connection, disconnection, and access to piping for inspection, cleaning, and modifications. This assembly combines pipes (long cylindrical conduits) with flanges (plate-like fittings) to create a secure yet detachable joint."
},

View File

@ -0,0 +1,25 @@
// 1120t74 Pipe
// import constants
import pipeInnerDiameter, pipeOuterDiameter, pipeLength from "globals.kcl"
// set units
@settings(defaultLengthUnit = in)
// create a function to make the pipe
export fn pipe() {
// create the pipe base
pipeBase = startSketchOn('XZ')
|> circle(%, center = [0, 0], radius = pipeOuterDiameter / 2)
|> extrude(%, length = pipeLength)
// extrude a hole through the length of the pipe
pipe = startSketchOn(pipeBase, 'end')
|> circle(center = [0, 0], radius = pipeInnerDiameter / 2)
|> extrude(%, length = -pipeLength)
|> appearance(color = "#a24ed0")
return pipe
}
// https://www.mcmaster.com/1120T74/

View File

@ -0,0 +1,46 @@
// 68095k348 flange
// import constants
import pipeDiameter, mountingHoleDiameter, mountingHolePlacementDiameter, flangeDiameter, flangeTotalThickness, flangeBackHeight, flangeFrontHeight, flangeBaseThickness, flangeBackDiameter, flangeFrontDiameter from "globals.kcl"
// set units
@settings(defaultLengthUnit = in)
// create a function to create the flange
export fn flange() {
// sketch the mounting hole pattern
mountingHoles = startSketchOn("XY")
|> circle(%, center = [0, mountingHolePlacementDiameter / 2], radius = mountingHoleDiameter / 2)
|> patternCircular2d(
%,
instances = 4,
center = [0, 0],
arcDegrees = 360,
rotateDuplicates = false,
)
// create the flange base
flangeBase = startSketchOn("XY")
|> circle(%, center = [0, 0], radius = flangeDiameter / 2)
|> hole(mountingHoles, %)
|> extrude(%, length = flangeBaseThickness)
// create both the raised portions on the front and back of the flange base
flangeBack = startSketchOn(flangeBase, 'start')
|> circle(%, center = [0, 0], radius = flangeBackDiameter / 2)
|> extrude(%, length = flangeBackHeight)
flangeFront = startSketchOn(flangeBase, 'end')
|> circle(%, center = [0, 0], radius = flangeFrontDiameter / 2)
|> extrude(%, length = flangeFrontHeight)
// create the circular cut in the center for the pipe
pipeCut = startSketchOn(flangeFront, 'end')
|> circle(%, center = [0, 0], radius = pipeDiameter / 2)
|> extrude(%, length = -flangeTotalThickness)
|> appearance(%, color = "#bab0b0")
return pipeCut
}
// https://www.mcmaster.com/68095K348/

View File

@ -0,0 +1,56 @@
// 91251A404 Socket Head Cap Screw
// import constants
import boltDiameter, boltLength, boltHeadLength, boltHeadDiameter, boltHexDrive, boltHexFlatLength, boltThreadLength from "globals.kcl"
// set units
@settings(defaultLengthUnit = in)
// create a function to make a the bolt
export fn bolt() {
// Create the head of the cap screw
boltHead = startSketchOn('XZ')
|> circle(center = [0, 0], radius = boltHeadDiameter / 2, tag = $topEdge)
|> extrude(length = -boltHeadLength)
|> fillet(radius = 0.020, tags = [topEdge, getOppositeEdge(topEdge)])
// Define the sketch of the hex pattern on the screw head and extrude into the head
hexPatternSketch = startSketchOn(boltHead, 'start')
|> startProfileAt([
boltHexDrive / 2,
boltHexFlatLength / 2
], %)
|> angledLine({
angle = 270,
length = boltHexFlatLength
}, %)
|> angledLine({
angle = 210,
length = boltHexFlatLength
}, %)
|> angledLine({
angle = 150,
length = boltHexFlatLength
}, %)
|> angledLine({
angle = 90,
length = boltHexFlatLength
}, %)
|> angledLine({
angle = 30,
length = boltHexFlatLength
}, %)
|> close()
|> extrude(length = -boltHeadLength * 0.75)
// create the body of the bolt
boltBody = startSketchOn(boltHead, 'end')
|> circle(center = [0, 0], radius = boltDiameter / 2, tag = $filletEdge)
|> extrude(length = boltLength)
|> appearance(color = "#4dd043", metalness = 90, roughness = 90)
return boltBody
}
// https://www.mcmaster.com/91251a404/

View File

@ -0,0 +1,26 @@
// 9472K188 Gasket
// import constants
import gasketOutsideDiameter, gasketInnerDiameter, gasketThickness from "globals.kcl"
// set units
@settings(defaultLengthUnit = in)
// create a function to make the gasket
export fn gasket() {
// create the base of the gasket
gasketBase = startSketchOn("XY")
|> circle(%, center = [0, 0], radius = gasketOutsideDiameter / 2)
|> extrude(%, length = gasketThickness)
// extrude a circular hole through the gasket base
gasket = startSketchOn(gasketBase, 'end')
|> circle(%, center = [0, 0], radius = gasketInnerDiameter / 2)
|> extrude(%, length = -gasketThickness)
|> appearance(%, color = "#d0cb3e")
return gasket
}
// https://www.mcmaster.com/9472K616/

View File

@ -0,0 +1,49 @@
// 95479A127 Hex Nut
// import constants
import hexNutDiameter, hexNutFlatToFlat, hexNutThickness, hexNutFlatLength from "globals.kcl"
// set units
@settings(defaultLengthUnit = in)
// create a function to make the hex nut
export fn hexNut() {
// create the base of the hex nut
hexNutBase = startSketchOn('XY')
|> startProfileAt([
hexNutFlatToFlat / 2,
hexNutFlatLength / 2
], %)
|> angledLine({
angle = 270,
length = hexNutFlatLength
}, %)
|> angledLine({
angle = 210,
length = hexNutFlatLength
}, %)
|> angledLine({
angle = 150,
length = hexNutFlatLength
}, %)
|> angledLine({
angle = 90,
length = hexNutFlatLength
}, %)
|> angledLine({
angle = 30,
length = hexNutFlatLength
}, %)
|> close()
|> extrude(length = hexNutThickness)
// create the hole in the center of the hex nut
hexNut = startSketchOn(hexNutBase, 'end')
|> circle(center = [0, 0], radius = hexNutDiameter / 2)
|> extrude(%, length = -hexNutThickness)
|> appearance(%, color = "#4edfd5")
return hexNut
}
// https://www.mcmaster.com/95479A127/

View File

@ -0,0 +1,26 @@
// 98017A257 Washer
// import constants
import washerInnerDia, washerOuterDia, washerThickness from "globals.kcl"
// set units
@settings(defaultLengthUnit = in)
// create a function to make the washer
export fn washer() {
// create the base of the washer
washerBase = startSketchOn('XY')
|> circle(center = [0, 0], radius = washerOuterDia / 2)
|> extrude(length = washerThickness)
// extrude a hole through the washer
washer = startSketchOn(washerBase, 'end')
|> circle(center = [0, 0], radius = washerInnerDia / 2)
|> extrude(%, length = -washerThickness)
|> appearance(%, color = "#ee4f4f")
return washer
}
// https://www.mcmaster.com/98017A257/

View File

@ -0,0 +1,48 @@
// Globals
// set units
@settings(defaultLengthUnit = in)
// flange (68095K348)
export pipeDiameter = 2.440
export mountingHoleDiameter = 0.750
export mountingHolePlacementDiameter = 4.750
export flangeDiameter = 6.0
export flangeTotalThickness = 1.0
export flangeBackHeight = 0.060
export flangeFrontHeight = 0.250
export flangeBaseThickness = flangeTotalThickness - flangeBackHeight - flangeFrontHeight
export flangeBackDiameter = 3.620
export flangeFrontDiameter = 3.060
// washer (98017A257)
export washerInnerDia = 0.640
export washerOuterDia = 1.188
export washerThickness = 0.032
// bolt (91251A404)
export boltDiameter = 0.625
export boltLength = 2.500
export boltHeadLength = boltDiameter
export boltHeadDiameter = 0.938
export boltHexDrive = 1 / 2
export boltHexFlatLength = boltHexDrive / (2 * cos(toRadians(30)))
export boltThreadLength = 1.750
// hex nut (95479A127)
export hexNutDiameter = 5 / 8
export hexNutFlatToFlat = 15 / 16
export hexNutThickness = 35 / 64
export hexNutFlatLength = hexNutFlatToFlat / (2 * cos(toRadians(30)))
// gasket (9472K188)
export gasketOutsideDiameter = 4.125
export gasketInnerDiameter = 2.375
export gasketThickness = 0.031
// pipe (1120T74)
export pipeInnerDiameter = 2.0
export pipeOuterDiameter = 2.375
export pipeLength = 6

View File

@ -1,304 +1,58 @@
// Pipe and Flange Assembly
// A crucial component in various piping systems, designed to facilitate the connection, disconnection, and access to piping for inspection, cleaning, and modifications. This assembly combines pipes (long cylindrical conduits) with flanges (plate-like fittings) to create a secure yet detachable joint.
// Set units
// set units
@settings(defaultLengthUnit = in)
// import constants
import * from 'globals.kcl'
// Define constants
flangeThickness = .125
flangeBaseDia = 2
boreHeight = 1
flangePipeDia = 1
mountingHoleDia = 0.425
screwDia = 0.375
tol = 0.010
hexNutScale = 0.90
wallThickness = 0.5
screwLength = 1.125
washerThickness = 0.0625
screwStart = [
0,
flangeThickness + washerThickness,
1.375
]
capRatio = .190 / .313 // Ratio grabbed from another screw
hexRatio = 5 / 32 / .190 // Ratio grabbed from another screw
hexStartingAngle = 210 // first angle of hex pattern (degrees)
hexInteriorAngle = 120 // degrees
hexChangeAngle = 180 - hexInteriorAngle // degrees
// import parts
import flange from '68095k348-flange.kcl'
import gasket from '9472k188-gasket.kcl'
import washer from '98017a257-washer.kcl'
import bolt from '91251a404-bolt.kcl'
import hexNut from '95479a127-hex-nut.kcl'
import pipe from '1120t74-pipe.kcl'
// place flanges
flange()
flange()
|> rotate(axis = [0, 1, 0], angle = 180)
|> translate(translate = [0, 0, flangeBackHeight*2 + gasketThickness])
screwPlane = {
plane = {
origin = {
x = screwStart[0],
y = screwStart[1],
z = screwStart[2]
},
xAxis = { x = 1, y = 0, z = 0 },
yAxis = { x = 0, y = 0, z = 1 },
zAxis = { x = 0, y = 1, z = 0 }
}
}
// place gasket between the flanges
gasket()
|> translate(translate = [0, 0, -flangeBackHeight - gasketThickness])
fn capScrew(start, length, dia) {
headLength = dia // inch
wallToWallLength = hexRatio * dia
headDia = dia / capRatio
hexWallLength = wallToWallLength / 2 * 1 / cos(toRadians(30)) // inch
// place eight washers (four front, four back)
washer()
|> translate(translate = [
mountingHolePlacementDiameter/2,
0,
flangeBaseThickness
])
|> patternCircular3d(%, instances = 4, axis = [0, 0, 1], center = [0, 0, 0], arcDegrees = 360, rotateDuplicates = false)
|> patternLinear3d(%, instances = 2, distance = -(flangeBaseThickness*2 + flangeBackHeight * 2 + gasketThickness + washerThickness), axis = [0, 0, 1])
// place four bolts
bolt()
|> translate(translate = [
mountingHolePlacementDiameter/2, 0, flangeBaseThickness + washerThickness
])
|> rotate(roll = 90, pitch = 0, yaw = 0)
|> patternCircular3d(%, instances = 4, axis = [0, 0, 1], center = [0, 0, 0], arcDegrees = 360, rotateDuplicates = false)
// Length of Cap Head is always equal to diameter
capHeadLength = dia
// place four hex nuts
hexNut()
|> translate(translate = [mountingHolePlacementDiameter/2, 0, -(flangeBackHeight * 2 + gasketThickness + flangeBaseThickness + washerThickness + hexNutThickness)])
|> patternCircular3d(%, instances = 4, axis = [0, 0, 1], center = [0, 0, 0], arcDegrees = 360, rotateDuplicates = false)
// Create the head of the cap screw
screwHeadSketch = startSketchOn(screwPlane)
|> circle(
center = [0, 0],
radius = headDia / 2
)
// place both pieces of pipe
pipe()
|> rotate(%, roll = -90, pitch = 0, yaw = 0)
|> translate(%, translate = [0, 0, flangeBaseThickness + flangeFrontHeight - 0.5], global = true)
// Extrude the screw head sketch
screwHead = extrude(screwHeadSketch, length = dia)
// Define the sketch of the hex pattern on the screw head
hexPatternSketch = startSketchOn(screwHead, 'end')
|> startProfileAt([
-start[0] + wallToWallLength / 2,
start[2]
], %)
|> yLine(length = -hexWallLength / 2)
|> angledLine({
angle = hexStartingAngle,
length = hexWallLength
}, %)
|> angledLine({
angle = hexStartingAngle - hexChangeAngle,
length = hexWallLength
}, %)
|> angledLine({
angle = hexStartingAngle - (2 * hexChangeAngle),
length = hexWallLength
}, %)
|> angledLine({
angle = hexStartingAngle - (3 * hexChangeAngle),
length = hexWallLength
}, %)
|> angledLine({
angle = hexStartingAngle - (4 * hexChangeAngle),
length = hexWallLength
}, %)
|> close()
hexPattern = extrude(hexPatternSketch, length = -headLength * 0.75)
return hexPattern
}
workingPlane = {
plane = {
origin = { x = 0, y = flangeThickness, z = 0 },
xAxis = { x = 0, y = 0, z = 1 },
yAxis = { x = 1, y = 0, z = 0 },
zAxis = { x = 0, y = 1, z = 0 }
}
}
// Washer function
fn washer(plane, start, thk, innerDia, outerDia) {
washerSketch = startSketchOn(plane)
|> circle(
center = [start[0], start[1]],
radius = outerDia / 2
)
|> hole(circle(
center = [start[0], start[1]],
radius = innerDia / 2
), %)
|> extrude(length = thk)
return washerSketch
}
// Hex nut function
fn hexNut(start, thk, innerDia) {
hexNutSketch = startSketchOn({
plane = {
origin = {
x = start[0],
y = -wallThickness - washerThickness,
z = start[2]
},
xAxis = { x = 1, y = 0, z = 0 },
yAxis = { x = 0, y = 0, z = 1 },
zAxis = { x = 0, y = 1, z = 0 }
}
})
|> startProfileAt([0 + innerDia * hexNutScale, 0], %)
|> angledLine({
angle = 240,
length = innerDia * hexNutScale
}, %)
|> angledLine({
angle = 180,
length = innerDia * hexNutScale
}, %)
|> angledLine({
angle = 120,
length = innerDia * hexNutScale
}, %)
|> angledLine({
angle = 60,
length = innerDia * hexNutScale
}, %)
|> angledLine({ angle = 0, length = innerDia * .90 }, %)
|> close()
|> hole(circle(
center = [0, 0],
radius = innerDia / 2
), %)
|> extrude(length = -thk)
return hexNutSketch
}
// Mounting holes pattern
mountingHolePattern = startSketchOn('XZ')
|> circle(
center = [screwStart[0], screwStart[2]],
radius = screwDia / 2 + tol
)
|> patternCircular2d(
arcDegrees = 360,
center = [0, 0],
instances = 7,
rotateDuplicates = true
)
// Sketch and revolve the pipe
pipe = startSketchOn('XY')
|> startProfileAt([flangePipeDia / 2 - tol, 0], %)
|> line(end = [0, -2])
|> angledLine({ angle = -60, length = .5 }, %)
|> line(end = [0, -1])
|> line(end = [-flangeThickness, 0])
|> line(end = [0, 1])
|> angledLine({ angle = -240, length = .5 }, %)
|> line(end = [0, 5])
|> angledLine({ angle = 60, length = .5 }, %)
|> line(end = [0, 1])
|> line(end = [flangeThickness, 0])
|> line(end = [0, -1])
|> angledLine({ angle = 240, length = .5 }, %)
|> close()
|> revolve(axis = 'y')
|> appearance(color = "#7b79d7")
// Sketch and extrude the wall
wall = startSketchOn('XZ')
|> startProfileAt([-4, -4], %)
|> line(end = [0, 8])
|> line(end = [8, 0])
|> line(end = [0, -8])
|> close()
|> hole(mountingHolePattern, %)
|> hole(circle(
center = [0, 0],
radius = flangePipeDia / 2
), %)
|> extrude(length = wallThickness)
|> appearance(color = "#c7aa8f")
// Sketch and revolve the flange
flangeBase = startSketchOn('XZ')
|> circle(
center = [0, 0],
radius = flangeBaseDia
)
|> hole(mountingHolePattern, %)
|> hole(circle(
center = [0, 0],
radius = flangePipeDia / 2
), %)
|> extrude(length = -flangeThickness)
|> appearance(color = "#9b9797")
// Create the washer and pattern around the flange
washer(workingPlane, [screwStart[2], screwStart[0]], 0.0625, screwDia + tol, 0.625)
|> patternCircular3d(
axis = [0, 1, 0],
center = [0, 0, 0],
instances = 7,
arcDegrees = 360,
rotateDuplicates = true
)
|> appearance(color = "#d8da5d")
// Create the cap screw and pattern around the flange
capScrew([
0,
flangeThickness + washerThickness,
1.375
], screwLength, screwDia)
|> patternCircular3d(
axis = [0, 1, 0],
center = [0, 0, 0],
instances = 7,
arcDegrees = 360,
rotateDuplicates = true
)
|> appearance(color = "#4cd411")
screwBodySketch = startSketchOn(screwPlane)
|> circle(
center = [0, 0],
radius = screwDia / 2
)
screwBody = extrude(screwBodySketch, length = -screwLength)
|> patternCircular3d(
axis = [0, 1, 0],
center = [0, 0, 0],
instances = 7,
arcDegrees = 360,
rotateDuplicates = true
)
|> appearance(color = "#4cd411")
// Create a plane for the washers on the back side of the wall
backSideWasherPlane = {
plane = {
origin = {
x = 0,
y = -wallThickness - washerThickness,
z = 0
},
xAxis = { x = 0, y = 0, z = 1 },
yAxis = { x = 1, y = 0, z = 0 },
zAxis = { x = 0, y = 1, z = 0 }
}
}
// Create the washers on the backside of the wall
washer(backSideWasherPlane, [screwStart[2], screwStart[0]], 0.0625, screwDia + tol, 0.625)
|> patternCircular3d(
axis = [0, 1, 0],
center = [0, 0, 0],
instances = 7,
arcDegrees = 360,
rotateDuplicates = true
)
|> appearance(color = "#e8ec09")
// Create the hex nut and pattern around the flange
hexNut([
screwStart[0],
screwStart[1],
screwStart[2]
], .25, screwDia + tol)
|> patternCircular3d(
axis = [0, 1, 0],
center = [0, 0, 0],
instances = 7,
arcDegrees = 360,
rotateDuplicates = true
)
|> appearance(color = "#bc3434")
pipe()
|> rotate(%, roll = 90, pitch = 0, yaw = 0)
|> translate(%, translate = [0, 0, -(flangeBackHeight * 2 + gasketThickness + flangeBaseThickness + flangeFrontHeight - 0.5)], global = true)

View File

@ -0,0 +1,269 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION (( 'STEP AP203' ),
'1' );
FILE_NAME ('1120T74_Standard-Wall Steel Unthreaded Pipe Nipple.STEP',
'2021-07-09T13:29:34',
( 'Administrator' ),
( 'Managed by Terraform' ),
'SwSTEP 2.0',
'SolidWorks 2017',
'' );
FILE_SCHEMA (( 'CONFIG_CONTROL_DESIGN' ));
ENDSEC;
DATA;
#1 = EDGE_LOOP ( 'NONE', ( #200, #99 ) ) ;
#2 = CALENDAR_DATE ( 2021, 9, 7 ) ;
#3 = AXIS2_PLACEMENT_3D ( 'NONE', #146, #228, #22 ) ;
#4 = CALENDAR_DATE ( 2021, 9, 7 ) ;
#5 = VECTOR ( 'NONE', #122, 39.37007874015748100 ) ;
#6 = APPROVAL_PERSON_ORGANIZATION ( #191, #189, #47 ) ;
#7 = MANIFOLD_SOLID_BREP ( 'Extrude1', #114 ) ;
#8 = CALENDAR_DATE ( 2021, 9, 7 ) ;
#9 = ORIENTED_EDGE ( 'NONE', *, *, #48, .F. ) ;
#10 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -3.000000000000000400 ) ) ;
#11 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#12 = AXIS2_PLACEMENT_3D ( 'NONE', #162, #203, #157 ) ;
#13 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 3.000000000000000400 ) ) ;
#14 = ADVANCED_FACE ( 'NONE', ( #107, #218 ), #177, .T. ) ;
#15 = CIRCLE ( 'NONE', #193, 1.187500000000000000 ) ;
#16 = PERSON_AND_ORGANIZATION_ROLE ( 'classification_officer' ) ;
#17 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#18 = AXIS2_PLACEMENT_3D ( 'NONE', #10, #245, #31 ) ;
#19 = LINE ( 'NONE', #137, #80 ) ;
#20 = CC_DESIGN_APPROVAL ( #189, ( #105 ) ) ;
#21 = ADVANCED_FACE ( 'NONE', ( #142, #60 ), #74, .F. ) ;
#22 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#23 = ORIENTED_EDGE ( 'NONE', *, *, #185, .T. ) ;
#24 = CC_DESIGN_DATE_AND_TIME_ASSIGNMENT ( #241, #211, ( #198 ) ) ;
#25 = APPROVAL_DATE_TIME ( #135, #90 ) ;
#26 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 3.000000000000000400 ) ) ;
#27 = ORIENTED_EDGE ( 'NONE', *, *, #28, .T. ) ;
#28 = EDGE_CURVE ( 'NONE', #237, #240, #110, .T. ) ;
#29 = EDGE_LOOP ( 'NONE', ( #9, #222 ) ) ;
#30 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, -1.000000000000000000 ) ) ;
#31 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#32 = CARTESIAN_POINT ( 'NONE', ( -1.187500000000000000, 0.0000000000000000000, -3.000000000000000400 ) ) ;
#33 = PERSON_AND_ORGANIZATION ( #83, #100 ) ;
#34 = VERTEX_POINT ( 'NONE', #201 ) ;
#35 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#36 = APPLICATION_CONTEXT ( 'configuration controlled 3d designs of mechanical parts and assemblies' ) ;
#37 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#38 = PERSON_AND_ORGANIZATION ( #83, #100 ) ;
#39 = EDGE_CURVE ( 'NONE', #112, #34, #43, .T. ) ;
#40 = EDGE_CURVE ( 'NONE', #72, #121, #187, .T. ) ;
#41 = LENGTH_MEASURE_WITH_UNIT ( LENGTH_MEASURE( 0.02539999999999999900 ), #165 );
#42 = APPROVAL_DATE_TIME ( #87, #235 ) ;
#43 = CIRCLE ( 'NONE', #156, 1.187500000000000000 ) ;
#44 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, -1.000000000000000000 ) ) ;
#45 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#46 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 3.000000000000000400 ) ) ;
#47 = APPROVAL_ROLE ( '' ) ;
#48 = EDGE_CURVE ( 'NONE', #202, #71, #15, .T. ) ;
#49 = LOCAL_TIME ( 8, 29, 34.00000000000000000, #173 ) ;
#50 = EDGE_LOOP ( 'NONE', ( #54, #247, #232, #126 ) ) ;
#51 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -3.000000000000000400 ) ) ;
#52 = APPROVAL_ROLE ( '' ) ;
#53 = CALENDAR_DATE ( 2021, 9, 7 ) ;
#54 = ORIENTED_EDGE ( 'NONE', *, *, #229, .F. ) ;
#55 = PERSON_AND_ORGANIZATION ( #83, #100 ) ;
#56 = ORIENTED_EDGE ( 'NONE', *, *, #152, .T. ) ;
#57 = FACE_OUTER_BOUND ( 'NONE', #220, .T. ) ;
#58 = PERSON_AND_ORGANIZATION ( #83, #100 ) ;
#59 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 3.000000000000000400 ) ) ;
#60 = FACE_BOUND ( 'NONE', #153, .T. ) ;
#61 = AXIS2_PLACEMENT_3D ( 'NONE', #13, #183, #35 ) ;
#62 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, -0.0000000000000000000 ) ) ;
#63 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, -1.000000000000000000 ) ) ;
#64 = LOCAL_TIME ( 8, 29, 34.00000000000000000, #115 ) ;
#65 = ORIENTED_EDGE ( 'NONE', *, *, #48, .T. ) ;
#66 = SECURITY_CLASSIFICATION_LEVEL ( 'unclassified' ) ;
#67 = PERSON_AND_ORGANIZATION_ROLE ( 'creator' ) ;
#68 = DIMENSIONAL_EXPONENTS ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000, 0.0000000000000000000, 0.0000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ;
#69 = LOCAL_TIME ( 8, 29, 34.00000000000000000, #120 ) ;
#70 = ORIENTED_EDGE ( 'NONE', *, *, #88, .T. ) ;
#71 = VERTEX_POINT ( 'NONE', #117 ) ;
#72 = VERTEX_POINT ( 'NONE', #160 ) ;
#73 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#74 = PLANE ( 'NONE', #119 ) ;
#75 = CYLINDRICAL_SURFACE ( 'NONE', #86, 1.033499999999999900 ) ;
#76 = CC_DESIGN_APPROVAL ( #235, ( #198 ) ) ;
#77 = CARTESIAN_POINT ( 'NONE', ( -1.187500000000000000, 0.0000000000000000000, 3.000000000000000400 ) ) ;
#78 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#79 = AXIS2_PLACEMENT_3D ( 'NONE', #252, #37, #124 ) ;
#80 = VECTOR ( 'NONE', #44, 39.37007874015748100 ) ;
#81 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 3.000000000000000400 ) ) ;
#82 = PERSON_AND_ORGANIZATION ( #83, #100 ) ;
#83 = PERSON ( 'UNSPECIFIED', 'UNSPECIFIED', 'UNSPECIFIED', ('UNSPECIFIED'), ('UNSPECIFIED'), ('UNSPECIFIED') ) ;
#84 = ORIENTED_EDGE ( 'NONE', *, *, #215, .T. ) ;
#85 = PERSON_AND_ORGANIZATION_ROLE ( 'design_supplier' ) ;
#86 = AXIS2_PLACEMENT_3D ( 'NONE', #46, #63, #78 ) ;
#87 = DATE_AND_TIME ( #140, #64 ) ;
#88 = EDGE_CURVE ( 'NONE', #72, #240, #158, .T. ) ;
#89 = VECTOR ( 'NONE', #138, 39.37007874015748100 ) ;
#90 = APPROVAL ( #171, 'UNSPECIFIED' ) ;
#91 = COORDINATED_UNIVERSAL_TIME_OFFSET ( 6, 0, .BEHIND. ) ;
#92 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -3.000000000000000400 ) ) ;
#93 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, -0.0000000000000000000 ) ) ;
#94 = CIRCLE ( 'NONE', #18, 1.187500000000000000 ) ;
#95 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#96 = PRODUCT_DEFINITION ( 'UNKNOWN', '', #105, #154 ) ;
#97 = CARTESIAN_POINT ( 'NONE', ( -1.033499999999999900, 0.0000000000000000000, 3.000000000000000400 ) ) ;
#98 = AXIS2_PLACEMENT_3D ( 'NONE', #141, #30, #181 ) ;
#99 = ORIENTED_EDGE ( 'NONE', *, *, #229, .T. ) ;
#100 = ORGANIZATION ( 'UNSPECIFIED', 'UNSPECIFIED', '' ) ;
#101 = CARTESIAN_POINT ( 'NONE', ( 1.033499999999999900, 1.265672466918789100E-016, 3.000000000000000400 ) ) ;
#102 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -3.000000000000000400 ) ) ;
#103 = CC_DESIGN_SECURITY_CLASSIFICATION ( #198, ( #105 ) ) ;
#104 = CYLINDRICAL_SURFACE ( 'NONE', #3, 1.033499999999999900 ) ;
#105 = PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE ( 'ANY', '', #230, .NOT_KNOWN. ) ;
#106 = DATE_TIME_ROLE ( 'creation_date' ) ;
#107 = FACE_OUTER_BOUND ( 'NONE', #1, .T. ) ;
#108 = CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT ( #207, #67, ( #105 ) ) ;
#109 = LINE ( 'NONE', #101, #155 ) ;
#110 = CIRCLE ( 'NONE', #217, 1.033499999999999900 ) ;
#111 = EDGE_CURVE ( 'NONE', #34, #71, #19, .T. ) ;
#112 = VERTEX_POINT ( 'NONE', #77 ) ;
#113 = AXIS2_PLACEMENT_3D ( 'NONE', #81, #17, #233 ) ;
#114 = CLOSED_SHELL ( 'NONE', ( #248, #148, #14, #21, #167, #170 ) ) ;
#115 = COORDINATED_UNIVERSAL_TIME_OFFSET ( 6, 0, .BEHIND. ) ;
#116 = ORIENTED_EDGE ( 'NONE', *, *, #185, .F. ) ;
#117 = CARTESIAN_POINT ( 'NONE', ( 1.187500000000000000, 1.454268073987481900E-016, -3.000000000000000400 ) ) ;
#118 = CYLINDRICAL_SURFACE ( 'NONE', #98, 1.187500000000000000 ) ;
#119 = AXIS2_PLACEMENT_3D ( 'NONE', #92, #246, #62 ) ;
#120 = COORDINATED_UNIVERSAL_TIME_OFFSET ( 6, 0, .BEHIND. ) ;
#121 = VERTEX_POINT ( 'NONE', #179 ) ;
#122 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, -1.000000000000000000 ) ) ;
#123 = APPROVAL_STATUS ( 'not_yet_approved' ) ;
#124 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#125 = FACE_OUTER_BOUND ( 'NONE', #163, .T. ) ;
#126 = ORIENTED_EDGE ( 'NONE', *, *, #152, .F. ) ;
#127 = PRODUCT_RELATED_PRODUCT_CATEGORY ( 'detail', '', ( #230 ) ) ;
#128 = CYLINDRICAL_SURFACE ( 'NONE', #150, 1.187500000000000000 ) ;
#129 = ORIENTED_EDGE ( 'NONE', *, *, #28, .F. ) ;
#130 = APPROVAL_PERSON_ORGANIZATION ( #82, #235, #234 ) ;
#131 = CIRCLE ( 'NONE', #161, 1.033499999999999900 ) ;
#132 = CC_DESIGN_APPROVAL ( #90, ( #96 ) ) ;
#133 = CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT ( #147, #231, ( #230 ) ) ;
#134 = EDGE_CURVE ( 'NONE', #71, #202, #94, .T. ) ;
#135 = DATE_AND_TIME ( #8, #69 ) ;
#136 = ORIENTED_EDGE ( 'NONE', *, *, #88, .F. ) ;
#137 = CARTESIAN_POINT ( 'NONE', ( 1.187500000000000000, 1.454268073987481900E-016, 3.000000000000000400 ) ) ;
#138 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, -1.000000000000000000 ) ) ;
#139 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#140 = CALENDAR_DATE ( 2021, 9, 7 ) ;
#141 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 3.000000000000000400 ) ) ;
#142 = FACE_OUTER_BOUND ( 'NONE', #29, .T. ) ;
#143 = PERSON_AND_ORGANIZATION_ROLE ( 'creator' ) ;
#144 = APPLICATION_PROTOCOL_DEFINITION ( 'international standard', 'config_control_design', 1994, #169 ) ;
#145 =( NAMED_UNIT ( * ) PLANE_ANGLE_UNIT ( ) SI_UNIT ( $, .RADIAN. ) );
#146 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 3.000000000000000400 ) ) ;
#147 = PERSON_AND_ORGANIZATION ( #83, #100 ) ;
#148 = ADVANCED_FACE ( 'NONE', ( #174 ), #118, .T. ) ;
#149 = CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT ( #55, #143, ( #96 ) ) ;
#150 = AXIS2_PLACEMENT_3D ( 'NONE', #59, #159, #45 ) ;
#151 = ORIENTED_EDGE ( 'NONE', *, *, #199, .T. ) ;
#152 = EDGE_CURVE ( 'NONE', #112, #202, #208, .T. ) ;
#153 = EDGE_LOOP ( 'NONE', ( #151, #27 ) ) ;
#154 = DESIGN_CONTEXT ( 'detailed design', #36, 'design' ) ;
#155 = VECTOR ( 'NONE', #188, 39.37007874015748100 ) ;
#156 = AXIS2_PLACEMENT_3D ( 'NONE', #225, #139, #223 ) ;
#157 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#158 = LINE ( 'NONE', #97, #5 ) ;
#159 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, -1.000000000000000000 ) ) ;
#160 = CARTESIAN_POINT ( 'NONE', ( -1.033499999999999900, 0.0000000000000000000, 3.000000000000000400 ) ) ;
#161 = AXIS2_PLACEMENT_3D ( 'NONE', #51, #186, #190 ) ;
#162 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 3.000000000000000400 ) ) ;
#163 = EDGE_LOOP ( 'NONE', ( #176, #23, #70, #129 ) ) ;
#164 =( CONVERSION_BASED_UNIT ( 'INCH', #41 ) LENGTH_UNIT ( ) NAMED_UNIT ( #68 ) );
#165 =( LENGTH_UNIT ( ) NAMED_UNIT ( * ) SI_UNIT ( $, .METRE. ) );
#166 = APPLICATION_PROTOCOL_DEFINITION ( 'international standard', 'config_control_design', 1994, #36 ) ;
#167 = ADVANCED_FACE ( 'NONE', ( #251 ), #128, .T. ) ;
#168 = CIRCLE ( 'NONE', #61, 1.033499999999999900 ) ;
#169 = APPLICATION_CONTEXT ( 'configuration controlled 3d designs of mechanical parts and assemblies' ) ;
#170 = ADVANCED_FACE ( 'NONE', ( #125 ), #75, .F. ) ;
#171 = APPROVAL_STATUS ( 'not_yet_approved' ) ;
#172 = AXIS2_PLACEMENT_3D ( 'NONE', #26, #73, #93 ) ;
#173 = COORDINATED_UNIVERSAL_TIME_OFFSET ( 6, 0, .BEHIND. ) ;
#174 = FACE_OUTER_BOUND ( 'NONE', #50, .T. ) ;
#175 = LOCAL_TIME ( 8, 29, 34.00000000000000000, #204 ) ;
#176 = ORIENTED_EDGE ( 'NONE', *, *, #215, .F. ) ;
#177 = PLANE ( 'NONE', #172 ) ;
#178 = ORIENTED_EDGE ( 'NONE', *, *, #40, .T. ) ;
#179 = CARTESIAN_POINT ( 'NONE', ( 1.033499999999999900, 1.265672466918789100E-016, 3.000000000000000400 ) ) ;
#180 =( GEOMETRIC_REPRESENTATION_CONTEXT ( 3 ) GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT ( ( #192 ) ) GLOBAL_UNIT_ASSIGNED_CONTEXT ( ( #164, #145, #212 ) ) REPRESENTATION_CONTEXT ( 'NONE', 'WORKASPACE' ) );
#181 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#182 = EDGE_LOOP ( 'NONE', ( #227, #116 ) ) ;
#183 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#184 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#185 = EDGE_CURVE ( 'NONE', #121, #72, #168, .T. ) ;
#186 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#187 = CIRCLE ( 'NONE', #12, 1.033499999999999900 ) ;
#188 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, -1.000000000000000000 ) ) ;
#189 = APPROVAL ( #123, 'UNSPECIFIED' ) ;
#190 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#191 = PERSON_AND_ORGANIZATION ( #83, #100 ) ;
#192 = UNCERTAINTY_MEASURE_WITH_UNIT (LENGTH_MEASURE( 1.000000000000000100E-005 ), #164, 'distance_accuracy_value', 'NONE');
#193 = AXIS2_PLACEMENT_3D ( 'NONE', #224, #184, #244 ) ;
#194 = ORIENTED_EDGE ( 'NONE', *, *, #111, .F. ) ;
#195 = EDGE_LOOP ( 'NONE', ( #194, #243, #56, #65 ) ) ;
#196 = APPROVAL_DATE_TIME ( #236, #189 ) ;
#197 = CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT ( #33, #85, ( #105 ) ) ;
#198 = SECURITY_CLASSIFICATION ( '', '', #66 ) ;
#199 = EDGE_CURVE ( 'NONE', #240, #237, #131, .T. ) ;
#200 = ORIENTED_EDGE ( 'NONE', *, *, #39, .T. ) ;
#201 = CARTESIAN_POINT ( 'NONE', ( 1.187500000000000000, 1.454268073987481900E-016, 3.000000000000000400 ) ) ;
#202 = VERTEX_POINT ( 'NONE', #32 ) ;
#203 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#204 = COORDINATED_UNIVERSAL_TIME_OFFSET ( 6, 0, .BEHIND. ) ;
#205 = CARTESIAN_POINT ( 'NONE', ( -1.033499999999999900, 0.0000000000000000000, -3.000000000000000400 ) ) ;
#206 = CARTESIAN_POINT ( 'NONE', ( 1.033499999999999900, 1.265672466918789100E-016, -3.000000000000000400 ) ) ;
#207 = PERSON_AND_ORGANIZATION ( #83, #100 ) ;
#208 = LINE ( 'NONE', #221, #89 ) ;
#209 = APPROVAL_STATUS ( 'not_yet_approved' ) ;
#210 = CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT ( #38, #16, ( #198 ) ) ;
#211 = DATE_TIME_ROLE ( 'classification_date' ) ;
#212 =( NAMED_UNIT ( * ) SI_UNIT ( $, .STERADIAN. ) SOLID_ANGLE_UNIT ( ) );
#213 = CIRCLE ( 'NONE', #113, 1.187500000000000000 ) ;
#214 = PRODUCT_DEFINITION_SHAPE ( 'NONE', 'NONE', #96 ) ;
#215 = EDGE_CURVE ( 'NONE', #121, #237, #109, .T. ) ;
#216 = DATE_AND_TIME ( #53, #175 ) ;
#217 = AXIS2_PLACEMENT_3D ( 'NONE', #102, #11, #95 ) ;
#218 = FACE_BOUND ( 'NONE', #182, .T. ) ;
#219 = APPROVAL_PERSON_ORGANIZATION ( #58, #90, #52 ) ;
#220 = EDGE_LOOP ( 'NONE', ( #178, #84, #242, #136 ) ) ;
#221 = CARTESIAN_POINT ( 'NONE', ( -1.187500000000000000, 0.0000000000000000000, 3.000000000000000400 ) ) ;
#222 = ORIENTED_EDGE ( 'NONE', *, *, #134, .F. ) ;
#223 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#224 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -3.000000000000000400 ) ) ;
#225 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 3.000000000000000400 ) ) ;
#226 = LOCAL_TIME ( 8, 29, 34.00000000000000000, #91 ) ;
#227 = ORIENTED_EDGE ( 'NONE', *, *, #40, .F. ) ;
#228 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, -1.000000000000000000 ) ) ;
#229 = EDGE_CURVE ( 'NONE', #34, #112, #213, .T. ) ;
#230 = PRODUCT ( '1120T74_Standard-Wall Steel Unthreaded Pipe Nipple', '1120T74_Standard-Wall Steel Unthreaded Pipe Nipple', '', ( #249 ) ) ;
#231 = PERSON_AND_ORGANIZATION_ROLE ( 'design_owner' ) ;
#232 = ORIENTED_EDGE ( 'NONE', *, *, #134, .T. ) ;
#233 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#234 = APPROVAL_ROLE ( '' ) ;
#235 = APPROVAL ( #209, 'UNSPECIFIED' ) ;
#236 = DATE_AND_TIME ( #2, #226 ) ;
#237 = VERTEX_POINT ( 'NONE', #206 ) ;
#238 = CC_DESIGN_DATE_AND_TIME_ASSIGNMENT ( #216, #106, ( #96 ) ) ;
#239 = ADVANCED_BREP_SHAPE_REPRESENTATION ( '1120T74_Standard-Wall Steel Unthreaded Pipe Nipple', ( #7, #79 ), #180 ) ;
#240 = VERTEX_POINT ( 'NONE', #205 ) ;
#241 = DATE_AND_TIME ( #4, #49 ) ;
#242 = ORIENTED_EDGE ( 'NONE', *, *, #199, .F. ) ;
#243 = ORIENTED_EDGE ( 'NONE', *, *, #39, .F. ) ;
#244 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#245 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#246 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#247 = ORIENTED_EDGE ( 'NONE', *, *, #111, .T. ) ;
#248 = ADVANCED_FACE ( 'NONE', ( #57 ), #104, .F. ) ;
#249 = MECHANICAL_CONTEXT ( 'NONE', #169, 'mechanical' ) ;
#250 = SHAPE_DEFINITION_REPRESENTATION ( #214, #239 ) ;
#251 = FACE_OUTER_BOUND ( 'NONE', #195, .T. ) ;
#252 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
ENDSEC;
END-ISO-10303-21;

View File

@ -0,0 +1,935 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION (( 'STEP AP203' ),
'1' );
FILE_NAME ('68095K348_Low-Pressure Steel Unthreaded Pipe Flange.STEP',
'2023-02-07T16:53:08',
( 'Administrator' ),
( 'Managed by Terraform' ),
'SwSTEP 2.0',
'SolidWorks 2017',
'' );
FILE_SCHEMA (( 'CONFIG_CONTROL_DESIGN' ));
ENDSEC;
DATA;
#1 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#2 = PLANE ( 'NONE', #478 ) ;
#3 = DIRECTION ( 'NONE', ( 1.224646799147353200E-016, 1.000000000000000000, 0.0000000000000000000 ) ) ;
#4 = PERSON_AND_ORGANIZATION_ROLE ( 'design_owner' ) ;
#5 = ADVANCED_FACE ( 'NONE', ( #454 ), #796, .F. ) ;
#6 = EDGE_LOOP ( 'NONE', ( #731, #231, #839, #562 ) ) ;
#7 = EDGE_LOOP ( 'NONE', ( #351, #304, #227, #362 ) ) ;
#8 = FACE_OUTER_BOUND ( 'NONE', #275, .T. ) ;
#9 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#10 = EDGE_CURVE ( 'NONE', #561, #199, #238, .T. ) ;
#11 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#12 = ORIENTED_EDGE ( 'NONE', *, *, #105, .F. ) ;
#13 = ORIENTED_EDGE ( 'NONE', *, *, #197, .F. ) ;
#14 = CIRCLE ( 'NONE', #559, 0.05999999999999990800 ) ;
#15 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, -0.0000000000000000000 ) ) ;
#16 = DATE_AND_TIME ( #483, #678 ) ;
#17 = CIRCLE ( 'NONE', #51, 3.000000000000000400 ) ;
#18 = AXIS2_PLACEMENT_3D ( 'NONE', #250, #616, #825 ) ;
#19 = EDGE_CURVE ( 'NONE', #574, #144, #56, .T. ) ;
#20 = AXIS2_PLACEMENT_3D ( 'NONE', #1, #845, #205 ) ;
#21 = ORIENTED_EDGE ( 'NONE', *, *, #764, .F. ) ;
#22 = CARTESIAN_POINT ( 'NONE', ( 1.583083515873356900, 0.0000000000000000000, -0.4350000000000001600 ) ) ;
#23 = ORIENTED_EDGE ( 'NONE', *, *, #682, .T. ) ;
#24 = FACE_OUTER_BOUND ( 'NONE', #7, .T. ) ;
#25 = EDGE_CURVE ( 'NONE', #691, #614, #607, .T. ) ;
#26 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#27 = VERTEX_POINT ( 'NONE', #760 ) ;
#28 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#29 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#30 = AXIS2_PLACEMENT_3D ( 'NONE', #797, #584, #660 ) ;
#31 = VERTEX_POINT ( 'NONE', #809 ) ;
#32 = EDGE_LOOP ( 'NONE', ( #13, #696, #367, #300 ) ) ;
#33 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#34 = VECTOR ( 'NONE', #158, 39.37007874015748100 ) ;
#35 = VECTOR ( 'NONE', #541, 39.37007874015748100 ) ;
#36 = EDGE_CURVE ( 'NONE', #768, #849, #78, .T. ) ;
#37 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 2.375000000000000000, -0.6250000000000003300 ) ) ;
#38 = CARTESIAN_POINT ( 'NONE', ( 2.000000000000000000, 7.730582919617667100E-016, 0.3150000000000000600 ) ) ;
#39 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.3750000000000000600 ) ) ;
#40 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#41 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#42 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.3150000000000002800 ) ) ;
#43 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.6250000000000003300 ) ) ;
#44 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#45 = ORIENTED_EDGE ( 'NONE', *, *, #898, .T. ) ;
#46 = ORIENTED_EDGE ( 'NONE', *, *, #558, .T. ) ;
#47 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#48 = VECTOR ( 'NONE', #826, 39.37007874015748100 ) ;
#49 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#50 = ORIENTED_EDGE ( 'NONE', *, *, #223, .T. ) ;
#51 = AXIS2_PLACEMENT_3D ( 'NONE', #42, #404, #40 ) ;
#52 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#53 = ORIENTED_EDGE ( 'NONE', *, *, #605, .T. ) ;
#54 = CARTESIAN_POINT ( 'NONE', ( -2.940000000000000400, 3.637200993467639100E-016, -0.3750000000000001700 ) ) ;
#55 = EDGE_CURVE ( 'NONE', #199, #777, #245, .T. ) ;
#56 = CIRCLE ( 'NONE', #431, 1.505773112999396800 ) ;
#57 = ORIENTED_EDGE ( 'NONE', *, *, #487, .T. ) ;
#58 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#59 = VECTOR ( 'NONE', #97, 39.37007874015748100 ) ;
#60 = APPROVAL_DATE_TIME ( #310, #139 ) ;
#61 = TOROIDAL_SURFACE ( 'NONE', #253, 2.940000000000000400, 0.05999999999999999800 ) ;
#62 = ORIENTED_EDGE ( 'NONE', *, *, #537, .T. ) ;
#63 =( NAMED_UNIT ( * ) PLANE_ANGLE_UNIT ( ) SI_UNIT ( $, .RADIAN. ) );
#64 = AXIS2_PLACEMENT_3D ( 'NONE', #549, #184, #557 ) ;
#65 = APPLICATION_PROTOCOL_DEFINITION ( 'international standard', 'config_control_design', 1994, #279 ) ;
#66 = APPLICATION_PROTOCOL_DEFINITION ( 'international standard', 'config_control_design', 1994, #569 ) ;
#67 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#68 = EDGE_CURVE ( 'NONE', #786, #90, #518, .T. ) ;
#69 = VERTEX_POINT ( 'NONE', #672 ) ;
#70 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.3750000000000000600 ) ) ;
#71 = ORIENTED_EDGE ( 'NONE', *, *, #682, .F. ) ;
#72 = CC_DESIGN_SECURITY_CLASSIFICATION ( #899, ( #508 ) ) ;
#73 = FACE_OUTER_BOUND ( 'NONE', #379, .T. ) ;
#74 = ORIENTED_EDGE ( 'NONE', *, *, #260, .T. ) ;
#75 = DIRECTION ( 'NONE', ( 0.1218693434051478800, 0.0000000000000000000, 0.9925461516413219800 ) ) ;
#76 = EDGE_CURVE ( 'NONE', #398, #578, #896, .T. ) ;
#77 = CARTESIAN_POINT ( 'NONE', ( -0.3749999999999996700, -2.375000000000000000, -0.6250000000000003300 ) ) ;
#78 = CIRCLE ( 'NONE', #774, 0.3749999999999999400 ) ;
#79 = CARTESIAN_POINT ( 'NONE', ( 0.3749999999999999400, 2.375000000000000000, -0.3750000000000001700 ) ) ;
#80 = ORIENTED_EDGE ( 'NONE', *, *, #700, .F. ) ;
#81 = AXIS2_PLACEMENT_3D ( 'NONE', #396, #256, #900 ) ;
#82 = FACE_OUTER_BOUND ( 'NONE', #192, .T. ) ;
#83 = PERSON_AND_ORGANIZATION ( #164, #907 ) ;
#84 = FACE_OUTER_BOUND ( 'NONE', #251, .T. ) ;
#85 = ADVANCED_FACE ( 'NONE', ( #679 ), #221, .F. ) ;
#86 = CARTESIAN_POINT ( 'NONE', ( -2.000000000000000000, -4.362804221962446100E-016, -0.3750000000000001700 ) ) ;
#87 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.4350000000000001600 ) ) ;
#88 = EDGE_CURVE ( 'NONE', #407, #263, #917, .T. ) ;
#89 = CARTESIAN_POINT ( 'NONE', ( -2.375000000000000000, -4.362804221962446100E-016, 0.3150000000000000600 ) ) ;
#90 = VERTEX_POINT ( 'NONE', #464 ) ;
#91 = VERTEX_POINT ( 'NONE', #765 ) ;
#92 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#93 = LINE ( 'NONE', #220, #543 ) ;
#94 = AXIS2_PLACEMENT_3D ( 'NONE', #70, #882, #335 ) ;
#95 = CARTESIAN_POINT ( 'NONE', ( -1.220000000000000000, 1.494069094959770800E-016, -0.6250000000000000000 ) ) ;
#96 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#97 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#98 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#99 = CARTESIAN_POINT ( 'NONE', ( -0.3749999999999996700, -2.375000000000000000, -0.3750000000000001700 ) ) ;
#100 = AXIS2_PLACEMENT_3D ( 'NONE', #662, #875, #597 ) ;
#101 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#102 = ORIENTED_EDGE ( 'NONE', *, *, #823, .T. ) ;
#103 = ORIENTED_EDGE ( 'NONE', *, *, #105, .T. ) ;
#104 = TOROIDAL_SURFACE ( 'NONE', #162, 1.583083515873356900, 0.05999999999999999800 ) ;
#105 = EDGE_CURVE ( 'NONE', #31, #506, #17, .T. ) ;
#106 = PERSON_AND_ORGANIZATION ( #164, #907 ) ;
#107 = CIRCLE ( 'NONE', #425, 0.05999999999999997700 ) ;
#108 = CARTESIAN_POINT ( 'NONE', ( 2.000000000000000000, 7.730582919617667100E-016, -0.3750000000000001700 ) ) ;
#109 = CARTESIAN_POINT ( 'NONE', ( 2.375000000000000000, 7.271340369937410300E-016, -0.6250000000000003300 ) ) ;
#110 = DIRECTION ( 'NONE', ( 0.0000000000000000000, -1.000000000000000000, 0.0000000000000000000 ) ) ;
#111 = AXIS2_PLACEMENT_3D ( 'NONE', #273, #783, #631 ) ;
#112 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#113 = ORIENTED_EDGE ( 'NONE', *, *, #749, .T. ) ;
#114 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.3750000000000001700 ) ) ;
#115 = ORIENTED_EDGE ( 'NONE', *, *, #516, .F. ) ;
#116 = DATE_AND_TIME ( #883, #295 ) ;
#117 = FACE_BOUND ( 'NONE', #210, .T. ) ;
#118 = EDGE_CURVE ( 'NONE', #768, #91, #172, .T. ) ;
#119 = ORIENTED_EDGE ( 'NONE', *, *, #338, .F. ) ;
#120 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#121 = AXIS2_PLACEMENT_3D ( 'NONE', #773, #633, #264 ) ;
#122 = EDGE_LOOP ( 'NONE', ( #538, #46, #315, #481 ) ) ;
#123 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#124 = EDGE_CURVE ( 'NONE', #427, #674, #266, .T. ) ;
#125 = EDGE_LOOP ( 'NONE', ( #442, #525, #634, #134 ) ) ;
#126 = EDGE_LOOP ( 'NONE', ( #102, #816 ) ) ;
#127 = DIRECTION ( 'NONE', ( -1.000000000000000000, -1.224646799147359900E-016, 0.0000000000000000000 ) ) ;
#128 = CIRCLE ( 'NONE', #261, 0.3749999999999999400 ) ;
#129 = LINE ( 'NONE', #503, #638 ) ;
#130 = ORIENTED_EDGE ( 'NONE', *, *, #664, .F. ) ;
#131 = AXIS2_PLACEMENT_3D ( 'NONE', #880, #174, #762 ) ;
#132 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#133 = EDGE_CURVE ( 'NONE', #506, #31, #343, .T. ) ;
#134 = ORIENTED_EDGE ( 'NONE', *, *, #605, .F. ) ;
#135 = ORIENTED_EDGE ( 'NONE', *, *, #19, .T. ) ;
#136 = LINE ( 'NONE', #843, #148 ) ;
#137 = FACE_OUTER_BOUND ( 'NONE', #738, .T. ) ;
#138 = APPROVAL_STATUS ( 'not_yet_approved' ) ;
#139 = APPROVAL ( #350, 'UNSPECIFIED' ) ;
#140 = APPROVAL_ROLE ( '' ) ;
#141 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#142 = AXIS2_PLACEMENT_3D ( 'NONE', #222, #868, #746 ) ;
#143 = ORIENTED_EDGE ( 'NONE', *, *, #305, .T. ) ;
#144 = VERTEX_POINT ( 'NONE', #393 ) ;
#145 = CYLINDRICAL_SURFACE ( 'NONE', #601, 1.220000000000000000 ) ;
#146 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#147 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.3150000000000000600 ) ) ;
#148 = VECTOR ( 'NONE', #594, 39.37007874015748100 ) ;
#149 = CIRCLE ( 'NONE', #142, 0.05999999999999990800 ) ;
#150 = EDGE_CURVE ( 'NONE', #437, #27, #567, .T. ) ;
#151 = ADVANCED_FACE ( 'NONE', ( #736 ), #61, .T. ) ;
#152 = CARTESIAN_POINT ( 'NONE', ( 2.940000000000000400, 0.0000000000000000000, -0.3750000000000001700 ) ) ;
#153 = ORIENTED_EDGE ( 'NONE', *, *, #68, .T. ) ;
#154 = AXIS2_PLACEMENT_3D ( 'NONE', #37, #461, #324 ) ;
#155 = ORIENTED_EDGE ( 'NONE', *, *, #36, .F. ) ;
#156 = CIRCLE ( 'NONE', #492, 3.000000000000000400 ) ;
#157 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#158 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#159 = ADVANCED_FACE ( 'NONE', ( #668 ), #276, .F. ) ;
#160 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#161 = EDGE_CURVE ( 'NONE', #578, #398, #761, .T. ) ;
#162 = AXIS2_PLACEMENT_3D ( 'NONE', #547, #734, #289 ) ;
#163 = CARTESIAN_POINT ( 'NONE', ( -2.375000000000000000, -4.362804221962446100E-016, -0.3750000000000001700 ) ) ;
#164 = PERSON ( 'UNSPECIFIED', 'UNSPECIFIED', 'UNSPECIFIED', ('UNSPECIFIED'), ('UNSPECIFIED'), ('UNSPECIFIED') ) ;
#165 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.6250000000000001100 ) ) ;
#166 = EDGE_LOOP ( 'NONE', ( #645, #168 ) ) ;
#167 = EDGE_CURVE ( 'NONE', #262, #772, #851, .T. ) ;
#168 = ORIENTED_EDGE ( 'NONE', *, *, #779, .T. ) ;
#169 = FACE_BOUND ( 'NONE', #126, .T. ) ;
#170 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#171 = SHAPE_DEFINITION_REPRESENTATION ( #445, #236 ) ;
#172 = LINE ( 'NONE', #694, #35 ) ;
#173 = AXIS2_PLACEMENT_3D ( 'NONE', #895, #886, #539 ) ;
#174 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#175 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#176 = ORIENTED_EDGE ( 'NONE', *, *, #450, .T. ) ;
#177 = CONICAL_SURFACE ( 'NONE', #364, 1.499303859774273800, 0.1221730476396034700 ) ;
#178 = EDGE_CURVE ( 'NONE', #614, #574, #460, .T. ) ;
#179 = DIRECTION ( 'NONE', ( -1.224646799147353200E-016, 1.000000000000000000, 0.0000000000000000000 ) ) ;
#180 = FACE_OUTER_BOUND ( 'NONE', #586, .T. ) ;
#181 = EDGE_LOOP ( 'NONE', ( #377, #252, #787, #115 ) ) ;
#182 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#183 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#184 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#185 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.3150000000000000600 ) ) ;
#186 = EDGE_LOOP ( 'NONE', ( #359, #595, #365, #353 ) ) ;
#187 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#188 = EDGE_LOOP ( 'NONE', ( #176, #771 ) ) ;
#189 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.3750000000000000600 ) ) ;
#190 = FACE_BOUND ( 'NONE', #685, .T. ) ;
#191 = AXIS2_PLACEMENT_3D ( 'NONE', #189, #194, #891 ) ;
#192 = EDGE_LOOP ( 'NONE', ( #292, #573, #626, #417 ) ) ;
#193 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#194 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#195 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.3750000000000001700 ) ) ;
#196 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#197 = EDGE_CURVE ( 'NONE', #485, #540, #780, .T. ) ;
#198 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#199 = VERTEX_POINT ( 'NONE', #474 ) ;
#200 = ORIENTED_EDGE ( 'NONE', *, *, #55, .F. ) ;
#201 = CIRCLE ( 'NONE', #397, 1.583083515873356900 ) ;
#202 = PERSON_AND_ORGANIZATION ( #164, #907 ) ;
#203 = CIRCLE ( 'NONE', #726, 1.870000000000000100 ) ;
#204 = AXIS2_PLACEMENT_3D ( 'NONE', #466, #41, #888 ) ;
#205 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#206 = SECURITY_CLASSIFICATION_LEVEL ( 'unclassified' ) ;
#207 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#208 = EDGE_CURVE ( 'NONE', #376, #777, #156, .T. ) ;
#209 = VERTEX_POINT ( 'NONE', #401 ) ;
#210 = EDGE_LOOP ( 'NONE', ( #847, #53 ) ) ;
#211 = CIRCLE ( 'NONE', #173, 0.3749999999999999400 ) ;
#212 = EDGE_CURVE ( 'NONE', #540, #554, #327, .T. ) ;
#213 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#214 = ORIENTED_EDGE ( 'NONE', *, *, #208, .F. ) ;
#215 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#216 = AXIS2_PLACEMENT_3D ( 'NONE', #456, #29, #813 ) ;
#217 = ORIENTED_EDGE ( 'NONE', *, *, #850, .T. ) ;
#218 = EDGE_LOOP ( 'NONE', ( #712, #135, #306, #698 ) ) ;
#219 = FACE_BOUND ( 'NONE', #544, .T. ) ;
#220 = CARTESIAN_POINT ( 'NONE', ( -1.220000000000000000, 1.494069094959770800E-016, 0.3750000000000000600 ) ) ;
#221 = CYLINDRICAL_SURFACE ( 'NONE', #676, 0.3749999999999999400 ) ;
#222 = CARTESIAN_POINT ( 'NONE', ( -2.940000000000000400, 3.600461589493218800E-016, -0.3150000000000002800 ) ) ;
#223 = EDGE_CURVE ( 'NONE', #674, #427, #531, .T. ) ;
#224 = ADVANCED_FACE ( 'NONE', ( #84, #842 ), #2, .F. ) ;
#225 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#226 = EDGE_LOOP ( 'NONE', ( #513, #534 ) ) ;
#227 = ORIENTED_EDGE ( 'NONE', *, *, #167, .F. ) ;
#228 = CIRCLE ( 'NONE', #204, 0.3749999999999999400 ) ;
#229 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#230 = CARTESIAN_POINT ( 'NONE', ( -1.583083515873356900, 1.938718160497244600E-016, -0.3750000000000001700 ) ) ;
#231 = ORIENTED_EDGE ( 'NONE', *, *, #794, .F. ) ;
#232 = CARTESIAN_POINT ( 'NONE', ( 1.870000000000000100, 2.290089514405550600E-016, 0.3750000000000000600 ) ) ;
#233 = AXIS2_PLACEMENT_3D ( 'NONE', #766, #52, #329 ) ;
#234 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.6250000000000000000 ) ) ;
#235 = CARTESIAN_POINT ( 'NONE', ( 3.000000000000000400, 0.0000000000000000000, 0.3750000000000000600 ) ) ;
#236 = ADVANCED_BREP_SHAPE_REPRESENTATION ( '68095K348_Low-Pressure Steel Unthreaded Pipe Flange', ( #866, #20 ), #904 ) ;
#237 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#238 = CIRCLE ( 'NONE', #383, 2.940000000000000400 ) ;
#239 = EDGE_CURVE ( 'NONE', #348, #767, #872, .T. ) ;
#240 = EDGE_LOOP ( 'NONE', ( #818, #74 ) ) ;
#241 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#242 = LINE ( 'NONE', #604, #59 ) ;
#243 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#244 = VECTOR ( 'NONE', #96, 39.37007874015748100 ) ;
#245 = CIRCLE ( 'NONE', #890, 0.06000000000000001200 ) ;
#246 = ORIENTED_EDGE ( 'NONE', *, *, #717, .F. ) ;
#247 = CARTESIAN_POINT ( 'NONE', ( 1.446220343900916900, 0.0000000000000000000, -0.5650000000000001700 ) ) ;
#248 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#249 = AXIS2_PLACEMENT_3D ( 'NONE', #89, #366, #865 ) ;
#250 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.3150000000000002800 ) ) ;
#251 = EDGE_LOOP ( 'NONE', ( #806, #455 ) ) ;
#252 = ORIENTED_EDGE ( 'NONE', *, *, #178, .T. ) ;
#253 = AXIS2_PLACEMENT_3D ( 'NONE', #331, #44, #684 ) ;
#254 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#255 = FACE_OUTER_BOUND ( 'NONE', #125, .T. ) ;
#256 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#257 = CC_DESIGN_DATE_AND_TIME_ASSIGNMENT ( #509, #346, ( #473 ) ) ;
#258 = CARTESIAN_POINT ( 'NONE', ( -1.499303859774273800, 1.836117672821836400E-016, -0.6250000000000003300 ) ) ;
#259 = EDGE_LOOP ( 'NONE', ( #666, #130, #153, #71 ) ) ;
#260 = EDGE_CURVE ( 'NONE', #743, #348, #370, .T. ) ;
#261 = AXIS2_PLACEMENT_3D ( 'NONE', #612, #175, #532 ) ;
#262 = VERTEX_POINT ( 'NONE', #472 ) ;
#263 = VERTEX_POINT ( 'NONE', #490 ) ;
#264 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#265 = FACE_OUTER_BOUND ( 'NONE', #6, .T. ) ;
#266 = CIRCLE ( 'NONE', #334, 2.940000000000000400 ) ;
#267 = AXIS2_PLACEMENT_3D ( 'NONE', #480, #546, #254 ) ;
#268 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#269 = ADVANCED_FACE ( 'NONE', ( #180 ), #412, .T. ) ;
#270 = DIRECTION ( 'NONE', ( 0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#271 = EDGE_CURVE ( 'NONE', #91, #856, #471, .T. ) ;
#272 = PERSON_AND_ORGANIZATION_ROLE ( 'design_supplier' ) ;
#273 = CARTESIAN_POINT ( 'NONE', ( -2.375000000000000000, -4.362804221962446100E-016, -0.3750000000000001700 ) ) ;
#274 = ORIENTED_EDGE ( 'NONE', *, *, #823, .F. ) ;
#275 = EDGE_LOOP ( 'NONE', ( #323, #143, #689, #655 ) ) ;
#276 = TOROIDAL_SURFACE ( 'NONE', #318, 1.870000000000000100, 0.05999999999999999800 ) ;
#277 = CARTESIAN_POINT ( 'NONE', ( -2.750000000000000000, -3.903561672282188800E-016, -0.3750000000000001700 ) ) ;
#278 = AXIS2_PLACEMENT_3D ( 'NONE', #147, #213, #858 ) ;
#279 = APPLICATION_CONTEXT ( 'configuration controlled 3d designs of mechanical parts and assemblies' ) ;
#280 = AXIS2_PLACEMENT_3D ( 'NONE', #406, #572, #579 ) ;
#281 = ORIENTED_EDGE ( 'NONE', *, *, #516, .T. ) ;
#282 = ORIENTED_EDGE ( 'NONE', *, *, #414, .F. ) ;
#283 = ADVANCED_FACE ( 'NONE', ( #821 ), #391, .F. ) ;
#284 = CIRCLE ( 'NONE', #357, 0.3749999999999999400 ) ;
#285 = APPROVAL_DATE_TIME ( #116, #654 ) ;
#286 = TOROIDAL_SURFACE ( 'NONE', #381, 1.583083515873356900, 0.05999999999999999800 ) ;
#287 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#288 = EDGE_CURVE ( 'NONE', #209, #757, #860, .T. ) ;
#289 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#290 = AXIS2_PLACEMENT_3D ( 'NONE', #416, #706, #707 ) ;
#291 = ADVANCED_FACE ( 'NONE', ( #337 ), #611, .F. ) ;
#292 = ORIENTED_EDGE ( 'NONE', *, *, #867, .F. ) ;
#293 = EDGE_LOOP ( 'NONE', ( #807, #441 ) ) ;
#294 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#295 = LOCAL_TIME ( 10, 53, 8.000000000000000000, #637 ) ;
#296 = CYLINDRICAL_SURFACE ( 'NONE', #100, 3.000000000000000400 ) ;
#297 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#298 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 2.375000000000000000, 0.3150000000000000600 ) ) ;
#299 = AXIS2_PLACEMENT_3D ( 'NONE', #185, #67, #132 ) ;
#300 = ORIENTED_EDGE ( 'NONE', *, *, #212, .F. ) ;
#301 = CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT ( #517, #785, ( #508 ) ) ;
#302 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#303 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#304 = ORIENTED_EDGE ( 'NONE', *, *, #764, .T. ) ;
#305 = EDGE_CURVE ( 'NONE', #398, #263, #93, .T. ) ;
#306 = ORIENTED_EDGE ( 'NONE', *, *, #322, .T. ) ;
#307 = AXIS2_PLACEMENT_3D ( 'NONE', #352, #486, #58 ) ;
#308 = ORIENTED_EDGE ( 'NONE', *, *, #664, .T. ) ;
#309 = LINE ( 'NONE', #727, #915 ) ;
#310 = DATE_AND_TIME ( #841, #389 ) ;
#311 = CARTESIAN_POINT ( 'NONE', ( 1.220000000000000000, 0.0000000000000000000, 0.3750000000000000600 ) ) ;
#312 = DESIGN_CONTEXT ( 'detailed design', #569, 'design' ) ;
#313 = TOROIDAL_SURFACE ( 'NONE', #661, 1.446220343900916900, 0.05999999999999999800 ) ;
#314 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#315 = ORIENTED_EDGE ( 'NONE', *, *, #271, .F. ) ;
#316 = EDGE_LOOP ( 'NONE', ( #113, #468 ) ) ;
#317 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#318 = AXIS2_PLACEMENT_3D ( 'NONE', #624, #182, #477 ) ;
#319 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#320 = EDGE_LOOP ( 'NONE', ( #339, #217, #491, #408 ) ) ;
#321 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.3750000000000000600 ) ) ;
#322 = EDGE_CURVE ( 'NONE', #144, #90, #129, .T. ) ;
#323 = ORIENTED_EDGE ( 'NONE', *, *, #76, .F. ) ;
#324 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#325 = EDGE_LOOP ( 'NONE', ( #527, #914 ) ) ;
#326 = DATE_AND_TIME ( #566, #529 ) ;
#327 = CIRCLE ( 'NONE', #290, 0.05999999999999997700 ) ;
#328 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.4276878393956912200 ) ) ;
#329 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#330 = CARTESIAN_POINT ( 'NONE', ( 1.446220343900916900, 0.0000000000000000000, -0.6250000000000001100 ) ) ;
#331 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.2550000000000000600 ) ) ;
#332 = VERTEX_POINT ( 'NONE', #79 ) ;
#333 = EDGE_LOOP ( 'NONE', ( #21, #274, #621, #596 ) ) ;
#334 = AXIS2_PLACEMENT_3D ( 'NONE', #628, #112, #897 ) ;
#335 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#336 = LINE ( 'NONE', #77, #34 ) ;
#337 = FACE_OUTER_BOUND ( 'NONE', #186, .T. ) ;
#338 = EDGE_CURVE ( 'NONE', #856, #91, #714, .T. ) ;
#339 = ORIENTED_EDGE ( 'NONE', *, *, #260, .F. ) ;
#340 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#341 = ORIENTED_EDGE ( 'NONE', *, *, #133, .F. ) ;
#342 = LINE ( 'NONE', #235, #244 ) ;
#343 = CIRCLE ( 'NONE', #18, 3.000000000000000400 ) ;
#344 = AXIS2_PLACEMENT_3D ( 'NONE', #399, #909, #127 ) ;
#345 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.3750000000000001700 ) ) ;
#346 = DATE_TIME_ROLE ( 'creation_date' ) ;
#347 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#348 = VERTEX_POINT ( 'NONE', #86 ) ;
#349 = AXIS2_PLACEMENT_3D ( 'NONE', #22, #522, #600 ) ;
#350 = APPROVAL_STATUS ( 'not_yet_approved' ) ;
#351 = ORIENTED_EDGE ( 'NONE', *, *, #150, .F. ) ;
#352 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.6250000000000001100 ) ) ;
#353 = ORIENTED_EDGE ( 'NONE', *, *, #88, .T. ) ;
#354 = FACE_BOUND ( 'NONE', #226, .T. ) ;
#355 = EDGE_CURVE ( 'NONE', #348, #743, #433, .T. ) ;
#356 = LENGTH_MEASURE_WITH_UNIT ( LENGTH_MEASURE( 0.02539999999999999900 ), #709 );
#357 = AXIS2_PLACEMENT_3D ( 'NONE', #392, #241, #317 ) ;
#358 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#359 = ORIENTED_EDGE ( 'NONE', *, *, #305, .F. ) ;
#360 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 3.000000000000000400, 0.3150000000000000600 ) ) ;
#361 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#362 = ORIENTED_EDGE ( 'NONE', *, *, #652, .F. ) ;
#363 = CARTESIAN_POINT ( 'NONE', ( -2.375000000000000000, -4.362804221962446100E-016, -0.6250000000000003300 ) ) ;
#364 = AXIS2_PLACEMENT_3D ( 'NONE', #43, #193, #835 ) ;
#365 = ORIENTED_EDGE ( 'NONE', *, *, #570, .T. ) ;
#366 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#367 = ORIENTED_EDGE ( 'NONE', *, *, #805, .F. ) ;
#368 = TOROIDAL_SURFACE ( 'NONE', #216, 2.940000000000000400, 0.05999999999999999800 ) ;
#369 = PERSON_AND_ORGANIZATION ( #164, #907 ) ;
#370 = CIRCLE ( 'NONE', #111, 0.3749999999999999400 ) ;
#371 = CARTESIAN_POINT ( 'NONE', ( 1.583083515873356900, 0.0000000000000000000, -0.3750000000000001700 ) ) ;
#372 = EDGE_CURVE ( 'NONE', #777, #376, #801, .T. ) ;
#373 = ORIENTED_EDGE ( 'NONE', *, *, #161, .T. ) ;
#374 = PLANE ( 'NONE', #815 ) ;
#375 = ADVANCED_FACE ( 'NONE', ( #589 ), #484, .F. ) ;
#376 = VERTEX_POINT ( 'NONE', #444 ) ;
#377 = ORIENTED_EDGE ( 'NONE', *, *, #901, .F. ) ;
#378 = CIRCLE ( 'NONE', #803, 1.220000000000000000 ) ;
#379 = EDGE_LOOP ( 'NONE', ( #421, #57, #12, #828 ) ) ;
#380 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#381 = AXIS2_PLACEMENT_3D ( 'NONE', #87, #877, #593 ) ;
#382 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.3150000000000002800 ) ) ;
#383 = AXIS2_PLACEMENT_3D ( 'NONE', #817, #319, #887 ) ;
#384 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#385 = ORIENTED_EDGE ( 'NONE', *, *, #715, .T. ) ;
#386 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#387 = EDGE_LOOP ( 'NONE', ( #373, #711 ) ) ;
#388 = FACE_BOUND ( 'NONE', #325, .T. ) ;
#389 = LOCAL_TIME ( 10, 53, 8.000000000000000000, #735 ) ;
#390 = DIRECTION ( 'NONE', ( -1.000000000000000000, -1.224646799147354900E-016, 0.0000000000000000000 ) ) ;
#391 = CYLINDRICAL_SURFACE ( 'NONE', #280, 0.3749999999999999400 ) ;
#392 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 2.375000000000000000, -0.3750000000000001700 ) ) ;
#393 = CARTESIAN_POINT ( 'NONE', ( 1.505773112999396800, 0.0000000000000000000, -0.5723121606043081200 ) ) ;
#394 = CARTESIAN_POINT ( 'NONE', ( 2.940000000000000400, 3.637200993467639100E-016, 0.3150000000000000600 ) ) ;
#395 = AXIS2_PLACEMENT_3D ( 'NONE', #345, #268, #207 ) ;
#396 = CARTESIAN_POINT ( 'NONE', ( 2.908536147974963700E-016, -2.375000000000000000, 0.3150000000000000600 ) ) ;
#397 = AXIS2_PLACEMENT_3D ( 'NONE', #114, #463, #384 ) ;
#398 = VERTEX_POINT ( 'NONE', #95 ) ;
#399 = CARTESIAN_POINT ( 'NONE', ( 2.940000000000000400, 3.600461589493218800E-016, 0.2550000000000000600 ) ) ;
#400 = ORIENTED_EDGE ( 'NONE', *, *, #913, .F. ) ;
#401 = CARTESIAN_POINT ( 'NONE', ( -0.3749999999999999400, 2.375000000000000000, 0.3150000000000000600 ) ) ;
#402 = CIRCLE ( 'NONE', #278, 2.940000000000000400 ) ;
#403 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#404 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#405 = EDGE_CURVE ( 'NONE', #427, #31, #831, .T. ) ;
#406 = CARTESIAN_POINT ( 'NONE', ( 2.375000000000000000, 7.271340369937410300E-016, -0.6250000000000003300 ) ) ;
#407 = VERTEX_POINT ( 'NONE', #669 ) ;
#408 = ORIENTED_EDGE ( 'NONE', *, *, #239, .F. ) ;
#409 = ADVANCED_FACE ( 'NONE', ( #137 ), #296, .T. ) ;
#410 = AXIS2_PLACEMENT_3D ( 'NONE', #195, #403, #47 ) ;
#411 = CIRCLE ( 'NONE', #533, 1.810000000000000100 ) ;
#412 = CONICAL_SURFACE ( 'NONE', #613, 1.499303859774273800, 0.1221730476396034700 ) ;
#413 = CARTESIAN_POINT ( 'NONE', ( -2.000000000000000000, -4.362804221962446100E-016, -0.6250000000000003300 ) ) ;
#414 = EDGE_CURVE ( 'NONE', #90, #69, #688, .T. ) ;
#415 = PERSON_AND_ORGANIZATION_ROLE ( 'classification_officer' ) ;
#416 = CARTESIAN_POINT ( 'NONE', ( -1.870000000000000100, 0.0000000000000000000, 0.3750000000000000600 ) ) ;
#417 = ORIENTED_EDGE ( 'NONE', *, *, #208, .T. ) ;
#418 = VERTEX_POINT ( 'NONE', #524 ) ;
#419 = CYLINDRICAL_SURFACE ( 'NONE', #592, 0.3749999999999999400 ) ;
#420 = ADVANCED_FACE ( 'NONE', ( #908, #495 ), #374, .F. ) ;
#421 = ORIENTED_EDGE ( 'NONE', *, *, #223, .F. ) ;
#422 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.3750000000000000600 ) ) ;
#423 =( CONVERSION_BASED_UNIT ( 'INCH', #356 ) LENGTH_UNIT ( ) NAMED_UNIT ( #581 ) );
#424 = DIRECTION ( 'NONE', ( -1.000000000000000000, 1.224646799147354900E-016, 0.0000000000000000000 ) ) ;
#425 = AXIS2_PLACEMENT_3D ( 'NONE', #247, #110, #615 ) ;
#426 = ADVANCED_FACE ( 'NONE', ( #724 ), #702, .T. ) ;
#427 = VERTEX_POINT ( 'NONE', #152 ) ;
#428 = ORIENTED_EDGE ( 'NONE', *, *, #794, .T. ) ;
#429 = LINE ( 'NONE', #258, #555 ) ;
#430 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.3750000000000000600 ) ) ;
#431 = AXIS2_PLACEMENT_3D ( 'NONE', #751, #671, #98 ) ;
#432 = CALENDAR_DATE ( 2023, 7, 2 ) ;
#433 = CIRCLE ( 'NONE', #550, 0.3749999999999999400 ) ;
#434 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.5650000000000001700 ) ) ;
#435 = ADVANCED_FACE ( 'NONE', ( #747 ), #286, .F. ) ;
#436 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 2.375000000000000000, -0.6250000000000003300 ) ) ;
#437 = VERTEX_POINT ( 'NONE', #99 ) ;
#438 = CARTESIAN_POINT ( 'NONE', ( -3.000000000000000400, 3.673940397442060400E-016, 0.2550000000000000600 ) ) ;
#439 = AXIS2_PLACEMENT_3D ( 'NONE', #430, #854, #852 ) ;
#440 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, -0.0000000000000000000 ) ) ;
#441 = ORIENTED_EDGE ( 'NONE', *, *, #520, .T. ) ;
#442 = ORIENTED_EDGE ( 'NONE', *, *, #850, .F. ) ;
#443 = CYLINDRICAL_SURFACE ( 'NONE', #94, 3.000000000000000400 ) ;
#444 = CARTESIAN_POINT ( 'NONE', ( 3.000000000000000400, 0.0000000000000000000, 0.2550000000000000600 ) ) ;
#445 = PRODUCT_DEFINITION_SHAPE ( 'NONE', 'NONE', #473 ) ;
#446 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#447 = AXIS2_PLACEMENT_3D ( 'NONE', #832, #916, #781 ) ;
#448 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 1.810000000000000100, 0.3750000000000000600 ) ) ;
#449 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#450 = EDGE_CURVE ( 'NONE', #540, #485, #203, .T. ) ;
#451 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#452 = CARTESIAN_POINT ( 'NONE', ( -2.940000000000000400, 0.0000000000000000000, 0.2550000000000000600 ) ) ;
#453 = CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT ( #106, #4, ( #548 ) ) ;
#454 = FACE_OUTER_BOUND ( 'NONE', #122, .T. ) ;
#455 = ORIENTED_EDGE ( 'NONE', *, *, #901, .T. ) ;
#456 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.2550000000000000600 ) ) ;
#457 = LINE ( 'NONE', #703, #646 ) ;
#458 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#459 = PERSON_AND_ORGANIZATION ( #164, #907 ) ;
#460 = CIRCLE ( 'NONE', #499, 0.05999999999999990800 ) ;
#461 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#462 = AXIS2_PLACEMENT_3D ( 'NONE', #651, #11, #146 ) ;
#463 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#464 = CARTESIAN_POINT ( 'NONE', ( 1.523530746774877300, 0.0000000000000000000, -0.4276878393956912200 ) ) ;
#465 = EDGE_CURVE ( 'NONE', #767, #418, #510, .T. ) ;
#466 = CARTESIAN_POINT ( 'NONE', ( -2.375000000000000000, -4.362804221962446100E-016, 0.3150000000000000600 ) ) ;
#467 = ORIENTED_EDGE ( 'NONE', *, *, #450, .F. ) ;
#468 = ORIENTED_EDGE ( 'NONE', *, *, #10, .T. ) ;
#469 = APPROVAL_DATE_TIME ( #326, #650 ) ;
#470 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#471 = CIRCLE ( 'NONE', #693, 0.3749999999999999400 ) ;
#472 = CARTESIAN_POINT ( 'NONE', ( 0.3750000000000002200, -2.375000000000000000, 0.3150000000000000600 ) ) ;
#473 = PRODUCT_DEFINITION ( 'UNKNOWN', '', #508, #312 ) ;
#474 = CARTESIAN_POINT ( 'NONE', ( -2.940000000000000400, 0.0000000000000000000, 0.3150000000000000600 ) ) ;
#475 = EDGE_LOOP ( 'NONE', ( #608, #155, #793, #119 ) ) ;
#476 = ORIENTED_EDGE ( 'NONE', *, *, #838, .T. ) ;
#477 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#478 = AXIS2_PLACEMENT_3D ( 'NONE', #710, #270, #198 ) ;
#479 = ORIENTED_EDGE ( 'NONE', *, *, #124, .T. ) ;
#480 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.5723121606043081200 ) ) ;
#481 = ORIENTED_EDGE ( 'NONE', *, *, #118, .F. ) ;
#482 = LINE ( 'NONE', #903, #732 ) ;
#483 = CALENDAR_DATE ( 2023, 7, 2 ) ;
#484 = CYLINDRICAL_SURFACE ( 'NONE', #648, 0.3749999999999999400 ) ;
#485 = VERTEX_POINT ( 'NONE', #602 ) ;
#486 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#487 = EDGE_CURVE ( 'NONE', #674, #506, #149, .T. ) ;
#488 =( NAMED_UNIT ( * ) SI_UNIT ( $, .STERADIAN. ) SOLID_ANGLE_UNIT ( ) );
#489 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.6250000000000003300 ) ) ;
#490 = CARTESIAN_POINT ( 'NONE', ( -1.220000000000000000, 1.494069094959770800E-016, 0.3750000000000000600 ) ) ;
#491 = ORIENTED_EDGE ( 'NONE', *, *, #465, .F. ) ;
#492 = AXIS2_PLACEMENT_3D ( 'NONE', #564, #340, #846 ) ;
#493 = ORIENTED_EDGE ( 'NONE', *, *, #487, .F. ) ;
#494 = APPROVAL_PERSON_ORGANIZATION ( #723, #650, #788 ) ;
#495 = FACE_OUTER_BOUND ( 'NONE', #293, .T. ) ;
#496 = DATE_TIME_ROLE ( 'classification_date' ) ;
#497 = CARTESIAN_POINT ( 'NONE', ( -1.583083515873356900, 1.938718160497244600E-016, -0.4350000000000001600 ) ) ;
#498 = ORIENTED_EDGE ( 'NONE', *, *, #700, .T. ) ;
#499 = AXIS2_PLACEMENT_3D ( 'NONE', #690, #833, #551 ) ;
#500 = AXIS2_PLACEMENT_3D ( 'NONE', #298, #303, #449 ) ;
#501 = CARTESIAN_POINT ( 'NONE', ( -2.000000000000000000, -4.362804221962446100E-016, 0.3150000000000000600 ) ) ;
#502 = ORIENTED_EDGE ( 'NONE', *, *, #505, .F. ) ;
#503 = CARTESIAN_POINT ( 'NONE', ( 1.499303859774273800, 0.0000000000000000000, -0.6250000000000003300 ) ) ;
#504 = CARTESIAN_POINT ( 'NONE', ( 0.3749999999999999400, 2.375000000000000000, 0.3150000000000000600 ) ) ;
#505 = EDGE_CURVE ( 'NONE', #485, #665, #556, .T. ) ;
#506 = VERTEX_POINT ( 'NONE', #802 ) ;
#507 = CIRCLE ( 'NONE', #267, 1.505773112999396800 ) ;
#508 = PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE ( 'ANY', '', #548, .NOT_KNOWN. ) ;
#509 = DATE_AND_TIME ( #432, #701 ) ;
#510 = CIRCLE ( 'NONE', #249, 0.3749999999999999400 ) ;
#511 = AXIS2_PLACEMENT_3D ( 'NONE', #836, #187, #120 ) ;
#512 = ADVANCED_FACE ( 'NONE', ( #658 ), #313, .T. ) ;
#513 = ORIENTED_EDGE ( 'NONE', *, *, #36, .T. ) ;
#514 = EDGE_LOOP ( 'NONE', ( #705, #498, #879, #200 ) ) ;
#515 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#516 = EDGE_CURVE ( 'NONE', #691, #144, #107, .T. ) ;
#517 = PERSON_AND_ORGANIZATION ( #164, #907 ) ;
#518 = CIRCLE ( 'NONE', #349, 0.05999999999999997700 ) ;
#519 = DIRECTION ( 'NONE', ( -0.1218693434051478800, 1.492469013153039400E-017, 0.9925461516413219800 ) ) ;
#520 = EDGE_CURVE ( 'NONE', #665, #554, #411, .T. ) ;
#521 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.4276878393956912200 ) ) ;
#522 = DIRECTION ( 'NONE', ( 0.0000000000000000000, -1.000000000000000000, 0.0000000000000000000 ) ) ;
#523 = CC_DESIGN_DATE_AND_TIME_ASSIGNMENT ( #16, #496, ( #899 ) ) ;
#524 = CARTESIAN_POINT ( 'NONE', ( -2.750000000000000000, -3.903561672282188800E-016, 0.3150000000000000600 ) ) ;
#525 = ORIENTED_EDGE ( 'NONE', *, *, #355, .F. ) ;
#526 = CARTESIAN_POINT ( 'NONE', ( 2.375000000000000000, 7.271340369937410300E-016, -0.3750000000000001700 ) ) ;
#527 = ORIENTED_EDGE ( 'NONE', *, *, #271, .T. ) ;
#528 = CIRCLE ( 'NONE', #410, 1.583083515873356900 ) ;
#529 = LOCAL_TIME ( 10, 53, 8.000000000000000000, #542 ) ;
#530 = CARTESIAN_POINT ( 'NONE', ( -1.810000000000000100, 0.0000000000000000000, 0.3750000000000000600 ) ) ;
#531 = CIRCLE ( 'NONE', #395, 2.940000000000000400 ) ;
#532 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#533 = AXIS2_PLACEMENT_3D ( 'NONE', #321, #535, #754 ) ;
#534 = ORIENTED_EDGE ( 'NONE', *, *, #585, .T. ) ;
#535 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#536 = CARTESIAN_POINT ( 'NONE', ( -0.3749999999999999400, 2.375000000000000000, -0.3750000000000001700 ) ) ;
#537 = EDGE_CURVE ( 'NONE', #830, #332, #789, .T. ) ;
#538 = ORIENTED_EDGE ( 'NONE', *, *, #585, .F. ) ;
#539 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#540 = VERTEX_POINT ( 'NONE', #729 ) ;
#541 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#542 = COORDINATED_UNIVERSAL_TIME_OFFSET ( 6, 0, .BEHIND. ) ;
#543 = VECTOR ( 'NONE', #215, 39.37007874015748100 ) ;
#544 = EDGE_LOOP ( 'NONE', ( #45, #869 ) ) ;
#545 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#546 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#547 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.4350000000000001600 ) ) ;
#548 = PRODUCT ( '68095K348_Low-Pressure Steel Unthreaded Pipe Flange', '68095K348_Low-Pressure Steel Unthreaded Pipe Flange', '', ( #571 ) ) ;
#549 = CARTESIAN_POINT ( 'NONE', ( 2.908536147974963700E-016, -2.375000000000000000, -0.3750000000000001700 ) ) ;
#550 = AXIS2_PLACEMENT_3D ( 'NONE', #163, #670, #92 ) ;
#551 = DIRECTION ( 'NONE', ( -1.000000000000000000, 1.224646799147354900E-016, 0.0000000000000000000 ) ) ;
#552 = EDGE_LOOP ( 'NONE', ( #902, #910, #281, #798 ) ) ;
#553 = CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT ( #459, #782, ( #473 ) ) ;
#554 = VERTEX_POINT ( 'NONE', #530 ) ;
#555 = VECTOR ( 'NONE', #519, 39.37007874015748100 ) ;
#556 = CIRCLE ( 'NONE', #912, 0.05999999999999990800 ) ;
#557 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#558 = EDGE_CURVE ( 'NONE', #849, #856, #778, .T. ) ;
#559 = AXIS2_PLACEMENT_3D ( 'NONE', #497, #3, #424 ) ;
#560 = AXIS2_PLACEMENT_3D ( 'NONE', #328, #697, #623 ) ;
#561 = VERTEX_POINT ( 'NONE', #394 ) ;
#562 = ORIENTED_EDGE ( 'NONE', *, *, #288, .F. ) ;
#563 = ADVANCED_FACE ( 'NONE', ( #73 ), #575, .T. ) ;
#564 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.2550000000000000600 ) ) ;
#565 = CYLINDRICAL_SURFACE ( 'NONE', #154, 0.3749999999999999400 ) ;
#566 = CALENDAR_DATE ( 2023, 7, 2 ) ;
#567 = CIRCLE ( 'NONE', #64, 0.3749999999999999400 ) ;
#568 = ORIENTED_EDGE ( 'NONE', *, *, #124, .F. ) ;
#569 = APPLICATION_CONTEXT ( 'configuration controlled 3d designs of mechanical parts and assemblies' ) ;
#570 = EDGE_CURVE ( 'NONE', #578, #407, #840, .T. ) ;
#571 = MECHANICAL_CONTEXT ( 'NONE', #279, 'mechanical' ) ;
#572 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#573 = ORIENTED_EDGE ( 'NONE', *, *, #133, .T. ) ;
#574 = VERTEX_POINT ( 'NONE', #750 ) ;
#575 = TOROIDAL_SURFACE ( 'NONE', #758, 2.940000000000000400, 0.05999999999999999800 ) ;
#576 = PLANE ( 'NONE', #643 ) ;
#577 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.5650000000000001700 ) ) ;
#578 = VERTEX_POINT ( 'NONE', #889 ) ;
#579 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#580 = AXIS2_PLACEMENT_3D ( 'NONE', #739, #741, #294 ) ;
#581 = DIMENSIONAL_EXPONENTS ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000, 0.0000000000000000000, 0.0000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ;
#582 = CARTESIAN_POINT ( 'NONE', ( -0.3749999999999996700, -2.375000000000000000, 0.3150000000000000600 ) ) ;
#583 = ORIENTED_EDGE ( 'NONE', *, *, #717, .T. ) ;
#584 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#585 = EDGE_CURVE ( 'NONE', #849, #768, #211, .T. ) ;
#586 = EDGE_LOOP ( 'NONE', ( #673, #476, #23, #625 ) ) ;
#587 = ADVANCED_FACE ( 'NONE', ( #265 ), #565, .F. ) ;
#588 = FACE_OUTER_BOUND ( 'NONE', #316, .T. ) ;
#589 = FACE_OUTER_BOUND ( 'NONE', #878, .T. ) ;
#590 = ADVANCED_FACE ( 'NONE', ( #609 ), #368, .T. ) ;
#591 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.3150000000000000600 ) ) ;
#592 = AXIS2_PLACEMENT_3D ( 'NONE', #363, #716, #791 ) ;
#593 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#594 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#595 = ORIENTED_EDGE ( 'NONE', *, *, #161, .F. ) ;
#596 = ORIENTED_EDGE ( 'NONE', *, *, #779, .F. ) ;
#597 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#598 = AXIS2_PLACEMENT_3D ( 'NONE', #577, #141, #361 ) ;
#599 = VECTOR ( 'NONE', #451, 39.37007874015748100 ) ;
#600 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#601 = AXIS2_PLACEMENT_3D ( 'NONE', #675, #314, #827 ) ;
#602 = CARTESIAN_POINT ( 'NONE', ( 1.870000000000000100, 2.290089514405550600E-016, 0.3150000000000000600 ) ) ;
#603 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#604 = CARTESIAN_POINT ( 'NONE', ( -2.750000000000000000, -3.903561672282188800E-016, -0.6250000000000003300 ) ) ;
#605 = EDGE_CURVE ( 'NONE', #418, #767, #228, .T. ) ;
#606 = CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT ( #687, #415, ( #899 ) ) ;
#607 = CIRCLE ( 'NONE', #834, 1.446220343900916900 ) ;
#608 = ORIENTED_EDGE ( 'NONE', *, *, #558, .F. ) ;
#609 = FACE_OUTER_BOUND ( 'NONE', #792, .T. ) ;
#610 = FACE_OUTER_BOUND ( 'NONE', #753, .T. ) ;
#611 = CYLINDRICAL_SURFACE ( 'NONE', #439, 1.220000000000000000 ) ;
#612 = CARTESIAN_POINT ( 'NONE', ( 2.908536147974963700E-016, -2.375000000000000000, 0.3150000000000000600 ) ) ;
#613 = AXIS2_PLACEMENT_3D ( 'NONE', #489, #918, #911 ) ;
#614 = VERTEX_POINT ( 'NONE', #680 ) ;
#615 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#616 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#617 = ORIENTED_EDGE ( 'NONE', *, *, #885, .F. ) ;
#618 = EDGE_CURVE ( 'NONE', #263, #407, #378, .T. ) ;
#619 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.3750000000000000600 ) ) ;
#620 = ORIENTED_EDGE ( 'NONE', *, *, #749, .F. ) ;
#621 = ORIENTED_EDGE ( 'NONE', *, *, #652, .T. ) ;
#622 = CYLINDRICAL_SURFACE ( 'NONE', #844, 0.3749999999999999400 ) ;
#623 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#624 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.3750000000000000600 ) ) ;
#625 = ORIENTED_EDGE ( 'NONE', *, *, #322, .F. ) ;
#626 = ORIENTED_EDGE ( 'NONE', *, *, #885, .T. ) ;
#627 = CARTESIAN_POINT ( 'NONE', ( 2.908536147974963700E-016, -2.375000000000000000, -0.6250000000000003300 ) ) ;
#628 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.3750000000000001700 ) ) ;
#629 = AXIS2_PLACEMENT_3D ( 'NONE', #873, #225, #740 ) ;
#630 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#631 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#632 = FACE_BOUND ( 'NONE', #166, .T. ) ;
#633 = DIRECTION ( 'NONE', ( 0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#634 = ORIENTED_EDGE ( 'NONE', *, *, #239, .T. ) ;
#635 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#636 = FACE_BOUND ( 'NONE', #871, .T. ) ;
#637 = COORDINATED_UNIVERSAL_TIME_OFFSET ( 6, 0, .BEHIND. ) ;
#638 = VECTOR ( 'NONE', #75, 39.37007874015748100 ) ;
#639 = EDGE_CURVE ( 'NONE', #144, #574, #507, .T. ) ;
#640 = ADVANCED_FACE ( 'NONE', ( #759 ), #881, .F. ) ;
#641 = UNCERTAINTY_MEASURE_WITH_UNIT (LENGTH_MEASURE( 1.000000000000000100E-005 ), #423, 'distance_accuracy_value', 'NONE');
#642 = ADVANCED_FACE ( 'NONE', ( #24 ), #622, .F. ) ;
#643 = AXIS2_PLACEMENT_3D ( 'NONE', #360, #287, #440 ) ;
#644 = EDGE_LOOP ( 'NONE', ( #653, #837 ) ) ;
#645 = ORIENTED_EDGE ( 'NONE', *, *, #167, .T. ) ;
#646 = VECTOR ( 'NONE', #123, 39.37007874015748100 ) ;
#647 = APPROVAL_ROLE ( '' ) ;
#648 = AXIS2_PLACEMENT_3D ( 'NONE', #436, #297, #733 ) ;
#649 = ADVANCED_FACE ( 'NONE', ( #677 ), #177, .T. ) ;
#650 = APPROVAL ( #853, 'UNSPECIFIED' ) ;
#651 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 2.375000000000000000, 0.3150000000000000600 ) ) ;
#652 = EDGE_CURVE ( 'NONE', #27, #262, #457, .T. ) ;
#653 = ORIENTED_EDGE ( 'NONE', *, *, #88, .F. ) ;
#654 = APPROVAL ( #138, 'UNSPECIFIED' ) ;
#655 = ORIENTED_EDGE ( 'NONE', *, *, #570, .F. ) ;
#656 = FACE_OUTER_BOUND ( 'NONE', #686, .T. ) ;
#657 = APPROVAL_PERSON_ORGANIZATION ( #369, #139, #140 ) ;
#658 = FACE_OUTER_BOUND ( 'NONE', #181, .T. ) ;
#659 = ORIENTED_EDGE ( 'NONE', *, *, #867, .T. ) ;
#660 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#661 = AXIS2_PLACEMENT_3D ( 'NONE', #434, #33, #248 ) ;
#662 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.3750000000000000600 ) ) ;
#663 = CARTESIAN_POINT ( 'NONE', ( 2.750000000000000000, 7.271340369937410300E-016, -0.3750000000000001700 ) ) ;
#664 = EDGE_CURVE ( 'NONE', #786, #893, #528, .T. ) ;
#665 = VERTEX_POINT ( 'NONE', #769 ) ;
#666 = ORIENTED_EDGE ( 'NONE', *, *, #730, .F. ) ;
#667 = COORDINATED_UNIVERSAL_TIME_OFFSET ( 6, 0, .BEHIND. ) ;
#668 = FACE_OUTER_BOUND ( 'NONE', #32, .T. ) ;
#669 = CARTESIAN_POINT ( 'NONE', ( 1.220000000000000000, 0.0000000000000000000, 0.3750000000000000600 ) ) ;
#670 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#671 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#672 = CARTESIAN_POINT ( 'NONE', ( -1.523530746774877300, 1.865787052440430200E-016, -0.4276878393956912200 ) ) ;
#673 = ORIENTED_EDGE ( 'NONE', *, *, #639, .T. ) ;
#674 = VERTEX_POINT ( 'NONE', #54 ) ;
#675 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.3750000000000000600 ) ) ;
#676 = AXIS2_PLACEMENT_3D ( 'NONE', #755, #386, #170 ) ;
#677 = FACE_OUTER_BOUND ( 'NONE', #218, .T. ) ;
#678 = LOCAL_TIME ( 10, 53, 8.000000000000000000, #859 ) ;
#679 = FACE_OUTER_BOUND ( 'NONE', #320, .T. ) ;
#680 = CARTESIAN_POINT ( 'NONE', ( -1.446220343900916900, 1.807574669048449600E-016, -0.6250000000000001100 ) ) ;
#681 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#682 = EDGE_CURVE ( 'NONE', #69, #90, #699, .T. ) ;
#683 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#684 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#685 = EDGE_LOOP ( 'NONE', ( #308, #583 ) ) ;
#686 = EDGE_LOOP ( 'NONE', ( #479, #50 ) ) ;
#687 = PERSON_AND_ORGANIZATION ( #164, #907 ) ;
#688 = CIRCLE ( 'NONE', #790, 1.523530746774877300 ) ;
#689 = ORIENTED_EDGE ( 'NONE', *, *, #618, .T. ) ;
#690 = CARTESIAN_POINT ( 'NONE', ( -1.446220343900916900, 1.771109115020042200E-016, -0.5650000000000001700 ) ) ;
#691 = VERTEX_POINT ( 'NONE', #330 ) ;
#692 = ORIENTED_EDGE ( 'NONE', *, *, #537, .F. ) ;
#693 = AXIS2_PLACEMENT_3D ( 'NONE', #863, #358, #347 ) ;
#694 = CARTESIAN_POINT ( 'NONE', ( 2.750000000000000000, 7.271340369937410300E-016, -0.6250000000000003300 ) ) ;
#695 = AXIS2_PLACEMENT_3D ( 'NONE', #39, #814, #763 ) ;
#696 = ORIENTED_EDGE ( 'NONE', *, *, #505, .T. ) ;
#697 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#698 = ORIENTED_EDGE ( 'NONE', *, *, #414, .T. ) ;
#699 = CIRCLE ( 'NONE', #560, 1.523530746774877300 ) ;
#700 = EDGE_CURVE ( 'NONE', #561, #376, #808, .T. ) ;
#701 = LOCAL_TIME ( 10, 53, 8.000000000000000000, #667 ) ;
#702 = TOROIDAL_SURFACE ( 'NONE', #629, 2.940000000000000400, 0.05999999999999999800 ) ;
#703 = CARTESIAN_POINT ( 'NONE', ( 0.3750000000000002200, -2.375000000000000000, -0.6250000000000003300 ) ) ;
#704 = AXIS2_PLACEMENT_3D ( 'NONE', #422, #876, #446 ) ;
#705 = ORIENTED_EDGE ( 'NONE', *, *, #10, .F. ) ;
#706 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -1.000000000000000000, -0.0000000000000000000 ) ) ;
#707 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#708 = AXIS2_PLACEMENT_3D ( 'NONE', #109, #683, #681 ) ;
#709 =( LENGTH_UNIT ( ) NAMED_UNIT ( * ) SI_UNIT ( $, .METRE. ) );
#710 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 1.499303859774273800, -0.6250000000000001100 ) ) ;
#711 = ORIENTED_EDGE ( 'NONE', *, *, #76, .T. ) ;
#712 = ORIENTED_EDGE ( 'NONE', *, *, #838, .F. ) ;
#713 = CIRCLE ( 'NONE', #307, 1.446220343900916900 ) ;
#714 = CIRCLE ( 'NONE', #30, 0.3749999999999999400 ) ;
#715 = EDGE_CURVE ( 'NONE', #830, #209, #482, .T. ) ;
#716 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#717 = EDGE_CURVE ( 'NONE', #893, #786, #201, .T. ) ;
#718 = ADVANCED_FACE ( 'NONE', ( #82 ), #443, .T. ) ;
#719 = CC_DESIGN_APPROVAL ( #650, ( #899 ) ) ;
#720 = ORIENTED_EDGE ( 'NONE', *, *, #68, .F. ) ;
#721 = ORIENTED_EDGE ( 'NONE', *, *, #730, .T. ) ;
#722 = FACE_OUTER_BOUND ( 'NONE', #776, .T. ) ;
#723 = PERSON_AND_ORGANIZATION ( #164, #907 ) ;
#724 = FACE_OUTER_BOUND ( 'NONE', #744, .T. ) ;
#725 = ADVANCED_FACE ( 'NONE', ( #857 ), #819, .T. ) ;
#726 = AXIS2_PLACEMENT_3D ( 'NONE', #591, #160, #157 ) ;
#727 = CARTESIAN_POINT ( 'NONE', ( -3.000000000000000400, 3.673940397442060400E-016, 0.3750000000000000600 ) ) ;
#728 = ADVANCED_FACE ( 'NONE', ( #255 ), #419, .F. ) ;
#729 = CARTESIAN_POINT ( 'NONE', ( -1.870000000000000100, 0.0000000000000000000, 0.3150000000000000600 ) ) ;
#730 = EDGE_CURVE ( 'NONE', #893, #69, #14, .T. ) ;
#731 = ORIENTED_EDGE ( 'NONE', *, *, #715, .F. ) ;
#732 = VECTOR ( 'NONE', #635, 39.37007874015748100 ) ;
#733 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#734 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#735 = COORDINATED_UNIVERSAL_TIME_OFFSET ( 6, 0, .BEHIND. ) ;
#736 = FACE_OUTER_BOUND ( 'NONE', #514, .T. ) ;
#737 = ORIENTED_EDGE ( 'NONE', *, *, #55, .T. ) ;
#738 = EDGE_LOOP ( 'NONE', ( #103, #659, #862, #617 ) ) ;
#739 = CARTESIAN_POINT ( 'NONE', ( 2.940000000000000400, 0.0000000000000000000, -0.3150000000000002800 ) ) ;
#740 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#741 = DIRECTION ( 'NONE', ( 0.0000000000000000000, -1.000000000000000000, 0.0000000000000000000 ) ) ;
#742 = AXIS2_PLACEMENT_3D ( 'NONE', #234, #49, #545 ) ;
#743 = VERTEX_POINT ( 'NONE', #277 ) ;
#744 = EDGE_LOOP ( 'NONE', ( #493, #568, #905, #341 ) ) ;
#745 = CIRCLE ( 'NONE', #447, 0.3749999999999999400 ) ;
#746 = DIRECTION ( 'NONE', ( -1.000000000000000000, 1.224646799147359900E-016, 0.0000000000000000000 ) ) ;
#747 = FACE_OUTER_BOUND ( 'NONE', #259, .T. ) ;
#748 = PLANE ( 'NONE', #121 ) ;
#749 = EDGE_CURVE ( 'NONE', #199, #561, #402, .T. ) ;
#750 = CARTESIAN_POINT ( 'NONE', ( -1.505773112999396800, 1.854913637758643400E-016, -0.5723121606043081200 ) ) ;
#751 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.5723121606043081200 ) ) ;
#752 = PRODUCT_RELATED_PRODUCT_CATEGORY ( 'detail', '', ( #548 ) ) ;
#753 = EDGE_LOOP ( 'NONE', ( #502, #467, #892, #756 ) ) ;
#754 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#755 = CARTESIAN_POINT ( 'NONE', ( -2.375000000000000000, -4.362804221962446100E-016, -0.6250000000000003300 ) ) ;
#756 = ORIENTED_EDGE ( 'NONE', *, *, #520, .F. ) ;
#757 = VERTEX_POINT ( 'NONE', #504 ) ;
#758 = AXIS2_PLACEMENT_3D ( 'NONE', #382, #380, #28 ) ;
#759 = FACE_OUTER_BOUND ( 'NONE', #333, .T. ) ;
#760 = CARTESIAN_POINT ( 'NONE', ( 0.3750000000000002200, -2.375000000000000000, -0.3750000000000001700 ) ) ;
#761 = CIRCLE ( 'NONE', #233, 1.220000000000000000 ) ;
#762 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#763 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#764 = EDGE_CURVE ( 'NONE', #437, #772, #336, .T. ) ;
#765 = CARTESIAN_POINT ( 'NONE', ( 2.750000000000000000, 7.271340369937410300E-016, 0.3150000000000000600 ) ) ;
#766 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.6250000000000000000 ) ) ;
#767 = VERTEX_POINT ( 'NONE', #501 ) ;
#768 = VERTEX_POINT ( 'NONE', #663 ) ;
#769 = CARTESIAN_POINT ( 'NONE', ( 1.810000000000000100, 2.253350110431129800E-016, 0.3750000000000000600 ) ) ;
#770 = CIRCLE ( 'NONE', #695, 1.810000000000000100 ) ;
#771 = ORIENTED_EDGE ( 'NONE', *, *, #197, .T. ) ;
#772 = VERTEX_POINT ( 'NONE', #582 ) ;
#773 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 1.530000000000000000, -0.3750000000000001700 ) ) ;
#774 = AXIS2_PLACEMENT_3D ( 'NONE', #526, #101, #243 ) ;
#775 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#776 = EDGE_LOOP ( 'NONE', ( #246, #721, #282, #720 ) ) ;
#777 = VERTEX_POINT ( 'NONE', #438 ) ;
#778 = LINE ( 'NONE', #824, #599 ) ;
#779 = EDGE_CURVE ( 'NONE', #772, #262, #128, .T. ) ;
#780 = CIRCLE ( 'NONE', #299, 1.870000000000000100 ) ;
#781 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#782 = PERSON_AND_ORGANIZATION_ROLE ( 'creator' ) ;
#783 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#784 = CC_DESIGN_APPROVAL ( #139, ( #508 ) ) ;
#785 = PERSON_AND_ORGANIZATION_ROLE ( 'creator' ) ;
#786 = VERTEX_POINT ( 'NONE', #371 ) ;
#787 = ORIENTED_EDGE ( 'NONE', *, *, #639, .F. ) ;
#788 = APPROVAL_ROLE ( '' ) ;
#789 = CIRCLE ( 'NONE', #131, 0.3749999999999999400 ) ;
#790 = AXIS2_PLACEMENT_3D ( 'NONE', #521, #229, #515 ) ;
#791 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#792 = EDGE_LOOP ( 'NONE', ( #80, #620, #737, #214 ) ) ;
#793 = ORIENTED_EDGE ( 'NONE', *, *, #118, .T. ) ;
#794 = EDGE_CURVE ( 'NONE', #332, #830, #284, .T. ) ;
#795 = CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT ( #202, #272, ( #508 ) ) ;
#796 = CYLINDRICAL_SURFACE ( 'NONE', #708, 0.3749999999999999400 ) ;
#797 = CARTESIAN_POINT ( 'NONE', ( 2.375000000000000000, 7.271340369937410300E-016, 0.3150000000000000600 ) ) ;
#798 = ORIENTED_EDGE ( 'NONE', *, *, #19, .F. ) ;
#799 = FACE_BOUND ( 'NONE', #188, .T. ) ;
#800 = TOROIDAL_SURFACE ( 'NONE', #704, 1.870000000000000100, 0.05999999999999999800 ) ;
#801 = CIRCLE ( 'NONE', #861, 3.000000000000000400 ) ;
#802 = CARTESIAN_POINT ( 'NONE', ( -3.000000000000000400, 3.673940397442060400E-016, -0.3150000000000002800 ) ) ;
#803 = AXIS2_PLACEMENT_3D ( 'NONE', #619, #183, #470 ) ;
#804 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.2550000000000000600 ) ) ;
#805 = EDGE_CURVE ( 'NONE', #554, #665, #770, .T. ) ;
#806 = ORIENTED_EDGE ( 'NONE', *, *, #25, .T. ) ;
#807 = ORIENTED_EDGE ( 'NONE', *, *, #805, .T. ) ;
#808 = CIRCLE ( 'NONE', #344, 0.05999999999999990800 ) ;
#809 = CARTESIAN_POINT ( 'NONE', ( 3.000000000000000400, 0.0000000000000000000, -0.3150000000000002800 ) ) ;
#810 = ADVANCED_FACE ( 'NONE', ( #8 ), #145, .F. ) ;
#811 = CLOSED_SHELL ( 'NONE', ( #159, #151, #563, #864, #512, #375, #5, #642, #85, #269, #810, #409, #718, #870, #420, #291, #224, #649, #848, #728, #640, #283, #587, #725, #435, #426, #590, #874 ) ) ;
#812 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#813 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#814 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#815 = AXIS2_PLACEMENT_3D ( 'NONE', #448, #26, #15 ) ;
#816 = ORIENTED_EDGE ( 'NONE', *, *, #150, .T. ) ;
#817 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.3150000000000000600 ) ) ;
#818 = ORIENTED_EDGE ( 'NONE', *, *, #355, .T. ) ;
#819 = TOROIDAL_SURFACE ( 'NONE', #598, 1.446220343900916900, 0.05999999999999999800 ) ;
#820 = CIRCLE ( 'NONE', #500, 0.3749999999999999400 ) ;
#821 = FACE_OUTER_BOUND ( 'NONE', #475, .T. ) ;
#822 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -1.000000000000000000, -0.0000000000000000000 ) ) ;
#823 = EDGE_CURVE ( 'NONE', #27, #437, #745, .T. ) ;
#824 = CARTESIAN_POINT ( 'NONE', ( 2.000000000000000000, 7.730582919617667100E-016, -0.6250000000000003300 ) ) ;
#825 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#826 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#827 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#828 = ORIENTED_EDGE ( 'NONE', *, *, #405, .F. ) ;
#829 = CC_DESIGN_APPROVAL ( #654, ( #473 ) ) ;
#830 = VERTEX_POINT ( 'NONE', #536 ) ;
#831 = CIRCLE ( 'NONE', #580, 0.05999999999999997700 ) ;
#832 = CARTESIAN_POINT ( 'NONE', ( 2.908536147974963700E-016, -2.375000000000000000, -0.3750000000000001700 ) ) ;
#833 = DIRECTION ( 'NONE', ( 1.224646799147353200E-016, 1.000000000000000000, 0.0000000000000000000 ) ) ;
#834 = AXIS2_PLACEMENT_3D ( 'NONE', #165, #237, #458 ) ;
#835 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#836 = CARTESIAN_POINT ( 'NONE', ( 2.908536147974963700E-016, -2.375000000000000000, -0.6250000000000003300 ) ) ;
#837 = ORIENTED_EDGE ( 'NONE', *, *, #618, .F. ) ;
#838 = EDGE_CURVE ( 'NONE', #574, #69, #429, .T. ) ;
#839 = ORIENTED_EDGE ( 'NONE', *, *, #913, .T. ) ;
#840 = LINE ( 'NONE', #311, #48 ) ;
#841 = CALENDAR_DATE ( 2023, 7, 2 ) ;
#842 = FACE_BOUND ( 'NONE', #387, .T. ) ;
#843 = CARTESIAN_POINT ( 'NONE', ( 0.3749999999999999400, 2.375000000000000000, -0.6250000000000003300 ) ) ;
#844 = AXIS2_PLACEMENT_3D ( 'NONE', #627, #630, #775 ) ;
#845 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#846 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#847 = ORIENTED_EDGE ( 'NONE', *, *, #465, .T. ) ;
#848 = ADVANCED_FACE ( 'NONE', ( #190, #656, #636, #354, #169, #906 ), #748, .F. ) ;
#849 = VERTEX_POINT ( 'NONE', #108 ) ;
#850 = EDGE_CURVE ( 'NONE', #743, #418, #242, .T. ) ;
#851 = CIRCLE ( 'NONE', #81, 0.3749999999999999400 ) ;
#852 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#853 = APPROVAL_STATUS ( 'not_yet_approved' ) ;
#854 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#855 = ORIENTED_EDGE ( 'NONE', *, *, #898, .F. ) ;
#856 = VERTEX_POINT ( 'NONE', #38 ) ;
#857 = FACE_OUTER_BOUND ( 'NONE', #552, .T. ) ;
#858 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#859 = COORDINATED_UNIVERSAL_TIME_OFFSET ( 6, 0, .BEHIND. ) ;
#860 = CIRCLE ( 'NONE', #462, 0.3749999999999999400 ) ;
#861 = AXIS2_PLACEMENT_3D ( 'NONE', #804, #302, #812 ) ;
#862 = ORIENTED_EDGE ( 'NONE', *, *, #372, .T. ) ;
#863 = CARTESIAN_POINT ( 'NONE', ( 2.375000000000000000, 7.271340369937410300E-016, 0.3150000000000000600 ) ) ;
#864 = ADVANCED_FACE ( 'NONE', ( #722 ), #104, .F. ) ;
#865 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#866 = MANIFOLD_SOLID_BREP ( 'Fillet1', #811 ) ;
#867 = EDGE_CURVE ( 'NONE', #506, #777, #309, .T. ) ;
#868 = DIRECTION ( 'NONE', ( 1.224646799147353200E-016, 1.000000000000000000, 0.0000000000000000000 ) ) ;
#869 = ORIENTED_EDGE ( 'NONE', *, *, #288, .T. ) ;
#870 = ADVANCED_FACE ( 'NONE', ( #588, #799, #219, #388, #632, #117 ), #576, .F. ) ;
#871 = EDGE_LOOP ( 'NONE', ( #428, #62 ) ) ;
#872 = LINE ( 'NONE', #413, #884 ) ;
#873 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.3150000000000002800 ) ) ;
#874 = ADVANCED_FACE ( 'NONE', ( #610 ), #800, .F. ) ;
#875 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#876 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#877 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#878 = EDGE_LOOP ( 'NONE', ( #692, #385, #855, #400 ) ) ;
#879 = ORIENTED_EDGE ( 'NONE', *, *, #372, .F. ) ;
#880 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 2.375000000000000000, -0.3750000000000001700 ) ) ;
#881 = CYLINDRICAL_SURFACE ( 'NONE', #511, 0.3749999999999999400 ) ;
#882 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#883 = CALENDAR_DATE ( 2023, 7, 2 ) ;
#884 = VECTOR ( 'NONE', #196, 39.37007874015748100 ) ;
#885 = EDGE_CURVE ( 'NONE', #31, #376, #342, .T. ) ;
#886 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#887 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#888 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#889 = CARTESIAN_POINT ( 'NONE', ( 1.220000000000000000, 0.0000000000000000000, -0.6250000000000000000 ) ) ;
#890 = AXIS2_PLACEMENT_3D ( 'NONE', #452, #822, #603 ) ;
#891 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#892 = ORIENTED_EDGE ( 'NONE', *, *, #212, .T. ) ;
#893 = VERTEX_POINT ( 'NONE', #230 ) ;
#894 = APPROVAL_PERSON_ORGANIZATION ( #83, #654, #647 ) ;
#895 = CARTESIAN_POINT ( 'NONE', ( 2.375000000000000000, 7.271340369937410300E-016, -0.3750000000000001700 ) ) ;
#896 = CIRCLE ( 'NONE', #742, 1.220000000000000000 ) ;
#897 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#898 = EDGE_CURVE ( 'NONE', #757, #209, #820, .T. ) ;
#899 = SECURITY_CLASSIFICATION ( '', '', #206 ) ;
#900 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#901 = EDGE_CURVE ( 'NONE', #614, #691, #713, .T. ) ;
#902 = ORIENTED_EDGE ( 'NONE', *, *, #178, .F. ) ;
#903 = CARTESIAN_POINT ( 'NONE', ( -0.3749999999999999400, 2.375000000000000000, -0.6250000000000003300 ) ) ;
#904 =( GEOMETRIC_REPRESENTATION_CONTEXT ( 3 ) GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT ( ( #641 ) ) GLOBAL_UNIT_ASSIGNED_CONTEXT ( ( #423, #63, #488 ) ) REPRESENTATION_CONTEXT ( 'NONE', 'WORKASPACE' ) );
#905 = ORIENTED_EDGE ( 'NONE', *, *, #405, .T. ) ;
#906 = FACE_BOUND ( 'NONE', #240, .T. ) ;
#907 = ORGANIZATION ( 'UNSPECIFIED', 'UNSPECIFIED', '' ) ;
#908 = FACE_BOUND ( 'NONE', #644, .T. ) ;
#909 = DIRECTION ( 'NONE', ( -1.224646799147353200E-016, 1.000000000000000000, 0.0000000000000000000 ) ) ;
#910 = ORIENTED_EDGE ( 'NONE', *, *, #25, .F. ) ;
#911 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#912 = AXIS2_PLACEMENT_3D ( 'NONE', #232, #179, #390 ) ;
#913 = EDGE_CURVE ( 'NONE', #332, #757, #136, .T. ) ;
#914 = ORIENTED_EDGE ( 'NONE', *, *, #338, .T. ) ;
#915 = VECTOR ( 'NONE', #9, 39.37007874015748100 ) ;
#916 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
#917 = CIRCLE ( 'NONE', #191, 1.220000000000000000 ) ;
#918 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, 1.000000000000000000 ) ) ;
ENDSEC;
END-ISO-10303-21;

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,269 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION (( 'STEP AP203' ),
'1' );
FILE_NAME ('9472K188_Oil-Resistant Aramid-Buna-N Gasket.STEP',
'2022-11-17T21:46:33',
( 'Administrator' ),
( 'Managed by Terraform' ),
'SwSTEP 2.0',
'SolidWorks 2017',
'' );
FILE_SCHEMA (( 'CONFIG_CONTROL_DESIGN' ));
ENDSEC;
DATA;
#1 = EDGE_CURVE ( 'NONE', #251, #149, #124, .T. ) ;
#2 = PERSON_AND_ORGANIZATION ( #159, #138 ) ;
#3 = SECURITY_CLASSIFICATION ( '', '', #150 ) ;
#4 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, -1.000000000000000000 ) ) ;
#5 = AXIS2_PLACEMENT_3D ( 'NONE', #243, #143, #82 ) ;
#6 = DATE_AND_TIME ( #211, #125 ) ;
#7 =( NAMED_UNIT ( * ) SI_UNIT ( $, .STERADIAN. ) SOLID_ANGLE_UNIT ( ) );
#8 =( GEOMETRIC_REPRESENTATION_CONTEXT ( 3 ) GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT ( ( #87 ) ) GLOBAL_UNIT_ASSIGNED_CONTEXT ( ( #64, #168, #7 ) ) REPRESENTATION_CONTEXT ( 'NONE', 'WORKASPACE' ) );
#9 = EDGE_LOOP ( 'NONE', ( #55, #200 ) ) ;
#10 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.01562500000000000000 ) ) ;
#11 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, -0.0000000000000000000 ) ) ;
#12 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.01562500000000000000 ) ) ;
#13 = CALENDAR_DATE ( 2022, 17, 11 ) ;
#14 = APPLICATION_PROTOCOL_DEFINITION ( 'international standard', 'config_control_design', 1994, #172 ) ;
#15 = CIRCLE ( 'NONE', #186, 1.187500000000000000 ) ;
#16 = DIMENSIONAL_EXPONENTS ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000, 0.0000000000000000000, 0.0000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ;
#17 = EDGE_CURVE ( 'NONE', #149, #114, #236, .T. ) ;
#18 = ORIENTED_EDGE ( 'NONE', *, *, #178, .T. ) ;
#19 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#20 = AXIS2_PLACEMENT_3D ( 'NONE', #135, #198, #19 ) ;
#21 = CIRCLE ( 'NONE', #91, 2.062500000000000000 ) ;
#22 = LOCAL_TIME ( 15, 46, 33.00000000000000000, #221 ) ;
#23 = CARTESIAN_POINT ( 'NONE', ( -2.062500000000000000, 0.0000000000000000000, -0.01562500000000000000 ) ) ;
#24 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#25 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.01562500000000000000 ) ) ;
#26 = CARTESIAN_POINT ( 'NONE', ( 2.062500000000000000, 2.525834023241416400E-016, -0.01562500000000000000 ) ) ;
#27 = PERSON_AND_ORGANIZATION_ROLE ( 'design_supplier' ) ;
#28 = PERSON_AND_ORGANIZATION_ROLE ( 'creator' ) ;
#29 = ADVANCED_BREP_SHAPE_REPRESENTATION ( '9472K188_Oil-Resistant Aramid-Buna-N Gasket', ( #118, #194 ), #8 ) ;
#30 = AXIS2_PLACEMENT_3D ( 'NONE', #235, #39, #216 ) ;
#31 = ADVANCED_FACE ( 'NONE', ( #40 ), #192, .F. ) ;
#32 = CC_DESIGN_DATE_AND_TIME_ASSIGNMENT ( #6, #212, ( #3 ) ) ;
#33 = ORIENTED_EDGE ( 'NONE', *, *, #171, .F. ) ;
#34 = PERSON_AND_ORGANIZATION ( #159, #138 ) ;
#35 = ADVANCED_FACE ( 'NONE', ( #232 ), #132, .T. ) ;
#36 = CIRCLE ( 'NONE', #44, 1.187500000000000000 ) ;
#37 = PERSON_AND_ORGANIZATION ( #159, #138 ) ;
#38 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#39 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#40 = FACE_OUTER_BOUND ( 'NONE', #54, .T. ) ;
#41 = PERSON_AND_ORGANIZATION ( #159, #138 ) ;
#42 = PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE ( 'ANY', '', #139, .NOT_KNOWN. ) ;
#43 = EDGE_LOOP ( 'NONE', ( #242, #57 ) ) ;
#44 = AXIS2_PLACEMENT_3D ( 'NONE', #131, #134, #38 ) ;
#45 = ORIENTED_EDGE ( 'NONE', *, *, #71, .T. ) ;
#46 = APPLICATION_CONTEXT ( 'configuration controlled 3d designs of mechanical parts and assemblies' ) ;
#47 = PERSON_AND_ORGANIZATION_ROLE ( 'classification_officer' ) ;
#48 = ORIENTED_EDGE ( 'NONE', *, *, #99, .F. ) ;
#49 = PERSON_AND_ORGANIZATION ( #159, #138 ) ;
#50 = DATE_TIME_ROLE ( 'creation_date' ) ;
#51 = CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT ( #41, #210, ( #42 ) ) ;
#52 = ORIENTED_EDGE ( 'NONE', *, *, #115, .T. ) ;
#53 = CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT ( #58, #148, ( #139 ) ) ;
#54 = EDGE_LOOP ( 'NONE', ( #116, #188, #179, #48 ) ) ;
#55 = ORIENTED_EDGE ( 'NONE', *, *, #59, .T. ) ;
#56 = PRODUCT_DEFINITION ( 'UNKNOWN', '', #42, #225 ) ;
#57 = ORIENTED_EDGE ( 'NONE', *, *, #140, .F. ) ;
#58 = PERSON_AND_ORGANIZATION ( #159, #138 ) ;
#59 = EDGE_CURVE ( 'NONE', #149, #251, #103, .T. ) ;
#60 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#61 = FACE_BOUND ( 'NONE', #80, .T. ) ;
#62 = ORIENTED_EDGE ( 'NONE', *, *, #99, .T. ) ;
#63 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, -1.000000000000000000 ) ) ;
#64 =( CONVERSION_BASED_UNIT ( 'INCH', #155 ) LENGTH_UNIT ( ) NAMED_UNIT ( #16 ) );
#65 = ORIENTED_EDGE ( 'NONE', *, *, #111, .F. ) ;
#66 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.01562500000000000000 ) ) ;
#67 = DATE_AND_TIME ( #13, #183 ) ;
#68 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.01562500000000000000 ) ) ;
#69 = APPROVAL_STATUS ( 'not_yet_approved' ) ;
#70 = APPROVAL_ROLE ( '' ) ;
#71 = EDGE_CURVE ( 'NONE', #251, #176, #249, .T. ) ;
#72 = LINE ( 'NONE', #189, #201 ) ;
#73 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#74 = CC_DESIGN_DATE_AND_TIME_ASSIGNMENT ( #67, #50, ( #56 ) ) ;
#75 = ORIENTED_EDGE ( 'NONE', *, *, #17, .T. ) ;
#76 = PERSON_AND_ORGANIZATION ( #159, #138 ) ;
#77 = EDGE_CURVE ( 'NONE', #160, #213, #36, .T. ) ;
#78 = ADVANCED_FACE ( 'NONE', ( #141 ), #128, .F. ) ;
#79 = FACE_BOUND ( 'NONE', #43, .T. ) ;
#80 = EDGE_LOOP ( 'NONE', ( #52, #62 ) ) ;
#81 = PLANE ( 'NONE', #157 ) ;
#82 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#83 = FACE_OUTER_BOUND ( 'NONE', #9, .T. ) ;
#84 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#85 = CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT ( #244, #27, ( #42 ) ) ;
#86 = CLOSED_SHELL ( 'NONE', ( #78, #35, #92, #177, #130, #31 ) ) ;
#87 = UNCERTAINTY_MEASURE_WITH_UNIT (LENGTH_MEASURE( 1.000000000000000100E-005 ), #64, 'distance_accuracy_value', 'NONE');
#88 = APPROVAL_ROLE ( '' ) ;
#89 = CIRCLE ( 'NONE', #203, 1.187500000000000000 ) ;
#90 = APPROVAL_PERSON_ORGANIZATION ( #76, #153, #88 ) ;
#91 = AXIS2_PLACEMENT_3D ( 'NONE', #165, #208, #205 ) ;
#92 = ADVANCED_FACE ( 'NONE', ( #83, #79 ), #81, .T. ) ;
#93 = ORIENTED_EDGE ( 'NONE', *, *, #71, .F. ) ;
#94 = DATE_AND_TIME ( #145, #120 ) ;
#95 = ORIENTED_EDGE ( 'NONE', *, *, #115, .F. ) ;
#96 = COORDINATED_UNIVERSAL_TIME_OFFSET ( 6, 0, .BEHIND. ) ;
#97 = AXIS2_PLACEMENT_3D ( 'NONE', #12, #63, #162 ) ;
#98 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#99 = EDGE_CURVE ( 'NONE', #163, #107, #89, .T. ) ;
#100 =( LENGTH_UNIT ( ) NAMED_UNIT ( * ) SI_UNIT ( $, .METRE. ) );
#101 = CARTESIAN_POINT ( 'NONE', ( 2.062500000000000000, 2.525834023241416400E-016, 0.01562500000000000000 ) ) ;
#102 = CARTESIAN_POINT ( 'NONE', ( 1.187500000000000000, 1.454268073987481900E-016, 0.01562500000000000000 ) ) ;
#103 = CIRCLE ( 'NONE', #105, 2.062500000000000000 ) ;
#104 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, -1.000000000000000000 ) ) ;
#105 = AXIS2_PLACEMENT_3D ( 'NONE', #147, #73, #152 ) ;
#106 = CYLINDRICAL_SURFACE ( 'NONE', #97, 2.062500000000000000 ) ;
#107 = VERTEX_POINT ( 'NONE', #240 ) ;
#108 = AXIS2_PLACEMENT_3D ( 'NONE', #174, #127, #245 ) ;
#109 = PRODUCT_DEFINITION_SHAPE ( 'NONE', 'NONE', #56 ) ;
#110 = ORIENTED_EDGE ( 'NONE', *, *, #1, .F. ) ;
#111 = EDGE_CURVE ( 'NONE', #114, #176, #21, .T. ) ;
#112 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#113 = FACE_OUTER_BOUND ( 'NONE', #209, .T. ) ;
#114 = VERTEX_POINT ( 'NONE', #23 ) ;
#115 = EDGE_CURVE ( 'NONE', #107, #163, #246, .T. ) ;
#116 = ORIENTED_EDGE ( 'NONE', *, *, #193, .F. ) ;
#117 = CALENDAR_DATE ( 2022, 17, 11 ) ;
#118 = MANIFOLD_SOLID_BREP ( 'Boss-Extrude1', #86 ) ;
#119 = AXIS2_PLACEMENT_3D ( 'NONE', #234, #4, #112 ) ;
#120 = LOCAL_TIME ( 15, 46, 33.00000000000000000, #96 ) ;
#121 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.01562500000000000000 ) ) ;
#122 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, -1.000000000000000000 ) ) ;
#123 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#124 = CIRCLE ( 'NONE', #30, 2.062500000000000000 ) ;
#125 = LOCAL_TIME ( 15, 46, 33.00000000000000000, #233 ) ;
#126 = MECHANICAL_CONTEXT ( 'NONE', #46, 'mechanical' ) ;
#127 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, -1.000000000000000000 ) ) ;
#128 = CYLINDRICAL_SURFACE ( 'NONE', #108, 1.187500000000000000 ) ;
#129 = EDGE_LOOP ( 'NONE', ( #182, #202, #95, #33 ) ) ;
#130 = ADVANCED_FACE ( 'NONE', ( #238 ), #106, .T. ) ;
#131 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.01562500000000000000 ) ) ;
#132 = CYLINDRICAL_SURFACE ( 'NONE', #20, 2.062500000000000000 ) ;
#133 = COORDINATED_UNIVERSAL_TIME_OFFSET ( 6, 0, .BEHIND. ) ;
#134 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#135 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.01562500000000000000 ) ) ;
#136 = CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT ( #37, #47, ( #3 ) ) ;
#137 = EDGE_LOOP ( 'NONE', ( #110, #45, #18, #227 ) ) ;
#138 = ORGANIZATION ( 'UNSPECIFIED', 'UNSPECIFIED', '' ) ;
#139 = PRODUCT ( '9472K188_Oil-Resistant Aramid-Buna-N Gasket', '9472K188_Oil-Resistant Aramid-Buna-N Gasket', '', ( #126 ) ) ;
#140 = EDGE_CURVE ( 'NONE', #213, #160, #15, .T. ) ;
#141 = FACE_OUTER_BOUND ( 'NONE', #129, .T. ) ;
#142 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#143 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#144 = ORIENTED_EDGE ( 'NONE', *, *, #59, .F. ) ;
#145 = CALENDAR_DATE ( 2022, 17, 11 ) ;
#146 = CARTESIAN_POINT ( 'NONE', ( -1.187500000000000000, 0.0000000000000000000, 0.01562500000000000000 ) ) ;
#147 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.01562500000000000000 ) ) ;
#148 = PERSON_AND_ORGANIZATION_ROLE ( 'design_owner' ) ;
#149 = VERTEX_POINT ( 'NONE', #167 ) ;
#150 = SECURITY_CLASSIFICATION_LEVEL ( 'unclassified' ) ;
#151 = APPROVAL_DATE_TIME ( #180, #153 ) ;
#152 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#153 = APPROVAL ( #170, 'UNSPECIFIED' ) ;
#154 = ORIENTED_EDGE ( 'NONE', *, *, #178, .F. ) ;
#155 = LENGTH_MEASURE_WITH_UNIT ( LENGTH_MEASURE( 0.02539999999999999900 ), #100 );
#156 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, -1.000000000000000000 ) ) ;
#157 = AXIS2_PLACEMENT_3D ( 'NONE', #68, #185, #206 ) ;
#158 = CARTESIAN_POINT ( 'NONE', ( -2.062500000000000000, 0.0000000000000000000, 0.01562500000000000000 ) ) ;
#159 = PERSON ( 'UNSPECIFIED', 'UNSPECIFIED', 'UNSPECIFIED', ('UNSPECIFIED'), ('UNSPECIFIED'), ('UNSPECIFIED') ) ;
#160 = VERTEX_POINT ( 'NONE', #146 ) ;
#161 = SHAPE_DEFINITION_REPRESENTATION ( #109, #29 ) ;
#162 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#163 = VERTEX_POINT ( 'NONE', #226 ) ;
#164 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#165 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.01562500000000000000 ) ) ;
#166 = APPROVAL ( #229, 'UNSPECIFIED' ) ;
#167 = CARTESIAN_POINT ( 'NONE', ( -2.062500000000000000, 0.0000000000000000000, 0.01562500000000000000 ) ) ;
#168 =( NAMED_UNIT ( * ) PLANE_ANGLE_UNIT ( ) SI_UNIT ( $, .RADIAN. ) );
#169 = VECTOR ( 'NONE', #156, 39.37007874015748100 ) ;
#170 = APPROVAL_STATUS ( 'not_yet_approved' ) ;
#171 = EDGE_CURVE ( 'NONE', #160, #107, #217, .T. ) ;
#172 = APPLICATION_CONTEXT ( 'configuration controlled 3d designs of mechanical parts and assemblies' ) ;
#173 = VECTOR ( 'NONE', #122, 39.37007874015748100 ) ;
#174 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.01562500000000000000 ) ) ;
#175 = APPROVAL ( #69, 'UNSPECIFIED' ) ;
#176 = VERTEX_POINT ( 'NONE', #26 ) ;
#177 = ADVANCED_FACE ( 'NONE', ( #113, #61 ), #247, .F. ) ;
#178 = EDGE_CURVE ( 'NONE', #176, #114, #252, .T. ) ;
#179 = ORIENTED_EDGE ( 'NONE', *, *, #171, .T. ) ;
#180 = DATE_AND_TIME ( #228, #22 ) ;
#181 = AXIS2_PLACEMENT_3D ( 'NONE', #25, #187, #11 ) ;
#182 = ORIENTED_EDGE ( 'NONE', *, *, #77, .T. ) ;
#183 = LOCAL_TIME ( 15, 46, 33.00000000000000000, #133 ) ;
#184 = APPROVAL_DATE_TIME ( #94, #175 ) ;
#185 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#186 = AXIS2_PLACEMENT_3D ( 'NONE', #66, #224, #142 ) ;
#187 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#188 = ORIENTED_EDGE ( 'NONE', *, *, #140, .T. ) ;
#189 = CARTESIAN_POINT ( 'NONE', ( 1.187500000000000000, 1.454268073987481900E-016, 0.01562500000000000000 ) ) ;
#190 = APPLICATION_PROTOCOL_DEFINITION ( 'international standard', 'config_control_design', 1994, #46 ) ;
#191 = APPROVAL_ROLE ( '' ) ;
#192 = CYLINDRICAL_SURFACE ( 'NONE', #119, 1.187500000000000000 ) ;
#193 = EDGE_CURVE ( 'NONE', #213, #163, #72, .T. ) ;
#194 = AXIS2_PLACEMENT_3D ( 'NONE', #84, #98, #123 ) ;
#195 = LOCAL_TIME ( 15, 46, 33.00000000000000000, #237 ) ;
#196 = VECTOR ( 'NONE', #104, 39.37007874015748100 ) ;
#197 = APPROVAL_DATE_TIME ( #214, #166 ) ;
#198 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, -1.000000000000000000 ) ) ;
#199 = PRODUCT_RELATED_PRODUCT_CATEGORY ( 'detail', '', ( #139 ) ) ;
#200 = ORIENTED_EDGE ( 'NONE', *, *, #1, .T. ) ;
#201 = VECTOR ( 'NONE', #222, 39.37007874015748100 ) ;
#202 = ORIENTED_EDGE ( 'NONE', *, *, #193, .T. ) ;
#203 = AXIS2_PLACEMENT_3D ( 'NONE', #121, #248, #164 ) ;
#204 = CARTESIAN_POINT ( 'NONE', ( 2.062500000000000000, 2.525834023241416400E-016, 0.01562500000000000000 ) ) ;
#205 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#206 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, -0.0000000000000000000 ) ) ;
#207 = CC_DESIGN_APPROVAL ( #166, ( #56 ) ) ;
#208 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#209 = EDGE_LOOP ( 'NONE', ( #65, #154 ) ) ;
#210 = PERSON_AND_ORGANIZATION_ROLE ( 'creator' ) ;
#211 = CALENDAR_DATE ( 2022, 17, 11 ) ;
#212 = DATE_TIME_ROLE ( 'classification_date' ) ;
#213 = VERTEX_POINT ( 'NONE', #102 ) ;
#214 = DATE_AND_TIME ( #117, #195 ) ;
#215 = CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT ( #34, #28, ( #56 ) ) ;
#216 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#217 = LINE ( 'NONE', #241, #173 ) ;
#218 = ORIENTED_EDGE ( 'NONE', *, *, #111, .T. ) ;
#219 = CC_DESIGN_SECURITY_CLASSIFICATION ( #3, ( #42 ) ) ;
#220 = EDGE_LOOP ( 'NONE', ( #93, #144, #75, #218 ) ) ;
#221 = COORDINATED_UNIVERSAL_TIME_OFFSET ( 6, 0, .BEHIND. ) ;
#222 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, -1.000000000000000000 ) ) ;
#223 = CC_DESIGN_APPROVAL ( #153, ( #3 ) ) ;
#224 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#225 = DESIGN_CONTEXT ( 'detailed design', #172, 'design' ) ;
#226 = CARTESIAN_POINT ( 'NONE', ( 1.187500000000000000, 1.454268073987481900E-016, -0.01562500000000000000 ) ) ;
#227 = ORIENTED_EDGE ( 'NONE', *, *, #17, .F. ) ;
#228 = CALENDAR_DATE ( 2022, 17, 11 ) ;
#229 = APPROVAL_STATUS ( 'not_yet_approved' ) ;
#230 = APPROVAL_PERSON_ORGANIZATION ( #2, #175, #191 ) ;
#231 = AXIS2_PLACEMENT_3D ( 'NONE', #10, #24, #60 ) ;
#232 = FACE_OUTER_BOUND ( 'NONE', #137, .T. ) ;
#233 = COORDINATED_UNIVERSAL_TIME_OFFSET ( 6, 0, .BEHIND. ) ;
#234 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.01562500000000000000 ) ) ;
#235 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.01562500000000000000 ) ) ;
#236 = LINE ( 'NONE', #158, #169 ) ;
#237 = COORDINATED_UNIVERSAL_TIME_OFFSET ( 6, 0, .BEHIND. ) ;
#238 = FACE_OUTER_BOUND ( 'NONE', #220, .T. ) ;
#239 = APPROVAL_PERSON_ORGANIZATION ( #49, #166, #70 ) ;
#240 = CARTESIAN_POINT ( 'NONE', ( -1.187500000000000000, 0.0000000000000000000, -0.01562500000000000000 ) ) ;
#241 = CARTESIAN_POINT ( 'NONE', ( -1.187500000000000000, 0.0000000000000000000, 0.01562500000000000000 ) ) ;
#242 = ORIENTED_EDGE ( 'NONE', *, *, #77, .F. ) ;
#243 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.01562500000000000000 ) ) ;
#244 = PERSON_AND_ORGANIZATION ( #159, #138 ) ;
#245 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#246 = CIRCLE ( 'NONE', #231, 1.187500000000000000 ) ;
#247 = PLANE ( 'NONE', #181 ) ;
#248 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#249 = LINE ( 'NONE', #101, #196 ) ;
#250 = CC_DESIGN_APPROVAL ( #175, ( #42 ) ) ;
#251 = VERTEX_POINT ( 'NONE', #204 ) ;
#252 = CIRCLE ( 'NONE', #5, 2.062500000000000000 ) ;
ENDSEC;
END-ISO-10303-21;

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,373 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION (( 'STEP AP203' ),
'1' );
FILE_NAME ('98017A257_18-8 Stainless Steel Mil. Spec. Washer.STEP',
'2023-09-12T13:39:25',
( 'Administrator' ),
( 'Managed by Terraform' ),
'SwSTEP 2.0',
'SolidWorks 2017',
'' );
FILE_SCHEMA (( 'CONFIG_CONTROL_DESIGN' ));
ENDSEC;
DATA;
#1 = CARTESIAN_POINT ( 'NONE', ( 0.3200000000000000100, 3.918869757271530800E-017, -0.01600000000000001800 ) ) ;
#2 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#3 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.01280000000000027500 ) ) ;
#4 = APPROVAL_STATUS ( 'not_yet_approved' ) ;
#5 = FACE_BOUND ( 'NONE', #226, .T. ) ;
#6 = APPROVAL ( #354, 'UNSPECIFIED' ) ;
#7 = LOCAL_TIME ( 8, 39, 25.00000000000000000, #120 ) ;
#8 = CARTESIAN_POINT ( 'NONE', ( -0.3200000000000000100, 0.0000000000000000000, 0.01599999999999998300 ) ) ;
#9 = CIRCLE ( 'NONE', #260, 0.3200000000000000100 ) ;
#10 = VERTEX_POINT ( 'NONE', #20 ) ;
#11 = AXIS2_PLACEMENT_3D ( 'NONE', #108, #220, #275 ) ;
#12 = CYLINDRICAL_SURFACE ( 'NONE', #11, 0.3200000000000000100 ) ;
#13 = FACE_OUTER_BOUND ( 'NONE', #312, .T. ) ;
#14 = VERTEX_POINT ( 'NONE', #1 ) ;
#15 = COORDINATED_UNIVERSAL_TIME_OFFSET ( 6, 0, .BEHIND. ) ;
#16 = ORIENTED_EDGE ( 'NONE', *, *, #31, .T. ) ;
#17 = AXIS2_PLACEMENT_3D ( 'NONE', #130, #23, #272 ) ;
#18 = ORIENTED_EDGE ( 'NONE', *, *, #188, .T. ) ;
#19 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.01599999999999998300 ) ) ;
#20 = CARTESIAN_POINT ( 'NONE', ( 0.3200000000000000100, 3.918869757271530800E-017, 0.01280000000000027500 ) ) ;
#21 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#22 = PRODUCT_RELATED_PRODUCT_CATEGORY ( 'detail', '', ( #84 ) ) ;
#23 = DIRECTION ( 'NONE', ( 1.224646799147353200E-016, 1.000000000000000000, -0.0000000000000000000 ) ) ;
#24 = CALENDAR_DATE ( 2023, 12, 9 ) ;
#25 = FACE_OUTER_BOUND ( 'NONE', #137, .T. ) ;
#26 = AXIS2_PLACEMENT_3D ( 'NONE', #131, #306, #147 ) ;
#27 = CARTESIAN_POINT ( 'NONE', ( -0.3200000000000000100, 0.0000000000000000000, -0.01600000000000001800 ) ) ;
#28 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, -1.000000000000000000 ) ) ;
#29 = CIRCLE ( 'NONE', #250, 0.5939999999999999700 ) ;
#30 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#31 = EDGE_CURVE ( 'NONE', #223, #296, #29, .T. ) ;
#32 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, -0.0000000000000000000 ) ) ;
#33 = CALENDAR_DATE ( 2023, 12, 9 ) ;
#34 = VERTEX_POINT ( 'NONE', #27 ) ;
#35 = PERSON_AND_ORGANIZATION ( #203, #57 ) ;
#36 = CALENDAR_DATE ( 2023, 12, 9 ) ;
#37 = ORIENTED_EDGE ( 'NONE', *, *, #230, .F. ) ;
#38 = ORIENTED_EDGE ( 'NONE', *, *, #341, .T. ) ;
#39 = AXIS2_PLACEMENT_3D ( 'NONE', #182, #123, #21 ) ;
#40 = VERTEX_POINT ( 'NONE', #346 ) ;
#41 =( GEOMETRIC_REPRESENTATION_CONTEXT ( 3 ) GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT ( ( #54 ) ) GLOBAL_UNIT_ASSIGNED_CONTEXT ( ( #73, #214, #268 ) ) REPRESENTATION_CONTEXT ( 'NONE', 'WORKASPACE' ) );
#42 = ADVANCED_FACE ( 'NONE', ( #5, #25 ), #238, .T. ) ;
#43 = TOROIDAL_SURFACE ( 'NONE', #200, 0.3271554175279990400, 0.009600000000000000900 ) ;
#44 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.01280000000000013800 ) ) ;
#45 = DIRECTION ( 'NONE', ( -1.000000000000000000, -1.224646799147356200E-016, 0.0000000000000000000 ) ) ;
#46 = EDGE_CURVE ( 'NONE', #223, #271, #286, .T. ) ;
#47 = LOCAL_TIME ( 8, 39, 25.00000000000000000, #169 ) ;
#48 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#49 = APPLICATION_PROTOCOL_DEFINITION ( 'international standard', 'config_control_design', 1994, #241 ) ;
#50 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#51 = CYLINDRICAL_SURFACE ( 'NONE', #274, 0.5939999999999999700 ) ;
#52 = CC_DESIGN_DATE_AND_TIME_ASSIGNMENT ( #90, #126, ( #248 ) ) ;
#53 = ORIENTED_EDGE ( 'NONE', *, *, #349, .F. ) ;
#54 = UNCERTAINTY_MEASURE_WITH_UNIT (LENGTH_MEASURE( 1.000000000000000100E-005 ), #73, 'distance_accuracy_value', 'NONE');
#55 = CARTESIAN_POINT ( 'NONE', ( 0.3200000000000000100, 3.918869757271530800E-017, 0.01599999999999998300 ) ) ;
#56 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#57 = ORGANIZATION ( 'UNSPECIFIED', 'UNSPECIFIED', '' ) ;
#58 = ORIENTED_EDGE ( 'NONE', *, *, #93, .F. ) ;
#59 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#60 = DATE_AND_TIME ( #36, #7 ) ;
#61 = EDGE_CURVE ( 'NONE', #34, #14, #235, .T. ) ;
#62 = EDGE_LOOP ( 'NONE', ( #282, #38, #82, #141 ) ) ;
#63 = VERTEX_POINT ( 'NONE', #320 ) ;
#64 = APPROVAL_PERSON_ORGANIZATION ( #281, #114, #75 ) ;
#65 = ORIENTED_EDGE ( 'NONE', *, *, #313, .F. ) ;
#66 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#67 = EDGE_CURVE ( 'NONE', #63, #315, #342, .T. ) ;
#68 = CIRCLE ( 'NONE', #256, 0.3271554175279990400 ) ;
#69 = DATE_TIME_ROLE ( 'creation_date' ) ;
#70 = TOROIDAL_SURFACE ( 'NONE', #138, 0.5868445824720007800, 0.009600000000000000900 ) ;
#71 = CLOSED_SHELL ( 'NONE', ( #155, #292, #326, #295, #42, #247, #101, #179, #344, #97 ) ) ;
#72 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#73 =( CONVERSION_BASED_UNIT ( 'INCH', #333 ) LENGTH_UNIT ( ) NAMED_UNIT ( #262 ) );
#74 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#75 = APPROVAL_ROLE ( '' ) ;
#76 = PRODUCT_DEFINITION ( 'UNKNOWN', '', #186, #285 ) ;
#77 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#78 = CYLINDRICAL_SURFACE ( 'NONE', #26, 0.5939999999999999700 ) ;
#79 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.01600000000000001800 ) ) ;
#80 = CIRCLE ( 'NONE', #219, 0.009600000000000000900 ) ;
#81 = APPROVAL ( #294, 'UNSPECIFIED' ) ;
#82 = ORIENTED_EDGE ( 'NONE', *, *, #31, .F. ) ;
#83 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#84 = PRODUCT ( '98017A257_18-8 Stainless Steel Mil. Spec. Washer', '98017A257_18-8 Stainless Steel Mil. Spec. Washer', '', ( #100 ) ) ;
#85 = LOCAL_TIME ( 8, 39, 25.00000000000000000, #15 ) ;
#86 = CIRCLE ( 'NONE', #17, 0.009600000000000014800 ) ;
#87 = SHAPE_DEFINITION_REPRESENTATION ( #206, #345 ) ;
#88 = CIRCLE ( 'NONE', #193, 0.5939999999999999700 ) ;
#89 = EDGE_LOOP ( 'NONE', ( #58, #183, #174, #287 ) ) ;
#90 = DATE_AND_TIME ( #113, #261 ) ;
#91 = APPROVAL_DATE_TIME ( #196, #6 ) ;
#92 = FACE_OUTER_BOUND ( 'NONE', #252, .T. ) ;
#93 = EDGE_CURVE ( 'NONE', #296, #40, #228, .T. ) ;
#94 = CIRCLE ( 'NONE', #172, 0.3271554175279990400 ) ;
#95 = CARTESIAN_POINT ( 'NONE', ( -0.5939999999999999700, 0.0000000000000000000, 0.01280000000000013800 ) ) ;
#96 = ORIENTED_EDGE ( 'NONE', *, *, #154, .F. ) ;
#97 = ADVANCED_FACE ( 'NONE', ( #311 ), #70, .T. ) ;
#98 = PERSON_AND_ORGANIZATION_ROLE ( 'creator' ) ;
#99 = CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT ( #103, #297, ( #76 ) ) ;
#100 = MECHANICAL_CONTEXT ( 'NONE', #241, 'mechanical' ) ;
#101 = ADVANCED_FACE ( 'NONE', ( #236 ), #51, .T. ) ;
#102 = EDGE_CURVE ( 'NONE', #173, #10, #304, .T. ) ;
#103 = PERSON_AND_ORGANIZATION ( #203, #57 ) ;
#104 = ORIENTED_EDGE ( 'NONE', *, *, #341, .F. ) ;
#105 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, -1.000000000000000000 ) ) ;
#106 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#107 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#108 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.01599999999999998300 ) ) ;
#109 = ORIENTED_EDGE ( 'NONE', *, *, #234, .T. ) ;
#110 = AXIS2_PLACEMENT_3D ( 'NONE', #240, #276, #356 ) ;
#111 = CARTESIAN_POINT ( 'NONE', ( -0.5868445824720007800, 0.0000000000000000000, 0.006399999999999983000 ) ) ;
#112 = ORIENTED_EDGE ( 'NONE', *, *, #171, .F. ) ;
#113 = CALENDAR_DATE ( 2023, 12, 9 ) ;
#114 = APPROVAL ( #4, 'UNSPECIFIED' ) ;
#115 = EDGE_CURVE ( 'NONE', #135, #34, #153, .T. ) ;
#116 = VECTOR ( 'NONE', #288, 39.37007874015748100 ) ;
#117 = EDGE_LOOP ( 'NONE', ( #216, #337 ) ) ;
#118 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.01599999999999998300 ) ) ;
#119 = PERSON_AND_ORGANIZATION ( #203, #57 ) ;
#120 = COORDINATED_UNIVERSAL_TIME_OFFSET ( 6, 0, .BEHIND. ) ;
#121 = AXIS2_PLACEMENT_3D ( 'NONE', #267, #124, #218 ) ;
#122 = AXIS2_PLACEMENT_3D ( 'NONE', #300, #217, #72 ) ;
#123 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, -1.000000000000000000 ) ) ;
#124 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#125 = LOCAL_TIME ( 8, 39, 25.00000000000000000, #347 ) ;
#126 = DATE_TIME_ROLE ( 'classification_date' ) ;
#127 = EDGE_LOOP ( 'NONE', ( #104, #317, #157, #96 ) ) ;
#128 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#129 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#130 = CARTESIAN_POINT ( 'NONE', ( -0.3271554175279990400, 4.006498348993799500E-017, 0.006399999999999983000 ) ) ;
#131 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.01599999999999998300 ) ) ;
#132 = CC_DESIGN_APPROVAL ( #114, ( #76 ) ) ;
#133 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#134 = PERSON_AND_ORGANIZATION_ROLE ( 'design_owner' ) ;
#135 = VERTEX_POINT ( 'NONE', #162 ) ;
#136 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.01599999999999998300 ) ) ;
#137 = EDGE_LOOP ( 'NONE', ( #245, #145 ) ) ;
#138 = AXIS2_PLACEMENT_3D ( 'NONE', #178, #352, #310 ) ;
#139 = CC_DESIGN_DATE_AND_TIME_ASSIGNMENT ( #314, #69, ( #76 ) ) ;
#140 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.01600000000000001800 ) ) ;
#141 = ORIENTED_EDGE ( 'NONE', *, *, #212, .F. ) ;
#142 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#143 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.01599999999999998300 ) ) ;
#144 = ORIENTED_EDGE ( 'NONE', *, *, #188, .F. ) ;
#145 = ORIENTED_EDGE ( 'NONE', *, *, #67, .T. ) ;
#146 = APPROVAL_DATE_TIME ( #60, #81 ) ;
#147 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#148 = EDGE_CURVE ( 'NONE', #135, #10, #231, .T. ) ;
#149 = CIRCLE ( 'NONE', #338, 0.3200000000000000100 ) ;
#150 = ORIENTED_EDGE ( 'NONE', *, *, #93, .T. ) ;
#151 = CARTESIAN_POINT ( 'NONE', ( 0.5939999999999999700, 7.274401986935278000E-017, 0.01599999999999998300 ) ) ;
#152 = APPROVAL_DATE_TIME ( #207, #114 ) ;
#153 = LINE ( 'NONE', #8, #170 ) ;
#154 = EDGE_CURVE ( 'NONE', #296, #223, #191, .T. ) ;
#155 = ADVANCED_FACE ( 'NONE', ( #225 ), #283, .T. ) ;
#156 = AXIS2_PLACEMENT_3D ( 'NONE', #190, #249, #77 ) ;
#157 = ORIENTED_EDGE ( 'NONE', *, *, #212, .T. ) ;
#158 = ORIENTED_EDGE ( 'NONE', *, *, #308, .F. ) ;
#159 = CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT ( #194, #350, ( #248 ) ) ;
#160 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.01599999999999998300 ) ) ;
#161 = CARTESIAN_POINT ( 'NONE', ( -0.5939999999999999700, 0.0000000000000000000, 0.01599999999999998300 ) ) ;
#162 = CARTESIAN_POINT ( 'NONE', ( -0.3200000000000000100, 0.0000000000000000000, 0.01280000000000027500 ) ) ;
#163 = DIRECTION ( 'NONE', ( -1.224646799147353200E-016, 1.000000000000000000, 0.0000000000000000000 ) ) ;
#164 = LINE ( 'NONE', #55, #167 ) ;
#165 = CARTESIAN_POINT ( 'NONE', ( -0.5868445824720007800, 0.0000000000000000000, 0.01599999999999998300 ) ) ;
#166 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.01280000000000013800 ) ) ;
#167 = VECTOR ( 'NONE', #105, 39.37007874015748100 ) ;
#168 = ORIENTED_EDGE ( 'NONE', *, *, #115, .F. ) ;
#169 = COORDINATED_UNIVERSAL_TIME_OFFSET ( 6, 0, .BEHIND. ) ;
#170 = VECTOR ( 'NONE', #302, 39.37007874015748100 ) ;
#171 = EDGE_CURVE ( 'NONE', #173, #211, #94, .T. ) ;
#172 = AXIS2_PLACEMENT_3D ( 'NONE', #136, #327, #279 ) ;
#173 = VERTEX_POINT ( 'NONE', #301 ) ;
#174 = ORIENTED_EDGE ( 'NONE', *, *, #46, .T. ) ;
#175 = AXIS2_PLACEMENT_3D ( 'NONE', #143, #59, #229 ) ;
#176 = PERSON_AND_ORGANIZATION ( #203, #57 ) ;
#177 = EDGE_LOOP ( 'NONE', ( #144, #109, #343, #158 ) ) ;
#178 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.006399999999999983000 ) ) ;
#179 = ADVANCED_FACE ( 'NONE', ( #293 ), #12, .F. ) ;
#180 = FACE_OUTER_BOUND ( 'NONE', #202, .T. ) ;
#181 = AXIS2_PLACEMENT_3D ( 'NONE', #50, #222, #246 ) ;
#182 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.01599999999999998300 ) ) ;
#183 = ORIENTED_EDGE ( 'NONE', *, *, #154, .T. ) ;
#184 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#185 = PERSON_AND_ORGANIZATION_ROLE ( 'design_supplier' ) ;
#186 = PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE ( 'ANY', '', #84, .NOT_KNOWN. ) ;
#187 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, -1.000000000000000000 ) ) ;
#188 = EDGE_CURVE ( 'NONE', #10, #14, #164, .T. ) ;
#189 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.006399999999999983000 ) ) ;
#190 = CARTESIAN_POINT ( 'NONE', ( 0.3271554175279990400, 0.0000000000000000000, 0.006399999999999983000 ) ) ;
#191 = CIRCLE ( 'NONE', #284, 0.5939999999999999700 ) ;
#192 = ORIENTED_EDGE ( 'NONE', *, *, #318, .T. ) ;
#193 = AXIS2_PLACEMENT_3D ( 'NONE', #195, #30, #227 ) ;
#194 = PERSON_AND_ORGANIZATION ( #203, #57 ) ;
#195 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.01600000000000001800 ) ) ;
#196 = DATE_AND_TIME ( #269, #47 ) ;
#197 = CARTESIAN_POINT ( 'NONE', ( -0.5939999999999999700, 0.0000000000000000000, -0.01600000000000001800 ) ) ;
#198 = ORIENTED_EDGE ( 'NONE', *, *, #313, .T. ) ;
#199 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -1.000000000000000000 ) ) ;
#200 = AXIS2_PLACEMENT_3D ( 'NONE', #257, #128, #353 ) ;
#201 = TOROIDAL_SURFACE ( 'NONE', #110, 0.3271554175279990400, 0.009600000000000000900 ) ;
#202 = EDGE_LOOP ( 'NONE', ( #37, #53 ) ) ;
#203 = PERSON ( 'UNSPECIFIED', 'UNSPECIFIED', 'UNSPECIFIED', ('UNSPECIFIED'), ('UNSPECIFIED'), ('UNSPECIFIED') ) ;
#204 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.01600000000000001800 ) ) ;
#205 = AXIS2_PLACEMENT_3D ( 'NONE', #118, #233, #66 ) ;
#206 = PRODUCT_DEFINITION_SHAPE ( 'NONE', 'NONE', #76 ) ;
#207 = DATE_AND_TIME ( #24, #85 ) ;
#208 = ORIENTED_EDGE ( 'NONE', *, *, #318, .F. ) ;
#209 = CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT ( #119, #98, ( #186 ) ) ;
#210 = CIRCLE ( 'NONE', #175, 0.5868445824720007800 ) ;
#211 = VERTEX_POINT ( 'NONE', #291 ) ;
#212 = EDGE_CURVE ( 'NONE', #315, #223, #80, .T. ) ;
#213 = VECTOR ( 'NONE', #270, 39.37007874015748100 ) ;
#214 =( NAMED_UNIT ( * ) PLANE_ANGLE_UNIT ( ) SI_UNIT ( $, .RADIAN. ) );
#215 = CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT ( #273, #185, ( #186 ) ) ;
#216 = ORIENTED_EDGE ( 'NONE', *, *, #61, .T. ) ;
#217 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#218 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, -0.0000000000000000000 ) ) ;
#219 = AXIS2_PLACEMENT_3D ( 'NONE', #111, #305, #199 ) ;
#220 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, -1.000000000000000000 ) ) ;
#221 = SECURITY_CLASSIFICATION_LEVEL ( 'unclassified' ) ;
#222 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#223 = VERTEX_POINT ( 'NONE', #95 ) ;
#224 = ORIENTED_EDGE ( 'NONE', *, *, #148, .T. ) ;
#225 = FACE_OUTER_BOUND ( 'NONE', #62, .T. ) ;
#226 = EDGE_LOOP ( 'NONE', ( #258, #192 ) ) ;
#227 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#228 = LINE ( 'NONE', #151, #116 ) ;
#229 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#230 = EDGE_CURVE ( 'NONE', #271, #40, #88, .T. ) ;
#231 = CIRCLE ( 'NONE', #265, 0.3200000000000000100 ) ;
#232 = CC_DESIGN_SECURITY_CLASSIFICATION ( #248, ( #186 ) ) ;
#233 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#234 = EDGE_CURVE ( 'NONE', #10, #135, #9, .T. ) ;
#235 = CIRCLE ( 'NONE', #322, 0.3200000000000000100 ) ;
#236 = FACE_OUTER_BOUND ( 'NONE', #89, .T. ) ;
#237 = APPLICATION_CONTEXT ( 'configuration controlled 3d designs of mechanical parts and assemblies' ) ;
#238 = PLANE ( 'NONE', #121 ) ;
#239 = AXIS2_PLACEMENT_3D ( 'NONE', #324, #163, #45 ) ;
#240 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.006399999999999983000 ) ) ;
#241 = APPLICATION_CONTEXT ( 'configuration controlled 3d designs of mechanical parts and assemblies' ) ;
#242 = PERSON_AND_ORGANIZATION ( #203, #57 ) ;
#243 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#244 = CC_DESIGN_APPROVAL ( #6, ( #186 ) ) ;
#245 = ORIENTED_EDGE ( 'NONE', *, *, #289, .T. ) ;
#246 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#247 = ADVANCED_FACE ( 'NONE', ( #180, #299 ), #332, .F. ) ;
#248 = SECURITY_CLASSIFICATION ( '', '', #221 ) ;
#249 = DIRECTION ( 'NONE', ( 0.0000000000000000000, -1.000000000000000000, 0.0000000000000000000 ) ) ;
#250 = AXIS2_PLACEMENT_3D ( 'NONE', #44, #74, #355 ) ;
#251 = ORIENTED_EDGE ( 'NONE', *, *, #148, .F. ) ;
#252 = EDGE_LOOP ( 'NONE', ( #16, #150, #340, #263 ) ) ;
#253 = CARTESIAN_POINT ( 'NONE', ( 0.5939999999999999700, 7.274401986935278000E-017, 0.01280000000000013800 ) ) ;
#254 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.01280000000000027500 ) ) ;
#255 = ORIENTED_EDGE ( 'NONE', *, *, #102, .T. ) ;
#256 = AXIS2_PLACEMENT_3D ( 'NONE', #19, #187, #325 ) ;
#257 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.006399999999999983000 ) ) ;
#258 = ORIENTED_EDGE ( 'NONE', *, *, #171, .T. ) ;
#259 = CC_DESIGN_APPROVAL ( #81, ( #248 ) ) ;
#260 = AXIS2_PLACEMENT_3D ( 'NONE', #254, #56, #142 ) ;
#261 = LOCAL_TIME ( 8, 39, 25.00000000000000000, #335 ) ;
#262 = DIMENSIONAL_EXPONENTS ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000, 0.0000000000000000000, 0.0000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ;
#263 = ORIENTED_EDGE ( 'NONE', *, *, #46, .F. ) ;
#264 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, -1.000000000000000000 ) ) ;
#265 = AXIS2_PLACEMENT_3D ( 'NONE', #3, #243, #107 ) ;
#266 = APPROVAL_ROLE ( '' ) ;
#267 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 0.01599999999999998300 ) ) ;
#268 =( NAMED_UNIT ( * ) SI_UNIT ( $, .STERADIAN. ) SOLID_ANGLE_UNIT ( ) );
#269 = CALENDAR_DATE ( 2023, 12, 9 ) ;
#270 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, -1.000000000000000000 ) ) ;
#271 = VERTEX_POINT ( 'NONE', #197 ) ;
#272 = DIRECTION ( 'NONE', ( -1.000000000000000000, 1.224646799147348300E-016, 0.0000000000000000000 ) ) ;
#273 = PERSON_AND_ORGANIZATION ( #203, #57 ) ;
#274 = AXIS2_PLACEMENT_3D ( 'NONE', #160, #264, #129 ) ;
#275 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#276 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#277 = FACE_OUTER_BOUND ( 'NONE', #278, .T. ) ;
#278 = EDGE_LOOP ( 'NONE', ( #65, #112, #255, #251 ) ) ;
#279 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#280 = AXIS2_PLACEMENT_3D ( 'NONE', #140, #330, #32 ) ;
#281 = PERSON_AND_ORGANIZATION ( #203, #57 ) ;
#282 = ORIENTED_EDGE ( 'NONE', *, *, #67, .F. ) ;
#283 = TOROIDAL_SURFACE ( 'NONE', #303, 0.5868445824720007800, 0.009600000000000000900 ) ;
#284 = AXIS2_PLACEMENT_3D ( 'NONE', #166, #106, #184 ) ;
#285 = DESIGN_CONTEXT ( 'detailed design', #237, 'design' ) ;
#286 = LINE ( 'NONE', #161, #213 ) ;
#287 = ORIENTED_EDGE ( 'NONE', *, *, #230, .T. ) ;
#288 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, -1.000000000000000000 ) ) ;
#289 = EDGE_CURVE ( 'NONE', #315, #63, #210, .T. ) ;
#290 = FACE_OUTER_BOUND ( 'NONE', #348, .T. ) ;
#291 = CARTESIAN_POINT ( 'NONE', ( -0.3271554175279990400, 4.006498348993799500E-017, 0.01599999999999998300 ) ) ;
#292 = ADVANCED_FACE ( 'NONE', ( #13 ), #43, .T. ) ;
#293 = FACE_OUTER_BOUND ( 'NONE', #177, .T. ) ;
#294 = APPROVAL_STATUS ( 'not_yet_approved' ) ;
#295 = ADVANCED_FACE ( 'NONE', ( #92 ), #78, .T. ) ;
#296 = VERTEX_POINT ( 'NONE', #253 ) ;
#297 = PERSON_AND_ORGANIZATION_ROLE ( 'creator' ) ;
#298 =( LENGTH_UNIT ( ) NAMED_UNIT ( * ) SI_UNIT ( $, .METRE. ) );
#299 = FACE_BOUND ( 'NONE', #117, .T. ) ;
#300 = CARTESIAN_POINT ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, -0.01600000000000001800 ) ) ;
#301 = CARTESIAN_POINT ( 'NONE', ( 0.3271554175279990400, 0.0000000000000000000, 0.01599999999999998300 ) ) ;
#302 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, -1.000000000000000000 ) ) ;
#303 = AXIS2_PLACEMENT_3D ( 'NONE', #189, #28, #48 ) ;
#304 = CIRCLE ( 'NONE', #156, 0.009600000000000000900 ) ;
#305 = DIRECTION ( 'NONE', ( 0.0000000000000000000, -1.000000000000000000, 0.0000000000000000000 ) ) ;
#306 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, -1.000000000000000000 ) ) ;
#307 = MANIFOLD_SOLID_BREP ( 'Fillet1', #71 ) ;
#308 = EDGE_CURVE ( 'NONE', #14, #34, #149, .T. ) ;
#309 = CYLINDRICAL_SURFACE ( 'NONE', #39, 0.3200000000000000100 ) ;
#310 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#311 = FACE_OUTER_BOUND ( 'NONE', #127, .T. ) ;
#312 = EDGE_LOOP ( 'NONE', ( #208, #198, #329, #316 ) ) ;
#313 = EDGE_CURVE ( 'NONE', #211, #135, #86, .T. ) ;
#314 = DATE_AND_TIME ( #33, #125 ) ;
#315 = VERTEX_POINT ( 'NONE', #165 ) ;
#316 = ORIENTED_EDGE ( 'NONE', *, *, #102, .F. ) ;
#317 = ORIENTED_EDGE ( 'NONE', *, *, #289, .F. ) ;
#318 = EDGE_CURVE ( 'NONE', #211, #173, #68, .T. ) ;
#319 = APPROVAL_ROLE ( '' ) ;
#320 = CARTESIAN_POINT ( 'NONE', ( 0.5868445824720007800, 7.230587691074144000E-017, 0.01599999999999998300 ) ) ;
#321 = APPLICATION_PROTOCOL_DEFINITION ( 'international standard', 'config_control_design', 1994, #237 ) ;
#322 = AXIS2_PLACEMENT_3D ( 'NONE', #79, #323, #2 ) ;
#323 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#324 = CARTESIAN_POINT ( 'NONE', ( 0.5868445824720007800, 7.186773395213007500E-017, 0.006399999999999983000 ) ) ;
#325 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#326 = ADVANCED_FACE ( 'NONE', ( #290 ), #309, .F. ) ;
#327 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, -1.000000000000000000 ) ) ;
#328 = CIRCLE ( 'NONE', #239, 0.009600000000000014800 ) ;
#329 = ORIENTED_EDGE ( 'NONE', *, *, #234, .F. ) ;
#330 = DIRECTION ( 'NONE', ( 0.0000000000000000000, 0.0000000000000000000, 1.000000000000000000 ) ) ;
#331 = CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT ( #176, #134, ( #84 ) ) ;
#332 = PLANE ( 'NONE', #280 ) ;
#333 = LENGTH_MEASURE_WITH_UNIT ( LENGTH_MEASURE( 0.02539999999999999900 ), #298 );
#334 = ORIENTED_EDGE ( 'NONE', *, *, #61, .F. ) ;
#335 = COORDINATED_UNIVERSAL_TIME_OFFSET ( 6, 0, .BEHIND. ) ;
#336 = CIRCLE ( 'NONE', #122, 0.5939999999999999700 ) ;
#337 = ORIENTED_EDGE ( 'NONE', *, *, #308, .T. ) ;
#338 = AXIS2_PLACEMENT_3D ( 'NONE', #204, #133, #83 ) ;
#339 = APPROVAL_PERSON_ORGANIZATION ( #242, #6, #266 ) ;
#340 = ORIENTED_EDGE ( 'NONE', *, *, #349, .T. ) ;
#341 = EDGE_CURVE ( 'NONE', #63, #296, #328, .T. ) ;
#342 = CIRCLE ( 'NONE', #205, 0.5868445824720007800 ) ;
#343 = ORIENTED_EDGE ( 'NONE', *, *, #115, .T. ) ;
#344 = ADVANCED_FACE ( 'NONE', ( #277 ), #201, .T. ) ;
#345 = ADVANCED_BREP_SHAPE_REPRESENTATION ( '98017A257_18-8 Stainless Steel Mil. Spec. Washer', ( #307, #181 ), #41 ) ;
#346 = CARTESIAN_POINT ( 'NONE', ( 0.5939999999999999700, 7.274401986935278000E-017, -0.01600000000000001800 ) ) ;
#347 = COORDINATED_UNIVERSAL_TIME_OFFSET ( 6, 0, .BEHIND. ) ;
#348 = EDGE_LOOP ( 'NONE', ( #224, #18, #334, #168 ) ) ;
#349 = EDGE_CURVE ( 'NONE', #40, #271, #336, .T. ) ;
#350 = PERSON_AND_ORGANIZATION_ROLE ( 'classification_officer' ) ;
#351 = APPROVAL_PERSON_ORGANIZATION ( #35, #81, #319 ) ;
#352 = DIRECTION ( 'NONE', ( -0.0000000000000000000, -0.0000000000000000000, -1.000000000000000000 ) ) ;
#353 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#354 = APPROVAL_STATUS ( 'not_yet_approved' ) ;
#355 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
#356 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.0000000000000000000, 0.0000000000000000000 ) ) ;
ENDSEC;
END-ISO-10303-21;

View File

@ -1,6 +1,7 @@
// Pipe with bend
// A tubular section or hollow cylinder, usually but not necessarily of circular cross-section, used mainly to convey substances that can flow.
// Set units
@settings(defaultLengthUnit = in)
@ -14,22 +15,14 @@ bendAngle = 90
sketch000 = startSketchOn("XZ")
// create a profile for the outer diameter
outerProfile = circle(
sketch000,
center = [bendRadius, 0],
radius = outerDiameter / 2
)
outerProfile = circle(sketch000, center = [bendRadius, 0], radius = outerDiameter / 2)
// create a profile for the inner diameter
innerProfile = circle(
sketch000,
center = [bendRadius, 0],
radius = innerDiameter / 2
)
innerProfile = circle(sketch000, center = [bendRadius, 0], radius = innerDiameter / 2)
// create the profile of the pipe
pipeProfile = outerProfile
|> hole(innerProfile, %)
// revolve the pipe profile at the desired angle
pipe = revolve(pipeProfile, axis = "Y", angle = bendAngle)
pipe = revolve(pipeProfile, axis = 'Y', angle = bendAngle)

View File

@ -1,9 +1,11 @@
// Poopy Shoe
// poop shute for bambu labs printer - optimized for printing.
// Set units
@settings(defaultLengthUnit = in)
wallThickness = 0.125
wallsWidth = 3
height = 5.125
@ -30,8 +32,7 @@ sketch001 = startSketchOn("-YZ")
|> yLine(endAbsolute = segEndY(seg01))
|> angledLineToY({ angle = 180 - 60, to = 0 }, %)
|> close()
part001 = revolve(
sketch001,
part001 = revolve(sketch001,
angle = 90,
axis = {
custom = {

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 58 KiB

View File

@ -1,68 +1,64 @@
// Socket Head Cap Screw
// This is for a #10-24 screw that is 1.00 inches long. A socket head cap screw is a type of fastener that is widely used in a variety of applications requiring a high strength fastening solution. It is characterized by its cylindrical head and internal hexagonal drive, which allows for tightening with an Allen wrench or hex key.
// Set units
@settings(defaultLengthUnit = in)
// set units
@settings(defaultLengthUnit = in, defaultAngleUnit = deg)
// Define constants
screwLength = 1.0
screwDiameter = .190
headDiameter = .313
headLength = screwDiameter
hexWallToWall = 5 / 32
capRatio = screwDiameter / headDiameter
hexRatio = hexWallToWall / headDiameter
hexWallLength = hexWallToWall / 2 * 1 / cos(toRadians(30))
hexStartingAngle = 210 // first angle of hex pattern
hexInteriorAngle = 120
hexChangeAngle = 180 - hexInteriorAngle
export boltDiameter = 0.190
export boltLength = 1.00
export boltHeadLength = boltDiameter
export boltHeadDiameter = 0.313
export boltHexDrive = 5/32
export boltHexFlatLength = boltHexDrive / (2 * cos(toRadians(30)))
// Write a function that defines the Socket Head Cap Screw
fn capScrew(start, length, dia, capHeadLength) {
export fn bolt () {
// Create the head of the cap screw
screwHeadSketch = startSketchOn('XZ')
boltHead = startSketchOn('XZ')
|> circle(
center = [start[0], start[1]],
radius = dia / capRatio / 2
center = [0, 0],
radius = boltHeadDiameter / 2,
tag = $topEdge
)
// Extrude the screw head sketch
screwHead = extrude(screwHeadSketch, length = capHeadLength)
|> extrude(length = -boltHeadLength)
|> fillet(radius = 0.020, tags = [topEdge, getOppositeEdge(topEdge)])
// Define the sketch of the hex pattern on the screw head
hexPatternSketch = startSketchOn(screwHead, 'end')
|> startProfileAt([hexWallToWall / 2, 0], %)
|> yLine(length = -hexWallLength / 2)
hexPatternSketch = startSketchOn(boltHead, 'start')
|> startProfileAt([
boltHexDrive / 2,
boltHexFlatLength / 2
], %)
|> angledLine({
angle = hexStartingAngle,
length = hexWallLength
angle = 270,
length = boltHexFlatLength
}, %)
|> angledLine({
angle = hexStartingAngle - hexChangeAngle,
length = hexWallLength
angle = 210,
length = boltHexFlatLength
}, %)
|> angledLine({
angle = hexStartingAngle - (2 * hexChangeAngle),
length = hexWallLength
angle = 150,
length = boltHexFlatLength
}, %)
|> angledLine({
angle = hexStartingAngle - (3 * hexChangeAngle),
length = hexWallLength
angle = 90,
length = boltHexFlatLength
}, %)
|> angledLine({
angle = hexStartingAngle - (4 * hexChangeAngle),
length = hexWallLength
angle = 30,
length = boltHexFlatLength
}, %)
|> close()
hexPattern = extrude(hexPatternSketch, length = -headLength * 0.75)
|> extrude(length = -boltHeadLength * 0.75)
boltBody = startSketchOn(boltHead, 'end')
|> circle(center = [0, 0], radius = boltDiameter / 2, tag = $filletEdge)
|> extrude(length = boltLength)
|> fillet(radius = .020, tags = [getOppositeEdge(filletEdge)])
|> appearance(color = "#4dd043", metalness = 90, roughness = 90)
screwBodySketch = startSketchOn(screwHead, "start")
|> circle(
center = [start[0], start[1]],
radius = dia / 2
)
screwBody = extrude(screwBodySketch, length = length)
return screwBody
return boltBody
}
capScrew([0, 0], screwLength, screwDiameter, screwDiameter)
bolt()

View File

@ -1,50 +1,37 @@
// Antenna
// import constants
import antennaLength, antennaBaseWidth, antennaBaseHeight, antennaTopWidth, antennaTopHeight from "globals.kcl"
// Set units
@settings(defaultLengthUnit = in)
// import constants
import height, width, antennaBaseWidth, antennaBaseHeight, antennaTopWidth, antennaTopHeight from "globals.kcl"
// Calculate the origin
origin = [-width / 2 + .45, -0.10]
// Create the antenna
antennaX = origin[0]
antennaY = origin[1]
antennaPlane = {
plane = {
origin = { x = 0, y = 0, z = height / 2 },
xAxis = { x = 1, y = 0, z = 0 },
yAxis = { x = 0, y = 1, z = 0 },
zAxis = { x = 0, y = 0, z = 1 }
}
export fn antenna () {
// Create the antenna base sketch
sketch001 = startSketchOn('XY')
|> startProfileAt([0, 0], %)
|> line(end = [antennaBaseWidth, 0])
|> line(end = [0, -antennaBaseHeight])
|> line(end = [-antennaBaseWidth, 0])
|> close()
// Create the antenna top sketch
loftPlane = offsetPlane('XY', offset = antennaLength)
sketch002 = startSketchOn(loftPlane)
|> startProfileAt([
(antennaBaseWidth - antennaTopWidth) / 2,
(antennaBaseHeight - antennaTopHeight) / 2
], %)
|> xLine(length = antennaTopWidth)
|> yLine(length = -antennaTopHeight)
|> xLine(length = -antennaTopWidth)
|> close()
// Create the antenna using a loft
antenna = loft([sketch001, sketch002])
|> appearance(color = "#000000")
return antenna
}
// Create the antenna base sketch
sketch001 = startSketchOn(antennaPlane)
|> startProfileAt([origin[0], origin[1]], %)
|> line(end = [antennaBaseWidth, 0])
|> line(end = [0, -antennaBaseHeight])
|> line(end = [-antennaBaseWidth, 0])
|> close()
// Create the antenna top sketch
loftPlane = offsetPlane('XY', offset = height / 2 + 3)
sketch002 = startSketchOn(loftPlane)
|> startProfileAt([
origin[0] + (antennaBaseWidth - antennaTopWidth) / 2,
origin[1] - ((antennaBaseHeight - antennaTopHeight) / 2)
], %)
|> xLine(length = antennaTopWidth)
|> yLine(length = -antennaTopHeight)
|> xLine(length = -antennaTopWidth)
|> close()
// Create the antenna using a loft
loft([sketch001, sketch002])
|> appearance(color = "#000000")

View File

@ -1,80 +1,86 @@
// Walkie talkie body
// Set units
@settings(defaultLengthUnit = in)
// Import constants
// import constants
import height, width, thickness, chamferLength, offset, screenWidth, screenHeight, screenYPosition, screenDepth, speakerBoxWidth, speakerBoxHeight from "globals.kcl"
bodySketch = startSketchOn('XZ')
|> startProfileAt([-width / 2, height / 2], %)
|> xLine(length = width, tag = $chamfer1)
|> yLine(length = -height, tag = $chamfer2)
|> xLine(length = -width, tag = $chamfer3)
|> close(tag = $chamfer4)
bodyExtrude = extrude(bodySketch, length = thickness)
|> chamfer(
length = chamferLength,
tags = [
getNextAdjacentEdge(chamfer1),
getNextAdjacentEdge(chamfer2),
getNextAdjacentEdge(chamfer3),
getNextAdjacentEdge(chamfer4)
]
)
// set units
@settings(defaultLengthUnit = in)
// Define the offset for the indentation
sketch002 = startSketchOn(bodyExtrude, 'END')
|> startProfileAt([
-width / 2 + offset,
height / 2 - (chamferLength + offset / 2 * cos(toRadians(45)))
], %)
|> angledLineToY({ angle = 45, to = height / 2 - offset }, %)
|> line(endAbsolute = [
width / 2 - (chamferLength + offset / 2 * cos(toRadians(45))),
height / 2 - offset
])
|> angledLineToX({ angle = -45, to = width / 2 - offset }, %)
|> line(endAbsolute = [
width / 2 - offset,
-(height / 2 - (chamferLength + offset / 2 * cos(toRadians(45))))
])
|> angledLineToY({
angle = -135,
to = -height / 2 + offset
}, %)
|> line(endAbsolute = [
-(width / 2 - (chamferLength + offset / 2 * cos(toRadians(45)))),
-height / 2 + offset
])
|> angledLineToX({
angle = -225,
to = -width / 2 + offset
}, %)
|> close()
extrude002 = extrude(sketch002, length = -0.0625)
// create a function to define the body
export fn body () {
// Create the pocket for the screen
sketch003 = startSketchOn(extrude002, 'start')
|> startProfileAt([-screenWidth / 2, screenYPosition], %)
|> xLine(length = screenWidth, tag = $seg01)
|> yLine(length = -screenHeight)
|> xLine(length = -segLen(seg01))
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
extrude003 = extrude(sketch003, length = screenDepth)
// sketch and extrude the body of the walkie talkie
bodySketch = startSketchOn('XZ')
|> startProfileAt([-width / 2, height / 2], %)
|> xLine(length = width, tag = $chamfer1)
|> yLine(length = -height, tag = $chamfer2)
|> xLine(length = -width, tag = $chamfer3)
|> close(tag = $chamfer4)
bodyExtrude = extrude(bodySketch, length = thickness)
|> chamfer(
length = chamferLength,
tags = [
getNextAdjacentEdge(chamfer1),
getNextAdjacentEdge(chamfer2),
getNextAdjacentEdge(chamfer3),
getNextAdjacentEdge(chamfer4)
]
)
// Create the speaker box
sketch004 = startSketchOn(extrude002, 'start')
|> startProfileAt([-1.25 / 2, -.125], %)
|> xLine(length = speakerBoxWidth)
|> yLine(length = -speakerBoxHeight)
|> xLine(length = -speakerBoxWidth)
|> close()
extrude(sketch004, length = -.5)
|> appearance(
color = "#277bb0",
)
// cut out the indentation for the case
sketch002 = startSketchOn(bodyExtrude, 'END')
|> startProfileAt([
-width / 2 + offset,
height / 2 - (chamferLength + offset / 2 * cos(toRadians(45)))
], %)
|> angledLineToY({ angle = 45, to = height / 2 - offset }, %)
|> line(endAbsolute = [
width / 2 - (chamferLength + offset / 2 * cos(toRadians(45))),
height / 2 - offset
])
|> angledLineToX({ angle = -45, to = width / 2 - offset }, %)
|> line(endAbsolute = [
width / 2 - offset,
-(height / 2 - (chamferLength + offset / 2 * cos(toRadians(45))))
])
|> angledLineToY({
angle = -135,
to = -height / 2 + offset
}, %)
|> line(endAbsolute = [
-(width / 2 - (chamferLength + offset / 2 * cos(toRadians(45)))),
-height / 2 + offset
])
|> angledLineToX({
angle = -225,
to = -width / 2 + offset
}, %)
|> close()
extrude002 = extrude(sketch002, length = -0.0625)
// Create the pocket for the screen
sketch003 = startSketchOn(extrude002, 'start')
|> startProfileAt([-screenWidth / 2, screenYPosition], %)
|> xLine(length = screenWidth, tag = $seg01)
|> yLine(length = -screenHeight)
|> xLine(length = -segLen(seg01))
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
extrude003 = extrude(sketch003, length = screenDepth)
// Create the speaker box
sketch004 = startSketchOn(extrude002, 'start')
|> startProfileAt([-1.25 / 2, -.125], %)
|> xLine(length = speakerBoxWidth)
|> yLine(length = -speakerBoxHeight)
|> xLine(length = -speakerBoxWidth)
|> close()
body = extrude(sketch004, length = -.5)
|> appearance(
color = "#277bb0",
)
return body
}
body()

View File

@ -1,26 +1,27 @@
// Walkie Talkie button
// Set units
// set units
@settings(defaultLengthUnit = in)
// Import constants
import screenHeight, buttonWidth, tolerance, buttonHeight, buttonThickness from 'globals.kcl'
// import constants
import buttonWidth, buttonHeight, buttonThickness from 'globals.kcl'
// create a function to define the button
export fn button() {
// Create a function for the button
export fn button(origin, rotation, plane) {
buttonSketch = startSketchOn(plane)
|> startProfileAt([origin[0], origin[1]], %)
// sketch the button profile and extrude
buttonSketch = startSketchOn('XZ')
|> startProfileAt([0, 0], %)
|> angledLine({
angle = 180 + rotation,
angle = 180,
length = buttonWidth
}, %, $tag1)
|> angledLine({
angle = 270 + rotation,
angle = 270,
length = buttonHeight
}, %, $tag2)
|> angledLine({
angle = 0 + rotation,
angle = 0,
length = buttonWidth
}, %)
|> close()
@ -35,4 +36,4 @@ export fn button(origin, rotation, plane) {
|> appearance(color = "#ff0000")
return buttonExtrude
}
}

View File

@ -1,85 +1,90 @@
// Walkie talkie case
// Set units
@settings(defaultLengthUnit = in)
// Import constants and Zoo logo
// import constants and Zoo logo
import width, height, chamferLength, offset, screenWidth, screenHeight, screenYPosition, screenDepth, speakerBoxWidth, speakerBoxHeight, squareHoleSideLength, caseTolerance from "globals.kcl"
import zLogo, oLogo, oLogo2 from "zoo-logo.kcl"
plane = offsetPlane("XZ", offset = 1)
// set units
@settings(defaultLengthUnit = in)
fn screenHole(sketchStart) {
sketch006 = startSketchOn(sketchStart)
// create a function to define the case
export fn case () {
// sketch the profile of the screen
sketch006 = startSketchOn(startSketchOn('XZ'))
|> startProfileAt([-screenWidth / 2, screenYPosition], %)
|> xLine(length = screenWidth)
|> yLine(length = -screenHeight)
|> xLine(length = -screenWidth)
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
return sketch006
}
fn squareHolePattern(plane, x, y) {
// create transform functions for the speaker grid pattern
fn transformX(i) {
return { translate = [.125 * i, 0] }
}
fn transformY(i) {
return { translate = [0, -.125 * i] }
}
squareHolePatternSketch = startSketchOn(plane)
|> startProfileAt([-x, -y], %)
// sketch the square hole grid pattern
squareHolePatternSketch = startSketchOn(startSketchOn('XZ'))
|> startProfileAt([-screenWidth / 2 + .100, 0], %)
|> line(end = [squareHoleSideLength / 2, 0])
|> line(end = [0, -squareHoleSideLength / 2])
|> line(end = [-squareHoleSideLength / 2, 0])
|> close()
|> patternTransform2d(instances = 13, transform = transformX)
|> patternTransform2d(instances = 11, transform = transformY)
return squareHolePatternSketch
}
sketch005 = startSketchOn(offsetPlane("XZ", offset = 1))
|> startProfileAt([
-width / 2 + offset + caseTolerance,
height / 2 - (chamferLength + (offset + caseTolerance) / 2 * cos(toRadians(45)))
], %)
|> angledLineToY({
angle = 45,
to = height / 2 - (offset + caseTolerance)
}, %)
|> line(endAbsolute = [
width / 2 - (chamferLength + (offset + caseTolerance) / 2 * cos(toRadians(45))),
height / 2 - (offset + caseTolerance)
])
|> angledLineToX({
angle = -45,
to = width / 2 - (offset + caseTolerance)
}, %)
|> line(endAbsolute = [
width / 2 - (offset + caseTolerance),
-(height / 2 - (chamferLength + (offset + caseTolerance) / 2 * cos(toRadians(45))))
])
|> angledLineToY({
angle = -135,
to = -height / 2 + offset + caseTolerance
}, %)
|> line(endAbsolute = [
-(width / 2 - (chamferLength + (offset + caseTolerance) / 2 * cos(toRadians(45)))),
-height / 2 + offset + caseTolerance
])
|> angledLineToX({
angle = -225,
to = -width / 2 + offset + caseTolerance
}, %)
|> close()
|> hole(screenHole(plane), %)
|> hole(squareHolePattern(plane, .75, .125), %)
|> hole(zLogo(plane, [-.30, -1.825], .20), %)
|> hole(oLogo(plane, [-.075, -1.825], .20), %)
|> hole(oLogo2(plane, [-.075, -1.825], .20), %)
|> hole(oLogo(plane, [.175, -1.825], .20), %)
|> hole(oLogo2(plane, [.175, -1.825], .20), %)
extrude(sketch005, length = -0.0625)
|> appearance(color = '#D0FF01', metalness = 0, roughness = 50)
// sketch the outer profile of the case and extrude with holes using the previously made profiles
sketch005 = startSketchOn(startSketchOn('XZ'))
|> startProfileAt([
-width / 2 + offset + caseTolerance,
height / 2 - (chamferLength + (offset + caseTolerance) / 2 * cos(toRadians(45)))
], %)
|> angledLineToY({
angle = 45,
to = height / 2 - (offset + caseTolerance)
}, %)
|> line(endAbsolute = [
width / 2 - (chamferLength + (offset + caseTolerance) / 2 * cos(toRadians(45))),
height / 2 - (offset + caseTolerance)
])
|> angledLineToX({
angle = -45,
to = width / 2 - (offset + caseTolerance)
}, %)
|> line(endAbsolute = [
width / 2 - (offset + caseTolerance),
-(height / 2 - (chamferLength + (offset + caseTolerance) / 2 * cos(toRadians(45))))
])
|> angledLineToY({
angle = -135,
to = -height / 2 + offset + caseTolerance
}, %)
|> line(endAbsolute = [
-(width / 2 - (chamferLength + (offset + caseTolerance) / 2 * cos(toRadians(45)))),
-height / 2 + offset + caseTolerance
])
|> angledLineToX({
angle = -225,
to = -width / 2 + offset + caseTolerance
}, %)
|> close()
|> hole(sketch006, %)
|> hole(squareHolePatternSketch, %)
// create the Zoo logo
|> hole(zLogo(startSketchOn('XZ'), [-.30, -1.825], .20), %)
|> hole(oLogo(startSketchOn('XZ'), [-.075, -1.825], .20), %)
|> hole(oLogo2(startSketchOn('XZ'), [-.075, -1.825], .20), %)
|> hole(oLogo(startSketchOn('XZ'), [.175, -1.825], .20), %)
|> hole(oLogo2(startSketchOn('XZ'), [.175, -1.825], .20), %)
case = extrude(sketch005, length = -0.0625)
|> appearance(color = '#D0FF01', metalness = 0, roughness = 50)
return case
}

View File

@ -21,6 +21,7 @@ export antennaBaseWidth = .5
export antennaBaseHeight = .25
export antennaTopWidth = .30
export antennaTopHeight = .05
export antennaLength = 3
// button
export buttonWidth = .15

View File

@ -1,29 +1,16 @@
// Walkie talkie knob
// Walkie Talkie Frequency Knob
// Set units
@settings(defaultLengthUnit = in)
// Import constants
// import constants
import width, thickness, height, knobDiameter, knobHeight, knobRadius from "globals.kcl"
// Define the plane for the knob
knobPlane = {
plane = {
origin = {
x = width / 2 - 0.70,
y = -thickness / 2,
z = height / 2
},
xAxis = { x = 1, y = 0, z = 0 },
yAxis = { x = 0, y = 0, z = 1 },
zAxis = { x = 0, y = 1, z = 0 }
}
}
// set units
@settings(defaultLengthUnit = in)
// create a function to define the knob
export fn knob () {
// Create the knob sketch and revolve
startSketchOn(knobPlane)
knob = startSketchOn('XZ')
|> startProfileAt([0.0001, 0], %)
|> xLine(length = knobDiameter / 2)
|> yLine(length = knobHeight - 0.05)
@ -34,5 +21,11 @@ startSketchOn(knobPlane)
}, %)
|> xLine(endAbsolute = 0.0001)
|> close()
|> revolve(axis = "Y")
|> revolve(
axis = "Y",
)
|> appearance(color = '#D0FF01', metalness = 90, roughness = 50)
return knob
}

View File

@ -1,50 +1,47 @@
// Walkie Talkie
// A portable, handheld two-way radio device that allows users to communicate wirelessly over short to medium distances. It operates on specific radio frequencies and features a push-to-talk button for transmitting messages, making it ideal for quick and reliable communication in outdoor, work, or emergency settings.
// Set units
// set units
@settings(defaultLengthUnit = in)
// Import parts and constants
import 'body.kcl'
import 'antenna.kcl'
import 'case.kcl'
import 'talk-button.kcl' as talkButton
import 'knob.kcl'
// import constants
import * from 'globals.kcl'
// import parts and constants
import body from 'body.kcl'
import case from 'case.kcl'
import antenna from 'antenna.kcl'
import talkButton from 'talk-button.kcl'
import knob from 'knob.kcl'
import button from "button.kcl"
import width, height, thickness, screenWidth, screenHeight, screenYPosition, tolerance from "globals.kcl"
// Import the body
body
// import the body
body()
// Import the case
case
// import the antenna
antenna()
|> translate(translate = [-width / 2 + .45, -0.10, height/2])
// Import the antenna
antenna
// import the case
case()
|> translate(translate = [0, -1, 0])
// Import the buttons
button([
-(screenWidth / 2 + tolerance),
screenYPosition
], 0, offsetPlane("XZ", offset = thickness))
button([
-(screenWidth / 2 + tolerance),
screenYPosition - (screenHeight / 2)
], 0, offsetPlane("XZ", offset = thickness))
button([
screenWidth / 2 + tolerance,
screenYPosition - screenHeight
], 180, offsetPlane("XZ", offset = thickness))
button([
screenWidth / 2 + tolerance,
screenYPosition - (screenHeight / 2)
], 180, offsetPlane("XZ", offset = thickness))
// Import the talk button
talkButton
// Import the frequency knob
knob
// import the talk button
talkButton()
|> translate(translate = [width / 2, -thickness / 2, .5])
// import the frequency knob
knob()
|> translate(translate = [width / 2 - 0.70, -thickness / 2, height / 2])
// import the buttons
button()
|> translate(translate = [-(screenWidth / 2 + tolerance), -1, screenYPosition])
button()
|> translate(translate = [-(screenWidth / 2 + tolerance), -1, screenYPosition - buttonHeight - tolerance*2])
button()
|> rotate(%, roll = 0, pitch = 180, yaw = 0)
|> translate(translate = [screenWidth / 2 + tolerance, -1, screenYPosition - buttonHeight], global = true)
button()
|> rotate(%, roll = 0, pitch = 180, yaw = 0)
|> translate(translate = [screenWidth / 2 + tolerance, -1, screenYPosition - buttonHeight*2 - tolerance * 2], global = true)

View File

@ -1,46 +1,37 @@
// Walkie talkie talk button
// Set units
// set units
@settings(defaultLengthUnit = in)
// Import constants
// import constants
import width, thickness, talkButtonSideLength, talkButtonHeight from "globals.kcl"
talkButtonPlane = {
plane = {
origin = {
x = width / 2,
y = -thickness / 2,
z = .5
},
xAxis = { x = 0, y = 1, z = 0 },
yAxis = { x = 0, y = 0, z = 1 },
zAxis = { x = 1, y = 0, z = 0 }
}
export fn talkButton() {
// create the talk button sketch
talkButtonSketch = startSketchOn('YZ')
|> startProfileAt([
-talkButtonSideLength / 2,
talkButtonSideLength / 2
], %)
|> xLine(length = talkButtonSideLength, tag = $tag1)
|> yLine(length = -talkButtonSideLength, tag = $tag2)
|> xLine(length = -talkButtonSideLength, tag = $tag3)
|> close(tag = $tag4)
// create the talk button and apply fillets
talkButton = extrude(talkButtonSketch, length = talkButtonHeight)
|> fillet(
radius = 0.050,
tags = [
getNextAdjacentEdge(tag1),
getNextAdjacentEdge(tag2),
getNextAdjacentEdge(tag3),
getNextAdjacentEdge(tag4)
]
)
|> appearance(color = '#D0FF01', metalness = 90, roughness = 90)
return talkButton
}
// Create the talk button sketch
talkButtonSketch = startSketchOn(talkButtonPlane)
|> startProfileAt([
-talkButtonSideLength / 2,
talkButtonSideLength / 2
], %)
|> xLine(length = talkButtonSideLength, tag = $tag1)
|> yLine(length = -talkButtonSideLength, tag = $tag2)
|> xLine(length = -talkButtonSideLength, tag = $tag3)
|> close(tag = $tag4)
// Create the talk button and apply fillets
extrude(talkButtonSketch, length = talkButtonHeight)
|> fillet(
radius = 0.050,
tags = [
getNextAdjacentEdge(tag1),
getNextAdjacentEdge(tag2),
getNextAdjacentEdge(tag3),
getNextAdjacentEdge(tag4)
]
)
|> appearance(color = '#D0FF01', metalness = 90, roughness = 90)

View File

@ -1,6 +1,6 @@
// Zoo logo
// Define a function to draw the ZOO "Z"
// define a function to draw the ZOO "Z"
export fn zLogo(surface, origin, scale) {
zSketch = surface
|> startProfileAt([
@ -39,7 +39,7 @@ export fn zLogo(surface, origin, scale) {
return zSketch
}
// Define a function to draw the ZOO "O"
// define a function to draw the ZOO "O"
export fn oLogo(surface, origin, scale) {
oSketch001 = surface
|> startProfileAt([

20
rust/Cargo.lock generated
View File

@ -1780,7 +1780,7 @@ dependencies = [
[[package]]
name = "kcl-bumper"
version = "0.1.51"
version = "0.1.52"
dependencies = [
"anyhow",
"clap",
@ -1791,7 +1791,7 @@ dependencies = [
[[package]]
name = "kcl-derive-docs"
version = "0.1.51"
version = "0.1.52"
dependencies = [
"Inflector",
"anyhow",
@ -1810,7 +1810,7 @@ dependencies = [
[[package]]
name = "kcl-directory-test-macro"
version = "0.1.51"
version = "0.1.52"
dependencies = [
"proc-macro2",
"quote",
@ -1819,7 +1819,7 @@ dependencies = [
[[package]]
name = "kcl-language-server"
version = "0.2.51"
version = "0.2.52"
dependencies = [
"anyhow",
"clap",
@ -1840,7 +1840,7 @@ dependencies = [
[[package]]
name = "kcl-language-server-release"
version = "0.1.51"
version = "0.1.52"
dependencies = [
"anyhow",
"clap",
@ -1860,7 +1860,7 @@ dependencies = [
[[package]]
name = "kcl-lib"
version = "0.2.51"
version = "0.2.52"
dependencies = [
"anyhow",
"approx 0.5.1",
@ -1928,7 +1928,7 @@ dependencies = [
[[package]]
name = "kcl-python-bindings"
version = "0.3.51"
version = "0.3.52"
dependencies = [
"anyhow",
"kcl-lib",
@ -1943,7 +1943,7 @@ dependencies = [
[[package]]
name = "kcl-test-server"
version = "0.1.51"
version = "0.1.52"
dependencies = [
"anyhow",
"hyper 0.14.32",
@ -1956,7 +1956,7 @@ dependencies = [
[[package]]
name = "kcl-to-core"
version = "0.1.51"
version = "0.1.52"
dependencies = [
"anyhow",
"async-trait",
@ -1970,7 +1970,7 @@ dependencies = [
[[package]]
name = "kcl-wasm-lib"
version = "0.1.51"
version = "0.1.52"
dependencies = [
"bson",
"console_error_panic_hook",

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -133,14 +133,14 @@
"@tsconfig/strictest": "^2.0.5",
"@types/glob": "^8.1.0",
"@types/mocha": "^10.0.10",
"@types/node": "^22.13.9",
"@types/node": "^22.13.10",
"@types/vscode": "^1.97.0",
"@typescript-eslint/eslint-plugin": "^6.6.0",
"@typescript-eslint/parser": "^6.6.0",
"@vscode/test-electron": "^2.4.1",
"@vscode/vsce": "^2.30.0",
"cross-env": "^7.0.3",
"esbuild": "^0.25.0",
"esbuild": "^0.25.1",
"glob": "^10.4.3",
"mocha": "^11.1.0",
"typescript": "^5.8.2"

View File

@ -120,130 +120,130 @@
jsonwebtoken "^9.0.0"
uuid "^8.3.0"
"@esbuild/aix-ppc64@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz#499600c5e1757a524990d5d92601f0ac3ce87f64"
integrity sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==
"@esbuild/aix-ppc64@0.25.1":
version "0.25.1"
resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz#c33cf6bbee34975626b01b80451cbb72b4c6c91d"
integrity sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==
"@esbuild/android-arm64@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz#b9b8231561a1dfb94eb31f4ee056b92a985c324f"
integrity sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==
"@esbuild/android-arm64@0.25.1":
version "0.25.1"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz#ea766015c7d2655164f22100d33d7f0308a28d6d"
integrity sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==
"@esbuild/android-arm@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.0.tgz#ca6e7888942505f13e88ac9f5f7d2a72f9facd2b"
integrity sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==
"@esbuild/android-arm@0.25.1":
version "0.25.1"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.1.tgz#e84d2bf2fe2e6177a0facda3a575b2139fd3cb9c"
integrity sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==
"@esbuild/android-x64@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.0.tgz#e765ea753bac442dfc9cb53652ce8bd39d33e163"
integrity sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==
"@esbuild/android-x64@0.25.1":
version "0.25.1"
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.1.tgz#58337bee3bc6d78d10425e5500bd11370cfdfbed"
integrity sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==
"@esbuild/darwin-arm64@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz#fa394164b0d89d4fdc3a8a21989af70ef579fa2c"
integrity sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==
"@esbuild/darwin-arm64@0.25.1":
version "0.25.1"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz#a46805c1c585d451aa83be72500bd6e8495dd591"
integrity sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==
"@esbuild/darwin-x64@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz#91979d98d30ba6e7d69b22c617cc82bdad60e47a"
integrity sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==
"@esbuild/darwin-x64@0.25.1":
version "0.25.1"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz#0643e003bb238c63fc93ddbee7d26a003be3cd98"
integrity sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==
"@esbuild/freebsd-arm64@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz#b97e97073310736b430a07b099d837084b85e9ce"
integrity sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==
"@esbuild/freebsd-arm64@0.25.1":
version "0.25.1"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz#cff18da5469c09986b93e87979de5d6872fe8f8e"
integrity sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==
"@esbuild/freebsd-x64@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz#f3b694d0da61d9910ec7deff794d444cfbf3b6e7"
integrity sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==
"@esbuild/freebsd-x64@0.25.1":
version "0.25.1"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz#362fc09c2de14987621c1878af19203c46365dde"
integrity sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==
"@esbuild/linux-arm64@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz#f921f699f162f332036d5657cad9036f7a993f73"
integrity sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==
"@esbuild/linux-arm64@0.25.1":
version "0.25.1"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz#aa90d5b02efc97a271e124e6d1cea490634f7498"
integrity sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==
"@esbuild/linux-arm@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz#cc49305b3c6da317c900688995a4050e6cc91ca3"
integrity sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==
"@esbuild/linux-arm@0.25.1":
version "0.25.1"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz#dfcefcbac60a20918b19569b4b657844d39db35a"
integrity sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==
"@esbuild/linux-ia32@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz#3e0736fcfab16cff042dec806247e2c76e109e19"
integrity sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==
"@esbuild/linux-ia32@0.25.1":
version "0.25.1"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz#6f9527077ccb7953ed2af02e013d4bac69f13754"
integrity sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==
"@esbuild/linux-loong64@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz#ea2bf730883cddb9dfb85124232b5a875b8020c7"
integrity sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==
"@esbuild/linux-loong64@0.25.1":
version "0.25.1"
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz#287d2412a5456e5860c2839d42a4b51284d1697c"
integrity sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==
"@esbuild/linux-mips64el@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz#4cababb14eede09248980a2d2d8b966464294ff1"
integrity sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==
"@esbuild/linux-mips64el@0.25.1":
version "0.25.1"
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz#530574b9e1bc5d20f7a4f44c5f045e26f3783d57"
integrity sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==
"@esbuild/linux-ppc64@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz#8860a4609914c065373a77242e985179658e1951"
integrity sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==
"@esbuild/linux-ppc64@0.25.1":
version "0.25.1"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz#5d7e6b283a0b321ea42c6bc0abeb9eb99c1f5589"
integrity sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==
"@esbuild/linux-riscv64@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz#baf26e20bb2d38cfb86ee282dff840c04f4ed987"
integrity sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==
"@esbuild/linux-riscv64@0.25.1":
version "0.25.1"
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz#14fa0cd073c26b4ee2465d18cd1e18eea7859fa8"
integrity sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==
"@esbuild/linux-s390x@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz#8323afc0d6cb1b6dc6e9fd21efd9e1542c3640a4"
integrity sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==
"@esbuild/linux-s390x@0.25.1":
version "0.25.1"
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz#e677b4b9d1b384098752266ccaa0d52a420dc1aa"
integrity sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==
"@esbuild/linux-x64@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz#08fcf60cb400ed2382e9f8e0f5590bac8810469a"
integrity sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==
"@esbuild/linux-x64@0.25.1":
version "0.25.1"
resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz#f1c796b78fff5ce393658313e8c58613198d9954"
integrity sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==
"@esbuild/netbsd-arm64@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz#935c6c74e20f7224918fbe2e6c6fe865b6c6ea5b"
integrity sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==
"@esbuild/netbsd-arm64@0.25.1":
version "0.25.1"
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz#0d280b7dfe3973f111b02d5fe9f3063b92796d29"
integrity sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==
"@esbuild/netbsd-x64@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz#414677cef66d16c5a4d210751eb2881bb9c1b62b"
integrity sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==
"@esbuild/netbsd-x64@0.25.1":
version "0.25.1"
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz#be663893931a4bb3f3a009c5cc24fa9681cc71c0"
integrity sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==
"@esbuild/openbsd-arm64@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz#8fd55a4d08d25cdc572844f13c88d678c84d13f7"
integrity sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==
"@esbuild/openbsd-arm64@0.25.1":
version "0.25.1"
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz#d9021b884233673a05dc1cc26de0bf325d824217"
integrity sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==
"@esbuild/openbsd-x64@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz#0c48ddb1494bbc2d6bcbaa1429a7f465fa1dedde"
integrity sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==
"@esbuild/openbsd-x64@0.25.1":
version "0.25.1"
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz#9f1dc1786ed2e2938c404b06bcc48be9a13250de"
integrity sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==
"@esbuild/sunos-x64@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz#86ff9075d77962b60dd26203d7352f92684c8c92"
integrity sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==
"@esbuild/sunos-x64@0.25.1":
version "0.25.1"
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz#89aac24a4b4115959b3f790192cf130396696c27"
integrity sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==
"@esbuild/win32-arm64@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz#849c62327c3229467f5b5cd681bf50588442e96c"
integrity sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==
"@esbuild/win32-arm64@0.25.1":
version "0.25.1"
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz#354358647a6ea98ea6d243bf48bdd7a434999582"
integrity sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==
"@esbuild/win32-ia32@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz#f62eb480cd7cca088cb65bb46a6db25b725dc079"
integrity sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==
"@esbuild/win32-ia32@0.25.1":
version "0.25.1"
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz#8cea7340f2647eba951a041dc95651e3908cd4cb"
integrity sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==
"@esbuild/win32-x64@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz#c8e119a30a7c8d60b9d2e22d2073722dde3b710b"
integrity sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==
"@esbuild/win32-x64@0.25.1":
version "0.25.1"
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz#7d79922cb2d88f9048f06393dbf62d2e4accb584"
integrity sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==
"@eslint-community/eslint-utils@^4.4.0":
version "4.4.1"
@ -323,10 +323,10 @@
resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.10.tgz#91f62905e8d23cbd66225312f239454a23bebfa0"
integrity sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==
"@types/node@*", "@types/node@^22.13.9":
version "22.13.9"
resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.9.tgz#5d9a8f7a975a5bd3ef267352deb96fb13ec02eca"
integrity sha512-acBjXdRJ3A6Pb3tqnw9HZmyR3Fiol3aGxRCK1x3d+6CDAMjl7I649wpSd+yNURCjbOUGu9tqtLKnTGxmK6CyGw==
"@types/node@*", "@types/node@^22.13.10":
version "22.13.10"
resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.10.tgz#df9ea358c5ed991266becc3109dc2dc9125d77e4"
integrity sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==
dependencies:
undici-types "~6.20.0"
@ -1025,36 +1025,36 @@ es-errors@^1.3.0:
resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
esbuild@^0.25.0:
version "0.25.0"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.0.tgz#0de1787a77206c5a79eeb634a623d39b5006ce92"
integrity sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==
esbuild@^0.25.1:
version "0.25.1"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.1.tgz#a16b8d070b6ad4871935277bda6ccfe852e3fa2f"
integrity sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==
optionalDependencies:
"@esbuild/aix-ppc64" "0.25.0"
"@esbuild/android-arm" "0.25.0"
"@esbuild/android-arm64" "0.25.0"
"@esbuild/android-x64" "0.25.0"
"@esbuild/darwin-arm64" "0.25.0"
"@esbuild/darwin-x64" "0.25.0"
"@esbuild/freebsd-arm64" "0.25.0"
"@esbuild/freebsd-x64" "0.25.0"
"@esbuild/linux-arm" "0.25.0"
"@esbuild/linux-arm64" "0.25.0"
"@esbuild/linux-ia32" "0.25.0"
"@esbuild/linux-loong64" "0.25.0"
"@esbuild/linux-mips64el" "0.25.0"
"@esbuild/linux-ppc64" "0.25.0"
"@esbuild/linux-riscv64" "0.25.0"
"@esbuild/linux-s390x" "0.25.0"
"@esbuild/linux-x64" "0.25.0"
"@esbuild/netbsd-arm64" "0.25.0"
"@esbuild/netbsd-x64" "0.25.0"
"@esbuild/openbsd-arm64" "0.25.0"
"@esbuild/openbsd-x64" "0.25.0"
"@esbuild/sunos-x64" "0.25.0"
"@esbuild/win32-arm64" "0.25.0"
"@esbuild/win32-ia32" "0.25.0"
"@esbuild/win32-x64" "0.25.0"
"@esbuild/aix-ppc64" "0.25.1"
"@esbuild/android-arm" "0.25.1"
"@esbuild/android-arm64" "0.25.1"
"@esbuild/android-x64" "0.25.1"
"@esbuild/darwin-arm64" "0.25.1"
"@esbuild/darwin-x64" "0.25.1"
"@esbuild/freebsd-arm64" "0.25.1"
"@esbuild/freebsd-x64" "0.25.1"
"@esbuild/linux-arm" "0.25.1"
"@esbuild/linux-arm64" "0.25.1"
"@esbuild/linux-ia32" "0.25.1"
"@esbuild/linux-loong64" "0.25.1"
"@esbuild/linux-mips64el" "0.25.1"
"@esbuild/linux-ppc64" "0.25.1"
"@esbuild/linux-riscv64" "0.25.1"
"@esbuild/linux-s390x" "0.25.1"
"@esbuild/linux-x64" "0.25.1"
"@esbuild/netbsd-arm64" "0.25.1"
"@esbuild/netbsd-x64" "0.25.1"
"@esbuild/openbsd-arm64" "0.25.1"
"@esbuild/openbsd-x64" "0.25.1"
"@esbuild/sunos-x64" "0.25.1"
"@esbuild/win32-arm64" "0.25.1"
"@esbuild/win32-ia32" "0.25.1"
"@esbuild/win32-x64" "0.25.1"
escalade@^3.1.1:
version "3.1.2"

View File

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

View File

@ -23,7 +23,9 @@ use crate::{
const TYPES_DIR: &str = "../../docs/kcl/types";
const LANG_TOPICS: [&str; 5] = ["Types", "Modules", "Settings", "Known Issues", "Constants"];
// These types are declared in std.
const DECLARED_TYPES: [&str; 7] = ["number", "string", "tag", "bool", "Sketch", "Solid", "Plane"];
const DECLARED_TYPES: [&str; 11] = [
"number", "string", "tag", "bool", "Sketch", "Solid", "Plane", "Helix", "Face", "Point2d", "Point3d",
];
fn init_handlebars() -> Result<handlebars::Handlebars<'static>> {
let mut hbs = handlebars::Handlebars::new();
@ -457,6 +459,7 @@ fn generate_type_from_kcl(ty: &TyData, file_name: String, example_name: String)
let data = json!({
"name": ty.qual_name(),
"definition": ty.alias.as_ref().map(|t| format!("type {} = {t}", ty.name)),
"summary": ty.summary,
"description": ty.description,
"deprecated": ty.properties.deprecated,

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