Compare commits

..

3 Commits

1662 changed files with 15812 additions and 50820 deletions

View File

@ -1,4 +1,3 @@
rust/*
src/wasm-lib/*
*.typegen.ts
packages/codemirror-lsp-client/dist/*
e2e/playwright/snapshots/prompt-to-edit/*

View File

@ -25,7 +25,7 @@ updates:
- adamchalmers
- jessfraz
- package-ecosystem: 'cargo' # See documentation for possible values
directory: '/rust/' # Location of package manifests
directory: '/src/wasm-lib/' # Location of package manifests
schedule:
interval: weekly
day: monday
@ -39,11 +39,3 @@ updates:
wasm-bindgen-deps:
patterns:
- "wasm-bindgen*"
- package-ecosystem: "pip" # See documentation for possible values
directory: "/rust/kcl-python-bindings/" # Location of package manifests
schedule:
interval: weekly
day: monday
reviewers:
- adamchalmers
- jessfraz

View File

@ -21,7 +21,7 @@ jobs:
- name: Cache wasm
uses: Swatinem/rust-cache@v2
with:
workspaces: './rust'
workspaces: './src/wasm-lib'
- uses: taiki-e/install-action@2dbeb927f58939d3aa13bf06ba0c0a34b76b9bfb
with:
tool: wasm-pack
@ -33,4 +33,4 @@ jobs:
- uses: actions/upload-artifact@v4
with:
name: wasm-bundle
path: rust/kcl-wasm-lib/pkg
path: src/wasm-lib/pkg

View File

@ -7,11 +7,14 @@ on:
- main
tags:
- 'v[0-9]+.[0-9]+.[0-9]+'
- 'nightly-v[0-9]+.[0-9]+.[0-9]+'
schedule:
- cron: '0 4 * * *'
# Daily at 04:00 AM UTC
# Will checkout the last commit from the default branch (main as of 2023-10-04)
env:
IS_RELEASE: ${{ github.ref_type == 'tag' && startsWith(github.ref_name, 'v') }}
IS_NIGHTLY: ${{ github.ref_type == 'tag' && startsWith(github.ref_name, 'nightly-v') }}
IS_RELEASE: ${{ github.ref_type == 'tag' }}
IS_NIGHTLY: ${{ github.event_name == 'schedule' }}
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
@ -29,7 +32,6 @@ jobs:
- uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
cache: 'yarn'
- run: yarn install
@ -38,9 +40,9 @@ jobs:
- uses: Swatinem/rust-cache@v2
with:
workspaces: './rust'
workspaces: './src/wasm-lib'
# TODO: see if we can fetch from main instead if no diff at rust
# TODO: see if we can fetch from main instead if no diff at src/wasm-lib
- uses: taiki-e/install-action@2dbeb927f58939d3aa13bf06ba0c0a34b76b9bfb
with:
tool: wasm-pack
@ -50,10 +52,7 @@ jobs:
- name: Set nightly version, product name, release notes, and icons
if: ${{ env.IS_NIGHTLY == 'true' }}
run: |
export VERSION=${GITHUB_REF_NAME#nightly-v}
yarn files:set-version
yarn files:flip-to-nightly
run: yarn files:flip-to-nightly
- name: Set release version
if: ${{ env.IS_RELEASE == 'true' }}
@ -67,7 +66,7 @@ jobs:
path: |
package.json
electron-builder.yml
rust/kcl-wasm-lib/pkg/kcl_wasm_lib*
src/wasm-lib/pkg/wasm_lib*
release-notes.md
assets/icon.ico
assets/icon.png
@ -117,24 +116,21 @@ jobs:
ls -R prepared-files
cp prepared-files/package.json package.json
cp prepared-files/electron-builder.yml electron-builder.yml
cp prepared-files/rust/kcl-wasm-lib/pkg/kcl_wasm_lib_bg.wasm public
mkdir rust/kcl-wasm-lib/pkg
cp prepared-files/rust/kcl-wasm-lib/pkg/kcl_wasm_lib* rust/kcl-wasm-lib/pkg
cp prepared-files/src/wasm-lib/pkg/wasm_lib_bg.wasm public
mkdir src/wasm-lib/pkg
cp prepared-files/src/wasm-lib/pkg/wasm_lib* src/wasm-lib/pkg
cp prepared-files/release-notes.md release-notes.md
cp prepared-files/assets/icon.ico assets/icon.ico
cp prepared-files/assets/icon.png assets/icon.png
- name: Sync node version and setup cache
uses: actions/setup-node@v4
- uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
cache: 'yarn' # Set this to npm, yarn or pnpm.
- name: yarn install
# Windows is picky sometimes and fails on fetch. Step takes about ~30s
uses: nick-fields/retry@v3.0.2
uses: nick-fields/retry@v3.0.1
with:
shell: bash
timeout_minutes: 2
max_attempts: 3
command: yarn install
@ -184,9 +180,8 @@ jobs:
WINDOWS_CERTIFICATE_THUMBPRINT: ${{ secrets.WINDOWS_CERTIFICATE_THUMBPRINT }}
DEBUG: "electron-notarize*"
# TODO: Fix electron-notarize flakes. The logs above should help gather more data on failures
uses: nick-fields/retry@v3.0.2
uses: nick-fields/retry@v3.0.1
with:
shell: bash
timeout_minutes: 10
max_attempts: 3
command: yarn tronb:package:prod
@ -246,9 +241,8 @@ jobs:
WINDOWS_CERTIFICATE_THUMBPRINT: ${{ secrets.WINDOWS_CERTIFICATE_THUMBPRINT }}
DEBUG: "electron-notarize*"
# TODO: Fix electron-notarize flakes. The logs above should help gather more data on failures
uses: nick-fields/retry@v3.0.2
uses: nick-fields/retry@v3.0.1
with:
shell: bash
timeout_minutes: 10
max_attempts: 3
command: yarn tronb:package:prod
@ -276,7 +270,7 @@ jobs:
runs-on: ubuntu-22.04
permissions:
contents: write
if: ${{ github.ref_type == 'tag' }}
if: ${{ github.ref_type == 'tag' || github.event_name == 'schedule' }}
env:
VERSION_NO_V: ${{ needs.prepare-files.outputs.version }}
VERSION: ${{ format('v{0}', needs.prepare-files.outputs.version) }}
@ -333,8 +327,8 @@ jobs:
env:
NOTES: ${{ needs.prepare-files.outputs.notes }}
PUB_DATE: ${{ github.event.repository.updated_at }}
WEBSITE_DIR: ${{ env.IS_NIGHTLY == 'true' && 'dl.zoo.dev/releases/modeling-app/nightly' || 'dl.zoo.dev/releases/modeling-app' }}
URL_CODED_NAME: ${{ env.IS_NIGHTLY == 'true' && 'Zoo%20Modeling%20App%20%28Nightly%29' || 'Zoo%20Modeling%20App' }}
WEBSITE_DIR: ${{ github.event_name == 'schedule' && 'dl.zoo.dev/releases/modeling-app/nightly' || 'dl.zoo.dev/releases/modeling-app' }}
URL_CODED_NAME: ${{ github.event_name == 'schedule' && 'Zoo%20Modeling%20App%20%28Nightly%29' || 'Zoo%20Modeling%20App' }}
run: |
RELEASE_DIR=https://${WEBSITE_DIR}
jq --null-input \
@ -389,7 +383,7 @@ jobs:
# see https://github.com/actions/checkout/issues/1471
git fetch --prune --unshallow --tags
export TAG="nightly-${VERSION}"
export PREVIOUS_TAG=$(git tag --list --sort=-committerdate "nightly-v[0-9]*" | head -n2 | tail -n1)
export PREVIOUS_TAG=$(git describe --tags --match="nightly-v[0-9]*" --abbrev=0)
export NOTES=$(./scripts/get-nightly-changelog.sh)
yarn files:set-notes
@ -417,3 +411,14 @@ jobs:
- name: Invalidate bucket cache on latest*.yml and last_download.json files
if: ${{ env.IS_NIGHTLY == 'true' }}
run: yarn files:invalidate-bucket:nightly
- name: Tag nightly commit
if: ${{ env.IS_NIGHTLY == 'true' }}
uses: actions/github-script@v7
with:
script: |
const { VERSION } = process.env
const { owner, repo } = context.repo
const { sha } = context
const ref = `refs/tags/nightly-${VERSION}`
github.rest.git.createRef({ owner, repo, sha, ref })

View File

@ -17,21 +17,23 @@ jobs:
cargocheck:
name: cargo check
runs-on: ubuntu-latest
strategy:
matrix:
dir: ['src/wasm-lib']
steps:
- uses: actions/checkout@v4
- name: Install latest rust
uses: actions-rs/toolchain@v1
with:
toolchain: 1.85
toolchain: stable
override: true
default: true
- name: Rust Cache
uses: Swatinem/rust-cache@v2.6.1
- name: Run check
run: |
cd rust
cd "${{ matrix.dir }}"
# We specifically want to test the disable-println feature
# Since it is not enabled by default, we need to specify it
# This is used in kcl-lsp

View File

@ -23,15 +23,17 @@ jobs:
cargoclippy:
name: cargo clippy
runs-on: ubuntu-latest
strategy:
matrix:
dir: ['src/wasm-lib']
steps:
- uses: actions/checkout@v4
- uses: taiki-e/install-action@just
- name: Install latest rust
uses: actions-rs/toolchain@v1
with:
toolchain: 1.85
toolchain: stable
override: true
default: true
components: clippy
- name: Rust Cache
@ -39,7 +41,7 @@ jobs:
- name: Run clippy
run: |
cd rust
cd "${{ matrix.dir }}"
just lint
# If this fails, run "cargo check" to update Cargo.lock,
# then add Cargo.lock to the PR.

View File

@ -26,14 +26,16 @@ jobs:
cargofmt:
name: cargo fmt
runs-on: ubuntu-latest
strategy:
matrix:
dir: ['src/wasm-lib']
steps:
- uses: actions/checkout@v4
- name: Install latest rust
uses: actions-rs/toolchain@v1
with:
toolchain: 1.85
toolchain: stable
override: true
default: true
components: rustfmt
- name: Rust Cache
@ -41,6 +43,6 @@ jobs:
- name: Run cargo fmt
run: |
cd rust
cd "${{ matrix.dir }}"
cargo fmt -- --check
shell: bash

View File

@ -9,19 +9,21 @@ permissions: read-all
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
name: cargo test
name: cargo test of wasm-lib
jobs:
cargotest:
name: cargo test
runs-on: ubuntu-latest-8-cores
strategy:
matrix:
dir: ['src/wasm-lib']
steps:
- uses: actions/checkout@v4
- name: Install latest rust
uses: actions-rs/toolchain@v1
with:
toolchain: 1.85
toolchain: stable
override: true
default: true
- name: Install vector
run: |
curl --proto '=https' --tlsv1.2 -sSfL https://sh.vector.dev > /tmp/vector.sh
@ -43,8 +45,8 @@ jobs:
- name: cargo test
shell: bash
run: |-
cd rust
cargo llvm-cov nextest --workspace --lcov --output-path lcov.info --retries=2 --no-fail-fast -P ci 2>&1 | tee /tmp/github-actions.log
cd "${{ matrix.dir }}"
cargo llvm-cov nextest --workspace --lcov --output-path lcov.info --test-threads=1 --retries=2 --no-fail-fast -P ci 2>&1 | tee /tmp/github-actions.log
env:
KITTYCAD_API_TOKEN: ${{secrets.KITTYCAD_API_TOKEN}}
RUST_MIN_STACK: 10485760000
@ -53,7 +55,7 @@ jobs:
with:
token: ${{secrets.CODECOV_TOKEN}}
fail_ci_if_error: true
flags: rust
flags: wasm-lib
verbose: true
files: lcov.info

View File

@ -3,8 +3,6 @@ on:
push:
branches: [ main ]
pull_request:
schedule:
- cron: 0 * * * * # hourly
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
@ -17,6 +15,23 @@ permissions:
jobs:
check-rust-changes:
runs-on: ubuntu-latest
outputs:
rust-changed: ${{ steps.filter.outputs.rust }}
steps:
- uses: actions/checkout@v4
- id: filter
name: Check for Rust changes
uses: dorny/paths-filter@v3
with:
filters: |
rust:
- 'src/wasm-lib/**'
electron:
timeout-minutes: 60
name: playwright:electron:${{ matrix.os }} ${{ matrix.shardIndex }} ${{ matrix.shardTotal }}
@ -27,8 +42,8 @@ jobs:
os: [namespace-profile-ubuntu-8-cores, namespace-profile-macos-8-cores, windows-16-cores]
shardIndex: [1, 2, 3, 4]
shardTotal: [4]
# TODO: add ref here for main and latest release tag
runs-on: ${{ matrix.os }}
needs: check-rust-changes
steps:
- uses: actions/create-github-app-token@v1
id: app-token
@ -39,19 +54,12 @@ jobs:
- uses: actions/checkout@v4
with:
token: ${{ steps.app-token.outputs.token }}
- id: filter
name: Check for Rust changes
uses: dorny/paths-filter@v3
with:
filters: |
rust:
- 'rust/**'
- uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
cache: 'yarn'
- uses: KittyCAD/action-install-cli@main
- name: Install dependencies
id: deps-install
shell: bash
run: yarn
- name: Cache Playwright Browsers
@ -65,7 +73,7 @@ jobs:
run: yarn playwright install --with-deps
- name: Download Wasm Cache
id: download-wasm
if: github.event_name != 'schedule' && steps.filter.outputs.rust == 'false'
if: needs.check-rust-changes.outputs.rust-changed == 'false'
uses: dawidd6/action-download-artifact@v7
continue-on-error: true
with:
@ -73,11 +81,11 @@ jobs:
name: wasm-bundle
workflow: build-and-store-wasm.yml
branch: main
path: rust/kcl-wasm-lib/pkg
path: src/wasm-lib/pkg
- name: copy wasm blob
if: github.event_name != 'schedule' && steps.filter.outputs.rust == 'false'
if: needs.check-rust-changes.outputs.rust-changed == 'false'
shell: bash
run: cp rust/kcl-wasm-lib/pkg/kcl_wasm_lib_bg.wasm public
run: cp src/wasm-lib/pkg/wasm_lib_bg.wasm public
continue-on-error: true
- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
@ -85,15 +93,15 @@ jobs:
with:
tool: wasm-pack
- name: Cache Wasm (because rust diff)
if: github.event_name == 'schedule' || steps.filter.outputs.rust == 'true'
if: needs.check-rust-changes.outputs.rust-changed == 'true'
uses: Swatinem/rust-cache@v2
with:
workspaces: './rust'
workspaces: './src/wasm-lib'
- name: OR Cache Wasm (because wasm cache failed)
if: steps.download-wasm.outcome == 'failure'
uses: Swatinem/rust-cache@v2
with:
workspaces: './rust'
workspaces: './src/wasm-lib'
- name: install good sed
if: ${{ startsWith(matrix.os, 'macos') }}
shell: bash
@ -118,7 +126,7 @@ jobs:
cat /tmp/vector.toml
${HOME}/.vector/bin/vector --config /tmp/vector.toml &
- name: Build Wasm (because rust diff)
if: github.event_name == 'schedule' || steps.filter.outputs.rust == 'true'
if: needs.check-rust-changes.outputs.rust-changed == 'true'
shell: bash
run: yarn build:wasm
- name: OR Build Wasm (because wasm cache failed)
@ -134,7 +142,7 @@ jobs:
# TODO: break this in its own job, for now it's not slowing down the overall execution as ubuntu is the quickest,
# but we could do better. This forces a large 1/1 shard of all 20 snapshot tests that runs in about 3 minutes.
run: |
yarn test:snapshots
PLATFORM=web yarn playwright test --config=playwright.config.ts --retries="3" --update-snapshots --grep=@snapshot --shard=1/1
env:
CI: true
NODE_ENV: development
@ -145,7 +153,7 @@ jobs:
- uses: actions/upload-artifact@v4
if: ${{ !cancelled() && (success() || failure()) }}
with:
name: playwright-report-snapshots-${{ matrix.os }}-snapshot-${{ matrix.shardIndex }}-${{ github.sha }}
name: playwright-report-${{ matrix.os }}-snapshot-${{ matrix.shardIndex }}-${{ github.sha }}
path: playwright-report/
include-hidden-files: true
retention-days: 30
@ -159,7 +167,7 @@ jobs:
shell: bash
id: git-check
run: |
git add e2e/playwright/snapshot-tests.spec.ts-snapshots e2e/playwright/snapshots
git add e2e/playwright/snapshot-tests.spec.ts-snapshots
if git status | grep -q "Changes to be committed"
then echo "modified=true" >> $GITHUB_OUTPUT
else echo "modified=false" >> $GITHUB_OUTPUT
@ -168,7 +176,7 @@ jobs:
if: steps.git-check.outputs.modified == 'true'
shell: bash
run: |
git add e2e/playwright/snapshot-tests.spec.ts-snapshots e2e/playwright/snapshots
git add e2e/playwright/snapshot-tests.spec.ts-snapshots
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
@ -194,10 +202,9 @@ jobs:
path: test-results/
- name: Run playwright/electron flow (with retries)
id: retry
if: ${{ !cancelled() && steps.deps-install.outcome == 'success' }}
uses: nick-fields/retry@v3.0.2
if: ${{ !cancelled() && (success() || failure()) }}
uses: nick-fields/retry@v3.0.1
with:
shell: bash
command: .github/ci-cd-scripts/playwright-electron.sh ${{matrix.shardIndex}} ${{matrix.shardTotal}} ${{matrix.os}}
timeout_minutes: 30
max_attempts: 25

View File

@ -1,179 +0,0 @@
# This file is autogenerated by maturin v1.6.0 and then modified
# To update, run
#
# maturin generate-ci github
#
name: kcl-python-bindings
on:
push:
branches:
- main
paths:
- '**/Cargo.toml'
- '**/Cargo.lock'
- '**/rust-toolchain.toml'
- 'rust/kcl-python-bindings/**'
- '**.rs'
- .github/workflows/kcl-python-bindings.yml
tags:
- 'kcl-*'
pull_request:
paths:
- '**/Cargo.toml'
- '**/Cargo.lock'
- '**/rust-toolchain.toml'
- 'rust/kcl-python-bindings/**'
- '**.rs'
- .github/workflows/kcl-python-bindings.yml
workflow_dispatch:
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
linux-x86_64:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: 3.x
- name: Build wheels
uses: PyO3/maturin-action@v1
with:
working-directory: rust/kcl-python-bindings
target: x86_64
args: --release --out dist --find-interpreter
sccache: 'true'
manylinux: auto
before-script-linux: |
yum install openssl-devel -y
- name: Upload wheels
uses: actions/upload-artifact@v4
with:
name: wheels-linux-x86_64
path: rust/kcl-python-bindings/dist
windows:
runs-on: windows-16-cores
strategy:
matrix:
target:
- x64
fail-fast: false
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: 3.x
architecture: ${{ matrix.target }}
- name: Build wheels
uses: PyO3/maturin-action@v1
with:
working-directory: rust/kcl-python-bindings
target: ${{ matrix.target }}
args: --release --out dist --find-interpreter
sccache: 'true'
- name: Upload wheels
uses: actions/upload-artifact@v4
with:
name: wheels-windows-${{ matrix.target }}
path: rust/kcl-python-bindings/dist
macos:
runs-on: macos-latest
strategy:
matrix:
target:
- x86_64
- aarch64
fail-fast: false
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: 3.x
- name: Build wheels
uses: PyO3/maturin-action@v1
with:
working-directory: rust/kcl-python-bindings
target: ${{ matrix.target }}
args: --release --out dist --find-interpreter
sccache: 'true'
- name: Upload wheels
uses: actions/upload-artifact@v4
with:
name: wheels-macos-${{ matrix.target }}
path: rust/kcl-python-bindings/dist
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v5
- uses: actions-rust-lang/setup-rust-toolchain@v1
- uses: taiki-e/install-action@just
- name: Run tests
run: |
cd rust/kcl-python-bindings
just setup-uv
just test
env:
KITTYCAD_API_TOKEN: ${{ secrets.KITTYCAD_API_TOKEN }}
sdist:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install the latest version of uv
uses: astral-sh/setup-uv@v5
- name: Install codespell
run: |
uv venv .venv
echo "VIRTUAL_ENV=.venv" >> $GITHUB_ENV
echo "$PWD/.venv/bin" >> $GITHUB_PATH
uv pip install pip --upgrade
- name: Build sdist
uses: PyO3/maturin-action@v1
with:
working-directory: rust/kcl-python-bindings
command: sdist
args: --out dist
- name: Upload sdist
uses: actions/upload-artifact@v4
with:
name: wheels-sdist
path: rust/kcl-python-bindings/dist
release:
name: Release
runs-on: ubuntu-latest
permissions:
contents: write
if: startsWith(github.ref, 'refs/tags/')
needs: [linux-x86_64, windows, macos, sdist]
steps:
- uses: actions/download-artifact@v4
- name: Install the latest version of uv
uses: astral-sh/setup-uv@v5
- name: Install codespell
run: |
cd rust/kcl-python-bindings
uv venv .venv
echo "VIRTUAL_ENV=.venv" >> $GITHUB_ENV
echo "$PWD/.venv/bin" >> $GITHUB_PATH
uv pip install pip --upgrade
- name: Publish to PyPI
uses: PyO3/maturin-action@v1
env:
MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
with:
working-directory: rust/kcl-python-bindings
command: upload
args: --non-interactive --skip-existing wheels-*/*

View File

@ -1,24 +0,0 @@
name: ruff
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
on:
push:
branches: main
paths:
- '**.py'
- .github/workflows/ruff.yml
pull_request:
paths:
- '**.py'
- .github/workflows/ruff.yml
permissions:
contents: read
pull-requests: write
jobs:
ruff:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: astral-sh/ruff-action@v3

View File

@ -54,7 +54,7 @@ jobs:
- run: yarn install
- uses: Swatinem/rust-cache@v2
with:
workspaces: './rust'
workspaces: './src/wasm-lib'
- uses: taiki-e/install-action@2dbeb927f58939d3aa13bf06ba0c0a34b76b9bfb
with:

View File

@ -1,39 +0,0 @@
name: tag-nightly
permissions:
contents: write
on:
schedule:
- cron: '0 4 * * *'
# Daily at 04:00 AM UTC
# Will checkout the last commit from the default branch (main as of 2023-10-04)
jobs:
tag-nightly:
runs-on: ubuntu-22.04
steps:
- uses: actions/create-github-app-token@v1
id: app-token
with:
app-id: ${{ secrets.MODELING_APP_GH_APP_ID }}
private-key: ${{ secrets.MODELING_APP_GH_APP_PRIVATE_KEY }}
owner: ${{ github.repository_owner }}
- uses: actions/checkout@v4
with:
token: ${{ steps.app-token.outputs.token }}
- uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
- run: yarn install
- name: Push tag
run: |
VERSION_NO_V=$(date +'%-y.%-m.%-d')
TAG="nightly-v$VERSION_NO_V"
git config --local user.email "github-actions[bot]@users.noreply.github.com"
git config --local user.name "github-actions[bot]"
git tag $TAG
git push origin tag $TAG

26
.gitignore vendored
View File

@ -24,17 +24,18 @@ yarn-debug.log*
yarn-error.log*
.idea
.vscode
# .vscode
.helix
src/wasm-lib/.idea
src/wasm-lib/.vscode
# rust
rust/target
rust/kcl-lib/bindings
public/kcl_wasm_lib_bg.wasm
rust/lcov.info
rust/kcl-wasm-lib/pkg
*.snap.new
rust/kcl-lib/fuzz/Cargo.lock
src/wasm-lib/target
src/wasm-lib/bindings
src/wasm-lib/kcl/bindings
public/wasm_lib_bg.wasm
src/wasm-lib/lcov.info
src/wasm-lib/grackle/test_json_output
e2e/playwright/playwright-secrets.env
e2e/playwright/temp1.png
@ -58,18 +59,15 @@ e2e/playwright/export-snapshots/*
## generated files
src/**/*.typegen.ts
src/wasm-lib/grackle/stdlib_cube_partial.json
Mac_App_Distribution.provisionprofile
*.tsbuildinfo
src/wasm-lib/pkg
.eslintcache
venv
.vite/
# electron
out/
# python
__pycache__/
uv.lock
rust/kcl-python-bindings/dist
venv

View File

@ -7,9 +7,9 @@ coverage
*.rs
*.hbs
target
rust/
src/wasm-lib/pkg
src/wasm-lib/kcl/bindings
e2e/playwright/export-snapshots
e2e/playwright/snapshots/prompt-to-edit
# XState generated files

5
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,5 @@
{
"rust-analyzer.linkedProjects": [
"src/wasm-lib/Cargo.toml"
]
}

View File

@ -1,6 +1,6 @@
.PHONY: dev
KCL_WASM_LIB_FILES := $(wildcard rust/**/*.rs)
WASM_LIB_FILES := $(wildcard src/wasm-lib/**/*.rs)
TS_SRC := $(wildcard src/**/*.tsx) $(wildcard src/**/*.ts)
XSTATE_TYPEGENS := $(wildcard src/machines/*.typegen.ts)
@ -18,7 +18,7 @@ lee-electron-test:
$(XSTATE_TYPEGENS): $(TS_SRC)
yarn xstate typegen 'src/**/*.ts?(x)'
public/kcl_wasm_lib_bg.wasm: $(KCL_WASM_LIB_FILES)
public/wasm_lib_bg.wasm: $(WASM_LIB_FILES)
yarn build:wasm
node_modules: package.json yarn.lock

View File

@ -40,7 +40,7 @@ The 3D view in Modeling App is just a video stream from our hosted geometry engi
[Original demo video](https://drive.google.com/file/d/183_wjqGdzZ8EEZXSqZ3eDcJocYPCyOdC/view?pli=1)
[Original demo slides](https://github.com/user-attachments/files/19010536/demo.pdf)
[Original demo slides](https://github.com/KittyCAD/Eng/files/10398178/demo.pdf)
## Get started
@ -52,21 +52,18 @@ Install a node version manager such as [fnm](https://github.com/Schniz/fnm?tab=r
On Windows, it's also recommended to [upgrade your PowerShell version](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.5#winget), we're using 7.
Then in the repo run the following to install and use the node version specified in `.nvmrc`. You might need to specify your processor architecture with `--arch arm64` or `--arch x64` if it's not autodetected.
Then in the repo run the following to install and use the node version specified in `.nvmrc`. You might need to specify your processor architecture with `--arch arm64` or `--arch x64` if it's not autodetected.
```
fnm install --corepack-enabled
fnm use
```
Install the NPM dependencies with:
```
yarn install
```
This project uses a lot of Rust compiled to [WASM](https://webassembly.org/) within it. We have package scripts to run rustup, see `package.json` for reference:
```
# macOS/Linux
yarn install:rust
@ -78,7 +75,6 @@ yarn install:wasm-pack:cargo
```
Then to build the WASM layer, run:
```
# macOS/Linux
yarn build:wasm
@ -139,7 +135,6 @@ To package the app for your platform with electron-builder, run `yarn tronb:pack
Which commands from setup are one off vs need to be run every time?
The following will need to be run when checking out a new commit and guarantees the build is not stale:
```bash
yarn install
yarn build:wasm
@ -190,12 +185,11 @@ Manually test against this [list](https://github.com/KittyCAD/modeling-app/issue
##### Updater-test builds
The other `build-apps` output in the release `build-apps` workflow (triggered by 2.) is `updater-test-{arch}-{platform}`. It's a semi-automated process: for macOS, Windows, and Linux, download the corresponding updater-test artifact file, install the app, run it, expect an updater prompt to a dummy v0.255.255, install it and check that the app comes back at that version.
The other `build-apps` output in the release `build-apps` workflow (triggered by 2.) is `updater-test-{arch}-{platform}`. It's a semi-automated process: for macOS, Windows, and Linux, download the corresponding updater-test artifact file, install the app, run it, expect an updater prompt to a dummy v0.255.255, install it and check that the app comes back at that version.
The only difference with these builds is that they point to a different update location on the release bucket, with this dummy v0.255.255 always available. This helps ensuring that the version we release will be able to update to the next one available.
If the prompt doesn't show up, start the app in command line to grab the electron-updater logs. This is likely an issue with the current build that needs addressing (or the updater-test location in the storage bucket).
```
# Windows (PowerShell)
& 'C:\Program Files\Zoo Modeling App\Zoo Modeling App.exe'
@ -211,14 +205,15 @@ If the prompt doesn't show up, start the app in command line to grab the electro
Head over to https://github.com/KittyCAD/modeling-app/releases/new, pick the newly created tag and type it in the _Release title_ field as well.
Hit _Generate release notes_ as a starting point to discuss the changelog in the issue. Once done, make sure _Set as the latest release_ is checked, and hit _Publish release_.
Hit _Generate release notes_ as a starting point to discuss the changelog in the issue. Once done, make sure _Set as the latest release_ is checked, and hit _Publish release_.
A new `publish-apps-release` will kick in and you should be able to find it [here](https://github.com/KittyCAD/modeling-app/actions?query=event%3Arelease). On success, the files will be uploaded to the public bucket as well as to the GitHub release, and the announcement on Discord will be sent.
A new `publish-apps-release` will kick in and you should be able to find it [here](https://github.com/KittyCAD/modeling-app/actions?query=event%3Arelease). On success, the files will be uploaded to the public bucket as well as to the GitHub release, and the announcement on Discord will be sent.
#### 5. Close the issue
If everything is well and the release is out to the public, the issue tracking the release shall be closed.
## Fuzzing the parser
Make sure you install cargo fuzz:
@ -228,7 +223,7 @@ $ cargo install cargo-fuzz
```
```bash
$ cd rust/kcl-lib
$ cd src/wasm-lib/kcl
# list the fuzz targets
$ cargo fuzz list
@ -256,7 +251,6 @@ snapshottoken=<your-snapshot-token>
For a portable way to run Playwright you'll need Docker.
#### Generic example
After that, open a terminal and run:
```bash
@ -269,6 +263,7 @@ and in another terminal, run:
PW_TEST_CONNECT_WS_ENDPOINT=ws://127.0.0.1:4444/ yarn playwright test --project="Google Chrome" <test suite>
```
#### Specific example
open a terminal and run:
@ -286,6 +281,7 @@ PW_TEST_CONNECT_WS_ENDPOINT=ws://127.0.0.1:4444/ yarn playwright test --project=
run a specific test change the test from `test('...` to `test.only('...`
(note if you commit this, the tests will instantly fail without running any of the tests)
**Gotcha**: running the docker container with a mismatched image against your `./node_modules/playwright` will cause a failure. Make sure the versions are matched and up to date.
run headed
@ -379,19 +375,17 @@ Which will run our suite of [Vitest unit](https://vitest.dev/) and [React Testin
- `just`
#### Setting KITTYCAD_API_TOKEN
Use the production zoo.dev token, set this environment variable before running the tests
#### Installing cargonextest
```
cd rust
cd src/wasm-lib
cargo search cargo-nextest
cargo install cargo-nextest
```
#### just
install [`just`](https://github.com/casey/just?tab=readme-ov-file#pre-built-binaries)
#### Running the tests
@ -401,7 +395,7 @@ install [`just`](https://github.com/casey/just?tab=readme-ov-file#pre-built-bina
# Make sure KITTYCAD_API_TOKEN=<prod zoo.dev token> is set
# Make sure you installed cargo-nextest
# Make sure you installed just
cd rust
cd src/wasm-lib
just test
```
@ -409,7 +403,7 @@ just test
# Without just
# Make sure KITTYCAD_API_TOKEN=<prod zoo.dev token> is set
# Make sure you installed cargo-nextest
cd rust
cd src/wasm-lib
export RUST_BRACKTRACE="full" && cargo nextest run --workspace --test-threads=1
```
@ -418,14 +412,13 @@ Where `XXX` is an API token from the production engine (NOT the dev environment)
We recommend using [nextest](https://nexte.st/) to run the Rust tests (its faster and is used in CI). Once installed, run the tests using
```
cd rust
cd src/wasm-lib
KITTYCAD_API_TOKEN=XXX cargo run nextest
```
### Mapping CI CD jobs to local commands
When you see the CI CD fail on jobs you may wonder three things
- Do I have a bug in my code?
- Is the test flaky?
- Is there a bug in `main`?
@ -444,6 +437,7 @@ yarn test-setup
> Gotcha, are packages up to date and is the wasm built?
```
yarn tsc
yarn fmt-check
@ -499,7 +493,7 @@ PS: for the debug panel, the following JSON is useful for snapping the camera
## KCL
For how to contribute to KCL, [see our KCL README](https://github.com/KittyCAD/modeling-app/tree/main/rust/kcl-lib).
For how to contribute to KCL, [see our KCL README](https://github.com/KittyCAD/modeling-app/tree/main/src/wasm-lib/kcl).
### Logging

View File

@ -1,5 +1,5 @@
---
title: "std::XY"
title: "HALF_TURN"
excerpt: ""
layout: manual
---
@ -9,7 +9,7 @@ layout: manual
```js
std::XY
HALF_TURN: number(deg) = 180deg
```

15
docs/kcl/QUARTER_TURN.md Normal file
View File

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

View File

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

View File

@ -1,5 +1,5 @@
---
title: "std::XZ"
title: "ZERO"
excerpt: ""
layout: manual
---
@ -9,7 +9,7 @@ layout: manual
```js
std::XZ
ZERO: number = 0
```

View File

@ -9,11 +9,7 @@ Returns the angle to match the given length for x.
```js
angleToMatchLengthX(
tag: TagIdentifier,
to: number,
sketch: Sketch,
) -> number
angleToMatchLengthX(tag: TagIdentifier, to: number, sketch: Sketch) -> number
```

View File

@ -9,11 +9,7 @@ Returns the angle to match the given length for y.
```js
angleToMatchLengthY(
tag: TagIdentifier,
to: number,
sketch: Sketch,
) -> number
angleToMatchLengthY(tag: TagIdentifier, to: number, sketch: Sketch) -> number
```

View File

@ -9,11 +9,7 @@ Draw a line segment relative to the current origin using the polar
measure of some angle and distance.
```js
angledLine(
data: AngledLineData,
sketch: Sketch,
tag?: TagDeclarator,
) -> Sketch
angledLine(data: AngledLineData, sketch: Sketch, tag?: TagDeclarator) -> Sketch
```
@ -33,7 +29,7 @@ angledLine(
### Examples
```js
exampleSketch = startSketchOn(XZ)
exampleSketch = startSketchOn('XZ')
|> startProfileAt([0, 0], %)
|> yLineTo(15, %)
|> angledLine({ angle = 30, length = 15 }, %)

View File

@ -9,11 +9,7 @@ Create a line segment from the current 2-dimensional sketch origin
along some angle (in degrees) for some relative length in the 'x' dimension.
```js
angledLineOfXLength(
data: AngledLineData,
sketch: Sketch,
tag?: TagDeclarator,
) -> Sketch
angledLineOfXLength(data: AngledLineData, sketch: Sketch, tag?: TagDeclarator) -> Sketch
```
@ -33,7 +29,7 @@ angledLineOfXLength(
### Examples
```js
sketch001 = startSketchOn(XZ)
sketch001 = startSketchOn('XZ')
|> startProfileAt([0, 0], %)
|> angledLineOfXLength({ angle = 45, length = 10 }, %, $edge1)
|> angledLineOfXLength({ angle = -15, length = 20 }, %, $edge2)

View File

@ -9,11 +9,7 @@ Create a line segment from the current 2-dimensional sketch origin
along some angle (in degrees) for some relative length in the 'y' dimension.
```js
angledLineOfYLength(
data: AngledLineData,
sketch: Sketch,
tag?: TagDeclarator,
) -> Sketch
angledLineOfYLength(data: AngledLineData, sketch: Sketch, tag?: TagDeclarator) -> Sketch
```
@ -33,7 +29,7 @@ angledLineOfYLength(
### Examples
```js
exampleSketch = startSketchOn(XZ)
exampleSketch = startSketchOn('XZ')
|> startProfileAt([0, 0], %)
|> line(end = [10, 0])
|> angledLineOfYLength({ angle = 45, length = 10 }, %)

View File

@ -9,11 +9,7 @@ Draw an angled line from the current origin, constructing a line segment
such that the newly created line intersects the desired target line segment.
```js
angledLineThatIntersects(
data: AngledLineThatIntersectsData,
sketch: Sketch,
tag?: TagDeclarator,
) -> Sketch
angledLineThatIntersects(data: AngledLineThatIntersectsData, sketch: Sketch, tag?: TagDeclarator) -> Sketch
```
@ -33,7 +29,7 @@ angledLineThatIntersects(
### Examples
```js
exampleSketch = startSketchOn(XZ)
exampleSketch = startSketchOn('XZ')
|> startProfileAt([0, 0], %)
|> line(endAbsolute = [5, 10])
|> line(endAbsolute = [-10, 10], tag = $lineToIntersect)

View File

@ -9,11 +9,7 @@ Create a line segment from the current 2-dimensional sketch origin
along some angle (in degrees) for some length, ending at the provided value in the 'x' dimension.
```js
angledLineToX(
data: AngledLineToData,
sketch: Sketch,
tag?: TagDeclarator,
) -> Sketch
angledLineToX(data: AngledLineToData, sketch: Sketch, tag?: TagDeclarator) -> Sketch
```
@ -33,7 +29,7 @@ angledLineToX(
### Examples
```js
exampleSketch = startSketchOn(XZ)
exampleSketch = startSketchOn('XZ')
|> startProfileAt([0, 0], %)
|> angledLineToX({ angle = 30, to = 10 }, %)
|> line(end = [0, 10])

View File

@ -9,11 +9,7 @@ Create a line segment from the current 2-dimensional sketch origin
along some angle (in degrees) for some length, ending at the provided value in the 'y' dimension.
```js
angledLineToY(
data: AngledLineToData,
sketch: Sketch,
tag?: TagDeclarator,
) -> Sketch
angledLineToY(data: AngledLineToData, sketch: Sketch, tag?: TagDeclarator) -> Sketch
```
@ -33,7 +29,7 @@ angledLineToY(
### Examples
```js
exampleSketch = startSketchOn(XZ)
exampleSketch = startSketchOn('XZ')
|> startProfileAt([0, 0], %)
|> angledLineToY({ angle = 60, to = 20 }, %)
|> line(end = [-20, 0])

File diff suppressed because one or more lines are too long

View File

@ -11,11 +11,7 @@ The arc is constructed such that the current position of the sketch is placed al
Unless this makes a lot of sense and feels like what you're looking for to construct your shape, you're likely looking for tangentialArc.
```js
arc(
data: ArcData,
sketch: Sketch,
tag?: TagDeclarator,
) -> Sketch
arc(data: ArcData, sketch: Sketch, tag?: TagDeclarator) -> Sketch
```
@ -35,7 +31,7 @@ arc(
### Examples
```js
exampleSketch = startSketchOn(XZ)
exampleSketch = startSketchOn('XZ')
|> startProfileAt([0, 0], %)
|> line(end = [10, 0])
|> arc({

View File

@ -9,11 +9,7 @@ Draw a 3 point arc.
The arc is constructed such that the start point is the current position of the sketch and two more points defined as the end and interior point. The interior point is placed between the start point and end point. The radius of the arc will be controlled by how far the interior point is placed from the start and end.
```js
arcTo(
data: ArcToData,
sketch: Sketch,
tag?: TagDeclarator,
) -> Sketch
arcTo(data: ArcToData, sketch: Sketch, tag?: TagDeclarator) -> Sketch
```
@ -33,7 +29,7 @@ arcTo(
### Examples
```js
exampleSketch = startSketchOn(XZ)
exampleSketch = startSketchOn('XZ')
|> startProfileAt([0, 0], %)
|> arcTo({ end = [10, 0], interior = [5, 5] }, %)
|> close()

View File

@ -9,10 +9,7 @@ Check a value at runtime, and raise an error if the argument provided
is false.
```js
assert(
data: bool,
message: string,
) -> ()
assert(data: bool, message: string) -> ()
```

View File

@ -9,12 +9,7 @@ Check that a numerical value equals another at runtime,
otherwise raise an error.
```js
assertEqual(
left: number,
right: number,
epsilon: number,
message: string,
) -> ()
assertEqual(left: number, right: number, epsilon: number, message: string) -> ()
```

View File

@ -9,11 +9,7 @@ Check that a numerical value is greater than another at runtime,
otherwise raise an error.
```js
assertGreaterThan(
left: number,
right: number,
message: string,
) -> ()
assertGreaterThan(left: number, right: number, message: string) -> ()
```

View File

@ -9,11 +9,7 @@ Check that a numerical value is greater than or equal to another at runtime,
otherwise raise an error.
```js
assertGreaterThanOrEq(
left: number,
right: number,
message: string,
) -> ()
assertGreaterThanOrEq(left: number, right: number, message: string) -> ()
```

View File

@ -9,11 +9,7 @@ Check that a numerical value is less than to another at runtime,
otherwise raise an error.
```js
assertLessThan(
left: number,
right: number,
message: string,
) -> ()
assertLessThan(left: number, right: number, message: string) -> ()
```

View File

@ -9,11 +9,7 @@ Check that a numerical value is less than or equal to another at runtime,
otherwise raise an error.
```js
assertLessThanOrEq(
left: number,
right: number,
message: string,
) -> ()
assertLessThanOrEq(left: number, right: number, message: string) -> ()
```

View File

@ -9,10 +9,7 @@ Compute the four quadrant arctangent of Y and X (in radians).
```js
atan2(
y: number,
x: number,
) -> number
atan2(y: number, x: number) -> number
```
### Tags

View File

@ -9,11 +9,7 @@ Draw a smooth, continuous, curved line segment from the current origin to
the desired (x, y), using a number of control points to shape the curve's shape.
```js
bezierCurve(
data: BezierData,
sketch: Sketch,
tag?: TagDeclarator,
) -> Sketch
bezierCurve(data: BezierData, sketch: Sketch, tag?: TagDeclarator) -> Sketch
```
@ -33,7 +29,7 @@ bezierCurve(
### Examples
```js
exampleSketch = startSketchOn(XZ)
exampleSketch = startSketchOn('XZ')
|> startProfileAt([0, 0], %)
|> line(end = [0, 10])
|> bezierCurve({

View File

@ -9,12 +9,7 @@ Cut a straight transitional edge along a tagged path.
Chamfer is similar in function and use to a fillet, except a fillet will blend the transition along an edge, rather than cut a sharp, straight transitional edge.
```js
chamfer(
solid: Solid,
length: number,
tags: [EdgeReference],
tag?: TagDeclarator,
) -> Solid
chamfer(solid: Solid, length: number, tags: [EdgeReference], tag?: TagDeclarator) -> Solid
```

View File

@ -9,12 +9,7 @@ Construct a 2-dimensional circle, of the specified radius, centered at
the provided (x, y) origin point.
```js
circle(
sketchOrSurface: SketchOrSurface,
center: [number],
radius: number,
tag?: TagDeclarator,
) -> Sketch
circle(data: CircleData, sketchSurfaceOrGroup: SketchOrSurface, tag?: TagDeclarator) -> Sketch
```
@ -22,10 +17,9 @@ circle(
| Name | Type | Description | Required |
|----------|------|-------------|----------|
| `sketchOrSurface` | [`SketchOrSurface`](/docs/kcl/types/SketchOrSurface) | Plane or surface to sketch on. | Yes |
| `center` | `[number]` | The center of the circle. | Yes |
| `radius` | `number` | The radius of the circle. | Yes |
| `tag` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | Create a new tag which refers to this circle | No |
| `data` | [`CircleData`](/docs/kcl/types/CircleData) | Data for drawing an circle | Yes |
| `sketchSurfaceOrGroup` | [`SketchOrSurface`](/docs/kcl/types/SketchOrSurface) | A sketch surface or a sketch. | Yes |
| `tag` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | | No |
### Returns
@ -36,7 +30,7 @@ circle(
```js
exampleSketch = startSketchOn("-XZ")
|> circle(center = [0, 0], radius = 10)
|> circle({ center = [0, 0], radius = 10 }, %)
example = extrude(exampleSketch, length = 5)
```
@ -50,7 +44,7 @@ exampleSketch = startSketchOn("XZ")
|> line(end = [0, 30])
|> line(end = [-30, 0])
|> close()
|> hole(circle(center = [0, 15], radius = 5), %)
|> hole(circle({ center = [0, 15], radius = 5 }, %), %)
example = extrude(exampleSketch, length = 5)
```

View File

@ -9,13 +9,7 @@ Construct a circle derived from 3 points.
```js
circleThreePoint(
p1: [number],
p2: [number],
p3: [number],
sketchSurfaceOrGroup: SketchOrSurface,
tag?: TagDeclarator,
) -> Sketch
circleThreePoint(p1: [number], p2: [number], p3: [number], sketchSurfaceOrGroup: SketchOrSurface, tag?: TagDeclarator) -> Sketch
```

File diff suppressed because one or more lines are too long

32
docs/kcl/const_E.md Normal file

File diff suppressed because one or more lines are too long

View File

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

28
docs/kcl/const_PI.md Normal file

File diff suppressed because one or more lines are too long

View File

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

32
docs/kcl/const_TAU.md Normal file

File diff suppressed because one or more lines are too long

View File

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

View File

@ -1,5 +1,5 @@
---
title: "std::YZ"
title: "ZERO"
excerpt: ""
layout: manual
---
@ -9,7 +9,7 @@ layout: manual
```js
std::YZ
ZERO: number = 0
```

View File

@ -18,7 +18,7 @@ std::math::PI: number = 3.14159265358979323846264338327950288_
circumference = 70
exampleSketch = startSketchOn("XZ")
|> circle(center = [0, 0], radius = circumference/ (2 * PI))
|> circle({ center = [0, 0], radius = circumference/ (2 * PI) }, %)
example = extrude(exampleSketch, length = 5)
```

File diff suppressed because one or more lines are too long

View File

@ -9,10 +9,7 @@ Extend a 2-dimensional sketch through a third dimension in order to
create new 3-dimensional volume, or if extruded into an existing volume, cut into an existing solid.
```js
extrude(
sketchSet: SketchSet,
length: number,
) -> SolidSet
extrude(sketchSet: SketchSet, length: number) -> SolidSet
```

View File

@ -9,13 +9,7 @@ Blend a transitional edge along a tagged path, smoothing the sharp edge.
Fillet is similar in function and use to a chamfer, except a chamfer will cut a sharp transition along an edge while fillet will smoothly blend the transition.
```js
fillet(
solid: Solid,
radius: number,
tags: [EdgeReference],
tolerance?: number,
tag?: TagDeclarator,
) -> Solid
fillet(solid: Solid, radius: number, tags: [EdgeReference], tolerance?: number, tag?: TagDeclarator) -> Solid
```

View File

@ -9,14 +9,7 @@ Create a helix.
```js
helix(
revolutions: number,
angleStart: number,
ccw?: bool,
radius: number,
axis: Axis3dOrEdgeReference,
length?: number,
) -> HelixValue
helix(revolutions: number, angleStart: number, ccw?: bool, radius: number, axis: Axis3dOrEdgeReference, length?: number) -> HelixValue
```
@ -51,7 +44,7 @@ helixPath = helix(
// Create a spring by sweeping around the helix path.
springSketch = startSketchOn('YZ')
|> circle(center = [0, 0], radius = 0.5)
|> circle({ center = [0, 0], radius = 0.5 }, %)
|> sweep(path = helixPath)
```
@ -74,7 +67,7 @@ helixPath = helix(
// Create a spring by sweeping around the helix path.
springSketch = startSketchOn('XY')
|> circle(center = [0, 0], radius = 0.5)
|> circle({ center = [0, 0], radius = 0.5 }, %)
|> sweep(path = helixPath)
```
@ -98,7 +91,7 @@ helixPath = helix(
// Create a spring by sweeping around the helix path.
springSketch = startSketchOn('XY')
|> circle(center = [0, 0], radius = 1)
|> circle({ center = [0, 0], radius = 1 }, %)
|> sweep(path = helixPath)
```

View File

@ -9,10 +9,7 @@ Create a helix on a cylinder.
```js
helixRevolutions(
data: HelixRevolutionsData,
solid: Solid,
) -> Solid
helixRevolutions(data: HelixRevolutionsData, solid: Solid) -> Solid
```
@ -32,7 +29,7 @@ helixRevolutions(
```js
part001 = startSketchOn('XY')
|> circle(center = [5, 5], radius = 10)
|> circle({ center = [5, 5], radius = 10 }, %)
|> extrude(length = 10)
|> helixRevolutions({
angleStart = 0,

View File

@ -9,10 +9,7 @@ Use a 2-dimensional sketch to cut a hole in another 2-dimensional sketch.
```js
hole(
holeSketch: SketchSet,
sketch: Sketch,
) -> Sketch
hole(holeSketch: SketchSet, sketch: Sketch) -> Sketch
```
@ -31,14 +28,14 @@ hole(
### Examples
```js
exampleSketch = startSketchOn(XY)
exampleSketch = startSketchOn('XY')
|> startProfileAt([0, 0], %)
|> line(end = [0, 5])
|> line(end = [5, 0])
|> line(end = [0, -5])
|> close()
|> hole(circle(center = [1, 1], radius = .25), %)
|> hole(circle(center = [1, 4], radius = .25), %)
|> hole(circle({ center = [1, 1], radius = .25 }, %), %)
|> hole(circle({ center = [1, 4], radius = .25 }, %), %)
example = extrude(exampleSketch, length = 1)
```
@ -47,7 +44,7 @@ example = extrude(exampleSketch, length = 1)
```js
fn squareHoleSketch() {
squareSketch = startSketchOn(-XZ)
squareSketch = startSketchOn('-XZ')
|> startProfileAt([-1, -1], %)
|> line(end = [2, 0])
|> line(end = [0, 2])
@ -56,8 +53,8 @@ fn squareHoleSketch() {
return squareSketch
}
exampleSketch = startSketchOn(-XZ)
|> circle(center = [0, 0], radius = 3)
exampleSketch = startSketchOn('-XZ')
|> circle({ center = [0, 0], radius = 3 }, %)
|> hole(squareHoleSketch(), %)
example = extrude(exampleSketch, length = 1)
```

View File

@ -9,10 +9,7 @@ Make the inside of a 3D object hollow.
Remove volume from a 3-dimensional shape such that a wall of the provided thickness remains around the exterior of the shape.
```js
hollow(
thickness: number,
solid: Solid,
) -> Solid
hollow(thickness: number, solid: Solid) -> Solid
```
@ -70,11 +67,17 @@ case = startSketchOn('-XZ')
|> extrude(length = 65)
thing1 = startSketchOn(case, 'end')
|> circle(center = [-size / 2, -size / 2], radius = 25)
|> circle({
center = [-size / 2, -size / 2],
radius = 25
}, %)
|> extrude(length = 50)
thing2 = startSketchOn(case, 'end')
|> circle(center = [size / 2, -size / 2], radius = 25)
|> circle({
center = [size / 2, -size / 2],
radius = 25
}, %)
|> extrude(length = 50)
hollow(0.5, case)

View File

@ -15,10 +15,7 @@ For formats lacking unit data (such as STL, OBJ, or PLY files), the default unit
Note: The import command currently only works when using the native Modeling App.
```js
import(
filePath: String,
options?: ImportFormat,
) -> ImportedGeometry
import(filePath: String, options?: ImportFormat) -> ImportedGeometry
```

View File

@ -6,22 +6,13 @@ layout: manual
## Table of Contents
### Language
* [`Types`](kcl/types)
* [`Modules`](kcl/modules)
* [`Settings`](kcl/settings)
* [`Known Issues`](kcl/known-issues)
### Standard library
* [Types](kcl/types)
* [Modules](kcl/modules)
* [Known Issues](kcl/KNOWN-ISSUES)
* **`std`**
* [`HALF_TURN`](kcl/const_std-HALF_TURN)
* [`QUARTER_TURN`](kcl/const_std-QUARTER_TURN)
* [`THREE_QUARTER_TURN`](kcl/const_std-THREE_QUARTER_TURN)
* [`XY`](kcl/const_std-XY)
* [`XZ`](kcl/const_std-XZ)
* [`YZ`](kcl/const_std-YZ)
* [`ZERO`](kcl/const_std-ZERO)
* [`abs`](kcl/abs)
* [`acos`](kcl/acos)
@ -99,9 +90,7 @@ layout: manual
* [`reduce`](kcl/reduce)
* [`rem`](kcl/rem)
* [`revolve`](kcl/revolve)
* [`rotate`](kcl/rotate)
* [`round`](kcl/round)
* [`scale`](kcl/scale)
* [`segAng`](kcl/segAng)
* [`segEnd`](kcl/segEnd)
* [`segEndX`](kcl/segEndX)
@ -121,7 +110,6 @@ layout: manual
* [`tangentialArcToRelative`](kcl/tangentialArcToRelative)
* [`toDegrees`](kcl/toDegrees)
* [`toRadians`](kcl/toRadians)
* [`translate`](kcl/translate)
* [`xLine`](kcl/xLine)
* [`xLineTo`](kcl/xLineTo)
* [`yLine`](kcl/yLine)

View File

@ -37,7 +37,7 @@ n = int(ceil(5 / 2))
assertEqual(n, 3, 0.0001, "5/2 = 2.5, rounded up makes 3")
// Draw n cylinders.
startSketchOn('XZ')
|> circle(center = [0, 0], radius = 2)
|> circle({ center = [0, 0], radius = 2 }, %)
|> extrude(length = 5)
|> patternTransform(
instances = n,

View File

@ -9,10 +9,7 @@ Compute the angle of the given leg for x.
```js
legAngX(
hypotenuse: number,
leg: number,
) -> number
legAngX(hypotenuse: number, leg: number) -> number
```
### Tags

View File

@ -9,10 +9,7 @@ Compute the angle of the given leg for y.
```js
legAngY(
hypotenuse: number,
leg: number,
) -> number
legAngY(hypotenuse: number, leg: number) -> number
```
### Tags

View File

@ -9,10 +9,7 @@ Compute the length of the given leg.
```js
legLen(
hypotenuse: number,
leg: number,
) -> number
legLen(hypotenuse: number, leg: number) -> number
```
### Tags

View File

@ -9,12 +9,7 @@ Extend the current sketch with a new straight line.
```js
line(
sketch: Sketch,
endAbsolute?: [number],
end?: [number],
tag?: TagDeclarator,
) -> Sketch
line(sketch: Sketch, endAbsolute?: [number], end?: [number], tag?: TagDeclarator) -> Sketch
```
@ -35,7 +30,7 @@ line(
### Examples
```js
triangle = startSketchOn(XZ)
triangle = startSketchOn("XZ")
|> startProfileAt([0, 0], %)
// The 'end' argument means it ends at exactly [10, 0].
// This is an absolute measurement, it is NOT relative to
@ -46,7 +41,7 @@ triangle = startSketchOn(XZ)
|> close()
|> extrude(length = 5)
box = startSketchOn(XZ)
box = startSketchOn("XZ")
|> startProfileAt([10, 10], %)
// The 'to' argument means move the pen this much.
// So, [10, 0] is a relative distance away from the current point.

View File

@ -9,13 +9,7 @@ Create a 3D surface or solid by interpolating between two or more sketches.
The sketches need to closed and on the same plane.
```js
loft(
sketches: [Sketch],
vDegree: NonZeroU32,
bezApproximateRational: bool,
baseCurveIndex?: integer,
tolerance?: number,
) -> Solid
loft(sketches: [Sketch], vDegree: NonZeroU32, bezApproximateRational: bool, baseCurveIndex?: integer, tolerance?: number) -> Solid
```
@ -69,10 +63,10 @@ squareSketch = startSketchOn('XY')
|> close()
circleSketch0 = startSketchOn(offsetPlane('XY', offset = 75))
|> circle(center = [0, 100], radius = 50)
|> circle({ center = [0, 100], radius = 50 }, %)
circleSketch1 = startSketchOn(offsetPlane('XY', offset = 150))
|> circle(center = [0, 100], radius = 20)
|> circle({ center = [0, 100], radius = 20 }, %)
loft([
squareSketch,
@ -94,10 +88,10 @@ squareSketch = startSketchOn('XY')
|> close()
circleSketch0 = startSketchOn(offsetPlane('XY', offset = 75))
|> circle(center = [0, 100], radius = 50)
|> circle({ center = [0, 100], radius = 50 }, %)
circleSketch1 = startSketchOn(offsetPlane('XY', offset = 150))
|> circle(center = [0, 100], radius = 20)
|> circle({ center = [0, 100], radius = 20 }, %)
loft(
[

View File

@ -9,10 +9,7 @@ Compute the logarithm of the number with respect to an arbitrary base.
The result might not be correctly rounded owing to implementation details; `log2()` can produce more accurate results for base 2, and `log10()` can produce more accurate results for base 10.
```js
log(
num: number,
base: number,
) -> number
log(num: number, base: number) -> number
```
### Tags

View File

@ -9,10 +9,7 @@ Apply a function to every element of a list.
Given a list like `[a, b, c]`, and a function like `f`, returns `[f(a), f(b), f(c)]`
```js
map(
array: [KclValue],
mapFn: FunctionSource,
) -> [KclValue]
map(array: [KclValue], mapFn: FunctionSource) -> [KclValue]
```
@ -34,7 +31,7 @@ map(
r = 10 // radius
fn drawCircle(id) {
return startSketchOn("XY")
|> circle(center = [id * 2 * r, 0], radius = r)
|> circle({ center = [id * 2 * r, 0], radius = r }, %)
}
// Call `drawCircle`, passing in each element of the array.
@ -50,7 +47,7 @@ r = 10 // radius
// Call `map`, using an anonymous function instead of a named one.
circles = map([1..3], fn(id) {
return startSketchOn("XY")
|> circle(center = [id * 2 * r, 0], radius = r)
|> circle({ center = [id * 2 * r, 0], radius = r }, %)
})
```

View File

@ -11,10 +11,7 @@ Only works on unclosed sketches for now.
Mirror occurs around a local sketch axis rather than a global axis.
```js
mirror2d(
data: Mirror2dData,
sketchSet: SketchSet,
) -> [Sketch]
mirror2d(data: Mirror2dData, sketchSet: SketchSet) -> [Sketch]
```

View File

@ -20,7 +20,7 @@ export fn increment(x) {
Other files in the project can now import functions that have been exported.
This makes them available to use in another file.
```norun
```
// main.kcl
import increment from "util.kcl"
@ -48,13 +48,13 @@ export fn decrement(x) {
When importing, you can import multiple functions at once.
```norun
```
import increment, decrement from "util.kcl"
```
Imported symbols can be renamed for convenience or to avoid name collisions.
```norun
```
import increment as inc, decrement as dec from "util.kcl"
```
@ -63,13 +63,13 @@ import increment as inc, decrement as dec from "util.kcl"
`import` can also be used to import files from other CAD systems. The format of the statement is the
same as for KCL files. You can only import the whole file, not items from it. E.g.,
```norun
```
import "tests/inputs/cube.obj"
// Use `cube` just like a KCL object.
```
```norun
```
import "tests/inputs/cube-2.sldprt" as cube
// Use `cube` just like a KCL object.
@ -78,7 +78,7 @@ import "tests/inputs/cube-2.sldprt" as cube
You can make the file format explicit using a format attribute (useful if using a different
extension), e.g.,
```norun
```
@(format = obj)
import "tests/inputs/cube"
```
@ -87,7 +87,7 @@ For formats lacking unit data (such as STL, OBJ, or PLY files), the default
unit of measurement is millimeters. Alternatively you may specify the unit
by using an attirbute. Likewise, you can also specify a coordinate system. E.g.,
```norun
```
@(unitLength = ft, coords = opengl)
import "tests/inputs/cube.obj"
```

View File

@ -9,10 +9,7 @@ Offset a plane by a distance along its normal.
For example, if you offset the 'XZ' plane by 10, the new plane will be parallel to the 'XZ' plane and 10 units away from it.
```js
offsetPlane(
plane: PlaneData,
offset: number,
) -> Plane
offsetPlane(plane: PlaneData, offset: number) -> Plane
```
@ -41,7 +38,7 @@ squareSketch = startSketchOn('XY')
|> close()
circleSketch = startSketchOn(offsetPlane('XY', offset = 150))
|> circle(center = [0, 100], radius = 50)
|> circle({ center = [0, 100], radius = 50 }, %)
loft([squareSketch, circleSketch])
```
@ -59,7 +56,7 @@ squareSketch = startSketchOn('XZ')
|> close()
circleSketch = startSketchOn(offsetPlane('XZ', offset = 150))
|> circle(center = [0, 100], radius = 50)
|> circle({ center = [0, 100], radius = 50 }, %)
loft([squareSketch, circleSketch])
```
@ -77,7 +74,7 @@ squareSketch = startSketchOn('YZ')
|> close()
circleSketch = startSketchOn(offsetPlane('YZ', offset = 150))
|> circle(center = [0, 100], radius = 50)
|> circle({ center = [0, 100], radius = 50 }, %)
loft([squareSketch, circleSketch])
```
@ -95,7 +92,7 @@ squareSketch = startSketchOn('-XZ')
|> close()
circleSketch = startSketchOn(offsetPlane('-XZ', offset = -150))
|> circle(center = [0, 100], radius = 50)
|> circle({ center = [0, 100], radius = 50 }, %)
loft([squareSketch, circleSketch])
```
@ -106,7 +103,7 @@ loft([squareSketch, circleSketch])
// A circle on the XY plane
startSketchOn("XY")
|> startProfileAt([0, 0], %)
|> circle(radius = 10, center = [0, 0])
|> circle({ radius = 10, center = [0, 0] }, %)
// Triangle on the plane 4 units above
startSketchOn(offsetPlane("XY", offset = 4))

View File

@ -9,14 +9,7 @@ Repeat a 2-dimensional sketch some number of times along a partial or
complete circle some specified number of times. Each object may additionally be rotated along the circle, ensuring orentation of the solid with respect to the center of the circle is maintained.
```js
patternCircular2d(
sketchSet: SketchSet,
instances: integer,
center: [number],
arcDegrees: number,
rotateDuplicates: bool,
useOriginal?: bool,
) -> [Sketch]
patternCircular2d(sketchSet: SketchSet, instances: integer, center: [number], arcDegrees: number, rotateDuplicates: bool, useOriginal?: bool) -> [Sketch]
```

File diff suppressed because one or more lines are too long

View File

@ -9,13 +9,7 @@ Repeat a 2-dimensional sketch along some dimension, with a dynamic amount
of distance between each repetition, some specified number of times.
```js
patternLinear2d(
sketchSet: SketchSet,
instances: integer,
distance: number,
axis: [number],
useOriginal?: bool,
) -> [Sketch]
patternLinear2d(sketchSet: SketchSet, instances: integer, distance: number, axis: [number], useOriginal?: bool) -> [Sketch]
```
@ -38,7 +32,7 @@ patternLinear2d(
```js
exampleSketch = startSketchOn('XZ')
|> circle(center = [0, 0], radius = 1)
|> circle({ center = [0, 0], radius = 1 }, %)
|> patternLinear2d(axis = [1, 0], instances = 7, distance = 4)
example = extrude(exampleSketch, length = 1)

File diff suppressed because one or more lines are too long

View File

@ -35,12 +35,7 @@ The transform function returns a transform object. All properties of the object
- `rotation.origin` (either "local" i.e. rotate around its own center, "global" i.e. rotate around the scene's center, or a 3D point, defaults to "local")
```js
patternTransform(
solidSet: SolidSet,
instances: integer,
transform: FunctionSource,
useOriginal?: bool,
) -> [Solid]
patternTransform(solidSet: SolidSet, instances: integer, transform: FunctionSource, useOriginal?: bool) -> [Solid]
```
@ -68,7 +63,7 @@ fn transform(id) {
// Sketch 4 cylinders.
sketch001 = startSketchOn('XZ')
|> circle(center = [0, 0], radius = 2)
|> circle({ center = [0, 0], radius = 2 }, %)
|> extrude(length = 5)
|> patternTransform(instances = 4, transform = transform)
```
@ -84,7 +79,7 @@ fn transform(id) {
}
sketch001 = startSketchOn('XZ')
|> circle(center = [0, 0], radius = 2)
|> circle({ center = [0, 0], radius = 2 }, %)
|> extrude(length = 5)
|> patternTransform(instances = 4, transform = transform)
```
@ -184,7 +179,7 @@ fn transform(replicaId) {
fn layer() {
return startSketchOn("XY")
// or some other plane idk
|> circle(center = [0, 0], radius = 1, tag = $tag1)
|> circle({ center = [0, 0], radius = 1 }, %, $tag1)
|> extrude(length = h)
}
// The vase is 100 layers tall.

View File

@ -9,12 +9,7 @@ Just like patternTransform, but works on 2D sketches not 3D solids.
```js
patternTransform2d(
sketchSet: SketchSet,
instances: integer,
transform: FunctionSource,
useOriginal?: bool,
) -> [Sketch]
patternTransform2d(sketchSet: SketchSet, instances: integer, transform: FunctionSource, useOriginal?: bool) -> [Sketch]
```
@ -42,7 +37,7 @@ fn transform(id) {
// Sketch 4 circles.
sketch001 = startSketchOn('XZ')
|> circle(center = [0, 0], radius = 2)
|> circle({ center = [0, 0], radius = 2 }, %)
|> patternTransform2d(instances = 4, transform = transform)
```

View File

@ -31,7 +31,10 @@ pi() -> number
circumference = 70
exampleSketch = startSketchOn("XZ")
|> circle(center = [0, 0], radius = circumference / (2 * pi()))
|> circle({
center = [0, 0],
radius = circumference / (2 * pi())
}, %)
example = extrude(exampleSketch, length = 5)
```

View File

@ -9,11 +9,7 @@ Create a regular polygon with the specified number of sides that is either inscr
```js
polygon(
data: PolygonData,
sketchSurfaceOrGroup: SketchOrSurface,
tag?: TagDeclarator,
) -> Sketch
polygon(data: PolygonData, sketchSurfaceOrGroup: SketchOrSurface, tag?: TagDeclarator) -> Sketch
```

View File

@ -9,10 +9,7 @@ Compute the number to a power.
```js
pow(
num: number,
pow: number,
) -> number
pow(num: number, pow: number) -> number
```
### Tags

View File

@ -27,7 +27,7 @@ profileStart(sketch: Sketch) -> [number]
### Examples
```js
sketch001 = startSketchOn(XY)
sketch001 = startSketchOn('XY')
|> startProfileAt([5, 2], %)
|> angledLine({ angle = 120, length = 50 }, %, $seg01)
|> angledLine({

View File

@ -27,7 +27,7 @@ profileStartX(sketch: Sketch) -> number
### Examples
```js
sketch001 = startSketchOn(XY)
sketch001 = startSketchOn('XY')
|> startProfileAt([5, 2], %)
|> angledLine([-26.6, 50], %)
|> angledLine([90, 50], %)

View File

@ -27,7 +27,7 @@ profileStartY(sketch: Sketch) -> number
### Examples
```js
sketch001 = startSketchOn(XY)
sketch001 = startSketchOn('XY')
|> startProfileAt([5, 2], %)
|> angledLine({ angle = -60, length = 14 }, %)
|> angledLineToY({ angle = 30, to = profileStartY(%) }, %)

View File

@ -9,10 +9,7 @@ Append an element to the end of an array.
Returns a new array with the element appended.
```js
push(
array: [KclValue],
elem: KclValue,
) -> KclValue
push(array: [KclValue], elem: KclValue) -> KclValue
```

View File

@ -9,11 +9,7 @@ Take a starting value. Then, for each element of an array, calculate the next va
using the previous value and the element.
```js
reduce(
array: [KclValue],
start: KclValue,
reduceFn: FunctionSource,
) -> KclValue
reduce(array: [KclValue], start: KclValue, reduceFn: FunctionSource) -> KclValue
```

View File

@ -9,10 +9,7 @@ Compute the remainder after dividing `num` by `div`.
If `num` is negative, the result will be too.
```js
rem(
num: number,
divisor: number,
) -> number
rem(num: number, divisor: number) -> number
```
### Tags

View File

@ -11,10 +11,7 @@ This, like extrude, is able to create a 3-dimensional solid from a 2-dimensional
Revolve occurs around a local sketch axis rather than a global axis.
```js
revolve(
data: RevolveData,
sketch: Sketch,
) -> Solid
revolve(data: RevolveData, sketch: Sketch) -> Solid
```
@ -51,7 +48,7 @@ part001 = startSketchOn('XY')
```js
// A donut shape.
sketch001 = startSketchOn('XY')
|> circle(center = [15, 0], radius = 5)
|> circle({ center = [15, 0], radius = 5 }, %)
|> revolve({ angle = 360, axis = 'y' }, %)
```
@ -106,7 +103,7 @@ box = startSketchOn('XY')
|> extrude(length = 20)
sketch001 = startSketchOn(box, "END")
|> circle(center = [10, 10], radius = 4)
|> circle({ center = [10, 10], radius = 4 }, %)
|> revolve({ angle = -90, axis = 'y' }, %)
```
@ -122,7 +119,7 @@ box = startSketchOn('XY')
|> extrude(length = 20)
sketch001 = startSketchOn(box, "END")
|> circle(center = [10, 10], radius = 4)
|> circle({ center = [10, 10], radius = 4 }, %)
|> revolve({
angle = 90,
axis = getOppositeEdge(revolveAxis)
@ -141,7 +138,7 @@ box = startSketchOn('XY')
|> extrude(length = 20)
sketch001 = startSketchOn(box, "END")
|> circle(center = [10, 10], radius = 4)
|> circle({ center = [10, 10], radius = 4 }, %)
|> revolve({
angle = 90,
axis = getOppositeEdge(revolveAxis),

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -40,7 +40,10 @@ cube = startSketchOn('XY')
fn cylinder(radius, tag) {
return startSketchOn('XY')
|> startProfileAt([0, 0], %)
|> circle(radius = radius, center = segEnd(tag))
|> circle({
radius = radius,
center = segEnd(tag)
}, %)
|> extrude(length = radius)
}

View File

@ -40,7 +40,10 @@ cube = startSketchOn('XY')
fn cylinder(radius, tag) {
return startSketchOn('XY')
|> startProfileAt([0, 0], %)
|> circle(radius = radius, center = segStart(tag))
|> circle({
radius = radius,
center = segStart(tag)
}, %)
|> extrude(length = radius)
}

View File

@ -1,30 +0,0 @@
---
title: "KCL settings"
excerpt: "Documentation of settings for the KCL language and Zoo Modeling App."
layout: manual
---
# Per-file settings
Settings which affect a single file are configured using the settings attribute.
This must be at the top of the KCL file (comments before the attribute are permitted).
E.g.,
```
// The settings attribute.
@settings(defaultLengthUnit = in)
// The rest of your KCL code goes below...
x = 42 // Represents 42 inches.
```
The settings attribute may contain multiple properties separated by commas.
Valid properties are:
- `defaultLengthUnit`: the default length unit to use for numbers declared in this file.
- Accepted values: `mm`, `cm`, `m`, `in` (inches), `ft` (feet), `yd` (yards).
- `defaultAngleUnit`: the default angle unit to use for numbers declared in this file.
- Accepted values: `deg` (degrees), `rad` (radians).
These settings override any project-wide settings (configured in project.toml or via the UI).

View File

@ -9,11 +9,7 @@ Remove volume from a 3-dimensional shape such that a wall of the
provided thickness remains, taking volume starting at the provided face, leaving it open in that direction.
```js
shell(
solidSet: SolidSet,
thickness: number,
faces: [FaceTag],
) -> SolidSet
shell(solidSet: SolidSet, thickness: number, faces: [FaceTag]) -> SolidSet
```
@ -108,11 +104,17 @@ case = startSketchOn('-XZ')
|> extrude(length = 65)
thing1 = startSketchOn(case, 'end')
|> circle(center = [-size / 2, -size / 2], radius = 25)
|> circle({
center = [-size / 2, -size / 2],
radius = 25
}, %)
|> extrude(length = 50)
thing2 = startSketchOn(case, 'end')
|> circle(center = [size / 2, -size / 2], radius = 25)
|> circle({
center = [size / 2, -size / 2],
radius = 25
}, %)
|> extrude(length = 50)
// We put "case" in the shell function to shell the entire object.
@ -133,11 +135,17 @@ case = startSketchOn('XY')
|> extrude(length = 65)
thing1 = startSketchOn(case, 'end')
|> circle(center = [-size / 2, -size / 2], radius = 25)
|> circle({
center = [-size / 2, -size / 2],
radius = 25
}, %)
|> extrude(length = 50)
thing2 = startSketchOn(case, 'end')
|> circle(center = [size / 2, -size / 2], radius = 25)
|> circle({
center = [size / 2, -size / 2],
radius = 25
}, %)
|> extrude(length = 50)
// We put "thing1" in the shell function to shell the end face of the object.
@ -161,11 +169,17 @@ case = startSketchOn('XY')
|> extrude(length = 65)
thing1 = startSketchOn(case, 'end')
|> circle(center = [-size / 2, -size / 2], radius = 25)
|> circle({
center = [-size / 2, -size / 2],
radius = 25
}, %)
|> extrude(length = 50)
thing2 = startSketchOn(case, 'end')
|> circle(center = [size / 2, -size / 2], radius = 25)
|> circle({
center = [size / 2, -size / 2],
radius = 25
}, %)
|> extrude(length = 50)
// We put "thing1" and "thing2" in the shell function to shell the end face of the object.

File diff suppressed because one or more lines are too long

67
docs/kcl/startSketchAt.md Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

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