Compare commits

...

6 Commits

Author SHA1 Message Date
4b2c745db5 Fix error: unknown sketch function circle (#6012) 2025-03-26 14:04:59 -04:00
bb983021b1 Feature: Traditional menu actions in desktop application (#5892)
* chore: skeleton for building and creating menus. Need electron to renderer interface to dynamically set the menu

* chore: skeleton typing for communication between nodes and web side

* chore: more skeleton for the different roles within the menu options, need more type safety

* chore: adding more skeleton and templates of what the menus could be

* chore: implemented first pass for helpRole links

* fix: syntax issue stopped the build step

* feature: loading different menus based on your page

* feature: Home page file role implemented

* chore: handling the build workflow for the signin page

* fix: moving edit actionst to the edit menu

* chore: adding preferences to the file role

* chore: redoing help roles based on the question mark widget

* fix: auto fmt

* chore: examples of accelerator strings for Menu.MenuItems keyboard shortcuts!

* chore: oddly specific toggle API for disabling MenuItems from JS. No rules!

* fix: do not implement a custom label disable thingy, use id on menu and use the native APIga

* fix: auto fmt

* fix: adding some typechecks and auto fmt fixes

* fix: trying to fix custom type?

* fix: nvm we back, the lsp on my editor borked for a second

* fix: adding one more level to the custom type for the labels

* chore: cleaning up type definitions to read easier

* fix: resolving yarn lint errors

* chore: adding file sign out

* chore: adding more file bar actions

* chore: ready for PR draft

* fix: preemptive GC collectoin bug fix if somehow a user interacts with a menu while it is being GCed

* fix: linking the OG source

* fix: set application menu to null to avoid default electron menu

* chore: trying to add more typescript

* chore: BIG workflow changes... better typing, less IPC junk

* fix: remapping the icp functions to the cb option select...

* chore: all og events are rehooked up with new workflow pattern

* feat: adding more options to the native bar!

* fix: todo

* chore: cleaning up some menus and adding more

* fix: desktop vs browser and lint errors

* fix: typescript did not like sample electorn JS code for the basic templates with isMac conditionals...

* fix: PR clean up

* fix: more PR cleanup

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

* fix: added the new help menu to the default sign in and modeling page

* fix: disabled two menu actions within sign in page since they will not do anything.

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

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

* fix: mergining main, auto fixes

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

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

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

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

* fix: fixed ipc renderer off/remove listener bug

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

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

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

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

* fix: report a bug to refresha and report a bug

* fix: new type for webContents send payload that does not brick TS

* fix: removing import file from url since it is not working in the command palette for manual user input

* fix: removing old comment

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

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

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

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

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

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

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

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

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

* chore: adding some E2E tests.

* chore: added E2E tests for each file menu

* fix: auto fixes

* chore: adding more edit role E2E tests

* chore: e2e test

* chore: adding help role e2e test

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

* chore: e2e test for all the menu options you can interact with in the frontend

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-03-26 13:03:44 -05:00
d27b8871bc Set bot user info to amend commits (#6011) 2025-03-26 17:12:20 +00:00
1753047d87 Feature: Release named views to all users (#5814)
* chore: cleanup to get named views released!

* fix: fixed gizmo, client side camera sync and remove DEV flag

* yarp

* chore: implementing E2E tests for creating a named view

* fix: cleaning up and commenting E2E tests for named views

* fix: we did it bois, the skip ceral i zation bricked my E2E test :(

* fix: auto formatter

* fix: snapshot uuid matching because rust will randomly generate thme

* fix: auto fmt

* fix: trying to resolve typescript issues

* fix: handling NamedView vs CameraViewState type checking

* fix: no idea I just mapped export to 3d export because we have no 2d export yet...

* fix: random file I wrote because my editor was too slow

* fix: git merge did not do what I wanted

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

* fix: linter errors

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

---------

Co-authored-by: 49fl <ircsurfer33@gmail.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Pierre Jacquier <pierre@zoo.dev>
2025-03-26 16:12:35 +00:00
fa16fcedff update all kcl-samples w/ format (#5999) 2025-03-26 11:53:34 -04:00
0677474097 Bump KCL in prep for release (#6010) 2025-03-26 15:52:32 +00:00
237 changed files with 27359 additions and 25319 deletions

View File

@ -28,14 +28,18 @@ jobs:
- name: Sync with main
run: |
# checkout our branch
# Create the branch
git checkout all-e2e || git checkout -b all-e2e
# fetch origin
# Reset to main
git fetch origin
# reset to main
git reset --hard origin/main
# get a new SHA to prevent overwriting the commit status on main
# Get a new SHA to prevent overwriting the commit status on main
git config --local user.email "github-actions[bot]@users.noreply.github.com"
git config --local user.name "github-actions[bot]"
git commit --amend --message="[all-e2e] $(git log --max-count=1 --pretty=%B)"
# force push it
# Overwrite the branch
git remote set-url origin https://x-access-token:${{ steps.app-token.outputs.token }}@github.com/${{ github.repository }}.git
git push --force origin all-e2e

View File

@ -0,0 +1,292 @@
import { test, expect } from './zoo-test'
import { PROJECT_SETTINGS_FILE_NAME } from 'lib/constants'
import * as fsp from 'fs/promises'
import { join } from 'path'
import {
createProject,
tomlToPerProjectSettings,
perProjectsettingsToToml,
} from './test-utils'
import { NamedView } from '@rust/kcl-lib/bindings/NamedView'
// Helper function to determine if the file path on disk exists
// Specifically this is used to check if project.toml exists on disk
const fileExists = async (path: string) => {
return !!(await fsp
.stat(path)
.then((_) => true)
.catch((_) => false))
}
// Here are a few uuids.
// When created named views rust will auto generate uuids and they will
// never match the snapshots. Overwrite them in memory to these
// values to have them match the snapshots.
const uuid1: string = '0656fb1a-9640-473e-b334-591dc70c0138'
const uuid2: string = 'c810cf04-c6cc-4a4a-8b11-17bf445dcab7'
const uuid3: string = 'cfecbfee-48a6-4561-b96d-ffbe5678bb7d'
// Look up the named view by name and then rewrite it with the same uuid each time
const nameToUuid: Map<string, string> = new Map()
nameToUuid.set('uuid1', uuid1)
nameToUuid.set('uuid2', uuid2)
nameToUuid.set('uuid3', uuid3)
/**
* Given the project.toml string, overwrite the named views to be the constant uuid
* values to match the snapshots. The uuids are randomly generated
*/
function tomlStringOverWriteNamedViewUuids(toml: string): string {
const settings = tomlToPerProjectSettings(toml)
const namedViews = settings.settings?.app?.named_views
if (namedViews) {
const entries = Object.entries(namedViews)
const remappedNamedViews: { [key: string]: NamedView } = {}
entries.forEach(([_, value]) => {
if (value) {
// {name:'uuid1'} -> uuid1 lookup
const staticUuid = nameToUuid.get(value.name)
if (staticUuid) {
remappedNamedViews[staticUuid] = value
}
}
})
if (settings && settings.settings && settings.settings.app) {
settings.settings.app.named_views = remappedNamedViews
}
}
return perProjectsettingsToToml(settings)
}
test.describe('Named view tests', () => {
test('Verify project.toml is not created', async ({ page }, testInfo) => {
// Create project and load it
const projectName = 'named-views'
await createProject({ name: projectName, page })
// Generate file paths for project.toml
const projectDirName = testInfo.outputPath('electron-test-projects-dir')
const tempProjectSettingsFilePath = join(
projectDirName,
projectName,
PROJECT_SETTINGS_FILE_NAME
)
// project.toml should not exist on initial project creation
let exists = await fileExists(tempProjectSettingsFilePath)
expect(exists).toBe(false)
})
test('Verify named view gets created', async ({
cmdBar,
scene,
page,
}, testInfo) => {
const projectName = 'named-views'
const myNamedView = 'uuid1'
// Create and load project
await createProject({ name: projectName, page })
await scene.waitForExecutionDone()
// Create named view
const projectDirName = testInfo.outputPath('electron-test-projects-dir')
await cmdBar.openCmdBar()
await cmdBar.chooseCommand('create named view')
await cmdBar.argumentInput.fill(myNamedView)
await cmdBar.progressCmdBar(false)
// Generate paths for the project.toml
const tempProjectSettingsFilePath = join(
projectDirName,
projectName,
PROJECT_SETTINGS_FILE_NAME
)
// Expect project.toml to be generated on disk since a named view was created
await expect(async () => {
let exists = await fileExists(tempProjectSettingsFilePath)
expect(exists).toBe(true)
}).toPass()
// Read project.toml into memory
let tomlString = await fsp.readFile(tempProjectSettingsFilePath, 'utf-8')
// Rewrite the uuids in the named views to match snapshot otherwise they will be randomly generated from rust and break
tomlString = tomlStringOverWriteNamedViewUuids(tomlString)
// Write the entire tomlString to a snapshot.
// There are many key/value pairs to check this is a safer match.
expect(tomlString).toMatchSnapshot('verify-named-view-gets-created')
})
test('Verify named view gets deleted', async ({
cmdBar,
scene,
page,
}, testInfo) => {
const projectName = 'named-views'
const myNamedView1 = 'uuid1'
const myNamedView2 = 'uuid2'
// Create project and go into the project
await createProject({ name: projectName, page })
await scene.waitForExecutionDone()
// Create a new named view
await cmdBar.openCmdBar()
await cmdBar.chooseCommand('create named view')
await cmdBar.argumentInput.fill(myNamedView1)
await cmdBar.progressCmdBar(false)
// Generate file paths for project.toml
const projectDirName = testInfo.outputPath('electron-test-projects-dir')
const tempProjectSettingsFilePath = join(
projectDirName,
projectName,
PROJECT_SETTINGS_FILE_NAME
)
// Except the project.toml to be written to disk since a named view was created
await expect(async () => {
let exists = await fileExists(tempProjectSettingsFilePath)
expect(exists).toBe(true)
}).toPass()
// Read project.toml into memory
let tomlString = await fsp.readFile(tempProjectSettingsFilePath, 'utf-8')
// Rewrite the uuids in the named views to match snapshot otherwise they will be randomly generated from rust and break
tomlString = tomlStringOverWriteNamedViewUuids(tomlString)
// Write the entire tomlString to a snapshot.
// There are many key/value pairs to check this is a safer match.
expect(tomlString).toMatchSnapshot('verify-named-view-gets-created')
// Delete a named view
await cmdBar.openCmdBar()
await cmdBar.chooseCommand('delete named view')
cmdBar.selectOption({ name: myNamedView2 })
await cmdBar.progressCmdBar(false)
// Read project.toml into memory again since we deleted a named view
tomlString = await fsp.readFile(tempProjectSettingsFilePath, 'utf-8')
// Rewrite the uuids in the named views to match snapshot otherwise they will be randomly generated from rust and break
tomlString = tomlStringOverWriteNamedViewUuids(tomlString)
// // Write the entire tomlString to a snapshot.
// // There are many key/value pairs to check this is a safer match.
expect(tomlString).toMatchSnapshot('verify-named-view-gets-deleted')
})
test('Verify named view gets loaded', async ({
cmdBar,
scene,
page,
}, testInfo) => {
const projectName = 'named-views'
const myNamedView = 'uuid1'
// Create project and go into the project
await createProject({ name: projectName, page })
await scene.waitForExecutionDone()
// Create a new named view
await cmdBar.openCmdBar()
await cmdBar.chooseCommand('create named view')
await cmdBar.argumentInput.fill(myNamedView)
await cmdBar.progressCmdBar(false)
// Generate file paths for project.toml
const projectDirName = testInfo.outputPath('electron-test-projects-dir')
const tempProjectSettingsFilePath = join(
projectDirName,
projectName,
PROJECT_SETTINGS_FILE_NAME
)
// Except the project.toml to be written to disk since a named view was created
await expect(async () => {
let exists = await fileExists(tempProjectSettingsFilePath)
expect(exists).toBe(true)
}).toPass()
// Read project.toml into memory
let tomlString = await fsp.readFile(tempProjectSettingsFilePath, 'utf-8')
// Rewrite the uuids in the named views to match snapshot otherwise they will be randomly generated from rust and break
tomlString = tomlStringOverWriteNamedViewUuids(tomlString)
// Write the entire tomlString to a snapshot.
// There are many key/value pairs to check this is a safer match.
expect(tomlString).toMatchSnapshot('verify-named-view-gets-created')
// Create a load a named view
await cmdBar.openCmdBar()
await cmdBar.chooseCommand('load named view')
await cmdBar.argumentInput.fill(myNamedView)
await cmdBar.progressCmdBar(false)
// Check the toast appeared
await expect(
page.getByText(`Named view ${myNamedView} loaded.`)
).toBeVisible()
})
test('Verify two named views get created', async ({
cmdBar,
scene,
page,
}, testInfo) => {
const projectName = 'named-views'
const myNamedView1 = 'uuid1'
const myNamedView2 = 'uuid2'
// Create and load project
await createProject({ name: projectName, page })
await scene.waitForExecutionDone()
// Create named view
const projectDirName = testInfo.outputPath('electron-test-projects-dir')
await cmdBar.openCmdBar()
await cmdBar.chooseCommand('create named view')
await cmdBar.argumentInput.fill(myNamedView1)
await cmdBar.progressCmdBar(false)
await page.waitForTimeout(1000)
const orbitMouseStart = { x: 800, y: 130 }
const orbitMouseEnd = { x: 0, y: 130 }
await page.mouse.move(orbitMouseStart.x, orbitMouseStart.y)
await page.mouse.down({ button: 'middle' })
await page.mouse.move(orbitMouseEnd.x, orbitMouseEnd.y, {
steps: 3,
})
await page.mouse.up({ button: 'middle' })
await page.waitForTimeout(1000)
await cmdBar.openCmdBar()
await cmdBar.chooseCommand('create named view')
await cmdBar.argumentInput.fill(myNamedView2)
await cmdBar.progressCmdBar(false)
// Wait a moment for the project.toml to get written to disk with the new view point
await page.waitForTimeout(1000)
// Generate paths for the project.toml
const tempProjectSettingsFilePath = join(
projectDirName,
projectName,
PROJECT_SETTINGS_FILE_NAME
)
// Expect project.toml to be generated on disk since a named view was created
await expect(async () => {
let exists = await fileExists(tempProjectSettingsFilePath)
expect(exists).toBe(true)
}).toPass()
// Read project.toml into memory
let tomlString = await fsp.readFile(tempProjectSettingsFilePath, 'utf-8')
// Rewrite the uuids in the named views to match snapshot otherwise they will be randomly generated from rust and break
tomlString = tomlStringOverWriteNamedViewUuids(tomlString)
// Write the entire tomlString to a snapshot.
// There are many key/value pairs to check this is a safer match.
expect(tomlString).toMatchSnapshot('verify-two-named-view-gets-created')
})
})

View File

@ -0,0 +1,16 @@
[settings]
modeling = { }
text_editor = { }
command_bar = { }
[settings.app.named_views.0656fb1a-9640-473e-b334-591dc70c0138]
name = "uuid1"
eye_offset = 1_378.0059
fov_y = 45
is_ortho = false
ortho_scale_enabled = true
ortho_scale_factor = 1.6
pivot_position = [ 0, 0, 0 ]
pivot_rotation = [ 0.5380994, 0.0, 0.0, 0.8428814 ]
world_coord_system = "right_handed_up_z"
version = 1

View File

@ -0,0 +1,16 @@
[settings]
modeling = { }
text_editor = { }
command_bar = { }
[settings.app.named_views.0656fb1a-9640-473e-b334-591dc70c0138]
name = "uuid1"
eye_offset = 1_378.0059
fov_y = 45
is_ortho = false
ortho_scale_enabled = true
ortho_scale_factor = 1.6
pivot_position = [ 0, 0, 0 ]
pivot_rotation = [ 0.5380994, 0.0, 0.0, 0.8428814 ]
world_coord_system = "right_handed_up_z"
version = 1

View File

@ -0,0 +1,28 @@
[settings]
modeling = { }
text_editor = { }
command_bar = { }
[settings.app.named_views.0656fb1a-9640-473e-b334-591dc70c0138]
name = "uuid1"
eye_offset = 1_378.0059
fov_y = 45
is_ortho = false
ortho_scale_enabled = true
ortho_scale_factor = 1.6
pivot_position = [ 0, 0, 0 ]
pivot_rotation = [ 0.5380994, 0.0, 0.0, 0.8428814 ]
world_coord_system = "right_handed_up_z"
version = 1
[settings.app.named_views.c810cf04-c6cc-4a4a-8b11-17bf445dcab7]
name = "uuid2"
eye_offset = 1_378.0059
fov_y = 45
is_ortho = false
ortho_scale_enabled = true
ortho_scale_factor = 1.6
pivot_position = [ 1_826.5239, 0.0, 0.0 ]
pivot_rotation = [ 0.5380994, 0.0, 0.0, 0.8428814 ]
world_coord_system = "right_handed_up_z"
version = 1

View File

@ -0,0 +1,312 @@
import { test, expect } from './zoo-test'
/**
* Not all menu actions are tested. Some are default electron menu actions.
* Test file menu actions that trigger something in the frontend
*/
test.describe('Native file menu', { tag: ['@electron'] }, () => {
test.describe('Home page', () => {
test.describe('File role', () => {
test('File.Create project', async ({ tronApp, cmdBar, page }) => {
if (!tronApp) fail()
// Run electron snippet to find the Menu!
await tronApp.electron.evaluate(async ({ app }) => {
if (!app || !app.applicationMenu) fail()
const newProject =
app.applicationMenu.getMenuItemById('File.New project')
if (!newProject) fail()
newProject.click()
})
// Check that the command bar is opened
await expect(cmdBar.cmdBarElement).toBeVisible()
// Check the placeholder project name exists
const actualArgument = await cmdBar.cmdBarElement
.getByTestId('cmd-bar-arg-value')
.inputValue()
const expectedArgument = 'project-$nnn'
expect(actualArgument).toBe(expectedArgument)
})
test('File.Open project', async ({ tronApp, cmdBar, page }) => {
if (!tronApp) fail()
// Run electron snippet to find the Menu!
await tronApp.electron.evaluate(async ({ app }) => {
if (!app || !app.applicationMenu) fail()
const openProject =
app.applicationMenu.getMenuItemById('File.Open project')
if (!openProject) fail()
openProject.click()
})
// Check that the command bar is opened
await expect(cmdBar.cmdBarElement).toBeVisible()
// Check the placeholder project name exists
const actual = await cmdBar.cmdBarElement
.getByTestId('command-name')
.textContent()
const expected = 'Open project'
expect(actual).toBe(expected)
})
test('File.Preferences.User settings', async ({
tronApp,
cmdBar,
page,
}) => {
if (!tronApp) fail()
// Run electron snippet to find the Menu!
await tronApp.electron.evaluate(async ({ app }) => {
if (!app || !app.applicationMenu) fail()
const userSettings = app.applicationMenu.getMenuItemById(
'File.Preferences.User settings'
)
if (!userSettings) fail()
userSettings.click()
})
const settings = page.getByTestId('settings-dialog-panel')
await expect(settings).toBeVisible()
// You are viewing the user tab
const actualText = settings.getByText(
'The overall appearance of the app'
)
await expect(actualText).toBeVisible()
})
test('File.Preferences.Keybindings', async ({
tronApp,
cmdBar,
page,
}) => {
if (!tronApp) fail()
// Run electron snippet to find the Menu!
await tronApp.electron.evaluate(async ({ app }) => {
if (!app || !app.applicationMenu) fail()
const keybindings = app.applicationMenu.getMenuItemById(
'File.Preferences.Keybindings'
)
if (!keybindings) fail()
keybindings.click()
})
const settings = page.getByTestId('settings-dialog-panel')
await expect(settings).toBeVisible()
// You are viewing the keybindings tab
const enterSketchMode = settings.locator('#enter-sketch-mode')
await expect(enterSketchMode).toBeVisible()
})
test('File.Preferences.User default units', async ({
tronApp,
cmdBar,
page,
}) => {
if (!tronApp) fail()
// Run electron snippet to find the Menu!
await tronApp.electron.evaluate(async ({ app }) => {
if (!app || !app.applicationMenu) fail()
const menu = app.applicationMenu.getMenuItemById(
'File.Preferences.User default units'
)
if (!menu) fail()
menu.click()
})
const settings = page.getByTestId('settings-dialog-panel')
await expect(settings).toBeVisible()
const defaultUnit = settings.locator('#defaultUnit')
await expect(defaultUnit).toBeVisible()
})
test('File.Preferences.Theme', async ({ tronApp, cmdBar, page }) => {
if (!tronApp) fail()
// Run electron snippet to find the Menu!
await tronApp.electron.evaluate(async ({ app }) => {
if (!app || !app.applicationMenu) fail()
const menu = app.applicationMenu.getMenuItemById(
'File.Preferences.Theme'
)
if (!menu) fail()
menu.click()
})
// Check that the command bar is opened
await expect(cmdBar.cmdBarElement).toBeVisible()
// Check the placeholder project name exists
const actual = await cmdBar.cmdBarElement
.getByTestId('command-name')
.textContent()
const expected = 'Settings · app · theme'
expect(actual).toBe(expected)
})
test('File.Preferences.Theme color', async ({
tronApp,
cmdBar,
page,
}) => {
if (!tronApp) fail()
// Run electron snippet to find the Menu!
await tronApp.electron.evaluate(async ({ app }) => {
if (!app || !app.applicationMenu) fail()
const menu = app.applicationMenu.getMenuItemById(
'File.Preferences.Theme color'
)
if (!menu) fail()
menu.click()
})
const settings = page.getByTestId('settings-dialog-panel')
await expect(settings).toBeVisible()
const defaultUnit = settings.locator('#themeColor')
await expect(defaultUnit).toBeVisible()
})
test('File.Preferences.Sign out', async ({ tronApp, cmdBar, page }) => {
if (!tronApp) fail()
// Run electron snippet to find the Menu!
await tronApp.electron.evaluate(async ({ app }) => {
if (!app || !app.applicationMenu) fail()
const menu = app.applicationMenu.getMenuItemById('File.Sign out')
if (!menu) fail()
// FIXME: Add back when you can actually sign out
// menu.click()
})
// FIXME: When signing out during E2E the page is not bound correctly.
// It cannot find the button
// const signIn = page.getByTestId('sign-in-button')
// await expect(signIn).toBeVisible()
})
})
test.describe('Edit role', () => {
test('Edit.Rename project', async ({ tronApp, cmdBar, page }) => {
if (!tronApp) fail()
// Run electron snippet to find the Menu!
await tronApp.electron.evaluate(async ({ app }) => {
if (!app || !app.applicationMenu) fail()
const menu = app.applicationMenu.getMenuItemById(
'Edit.Rename project'
)
if (!menu) fail()
menu.click()
})
// Check the placeholder project name exists
const actual = await cmdBar.cmdBarElement
.getByTestId('command-name')
.textContent()
const expected = 'Rename project'
expect(actual).toBe(expected)
})
test('Edit.Delete project', async ({ tronApp, cmdBar, page }) => {
if (!tronApp) fail()
// Run electron snippet to find the Menu!
await tronApp.electron.evaluate(async ({ app }) => {
if (!app || !app.applicationMenu) fail()
const menu = app.applicationMenu.getMenuItemById(
'Edit.Delete project'
)
if (!menu) fail()
menu.click()
})
// Check the placeholder project name exists
const actual = await cmdBar.cmdBarElement
.getByTestId('command-name')
.textContent()
const expected = 'Delete project'
expect(actual).toBe(expected)
})
test('Edit.Change project directory', async ({
tronApp,
cmdBar,
page,
}) => {
if (!tronApp) fail()
// Run electron snippet to find the Menu!
await tronApp.electron.evaluate(async ({ app }) => {
if (!app || !app.applicationMenu) fail()
const menu = app.applicationMenu.getMenuItemById(
'Edit.Change project directory'
)
if (!menu) fail()
menu.click()
})
const settings = page.getByTestId('settings-dialog-panel')
await expect(settings).toBeVisible()
const projectDirectory = settings.locator('#projectDirectory')
await expect(projectDirectory).toBeVisible()
})
})
test.describe('View role', () => {
test('View.Command Palette...', async ({ tronApp, cmdBar, page }) => {
if (!tronApp) fail()
// Run electron snippet to find the Menu!
await tronApp.electron.evaluate(async ({ app }) => {
if (!app || !app.applicationMenu) fail()
const menu = app.applicationMenu.getMenuItemById(
'View.Command Palette...'
)
if (!menu) fail()
menu.click()
})
// Check the placeholder project name exists
const actual = cmdBar.cmdBarElement.getByTestId('cmd-bar-search')
await expect(actual).toBeVisible()
})
})
test.describe('Help role', () => {
test('Help.Show all commands', async ({ tronApp, cmdBar, page }) => {
if (!tronApp) fail()
// Run electron snippet to find the Menu!
await tronApp.electron.evaluate(async ({ app }) => {
if (!app || !app.applicationMenu) fail()
const menu = app.applicationMenu.getMenuItemById(
'Help.Show all commands'
)
if (!menu) fail()
menu.click()
})
// Check the placeholder project name exists
const actual = cmdBar.cmdBarElement.getByTestId('cmd-bar-search')
await expect(actual).toBeVisible()
})
test('Help.KCL code samples', async ({ tronApp, cmdBar, page }) => {
if (!tronApp) fail()
// Run electron snippet to find the Menu!
await tronApp.electron.evaluate(async ({ app }) => {
if (!app || !app.applicationMenu) fail()
const menu = app.applicationMenu.getMenuItemById(
'Help.KCL code samples'
)
if (!menu) fail()
})
})
test('Help.Refresh and report a bug', async ({
tronApp,
cmdBar,
page,
}) => {
if (!tronApp) fail()
// Run electron snippet to find the Menu!
await tronApp.electron.evaluate(async ({ app }) => {
if (!app || !app.applicationMenu) fail()
const menu = app.applicationMenu.getMenuItemById(
'Help.Refresh and report a bug'
)
if (!menu) fail()
menu.click()
})
// Core dump and refresh magic number timeout
await page.waitForTimeout(7000)
const actual = page.getByText(
'No Projects found, ready to make your first one?'
)
await expect(actual).toBeVisible()
})
test('Help.Reset onboarding', async ({ tronApp, cmdBar, page }) => {
if (!tronApp) fail()
// Run electron snippet to find the Menu!
await tronApp.electron.evaluate(async ({ app }) => {
if (!app || !app.applicationMenu) fail()
const menu = app.applicationMenu.getMenuItemById(
'Help.Reset onboarding'
)
if (!menu) fail()
menu.click()
})
const actual = page.getByText(
`This is a hardware design tool that lets you edit visually, with code, or both. It's powered by the KittyCAD Design API, the first API created for anyone to build hardware design tools.`
)
await expect(actual).toBeVisible()
})
})
})
})

View File

@ -26,6 +26,7 @@ import { isArray } from 'lib/utils'
import { reportRejection } from 'lib/trap'
import { DeepPartial } from 'lib/types'
import { Configuration } from 'lang/wasm'
import { ProjectConfiguration } from '@rust/kcl-lib/bindings/ProjectConfiguration'
const toNormalizedCode = (text: string) => {
return text.replace(/\s+/g, '')
@ -761,7 +762,7 @@ export interface Paths {
}
export const doExport = async (
output: Models['OutputFormat_type'],
output: Models['OutputFormat3d_type'],
rootDir: string,
page: Page,
exportFrom: 'dropdown' | 'sidebarButton' | 'commandBar' = 'dropdown'
@ -1125,3 +1126,15 @@ export function settingsToToml(settings: DeepPartial<Configuration>) {
export function tomlToSettings(toml: string): DeepPartial<Configuration> {
return TOML.parse(toml)
}
export function tomlToPerProjectSettings(
toml: string
): DeepPartial<ProjectConfiguration> {
return TOML.parse(toml)
}
export function perProjectsettingsToToml(
settings: DeepPartial<ProjectConfiguration>
) {
return TOML.stringify(settings as any)
}

20
interface.d.ts vendored
View File

@ -3,6 +3,18 @@ import fsSync from 'node:fs'
import path from 'path'
import { dialog, shell } from 'electron'
import { MachinesListing } from 'components/MachineManagerProvider'
import type { Channel } from 'src/menu/channels'
import { Menu, WebContents } from 'electron'
import { ZooLabel, ZooMenuEvents } from 'menu/roles'
import type { MenuActionIPC } from 'menu/rules'
import type { WebContentSendPayload } from 'menu/channels'
// Extend the interface with additional custom properties
declare module 'electron' {
interface Menu {
label?: ZooLabel
}
}
type EnvFn = (value?: string) => string
@ -94,6 +106,14 @@ export interface IElectronAPI {
appCheckForUpdates: () => Promise<unknown>
getArgvParsed: () => any
getAppTestProperty: (propertyName: string) => any
// Helper functions to create application Menus
createHomePageMenu: () => Promise<any>
createModelingPageMenu: () => Promise<any>
createFallbackMenu: () => Promise<any>
enableMenu(menuId: string): Promise<any>
disableMenu(menuId: string): Promise<any>
menuOn: (callback: (payload: WebContentSendPayload) => void) => any
}
declare global {

View File

@ -26,7 +26,7 @@
"@fortawesome/react-fontawesome": "^0.2.0",
"@headlessui/react": "^1.7.19",
"@headlessui/tailwindcss": "^0.2.0",
"@kittycad/lib": "2.0.17",
"@kittycad/lib": "2.0.21",
"@lezer/highlight": "^1.2.1",
"@lezer/lr": "^1.4.1",
"@react-hook/resize-observer": "^2.0.1",

View File

@ -7,7 +7,7 @@
// Define function
fn rail8020(originStart, railHeight, railLength) {
// Sketch side 1 of profile
sketch001 = startSketchOn('-XZ')
sketch001 = startSketchOn(-XZ)
|> startProfileAt([
originStart[0],
0.1 * railHeight + originStart[1]
@ -194,7 +194,7 @@ fn rail8020(originStart, railHeight, railLength) {
.5 * railHeight + originStart[0],
.5 * railHeight + originStart[1]
],
radius = .205 * railHeight / 2
radius = .205 * railHeight / 2,
), %)
|> extrude(length = railLength)
|> fillet(
@ -216,7 +216,7 @@ fn rail8020(originStart, railHeight, railLength) {
getNextAdjacentEdge(edge28),
getNextAdjacentEdge(edge29),
getNextAdjacentEdge(edge30)
]
],
)
|> fillet(
radius = 0.03,
@ -237,7 +237,7 @@ fn rail8020(originStart, railHeight, railLength) {
getNextAdjacentEdge(edge26),
getNextAdjacentEdge(edge31),
getNextAdjacentEdge(edge32)
]
],
)
return sketch001
}

View File

@ -15,57 +15,37 @@ padding = 1.5
bearingDia = 3
// (Needs to be updated). Sketch the block and extrude up to where the counterbore diameter starts.
extrude001 = startSketchOn('XY')
extrude001 = startSketchOn(XY)
|> startProfileAt([-width / 2, -length / 2], %)
|> line(endAbsolute = [width / 2, -length / 2])
|> line(endAbsolute = [width / 2, length / 2])
|> line(endAbsolute = [-width / 2, length / 2])
|> close()
|> extrude(length = height)
extrude002 = startSketchOn(extrude001, 'end')
|> circle(
center = [
center = [
-(width / 2 - (padding / 2)),
-(length / 2 - (padding / 2))
],
radius = cbDia / 2,
],
radius = cbDia / 2,
)
|> patternLinear2d(
instances = 2,
distance = length - padding,
axis = [0, 1],
)
|> patternLinear2d(
instances = 2,
distance = width - padding,
axis = [1, 0],
)
|> patternLinear2d(instances = 2, distance = length - padding, axis = [0, 1])
|> patternLinear2d(instances = 2, distance = width - padding, axis = [1, 0])
|> extrude(%, length = -cbDepth)
extrude003 = startSketchOn(extrude001, 'start')
|> circle(
center = [
-(width / 2 - (padding / 2)),
-(length / 2 - (padding / 2))
],
radius = holeDia / 2,
center = [
-(width / 2 - (padding / 2)),
-(length / 2 - (padding / 2))
],
radius = holeDia / 2,
)
|> patternLinear2d(
instances = 2,
distance = length - padding,
axis = [0, 1],
)
|> patternLinear2d(
instances = 2,
distance = width - padding,
axis = [1, 0],
)
|> patternLinear2d(instances = 2, distance = length - padding, axis = [0, 1])
|> patternLinear2d(instances = 2, distance = width - padding, axis = [1, 0])
|> extrude(length = -height + cbDepth)
extrude004 = startSketchOn(extrude001, 'end')
|> circle(
center = [0, 0],
radius = bearingDia/2,
)
|> extrude(length = -height)
|> circle(center = [0, 0], radius = bearingDia / 2)
|> extrude(length = -height)

View File

@ -17,21 +17,15 @@ chainThickness = sphereDia / 8
linkDiameter = sphereDia / 4
// Sketch the inside bearing piece
insideWallSketch = startSketchOn(offsetPlane("XY", offset = -overallThickness / 2))
|> circle(
center = [0, 0],
radius = shaftDia / 2 + wallThickness
)
|> hole(circle(
center = [0, 0],
radius = shaftDia / 2
), %)
insideWallSketch = startSketchOn(offsetPlane(XY, offset = -overallThickness / 2))
|> circle(center = [0, 0], radius = shaftDia / 2 + wallThickness)
|> hole(circle(center = [0, 0], radius = shaftDia / 2), %)
// Extrude the inside bearing piece
insideWall = extrude(insideWallSketch, length = overallThickness)
// Create the sketch of one of the balls
ballsSketch = startSketchOn("XY")
ballsSketch = startSketchOn(XY)
|> startProfileAt([shaftDia / 2 + wallThickness, 0.001], %)
|> arc({
angleEnd = 0,
@ -47,11 +41,11 @@ balls = revolve(ballsSketch, axis = "X")
axis = [0, 0, 1],
center = [0, 0, 0],
instances = nBalls,
rotateDuplicates = true
rotateDuplicates = true,
)
// Create the sketch for the chain around the balls
chainSketch = startSketchOn("XY")
chainSketch = startSketchOn(XY)
|> startProfileAt([
shaftDia / 2 + wallThickness + sphereDia / 2 - (chainWidth / 2),
0.125 * sin(toRadians(60))
@ -72,17 +66,17 @@ chainHead = revolve(chainSketch, axis = "X")
axis = [0, 0, 1],
center = [0, 0, 0],
instances = nBalls,
rotateDuplicates = true
rotateDuplicates = true,
)
// Create the sketch for the links in between the chains
linkSketch = startSketchOn("XZ")
linkSketch = startSketchOn(XZ)
|> circle(
center = [
shaftDia / 2 + wallThickness + sphereDia / 2,
0
],
radius = linkDiameter / 2
radius = linkDiameter / 2,
)
// Revolve the link sketch
@ -92,19 +86,13 @@ linkRevolve = revolve(linkSketch, axis = 'Y', angle = 360 / nBalls)
axis = [0, 0, 1],
center = [0, 0, 0],
instances = nBalls,
rotateDuplicates = true
rotateDuplicates = true,
)
// Create the sketch for the outside walls
outsideWallSketch = startSketchOn(offsetPlane("XY", offset = -overallThickness / 2))
|> circle(
center = [0, 0],
radius = outsideDiameter / 2
)
|> hole(circle(
center = [0, 0],
radius = shaftDia / 2 + wallThickness + sphereDia
), %)
outsideWallSketch = startSketchOn(offsetPlane(XY, offset = -overallThickness / 2))
|> circle(center = [0, 0], radius = outsideDiameter / 2)
|> hole(circle(center = [0, 0], radius = shaftDia / 2 + wallThickness + sphereDia), %)
outsideWall = extrude(outsideWallSketch, length = overallThickness)

View File

@ -130,7 +130,7 @@ fn armRestProfile(plane, offset) {
export fn armRest(plane, offset) {
path = armRestPath( offsetPlane(plane, offset = offset))
profile = armRestProfile( offsetPlane("-XZ", offset = 20), offset)
profile = armRestProfile( offsetPlane(-XZ, offset = 20), offset)
sweep(profile, path = path)
return 0
}

View File

@ -16,19 +16,19 @@ import backSlats from "bench-parts.kcl"
import armRest from "bench-parts.kcl"
// Create the dividers, these hold the seat and back slats
divider("YZ")
divider(offsetPlane("-YZ", offset = benchLength / 2))
divider(offsetPlane("YZ", offset = benchLength / 2))
divider(YZ)
divider(offsetPlane(-YZ, offset = benchLength / 2))
divider(offsetPlane(YZ, offset = benchLength / 2))
// Create the connectors to join the dividers
connector(offsetPlane("YZ", offset = -benchLength / 2), benchLength)
connector(offsetPlane(YZ, offset = -benchLength / 2), benchLength)
// Create the seat slats
seatSlats(offsetPlane("YZ", offset = -benchLength / 2 - dividerThickness / 2), benchLength + dividerThickness)
seatSlats(offsetPlane(YZ, offset = -benchLength / 2 - (dividerThickness / 2)), benchLength + dividerThickness)
// Create the back slats
backSlats(offsetPlane("YZ", offset = -benchLength / 2 - dividerThickness / 2), benchLength + dividerThickness)
backSlats(offsetPlane(YZ, offset = -benchLength / 2 - (dividerThickness / 2)), benchLength + dividerThickness)
// Create the arm rests
armRest("-YZ", benchLength / 2)
armRest("-YZ", -benchLength / 2)
armRest(-YZ, benchLength / 2)
armRest(-YZ, -benchLength / 2)

View File

@ -1,7 +1,6 @@
// Shelf Bracket
// This is a bracket that holds a shelf. It is made of aluminum and is designed to hold a force of 300 lbs. The bracket is 6 inches wide and the force is applied at the end of the shelf, 12 inches from the wall. The bracket has a factor of safety of 1.2. The legs of the bracket are 5 inches and 2 inches long. The thickness of the bracket is calculated from the constraints provided.
// Define constants
sigmaAllow = 35000 // psi (6061-T6 aluminum)
width = 6 // inch
@ -12,14 +11,16 @@ wallMountL = 2 // inches
shelfDepth = 12 // Shelf is 12 inches in depth from the wall
moment = shelfDepth * p // assume the force is applied at the end of the shelf to be conservative (lb-in)
// Calculate required thickness of bracket
thickness = sqrt(moment * factorOfSafety * 6 / (sigmaAllow * width)) // this is the calculation of two brackets holding up the shelf (inches)
filletRadius = .25
extFilletRadius = filletRadius + thickness
mountingHoleDiameter = 0.5
sketch001 = startSketchOn('XZ')
sketch001 = startSketchOn(XZ)
|> startProfileAt([0, 0], %)
|> xLine(length = shelfMountL - thickness, tag = $seg01)
|> yLine(length = thickness, tag = $seg02)
@ -29,48 +30,18 @@ sketch001 = startSketchOn('XZ')
|> line(endAbsolute = [profileStartX(%), profileStartY(%)], tag = $seg06)
|> close()
|> extrude(%, length = width)
|> fillet(
radius = extFilletRadius,
tags = [getNextAdjacentEdge(seg03)],
)
|> fillet(
radius = filletRadius,
tags = [getNextAdjacentEdge(seg06)],
)
|> fillet(
radius = filletRadius,
tags = [seg02, getOppositeEdge(seg02)],
)
|> fillet(
radius = filletRadius,
tags = [seg05, getOppositeEdge(seg05)],
)
|> fillet(radius = extFilletRadius, tags = [getNextAdjacentEdge(seg03)])
|> fillet(radius = filletRadius, tags = [getNextAdjacentEdge(seg06)])
|> fillet(radius = filletRadius, tags = [seg02, getOppositeEdge(seg02)])
|> fillet(radius = filletRadius, tags = [seg05, getOppositeEdge(seg05)])
sketch002 = startSketchOn(sketch001, seg03)
|> circle(
center = [-1.25, 1],
radius = mountingHoleDiameter / 2,
)
|> patternLinear2d(
instances = 2,
distance = 2.5,
axis = [-1, 0],
)
|> patternLinear2d(
instances = 2,
distance = 4,
axis = [0, 1],
)
|> extrude(%, length = -thickness-.01)
|> circle(center = [-1.25, 1], radius = mountingHoleDiameter / 2)
|> patternLinear2d(instances = 2, distance = 2.5, axis = [-1, 0])
|> patternLinear2d(instances = 2, distance = 4, axis = [0, 1])
|> extrude(%, length = -thickness - .01)
sketch003 = startSketchOn(sketch001, seg04)
|> circle(
center = [1, -1],
radius = mountingHoleDiameter / 2,
)
|> patternLinear2d(
instances = 2,
distance = 4,
axis = [1, 0],
)
|> extrude(%, length = -thickness-0.1)
|> circle(center = [1, -1], radius = mountingHoleDiameter / 2)
|> patternLinear2d(instances = 2, distance = 4, axis = [1, 0])
|> extrude(%, length = -thickness - 0.1)

View File

@ -1,16 +1,14 @@
// Brake Caliper
// Brake calipers are used to squeeze the brake pads against the rotor, causing larger and larger amounts of friction depending on how hard the brakes are pressed.
// Set units
@settings(defaultLengthUnit = in)
// Import Constants
import caliperTolerance, caliperPadLength, caliperThickness, caliperOuterEdgeRadius, caliperInnerEdgeRadius, rotorDiameter, rotorTotalThickness, yAxisOffset from "globals.kcl"
// Sketch the brake caliper profile
brakeCaliperSketch = startSketchOn('XY')
brakeCaliperSketch = startSketchOn(XY)
|> startProfileAt([
rotorDiameter / 2 + caliperTolerance,
0

View File

@ -1,39 +1,28 @@
// Wheel rotor
// A component of a disc brake system. It provides a surface for brake pads to press against, generating the friction needed to slow or stop the vehicle.
// Set units
@settings(defaultLengthUnit = in)
// Import Constants
import rotorDiameter, rotorInnerDiameter, rotorSinglePlateThickness, rotorInnerDiameterThickness, lugHolePatternDia, lugSpacing, rotorTotalThickness, spacerPatternDiameter, spacerDiameter, spacerLength, spacerCount, wheelDiameter, lugCount, yAxisOffset, drillAndSlotCount from "globals.kcl"
rotorSketch = startSketchOn('XZ')
|> circle(
center = [0, 0],
radius = rotorDiameter / 2
)
rotorSketch = startSketchOn(XZ)
|> circle(center = [0, 0], radius = rotorDiameter / 2)
rotor = extrude(rotorSketch, length = rotorSinglePlateThickness)
|> appearance(color = "#dbcd70", roughness = 90, metalness = 90)
rotorBumpSketch = startSketchOn(rotor, 'end')
|> circle(
center = [0, 0],
radius = rotorInnerDiameter / 2
)
|> circle(center = [0, 0], radius = rotorInnerDiameter / 2)
rotorBump = extrude(rotorBumpSketch, length = rotorInnerDiameterThickness)
lugHoles = startSketchOn(rotorBump, 'end')
|> circle(
center = [-lugSpacing / 2, 0],
radius = 0.315
)
|> circle(center = [-lugSpacing / 2, 0], radius = 0.315)
|> patternCircular2d(
arcDegrees = 360,
center = [0, 0],
instances = lugCount,
rotateDuplicates = true
rotateDuplicates = true,
)
|> extrude(%, length = -(rotorInnerDiameterThickness + rotorSinglePlateThickness))
|> appearance(color = "#dbcd70", roughness = 90, metalness = 90)
@ -44,35 +33,26 @@ centerSpacer = startSketchOn(rotor, 'start')
|> extrude(%, length = spacerLength)
secondaryRotorSketch = startSketchOn(centerSpacer, 'end')
|> circle(
center = [0, 0],
radius = rotorDiameter / 2
)
|> circle(center = [0, 0], radius = rotorDiameter / 2)
secondRotor = extrude(secondaryRotorSketch, length = rotorSinglePlateThickness)
lugHoles2 = startSketchOn(secondRotor, 'end')
|> circle(
center = [-lugSpacing / 2, 0],
radius = 0.315
)
|> circle(center = [-lugSpacing / 2, 0], radius = 0.315)
|> patternCircular2d(
arcDegrees = 360,
center = [0, 0],
instances = lugCount,
rotateDuplicates = true
rotateDuplicates = true,
)
|> extrude(length = -rotorSinglePlateThickness)
spacerSketch = startSketchOn(rotor, 'start')
|> circle(
center = [spacerPatternDiameter / 2, 0],
radius = spacerDiameter
)
|> circle(center = [spacerPatternDiameter / 2, 0], radius = spacerDiameter)
|> patternCircular2d(
arcDegrees = 360,
center = [0, 0],
instances = spacerCount,
rotateDuplicates = true
rotateDuplicates = true,
)
spacers = extrude(spacerSketch, length = spacerLength)
@ -87,7 +67,7 @@ rotorSlottedSketch = startSketchOn(rotor, 'START')
center = [0, 0],
instances = drillAndSlotCount,
arcDegrees = 360,
rotateDuplicates = true
rotateDuplicates = true,
)
rotorSlotted = extrude(rotorSlottedSketch, length = -rotorSinglePlateThickness / 2)
@ -102,7 +82,7 @@ secondRotorSlottedSketch = startSketchOn(secondRotor, 'END')
center = [0, 0],
instances = drillAndSlotCount,
arcDegrees = 360,
rotateDuplicates = true
rotateDuplicates = true,
)
extrude(secondRotorSlottedSketch, length = -rotorSinglePlateThickness / 2)

View File

@ -1,21 +1,22 @@
// Tire
// A tire is a critical component of a vehicle that provides the necessary traction and grip between the car and the road. It supports the vehicle's weight and absorbs shocks from road irregularities.
// Set units
@settings(defaultLengthUnit = in)
// Import Constants
import tireInnerDiameter, tireOuterDiameter, tireDepth, bendRadius, tireTreadWidth, tireTreadDepth, tireTreadOffset from "globals.kcl"
// Create the sketch of the tire
tireSketch = startSketchOn("XY")
tireSketch = startSketchOn(XY)
|> startProfileAt([tireInnerDiameter / 2, tireDepth / 2], %)
|> line(endAbsolute = [
tireOuterDiameter / 2 - bendRadius,
tireDepth / 2
], tag = $edge1)
|> line(
endAbsolute = [
tireOuterDiameter / 2 - bendRadius,
tireDepth / 2
],
tag = $edge1,
)
|> tangentialArc({ offset = -90, radius = bendRadius }, %)
|> line(endAbsolute = [
tireOuterDiameter / 2,

View File

@ -1,69 +1,49 @@
// Car Wheel
// A sports car wheel with a circular lug pattern and spokes.
// Set units
@settings(defaultLengthUnit = in)
// Import Constants
import lugCount, lugSpacing, offset, backSpacing, wheelWidth, wheelDiameter, spokeCount, spokeGap, spokeAngle, spokeThickness from "globals.kcl"
// Create the wheel center
lugBase = startSketchOn('XZ')
|> circle(
center = [0, 0],
radius = (lugSpacing + 1.5) / 2
)
|> hole(circle(
center = [0, 0],
radius = (lugSpacing - 1.5) / 2
), %)
lugBase = startSketchOn(XZ)
|> circle(center = [0, 0], radius = (lugSpacing + 1.5) / 2)
|> hole(circle(center = [0, 0], radius = (lugSpacing - 1.5) / 2), %)
|> extrude(length = wheelWidth / 20)
// Extend the wheel center and bore holes to accomidate the lug heads
lugExtrusion = startSketchOn(lugBase, 'END')
|> circle(
center = [0, 0],
radius = (lugSpacing + 1.5) / 2
)
|> hole(circle(
center = [0, 0],
radius = (lugSpacing - 1.5) / 2
), %)
|> circle(center = [0, 0], radius = (lugSpacing + 1.5) / 2)
|> hole(circle(center = [0, 0], radius = (lugSpacing - 1.5) / 2), %)
|> extrude(length = wheelWidth / 10)
// Create the circular pattern for the lugs
lugClearance = startSketchOn(lugExtrusion, 'END')
|> circle(
center = [lugSpacing / 2, 0],
radius = 1.2 / 2
)
|> circle(center = [lugSpacing / 2, 0], radius = 1.2 / 2)
|> patternCircular2d(
arcDegrees = 360,
center = [0, 0],
instances = lugCount,
rotateDuplicates = true
rotateDuplicates = true,
)
|> extrude(length = -wheelWidth / 10)
// Create the circular pattern for the lug holes
lugHoles = startSketchOn(lugBase, 'END')
|> circle(
center = [lugSpacing / 2, 0],
radius = 16 * mm() / 2
)
|> circle(center = [lugSpacing / 2, 0], radius = 16 * mm() / 2)
|> patternCircular2d(
arcDegrees = 360,
center = [0, 0],
instances = lugCount,
rotateDuplicates = true
rotateDuplicates = true,
)
|> extrude(length = -wheelWidth / 20)
|> appearance(color = "#ffffff", metalness = 0, roughness = 0)
// Add detail to the wheel center by revolving curved edge profiles
wheelCenterInner = startSketchOn('XY')
wheelCenterInner = startSketchOn(XY)
|> startProfileAt([(lugSpacing - 1.5) / 2, 0], %)
|> yLine(length = -wheelWidth / 10 - (wheelWidth / 20))
|> bezierCurve({
@ -77,7 +57,7 @@ wheelCenterInner = startSketchOn('XY')
|> revolve(axis = 'y')
|> appearance(color = "#ffffff", metalness = 0, roughness = 0)
wheelCenterOuter = startSketchOn('XY')
wheelCenterOuter = startSketchOn(XY)
|> startProfileAt([(lugSpacing + 1.5) / 2, 0], %)
|> yLine(length = -wheelWidth / 10 - (wheelWidth / 20))
|> bezierCurve({
@ -145,7 +125,7 @@ fn spoke(spokeGap, spokeAngle, spokeThickness) {
center = [0, -2000, 0],
instances = spokeCount,
arcDegrees = 360,
rotateDuplicates = true
rotateDuplicates = true,
)
|> appearance(color = "#ffffff", metalness = 0, roughness = 0)
return spokePattern
@ -155,7 +135,7 @@ spoke(spokeGap, spokeAngle, spokeThickness)
spoke(-spokeGap, -spokeAngle, -spokeThickness)
// Define and revolve wheel exterior
startSketchOn('XY')
startSketchOn(XY)
|> startProfileAt([
wheelDiameter / 2,
-wheelWidth + backSpacing + offset

View File

@ -20,7 +20,7 @@ export lugDiameter = 24 * mm()
export lugHeadLength = lugDiameter * .5
export lugThreadDiameter = lugDiameter / 2 * .85
export lugLength = 30 * mm()
export lugThreadDepth = lugLength - 12.7 * mm()
export lugThreadDepth = lugLength - (12.7 * mm())
// Car Rotor
export rotorDiameter = 12
@ -50,4 +50,4 @@ export caliperTolerance = 0.050
export caliperPadLength = 1.6
export caliperThickness = 0.39
export caliperOuterEdgeRadius = 0.39
export caliperInnerEdgeRadius = 0.12
export caliperInnerEdgeRadius = 0.12

View File

@ -1,11 +1,9 @@
// Lug Nut
// lug Nuts are essential components used to create secure connections, whether for electrical purposes, like terminating wires or grounding, or for mechanical purposes, such as providing mounting points or reinforcing structural joints.
// Set units
@settings(defaultLengthUnit = in)
// Import Constants
import lugDiameter, lugHeadLength, lugThreadDiameter, lugLength, lugThreadDepth, lugSpacing from "globals.kcl"

View File

@ -4,24 +4,24 @@
// Set units
@settings(defaultLengthUnit = in)
import 'car-wheel.kcl' as carWheel
import 'car-rotor.kcl' as carRotor
import "car-wheel.kcl" as carWheel
import "car-rotor.kcl" as carRotor
import "brake-caliper.kcl" as brakeCaliper
import 'lug-nut.kcl' as lugNut
import 'car-tire.kcl' as carTire
import lugCount from 'globals.kcl'
import "lug-nut.kcl" as lugNut
import "car-tire.kcl" as carTire
import lugCount from "globals.kcl"
carRotor
|> translate(translate = [0, 0.5, 0])
carWheel
lugNut
|> patternCircular3d(
arcDegrees = 360,
axis = [0, 1, 0],
center = [0, 0, 0],
instances = lugCount,
rotateDuplicates = false
)
arcDegrees = 360,
axis = [0, 1, 0],
center = [0, 0, 0],
instances = lugCount,
rotateDuplicates = false,
)
brakeCaliper
|> translate(translate = [0, 0.5, 0])
carTire

View File

@ -6,42 +6,42 @@
// Globals referenced in drawRectangle
size = 100
halfSize = size/2
halfSize = size / 2
extrudeLength = 1.0
metalConstant = 50
roughnessConstant = 50
// Create planes for 6 sides of a cube
bluePlane = offsetPlane('XY', offset = halfSize)
yellowPlane = offsetPlane('XY', offset = -halfSize)
greenPlane = offsetPlane('XZ', offset = -halfSize)
purplePlane = offsetPlane('-XZ', offset = -halfSize)
redPlane = offsetPlane('YZ', offset = halfSize - extrudeLength)
tealPlane = offsetPlane('YZ', offset = -halfSize)
bluePlane = offsetPlane(XY, offset = halfSize)
yellowPlane = offsetPlane(XY, offset = -halfSize)
greenPlane = offsetPlane(XZ, offset = -halfSize)
purplePlane = offsetPlane(-XZ, offset = -halfSize)
redPlane = offsetPlane(YZ, offset = halfSize - extrudeLength)
tealPlane = offsetPlane(YZ, offset = -halfSize)
// Sketch a rectangle centered at the origin of the profile
fn sketchRectangle (profile, color) {
fn sketchRectangle(profile, color) {
return profile
|> startProfileAt([-halfSize, halfSize], %)
|> angledLine([0, size], %, $rectangleSegmentA001)
|> angledLine([
segAng(rectangleSegmentA001) - 90,
size
], %, $rectangleSegmentB001)
|> angledLine([
segAng(rectangleSegmentA001),
-segLen(rectangleSegmentA001)
], %, $rectangleSegmentC001)
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
|> extrude(%, length = extrudeLength)
|> appearance(color = color, metalness = metalConstant, roughness = roughnessConstant)
|> startProfileAt([-halfSize, halfSize], %)
|> angledLine([0, size], %, $rectangleSegmentA001)
|> angledLine([
segAng(rectangleSegmentA001) - 90,
size
], %, $rectangleSegmentB001)
|> angledLine([
segAng(rectangleSegmentA001),
-segLen(rectangleSegmentA001)
], %, $rectangleSegmentC001)
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
|> extrude(%, length = extrudeLength)
|> appearance(color = color, metalness = metalConstant, roughness = roughnessConstant)
}
// Sketch each side of the cube
sketchRectangle(bluePlane,'#0000FF')
sketchRectangle(yellowPlane,'#FFFF00')
sketchRectangle(greenPlane,'#00FF00')
sketchRectangle(redPlane,'#FF0000')
sketchRectangle(tealPlane,'#00FFFF')
sketchRectangle(purplePlane,'#FF00FF')
sketchRectangle(bluePlane, '#0000FF')
sketchRectangle(yellowPlane, '#FFFF00')
sketchRectangle(greenPlane, '#00FF00')
sketchRectangle(redPlane, '#FF0000')
sketchRectangle(tealPlane, '#00FFFF')
sketchRectangle(purplePlane, '#FF00FF')

View File

@ -4,12 +4,11 @@
// Set Units
@settings(defaultLengthUnit = in)
fn cycloidalGear(gearPitch, gearHeight, holeDiameter, helixAngle) {
// Create a function to draw the gear profile as a sketch. Rotate each profile about the gear's axis by an helix angle proportional to the total gear height
fn gearSketch(gHeight) {
helixAngleP = helixAngle * gHeight / gearHeight
gearProfile = startSketchOn(offsetPlane("XY", offset = gHeight))
gearProfile = startSketchOn(offsetPlane(XY, offset = gHeight))
|> startProfileAt([
gearPitch * 1.55 * cos(toRadians(helixAngleP)) + gearPitch * sin(toRadians(-helixAngleP)),
gearPitch * 1.55 * sin(toRadians(helixAngleP)) + gearPitch * cos(toRadians(-helixAngleP))
@ -31,10 +30,7 @@ fn cycloidalGear(gearPitch, gearHeight, holeDiameter, helixAngle) {
|> tangentialArc({ radius = gearPitch, offset = -180 }, %)
|> tangentialArcTo([profileStartX(%), profileStartY(%)], %)
|> close(%)
|> hole(circle(
center = [0, 0],
radius = holeDiameter / 2
), %)
|> hole(circle(center = [0, 0], radius = holeDiameter / 2), %)
return gearProfile
}

View File

@ -39,7 +39,7 @@ plane = {
}
// Create a regular pentagon inscribed in a circle of radius pentR
bottomFace = startSketchOn('XY')
bottomFace = startSketchOn(XY)
|> polygon({
radius = pentR,
numSides = 5,
@ -66,7 +66,7 @@ bottomBowl = patternCircular3d(
axis = [0, 0, 1],
center = [0, 0, 0],
arcDegrees = 360,
rotateDuplicates = true
rotateDuplicates = true,
)
// pattern the bottom to create the top face
@ -76,7 +76,7 @@ patternCircular3d(
axis = [0, 1, 0],
center = [0, 0, inscR],
arcDegrees = 360,
rotateDuplicates = true
rotateDuplicates = true,
)
// pattern the bottom angled faces to create the top
@ -86,5 +86,5 @@ patternCircular3d(
axis = [0, 1, 0],
center = [0, 0, inscR],
arcDegrees = 360,
rotateDuplicates = true
rotateDuplicates = true,
)

View File

@ -11,7 +11,7 @@ wallThickness = 3
holeDia = 4
// Model a box with base enclosure dimensions
sketch001 = startSketchOn('XY')
sketch001 = startSketchOn(XY)
|> startProfileAt([0, 0], %)
|> angledLine([0, width], %, $rectangleSegmentA001)
|> angledLine([
@ -32,14 +32,11 @@ extrude001 = extrude(sketch001, length = height)
getNextAdjacentEdge(rectangleSegmentB001),
getNextAdjacentEdge(rectangleSegmentC001),
getNextAdjacentEdge(rectangleSegmentD001)
]
],
)
// Apply a shell to the enclosure base to create the internal storage
|> shell(
faces = ["end"],
thickness = wallThickness
)
|> shell(faces = ["end"], thickness = wallThickness)
// Define a function to create the internal structure to secure a fastener at each corner
fn function001(originStart) {
@ -55,14 +52,8 @@ fn function001(originStart) {
// Create a pillar with a fasterner hole at the center
sketch002 = startSketchOn(plane001)
|> circle(
center = [originStart[0], originStart[1]],
radius = holeDia + wallThickness
)
|> hole(circle(
center = [originStart[0], originStart[1]],
radius = holeDia
), %)
|> circle(center = [originStart[0], originStart[1]], radius = holeDia + wallThickness)
|> hole(circle(center = [originStart[0], originStart[1]], radius = holeDia), %)
extrude002 = extrude(sketch002, length = height - wallThickness)
return extrude002
@ -87,7 +78,7 @@ function001([
])
// Define lid position and outer surface
sketch003 = startSketchOn('XY')
sketch003 = startSketchOn(XY)
|> startProfileAt([width * 1.2, 0], %)
|> angledLine([0, width], %, $rectangleSegmentA002)
|> angledLine([
@ -105,28 +96,28 @@ sketch003 = startSketchOn('XY')
width * 1.2 + wallThickness * 3 + holeDia,
wallThickness * 3 + holeDia
],
radius = holeDia
radius = holeDia,
), %)
|> hole(circle(
center = [
width * 1.2 + wallThickness * 3 + holeDia,
length - (wallThickness * 3 + holeDia)
],
radius = holeDia
radius = holeDia,
), %)
|> hole(circle(
center = [
width * 2.2 - (wallThickness * 3 + holeDia),
wallThickness * 3 + holeDia
],
radius = holeDia
radius = holeDia,
), %)
|> hole(circle(
center = [
width * 2.2 - (wallThickness * 3 + holeDia),
length - (wallThickness * 3 + holeDia)
],
radius = holeDia
radius = holeDia,
), %)
extrude003 = extrude(sketch003, length = wallThickness)
|> fillet(
@ -136,7 +127,7 @@ extrude003 = extrude(sketch003, length = wallThickness)
getNextAdjacentEdge(rectangleSegmentB002),
getNextAdjacentEdge(rectangleSegmentC002),
getNextAdjacentEdge(rectangleSegmentD002)
]
],
)
// Define lid inner and sealing surfaces
@ -161,28 +152,28 @@ sketch004 = startSketchOn(extrude003, 'END')
width * 1.2 + wallThickness * 3 + holeDia,
wallThickness * 3 + holeDia
],
radius = holeDia + wallThickness
radius = holeDia + wallThickness,
), %)
|> hole(circle(
center = [
width * 1.2 + wallThickness * 3 + holeDia,
length - (wallThickness * 3 + holeDia)
],
radius = holeDia + wallThickness
radius = holeDia + wallThickness,
), %)
|> hole(circle(
center = [
width * 2.2 - (wallThickness * 3 + holeDia),
wallThickness * 3 + holeDia
],
radius = holeDia + wallThickness
radius = holeDia + wallThickness,
), %)
|> hole(circle(
center = [
width * 2.2 - (wallThickness * 3 + holeDia),
length - (wallThickness * 3 + holeDia)
],
radius = holeDia + wallThickness
radius = holeDia + wallThickness,
), %)
extrude004 = extrude(sketch004, length = wallThickness)
|> fillet(
@ -192,5 +183,5 @@ extrude004 = extrude(sketch004, length = wallThickness)
getNextAdjacentEdge(rectangleSegmentB003),
getNextAdjacentEdge(rectangleSegmentC003),
getNextAdjacentEdge(rectangleSegmentD003)
]
],
)

View File

@ -45,15 +45,9 @@ fn primaryTube(n, angle001, length001, length002, length003) {
}, %)
// Create the cross section of each tube and sweep them
sweepProfile = startSketchOn('XY')
|> circle(
center = [pos001, 0],
radius = primaryTubeDiameter / 2
)
|> hole(circle(
center = [pos001, 0],
radius = primaryTubeDiameter / 2 - wallThickness
), %)
sweepProfile = startSketchOn(XY)
|> circle(center = [pos001, 0], radius = primaryTubeDiameter / 2)
|> hole(circle(center = [pos001, 0], radius = primaryTubeDiameter / 2 - wallThickness), %)
|> sweep(path = sweepPath)
return { }
@ -66,7 +60,7 @@ primaryTube(2, 24.3, 5, 5, 3)
primaryTube(3, 25.2, 5, 5, 3)
// Create the mounting flange for the header
flangeSketch = startSketchOn('XY')
flangeSketch = startSketchOn(XY)
|> startProfileAt([3 + 1.3, -1.25], %)
|> xLine(length = -2.6, tag = $seg01)
|> tangentialArc({ radius = .3, offset = -40 }, %)
@ -87,22 +81,10 @@ flangeSketch = startSketchOn('XY')
|> close()
// Create openings in the flange to accommodate each tube
|> hole(circle(
center = [0, 0],
radius = primaryTubeDiameter / 2 - wallThickness
), %)
|> hole(circle(
center = [2, 0],
radius = primaryTubeDiameter / 2 - wallThickness
), %)
|> hole(circle(
center = [4, 0],
radius = primaryTubeDiameter / 2 - wallThickness
), %)
|> hole(circle(
center = [6, 0],
radius = primaryTubeDiameter / 2 - wallThickness
), %)
|> hole(circle(center = [0, 0], radius = primaryTubeDiameter / 2 - wallThickness), %)
|> hole(circle(center = [2, 0], radius = primaryTubeDiameter / 2 - wallThickness), %)
|> hole(circle(center = [4, 0], radius = primaryTubeDiameter / 2 - wallThickness), %)
|> hole(circle(center = [6, 0], radius = primaryTubeDiameter / 2 - wallThickness), %)
// Add mounting holes to the flange
|> hole(circle(
@ -110,28 +92,28 @@ flangeSketch = startSketchOn('XY')
-primaryTubeDiameter * .6,
-primaryTubeDiameter * .6
],
radius = 0.25 / 2
radius = 0.25 / 2,
), %)
|> hole(circle(
center = [
primaryTubeDiameter * .6,
primaryTubeDiameter * .6
],
radius = 0.25 / 2
radius = 0.25 / 2,
), %)
|> hole(circle(
center = [
3 * 2 - (primaryTubeDiameter * .6),
primaryTubeDiameter * .6
],
radius = 0.25 / 2
radius = 0.25 / 2,
), %)
|> hole(circle(
center = [
3 * 2 + primaryTubeDiameter * .6,
-primaryTubeDiameter * .6
],
radius = 0.25 / 2
radius = 0.25 / 2,
), %)
// Extrude the flange and fillet the edges
@ -141,12 +123,12 @@ flangeSketch = startSketchOn('XY')
tags = [
getNextAdjacentEdge(seg04),
getNextAdjacentEdge(seg07)
]
],
)
|> fillet(
radius = .25,
tags = [
getNextAdjacentEdge(seg03),
getNextAdjacentEdge(seg08)
]
],
)

View File

@ -21,44 +21,32 @@ nHoles = 4
assertGreaterThan(nHoles, 1, "nHoles must be greater than 1")
// Create the circular pattern for the mounting holes
circles = startSketchOn('XY')
|> circle(
center = [mountingHolePlacementDiameter / 2, 0],
radius = mountingHoleDia / 2
)
circles = startSketchOn(XY)
|> circle(center = [mountingHolePlacementDiameter / 2, 0], radius = mountingHoleDia / 2)
|> patternCircular2d(
arcDegrees = 360,
center = [0, 0],
instances = nHoles,
rotateDuplicates = true
rotateDuplicates = true,
)
// Create the base of the flange and add the mounting holes
flangeBase = startSketchOn('XY')
|> circle(
center = [0, 0],
radius = baseDia / 2
)
flangeBase = startSketchOn(XY)
|> circle(center = [0, 0], radius = baseDia / 2)
|> hole(circles, %)
|> extrude(length = baseThickness)
// Create the extrusion on the top of the flange base
topExtrusion = startSketchOn(flangeBase, 'end')
|> circle(
center = [0, 0],
radius = topTotalDiameter / 2
)
|> circle(center = [0, 0], radius = topTotalDiameter / 2)
|> extrude(length = topTotalThickness)
// Create the extrusion on the bottom of the flange base
bottomExtrusion = startSketchOn(flangeBase, 'start')
|> circle(
center = [0, 0],
radius = bottomTotalDiameter / 2
)
|> circle(center = [0, 0], radius = bottomTotalDiameter / 2)
|> extrude(length = bottomThickness)
// Cut a hole through the entire body
pipeHole = startSketchOn(topExtrusion, 'end')
|> circle(center = [0, 0], radius = pipeDia/2)
|> circle(center = [0, 0], radius = pipeDia / 2)
|> extrude(%, length = -(topTotalThickness + baseThickness + bottomThickness))

View File

@ -62,7 +62,7 @@ bracketBody = bs
getPreviousAdjacentEdge(bs.tags.edge2),
getPreviousAdjacentEdge(bs.tags.edge3),
getPreviousAdjacentEdge(bs.tags.edge6)
]
],
)
// define the tab plane
@ -87,7 +87,7 @@ tabsR = startSketchOn(tabPlane)
width / 2 + thk + tabWidth / 2,
length / 2 + thk - (tabLength / (3 / 2))
],
radius = holeDiam / 2
radius = holeDiam / 2,
), %)
|> extrude(length = -tabThk)
|> fillet(
@ -95,13 +95,9 @@ tabsR = startSketchOn(tabPlane)
tags = [
getNextAdjacentEdge(edge11),
getNextAdjacentEdge(edge12)
]
)
|> patternLinear3d(
axis = [0, -1, 0],
instances = 2,
distance = length + 2 * thk - (tabLength * 4 / 3)
],
)
|> patternLinear3d(axis = [0, -1, 0], instances = 2, distance = length + 2 * thk - (tabLength * 4 / 3))
// build the tabs of the mounting bracket (left side)
tabsL = startSketchOn(tabPlane)
@ -115,7 +111,7 @@ tabsL = startSketchOn(tabPlane)
-width / 2 - thk - (tabWidth / 2),
length / 2 + thk - (tabLength / (3 / 2))
],
radius = holeDiam / 2
radius = holeDiam / 2,
), %)
|> extrude(length = -tabThk)
|> fillet(
@ -123,13 +119,9 @@ tabsL = startSketchOn(tabPlane)
tags = [
getNextAdjacentEdge(edge21),
getNextAdjacentEdge(edge22)
]
)
|> patternLinear3d(
axis = [0, -1, 0],
instances = 2,
distance = length + 2 * thk - (tabLength * 4 / 3)
],
)
|> patternLinear3d(axis = [0, -1, 0], instances = 2, distance = length + 2 * thk - (tabLength * 4 / 3))
// define a plane for retention bumps
retPlane = {

View File

@ -44,7 +44,7 @@ fn slot(sketch1, start, end, width) {
}
// create a sketch on the "XY" plane
sketch000 = startSketchOn('XY')
sketch000 = startSketchOn(XY)
// create a profile of the flipper
flipperProfile = startProfileAt([-flipperLength, -32.0], sketch000)
@ -83,11 +83,11 @@ fillet(
tags = [
getNextAdjacentEdge(backEdge),
getPreviousAdjacentEdge(backEdge)
]
],
)
// create a sketch on the "XZ" plane offset by half the thickness
sketch001 = startSketchOn(offsetPlane("XZ", offset = -handleWidth / 2))
sketch001 = startSketchOn(offsetPlane(XZ, offset = -handleWidth / 2))
// create a profile of the spatula handle
handleProfile = startProfileAt([0.0, flipperThickness], sketch001)
@ -109,7 +109,7 @@ fillet(
tags = [
getNextAdjacentEdge(handleBottomEdge),
getNextAdjacentEdge(handleTopEdge)
]
],
)
// define a plane which is at the end of the handle
@ -163,4 +163,4 @@ sketch003 = startSketchOn(grip, gripEdgeTop)
gripHoleProfile = slot(sketch003, [0, 200], [0, 210], gripSlotWidth)
// cut a hole in the grip
extrude(gripHoleProfile, length = -gripWidth-20)
extrude(gripHoleProfile, length = -gripWidth - 20)

View File

@ -10,7 +10,7 @@ carafeHeight = 7.32
handleThickness = 0.65
// Upper ring of the metal structure
sketch001 = startSketchOn('XZ')
sketch001 = startSketchOn(XZ)
|> startProfileAt([carafeDiameter / 2, 5.7], %)
|> angledLine([0, 0.1], %, $rectangleSegmentA001)
|> angledLine([
@ -91,15 +91,12 @@ sketch002 = startSketchOn(plane001)
center = [0, 0, 0],
instances = 4,
arcDegrees = 360,
rotateDuplicates = true
rotateDuplicates = true,
)
// Cross plate
sketch003 = startSketchOn(offsetPlane('XY', offset = 1))
|> circle(
center = [0, 0],
radius = carafeDiameter / 2 - 0.15
)
sketch003 = startSketchOn(offsetPlane(XY, offset = 1))
|> circle(center = [0, 0], radius = carafeDiameter / 2 - 0.15)
extrude001 = extrude(sketch003, length = 0.050)
@ -117,13 +114,13 @@ sketch004 = startSketchOn(extrude001, 'END')
center = [0, 0],
instances = 3,
arcDegrees = 360,
rotateDuplicates = true
rotateDuplicates = true,
)
extrude002 = extrude(sketch004, length = -0.050)
// Filter screen
sketch005 = startSketchOn('XZ')
sketch005 = startSketchOn(XZ)
|> startProfileAt([0.15, 1.11], %)
|> xLine(endAbsolute = carafeDiameter / 2 - 0.2)
|> angledLineToX({
@ -138,7 +135,7 @@ sketch005 = startSketchOn('XZ')
|> revolve(axis = 'y')
// Plunger and stem
sketch006 = startSketchOn('XZ')
sketch006 = startSketchOn(XZ)
|> startProfileAt([0.1, 1], %)
|> line(end = [0.1, 0])
|> angledLineToX({ angle = 10, to = 0.05 }, %)
@ -151,11 +148,8 @@ sketch006 = startSketchOn('XZ')
|> revolve(axis = 'y')
// Spiral plate
sketch007 = startSketchOn(offsetPlane('XY', offset = 1.12))
|> circle(
center = [0, 0],
radius = carafeDiameter / 2 - 0.24
)
sketch007 = startSketchOn(offsetPlane(XY, offset = 1.12))
|> circle(center = [0, 0], radius = carafeDiameter / 2 - 0.24)
|> hole(circle(center = [0, 0], radius = .15), %)
extrude003 = extrude(sketch007, length = 0.050)
@ -167,7 +161,7 @@ sketch008 = startSketchOn(extrude003, 'END')
center = [0, 0],
instances = 8,
arcDegrees = 360,
rotateDuplicates = true
rotateDuplicates = true,
)
extrude004 = extrude(sketch008, length = -0.050)
@ -179,24 +173,21 @@ sketch009 = startSketchOn(extrude003, 'END')
center = [0, 0],
instances = 4,
arcDegrees = 360,
rotateDuplicates = true
rotateDuplicates = true,
)
extrude005 = extrude(sketch009, length = -0.050)
// Extrude a glass carafe body
sketch010 = startSketchOn("XY")
|> circle(
center = [0, 0],
radius = carafeDiameter / 2
)
sketch010 = startSketchOn(XY)
|> circle(center = [0, 0], radius = carafeDiameter / 2)
// Perform a shell operation to hollow the carafe body with the top face removed
extrude006 = extrude(sketch010, length = carafeHeight)
|> shell(faces = ["end"], thickness = .07)
// Draw and revolve the lid
sketch011 = startSketchOn('XZ')
sketch011 = startSketchOn(XZ)
|> startProfileAt([0.2, carafeHeight - 0.7], %)
|> xLine(length = carafeDiameter / 2 - 0.3)
|> yLine(length = 0.7)
@ -213,7 +204,7 @@ sketch011 = startSketchOn('XZ')
|> revolve(axis = 'y')
// Draw and extrude handle
sketch012 = startSketchOn(offsetPlane('XZ', offset = handleThickness / 2))
sketch012 = startSketchOn(offsetPlane(XZ, offset = handleThickness / 2))
|> startProfileAt([2.3, 6.4], %)
|> line(end = [0.56, 0])
|> tangentialArcTo([4.1, 5.26], %)

View File

@ -12,7 +12,7 @@ height = 12
minHeight = 10.875
// Create the body of the rack
rackBody = startSketchOn('XY')
rackBody = startSketchOn(XY)
|> startProfileAt([-length / 2, 0], %)
|> line(end = [length, 0])
|> line(end = [0, minHeight])
@ -22,7 +22,7 @@ rackBody = startSketchOn('XY')
// Create a function for sketch of a single tooth
fn tooth() {
toothSketch = startSketchOn('XY')
toothSketch = startSketchOn(XY)
|> startProfileAt([-length / 2 + 0.567672, minHeight], %)
|> tangentialArcToRelative([0.157636, 0.110378], %)
|> line(end = [0.329118, 0.904244])
@ -38,14 +38,10 @@ fn tooth() {
// Pattern the single tooth over the length of the rack body
teeth = tooth()
|> patternLinear3d(
axis = [10, 0, 0],
distance = 1.570796,
instances = 63
)
|> patternLinear3d(axis = [10, 0, 0], distance = 1.570796, instances = 63)
// Sketch and extrude the first end cap. This is a partial tooth
endCapTooth = startSketchOn('XY')
endCapTooth = startSketchOn(XY)
|> startProfileAt([-length / 2, 11.849525], %)
|> line(end = [0.314524, -0.864147])
|> tangentialArcToRelative([0.157636, -0.110378], %)
@ -54,7 +50,7 @@ endCapTooth = startSketchOn('XY')
|> extrude(length = width)
// Sketch and extrude the second end cap. This is a partial tooth
endCapTooth2 = startSketchOn('XY')
endCapTooth2 = startSketchOn(XY)
|> startProfileAt([length / 2, 11.849525], %)
|> line(end = [-0.314524, -0.864147])
|> tangentialArcToRelative([-0.157636, -0.110378], %)

View File

@ -17,35 +17,32 @@ gearHeight = 3
// Interpolate points along the involute curve
cmo = 101
rs = map([0..cmo], fn (i) {
rs = map([0..cmo], fn(i) {
return baseDiameter / 2 + i / cmo * (tipDiameter - baseDiameter) / 2
})
// Calculate operating pressure angle
angles = map(rs, fn (r) {
angles = map(rs, fn(r) {
return toDegrees( acos(baseDiameter / 2 / r))
})
// Calculate the involute function
invas = map(angles, fn (a) {
invas = map(angles, fn(a) {
return tan(toRadians(a)) - toRadians(a)
})
// Map the involute curve
xs = map([0..cmo], fn (i) {
xs = map([0..cmo], fn(i) {
return rs[i] * cos(invas[i])
})
ys = map([0..cmo], fn (i) {
ys = map([0..cmo], fn(i) {
return rs[i] * sin(invas[i])
})
// Extrude the gear body
body = startSketchOn('XY')
|> circle(
center = [0, 0],
radius = baseDiameter / 2
)
body = startSketchOn(XY)
|> circle(center = [0, 0], radius = baseDiameter / 2)
|> extrude(length = gearHeight)
toothAngle = 360 / nTeeth / 1.5
@ -63,7 +60,7 @@ fn rightInvolute(i, sg) {
}
// Draw gear teeth
start = startSketchOn('XY')
start = startSketchOn(XY)
|> startProfileAt([xs[101], ys[101]], %)
teeth = reduce([0..100], start, leftInvolute)
|> arc({
@ -79,7 +76,7 @@ teeth = reduce([0..100], start, leftInvolute)
center = [0, 0, 0],
instances = nTeeth,
arcDegrees = 360,
rotateDuplicates = true
rotateDuplicates = true,
)
// Define the constants of the keyway and the bore hole

View File

@ -34,7 +34,7 @@ fn face(plane) {
}
// extrude a single side of the bin
singleSide = extrude(face(offsetPlane("YZ", offset = cornerRadius)), length = binLength - (cornerRadius * 2), )
singleSide = extrude(face(offsetPlane(YZ, offset = cornerRadius)), length = binLength - (cornerRadius * 2))
// create the other sides of the bin by using a circular pattern
sides = patternCircular3d(
@ -43,7 +43,7 @@ sides = patternCircular3d(
axis = [0, 0, 1],
center = [binLength / 2, binLength / 2, 0],
instances = 4,
rotateDuplicates = true
rotateDuplicates = true,
)
// define an axis axis000
@ -55,7 +55,7 @@ axis000 = {
}
// create a single corner of the bin
singleCorner = revolve(face(offsetPlane("YZ", offset = cornerRadius)), angle = -90, axis = axis000)
singleCorner = revolve(face(offsetPlane(YZ, offset = cornerRadius)), angle = -90, axis = axis000)
// create the corners of the bin
corners = patternCircular3d(
@ -64,7 +64,7 @@ corners = patternCircular3d(
axis = [0, 0, 1],
center = [binLength / 2, binLength / 2, 0],
instances = 4,
rotateDuplicates = true
rotateDuplicates = true,
)
// create the baseplate by patterning sides
@ -72,26 +72,18 @@ basePlateSides = patternLinear3d(
sides,
axis = [1.0, 0.0, 0.0],
instances = countBinWidth,
distance = binLength
)
|> patternLinear3d(
axis = [0.0, 1.0, 0.0],
instances = countBinLength,
distance = binLength
distance = binLength,
)
|> patternLinear3d(axis = [0.0, 1.0, 0.0], instances = countBinLength, distance = binLength)
// create the corners of the baseplate by patterning the corners
basePlateCorners = patternLinear3d(
corners,
axis = [1.0, 0.0, 0.0],
instances = countBinWidth,
distance = binLength
)
|> patternLinear3d(
axis = [0.0, 1.0, 0.0],
instances = countBinLength,
distance = binLength
distance = binLength,
)
|> patternLinear3d(axis = [0.0, 1.0, 0.0], instances = countBinLength, distance = binLength)
// create the center cutout for the magnet profile
fn magnetCenterCutout(plane) {
@ -149,20 +141,17 @@ fn magnetBase(plane) {
}
// create sketch profile sketch000Profile002
magnetsSketch = startSketchOn('XY')
|> circle(
center = [cornerRadius * 2, cornerRadius * 2],
radius = magOuterDiam / 2
)
magnetsSketch = startSketchOn(XY)
|> circle(center = [cornerRadius * 2, cornerRadius * 2], radius = magOuterDiam / 2)
|> patternCircular2d(
center = [binLength / 2, binLength / 2],
instances = 4,
arcDegrees = 360,
rotateDuplicates = true
rotateDuplicates = true,
)
// create a profile with holes for the magnets
magnetProfile = magnetBase("XY")
magnetProfile = magnetBase(XY)
|> hole(magnetsSketch, %)
// create an extrusion of the magnet cutout with holes
@ -177,11 +166,11 @@ magnetHolesExtrudeFillets = fillet(
getPreviousAdjacentEdge(magnetHolesExtrude.sketch.tags.line001),
getNextAdjacentEdge(magnetHolesExtrude.sketch.tags.line003),
getPreviousAdjacentEdge(magnetHolesExtrude.sketch.tags.line003)
]
],
)
// create a profile without the holes for the magnets
magnetProfileNoMagnets = magnetBase(offsetPlane("XY", offset = -magDepth))
magnetProfileNoMagnets = magnetBase(offsetPlane(XY, offset = -magDepth))
// create an extrusion of the magnet cutout without holes
magnetCutoutExtrude = extrude(magnetProfileNoMagnets, length = -magDepth)
@ -195,7 +184,7 @@ magnetCutoutExtrudeFillets = fillet(
getPreviousAdjacentEdge(magnetCutoutExtrude.sketch.tags.line001),
getNextAdjacentEdge(magnetCutoutExtrude.sketch.tags.line003),
getPreviousAdjacentEdge(magnetCutoutExtrude.sketch.tags.line003)
]
],
)
// pattern the magnet cutouts with holes
@ -203,23 +192,15 @@ patternLinear3d(
magnetHolesExtrudeFillets,
axis = [1.0, 0.0, 0.0],
instances = countBinWidth,
distance = binLength
)
|> patternLinear3d(
axis = [0.0, 1.0, 0.0],
instances = countBinLength,
distance = binLength
distance = binLength,
)
|> patternLinear3d(axis = [0.0, 1.0, 0.0], instances = countBinLength, distance = binLength)
// pattern the magnet cutouts without holes
patternLinear3d(
magnetCutoutExtrudeFillets,
axis = [1.0, 0.0, 0.0],
instances = countBinWidth,
distance = binLength
)
|> patternLinear3d(
axis = [0.0, 1.0, 0.0],
instances = countBinLength,
distance = binLength
distance = binLength,
)
|> patternLinear3d(axis = [0.0, 1.0, 0.0], instances = countBinLength, distance = binLength)

View File

@ -31,7 +31,7 @@ fn face(plane) {
}
// extrude a single side of the bin
singleSide = extrude(face(offsetPlane("YZ", offset = cornerRadius)), length = binLength - (cornerRadius * 2))
singleSide = extrude(face(offsetPlane(YZ, offset = cornerRadius)), length = binLength - (cornerRadius * 2))
// create the other sides of the bin by using a circular pattern
sides = patternCircular3d(
@ -40,7 +40,7 @@ sides = patternCircular3d(
axis = [0, 0, 1],
center = [binLength / 2, binLength / 2, 0],
instances = 4,
rotateDuplicates = true
rotateDuplicates = true,
)
// define an axis axis000
@ -52,7 +52,7 @@ axis000 = {
}
// create a single corner of the bin
singleCorner = revolve(face(offsetPlane("YZ", offset = cornerRadius)), angle = -90, axis = axis000)
singleCorner = revolve(face(offsetPlane(YZ, offset = cornerRadius)), angle = -90, axis = axis000)
// create the corners of the bin
corners = patternCircular3d(
@ -61,7 +61,7 @@ corners = patternCircular3d(
axis = [0, 0, 1],
center = [binLength / 2, binLength / 2, 0],
instances = 4,
rotateDuplicates = true
rotateDuplicates = true,
)
// create the baseplate by patterning sides
@ -69,23 +69,15 @@ basePlateSides = patternLinear3d(
sides,
axis = [1.0, 0.0, 0.0],
instances = countBinWidth,
distance = binLength
)
|> patternLinear3d(
axis = [0.0, 1.0, 0.0],
instances = countBinLength,
distance = binLength
distance = binLength,
)
|> patternLinear3d(axis = [0.0, 1.0, 0.0], instances = countBinLength, distance = binLength)
// create the corners of the baseplate by patterning the corners
basePlateCorners = patternLinear3d(
corners,
axis = [1.0, 0.0, 0.0],
instances = countBinWidth,
distance = binLength
)
|> patternLinear3d(
axis = [0.0, 1.0, 0.0],
instances = countBinLength,
distance = binLength
distance = binLength,
)
|> patternLinear3d(axis = [0.0, 1.0, 0.0], instances = countBinLength, distance = binLength)

View File

@ -47,7 +47,7 @@ fn face(plane) {
}
// extrude a single side of the bin
singleSide = extrude(face(offsetPlane("YZ", offset = cornerRadius + binTol)), length = binLength - (cornerRadius * 2))
singleSide = extrude(face(offsetPlane(YZ, offset = cornerRadius + binTol)), length = binLength - (cornerRadius * 2))
// create the other sides of the bin by using a circular pattern
sides = patternCircular3d(
@ -60,7 +60,7 @@ sides = patternCircular3d(
0
],
instances = 4,
rotateDuplicates = true
rotateDuplicates = true,
)
// define an axis axis000
@ -75,7 +75,7 @@ axis000 = {
}
// create a single corner of the bin
singleCorner = revolve(face(offsetPlane("YZ", offset = cornerRadius + binTol)), angle = -90, axis = axis000)
singleCorner = revolve(face(offsetPlane(YZ, offset = cornerRadius + binTol)), angle = -90, axis = axis000)
// create the corners of the bin
corners = patternCircular3d(
@ -88,10 +88,10 @@ corners = patternCircular3d(
0
],
instances = 4,
rotateDuplicates = true
rotateDuplicates = true,
)
singleBinFill = startSketchOn("XY")
singleBinFill = startSketchOn(XY)
|> startProfileAt([
binBaseLength + binTol,
binBaseLength + binTol
@ -108,7 +108,7 @@ singleBinFill = startSketchOn("XY")
getPreviousAdjacentEdge(line000),
getNextAdjacentEdge(line002),
getPreviousAdjacentEdge(line002)
]
],
)
magCutout000 = startSketchOn(singleBinFill, "start")
@ -117,7 +117,7 @@ magCutout000 = startSketchOn(singleBinFill, "start")
-magOffset - binBaseLength - binTol,
magOffset + binBaseLength + binTol
],
radius = magOuterDiam / 2
radius = magOuterDiam / 2,
)
|> patternCircular2d(
arcDegrees = 360,
@ -126,7 +126,7 @@ magCutout000 = startSketchOn(singleBinFill, "start")
(binLength + 2 * binTol) / 2
],
instances = 4,
rotateDuplicates = true
rotateDuplicates = true,
)
|> extrude(length = -magDepth)
@ -135,42 +135,30 @@ binSides = patternLinear3d(
sides,
axis = [1.0, 0.0, 0.0],
instances = countBinWidth,
distance = binLength + binTol * 2
)
|> patternLinear3d(
axis = [0.0, 1.0, 0.0],
instances = countBinLength,
distance = binLength + binTol * 2
distance = binLength + binTol * 2,
)
|> patternLinear3d(axis = [0.0, 1.0, 0.0], instances = countBinLength, distance = binLength + binTol * 2)
// create the corners of the baseplate by patterning the corners
binCorners = patternLinear3d(
corners,
axis = [1.0, 0.0, 0.0],
instances = countBinWidth,
distance = binLength + binTol * 2
)
|> patternLinear3d(
axis = [0.0, 1.0, 0.0],
instances = countBinLength,
distance = binLength + binTol * 2
distance = binLength + binTol * 2,
)
|> patternLinear3d(axis = [0.0, 1.0, 0.0], instances = countBinLength, distance = binLength + binTol * 2)
// create the fill of the bin by patterning the corners
binFill = patternLinear3d(
singleBinFill,
axis = [1.0, 0.0, 0.0],
instances = countBinWidth,
distance = binLength + binTol * 2
)
|> patternLinear3d(
axis = [0.0, 1.0, 0.0],
instances = countBinLength,
distance = binLength + binTol * 2
distance = binLength + binTol * 2,
)
|> patternLinear3d(axis = [0.0, 1.0, 0.0], instances = countBinLength, distance = binLength + binTol * 2)
//
binTop = startSketchOn(offsetPlane("XY", offset = height))
binTop = startSketchOn(offsetPlane(XY, offset = height))
|> startProfileAt([0, 0], %)
|> xLine(length = (binLength + 2 * binTol) * countBinWidth, tag = $line010)
|> yLine(length = (binLength + 2 * binTol) * countBinLength, tag = $line011)
@ -184,7 +172,7 @@ binTop = startSketchOn(offsetPlane("XY", offset = height))
getPreviousAdjacentEdge(line010),
getNextAdjacentEdge(line012),
getPreviousAdjacentEdge(line012)
]
],
)
|> shell(faces = ["end"], thickness = binThk)
@ -265,7 +253,7 @@ lipLengths = patternCircular3d(
0
],
instances = 2,
rotateDuplicates = true
rotateDuplicates = true,
)
// create the other sides of the lips by using a circular pattern
@ -279,7 +267,7 @@ lipWidths = patternCircular3d(
0
],
instances = 2,
rotateDuplicates = true
rotateDuplicates = true,
)
// define an axis axis000
@ -307,7 +295,7 @@ lipCorners000 = patternCircular3d(
0
],
instances = 2,
rotateDuplicates = true
rotateDuplicates = true,
)
// create the corners of the bin
@ -321,5 +309,5 @@ lipCorners001 = patternCircular3d(
0
],
instances = 2,
rotateDuplicates = true
rotateDuplicates = true,
)

View File

@ -40,7 +40,7 @@ fn face(plane) {
}
// extrude a single side of the bin
singleSide = extrude(face(offsetPlane("YZ", offset = cornerRadius + binTol)), length = binLength - (cornerRadius * 2), )
singleSide = extrude(face(offsetPlane(YZ, offset = cornerRadius + binTol)), length = binLength - (cornerRadius * 2))
// create the other sides of the bin by using a circular pattern
sides = patternCircular3d(
@ -53,7 +53,7 @@ sides = patternCircular3d(
0
],
instances = 4,
rotateDuplicates = true
rotateDuplicates = true,
)
// define an axis axis000
@ -68,7 +68,7 @@ axis000 = {
}
// create a single corner of the bin
singleCorner = revolve(face(offsetPlane("YZ", offset = cornerRadius + binTol)), angle = -90, axis = axis000)
singleCorner = revolve(face(offsetPlane(YZ, offset = cornerRadius + binTol)), angle = -90, axis = axis000)
// create the corners of the bin
corners = patternCircular3d(
@ -81,10 +81,10 @@ corners = patternCircular3d(
0
],
instances = 4,
rotateDuplicates = true
rotateDuplicates = true,
)
singleBinFill = startSketchOn("XY")
singleBinFill = startSketchOn(XY)
|> startProfileAt([
binBaseLength + binTol,
binBaseLength + binTol
@ -101,7 +101,7 @@ singleBinFill = startSketchOn("XY")
getPreviousAdjacentEdge(line000),
getNextAdjacentEdge(line002),
getPreviousAdjacentEdge(line002)
]
],
)
magCutout000 = startSketchOn(singleBinFill, "start")
@ -110,7 +110,7 @@ magCutout000 = startSketchOn(singleBinFill, "start")
-magOffset - binBaseLength - binTol,
magOffset + binBaseLength + binTol
],
radius = magOuterDiam / 2
radius = magOuterDiam / 2,
)
|> patternCircular2d(
arcDegrees = 360,
@ -119,7 +119,7 @@ magCutout000 = startSketchOn(singleBinFill, "start")
(binLength + 2 * binTol) / 2
],
instances = 4,
rotateDuplicates = true
rotateDuplicates = true,
)
|> extrude(length = -magDepth)
@ -128,42 +128,30 @@ binSides = patternLinear3d(
sides,
axis = [1.0, 0.0, 0.0],
instances = countBinWidth,
distance = binLength + binTol * 2
)
|> patternLinear3d(
axis = [0.0, 1.0, 0.0],
instances = countBinLength,
distance = binLength + binTol * 2
distance = binLength + binTol * 2,
)
|> patternLinear3d(axis = [0.0, 1.0, 0.0], instances = countBinLength, distance = binLength + binTol * 2)
// create the corners of the baseplate by patterning the corners
binCorners = patternLinear3d(
corners,
axis = [1.0, 0.0, 0.0],
instances = countBinWidth,
distance = binLength + binTol * 2
)
|> patternLinear3d(
axis = [0.0, 1.0, 0.0],
instances = countBinLength,
distance = binLength + binTol * 2
distance = binLength + binTol * 2,
)
|> patternLinear3d(axis = [0.0, 1.0, 0.0], instances = countBinLength, distance = binLength + binTol * 2)
// create the fill of the bin by patterning the corners
binFill = patternLinear3d(
singleBinFill,
axis = [1.0, 0.0, 0.0],
instances = countBinWidth,
distance = binLength + binTol * 2
)
|> patternLinear3d(
axis = [0.0, 1.0, 0.0],
instances = countBinLength,
distance = binLength + binTol * 2
distance = binLength + binTol * 2,
)
|> patternLinear3d(axis = [0.0, 1.0, 0.0], instances = countBinLength, distance = binLength + binTol * 2)
// create the top of the bin
binTop = startSketchOn(offsetPlane("XY", offset = height))
binTop = startSketchOn(offsetPlane(XY, offset = height))
|> startProfileAt([0, 0], %)
|> xLine(length = (binLength + 2 * binTol) * countBinWidth, tag = $line010)
|> yLine(length = (binLength + 2 * binTol) * countBinLength, tag = $line011)
@ -177,6 +165,6 @@ binTop = startSketchOn(offsetPlane("XY", offset = height))
getPreviousAdjacentEdge(line010),
getNextAdjacentEdge(line012),
getPreviousAdjacentEdge(line012)
]
],
)
|> shell(faces = ["end"], thickness = binThk)

View File

@ -11,7 +11,7 @@ diameter = 0.3125
// Define a function for the hex nut
fn hexNut(start, thk, innerDia) {
hexNutSketch = startSketchOn('-XZ')
hexNutSketch = startSketchOn(-XZ)
|> startProfileAt([start[0] + innerDia, start[1]], %)
|> angledLine({ angle = 240, length = innerDia }, %)
|> angledLine({ angle = 180, length = innerDia }, %)
@ -19,10 +19,7 @@ fn hexNut(start, thk, innerDia) {
|> angledLine({ angle = 60, length = innerDia }, %)
|> angledLine({ angle = 0, length = innerDia * .90 }, %)
|> close()
|> hole(circle(
center = [start[0], start[1]],
radius = innerDia / 2
), %)
|> hole(circle(center = [start[0], start[1]], radius = innerDia / 2), %)
|> extrude(length = thk)
return hexNutSketch
}

View File

@ -19,7 +19,7 @@ row5 = row4 + keyHeight + spacing
row6 = row5 + keyHeight + spacing
// Sketch the side profile of the keyboard base and extrude to total width
sketch001 = startSketchOn('YZ')
sketch001 = startSketchOn(YZ)
|> startProfileAt([0, 0], %)
|> line(end = [-0.14, 0.68], tag = $seg01)
|> angledLine([7, row6 + 3 * spacing + keyHeight], %, $seg02)
@ -89,7 +89,7 @@ fn keyFn(originStart, keyWidth, keyHeight, repeats, color) {
|> close()
|> extrude(length = keyDepth)
|> appearance(color = color)
// Repeat key when desired. This will default to zero
// Repeat key when desired. This will default to zero
|> patternLinear3d(
%,
instances = repeats + 1,

View File

@ -20,7 +20,7 @@ kitBodyWidth = 26
kitBodyHeight = 25
kitBodyDepth = 18
kitBody = startSketchOn('XZ')
kitBody = startSketchOn(XZ)
|> startProfileAt([-kitBodyWidth / 2, kitBodyElevation], %)
|> line(end = [0, kitBodyHeight])
|> line(end = [kitBodyWidth, 0], tag = $seg01)
@ -159,7 +159,7 @@ kitShoeHeight = 3
fn kitLeg(offsetFront, offsetSide) {
kitShoeOffsetFront = kitShoeLength / 2 - (kitBodyDepth / 2) - offsetFront
kitFootPrint = startSketchOn('XY')
kitFootPrint = startSketchOn(XY)
|> startProfileAt([offsetSide, kitShoeOffsetFront], %)
|> line(end = [kitShoeWidth, 0])
|> line(end = [0, -kitShoeLength])

View File

@ -26,7 +26,7 @@ assertGreaterThan(lbumps, 1, "lbumps must be greater than 1")
assertGreaterThan(wbumps, 1, "wbumps must be greater than 1")
// Make the base
base = startSketchOn('XY')
base = startSketchOn(XY)
|> startProfileAt([-totalWidth / 2, -totalLength / 2], %)
|> line(end = [totalWidth, 0])
|> line(end = [0, totalLength])
@ -53,18 +53,10 @@ peg = startSketchOn(base, 'end')
-(pitch * (wbumps - 1) / 2),
-(pitch * (lbumps - 1) / 2)
],
radius = bumpDiam / 2
)
|> patternLinear2d(
axis = [1, 0],
instances = wbumps,
distance = pitch
)
|> patternLinear2d(
axis = [0, 1],
instances = lbumps,
distance = pitch
radius = bumpDiam / 2,
)
|> patternLinear2d(axis = [1, 0], instances = wbumps, distance = pitch)
|> patternLinear2d(axis = [0, 1], instances = lbumps, distance = pitch)
|> extrude(length = bumpHeight)
// Create the pegs on the bottom of the base
@ -74,16 +66,8 @@ tubePattern = startSketchOn(shellExtrude, 'start')
-(pitch * (wbumps - 1) / 2 - (pitch / 2)),
-(pitch * (lbumps - 1) / 2 - (pitch / 2))
],
radius = bumpDiam / 2
)
|> patternLinear2d(
axis = [1, 0],
instances = wbumps - 1,
distance = pitch
)
|> patternLinear2d(
axis = [0, 1],
instances = lbumps - 1,
distance = pitch
radius = bumpDiam / 2,
)
|> patternLinear2d(axis = [1, 0], instances = wbumps - 1, distance = pitch)
|> patternLinear2d(axis = [0, 1], instances = lbumps - 1, distance = pitch)
|> extrude(length = bumpHeight)

View File

@ -13,7 +13,7 @@ centerHoleDiameter = 2
// Create a function that defines the body width and length of the mounting plate. Tag the corners so they can be passed through the fillet function.
fn rectShape(pos, w, l) {
rr = startSketchOn('XY')
rr = startSketchOn(XY)
|> startProfileAt([pos[0] - (w / 2), pos[1] - (l / 2)], %)
|> line(endAbsolute = [pos[0] + w / 2, pos[1] - (l / 2)], tag = $edge1)
|> line(endAbsolute = [pos[0] + w / 2, pos[1] + l / 2], tag = $edge2)
@ -34,33 +34,30 @@ part = rs
-plateWidth / 2 + holeIndex,
plateLength / 2 - holeIndex
],
radius = holeRadius
radius = holeRadius,
), %)
|> hole(circle(
center = [
plateWidth / 2 - holeIndex,
plateLength / 2 - holeIndex
],
radius = holeRadius
radius = holeRadius,
), %)
|> hole(circle(
center = [
-plateWidth / 2 + holeIndex,
-plateLength / 2 + holeIndex
],
radius = holeRadius
radius = holeRadius,
), %)
|> hole(circle(
center = [
plateWidth / 2 - holeIndex,
-plateLength / 2 + holeIndex
],
radius = holeRadius
), %)
|> hole(circle(
center = [0, 0],
radius = centerHoleDiameter
radius = holeRadius,
), %)
|> hole(circle(center = [0, 0], radius = centerHoleDiameter), %)
|> extrude(length = plateThickness)
|> fillet(
radius = filletRadius,
@ -69,5 +66,5 @@ part = rs
getPreviousAdjacentEdge(rs.tags.edge2),
getPreviousAdjacentEdge(rs.tags.edge3),
getPreviousAdjacentEdge(rs.tags.edge4)
]
],
)

View File

@ -28,37 +28,37 @@ export axisJ3CArmThickness = 2.5
// Planes
export plane001 = {
plane = {
origin = [0.0, 0.0, baseHeight - 1.5 + 0.1],
xAxis = [1.0, 0.0, 0.0],
yAxis = [0.0, 1.0, 0.0],
zAxis = [0.0, 0.0, 1.0]
}
plane = {
origin = [0.0, 0.0, baseHeight - 1.5 + 0.1],
xAxis = [1.0, 0.0, 0.0],
yAxis = [0.0, 1.0, 0.0],
zAxis = [0.0, 0.0, 1.0]
}
}
export plane002 = {
plane = {
origin = [0.0, 0.0, 0.0],
xAxis = [
sin(toRadians(axisJ1)),
cos(toRadians(axisJ1)),
0.0
],
yAxis = [0.0, 0.0, 1.0],
zAxis = [1.0, 0.0, 0.0]
}
plane = {
origin = [0.0, 0.0, 0.0],
xAxis = [
sin(toRadians(axisJ1)),
cos(toRadians(axisJ1)),
0.0
],
yAxis = [0.0, 0.0, 1.0],
zAxis = [1.0, 0.0, 0.0]
}
}
// Define Plane to Move J2 Axis Robot Arm
export plane003 = {
plane = {
origin = [-0.1, 0.0, 0.0],
xAxis = [
sin(toRadians(axisJ1)),
cos(toRadians(axisJ1)),
0.0
],
yAxis = [0.0, 0.0, 1.0],
zAxis = [1.0, 0.0, 0.0]
}
}
plane = {
origin = [-0.1, 0.0, 0.0],
xAxis = [
sin(toRadians(axisJ1)),
cos(toRadians(axisJ1)),
0.0
],
yAxis = [0.0, 0.0, 1.0],
zAxis = [1.0, 0.0, 0.0]
}
}

View File

@ -4,10 +4,10 @@
// Set Units
@settings(defaultLengthUnit = in)
import 'robot-arm-base.kcl' as robotArmBase
import 'robot-rotating-base.kcl' as rotatingBase
import 'robot-arm-j2.kcl' as j2RobotArm
import 'robot-arm-j3.kcl' as j3RobotArm
import "robot-arm-base.kcl" as robotArmBase
import "robot-rotating-base.kcl" as rotatingBase
import "robot-arm-j2.kcl" as j2RobotArm
import "robot-arm-j3.kcl" as j3RobotArm
robotArmBase
rotatingBase

View File

@ -1,15 +1,13 @@
// Robot Arm Base
// Set Units
@settings(defaultLengthUnit = in)
// Import Constants
import basePlateRadius, basePlateThickness, baseChamfer, baseHeight from "globals.kcl"
// Base Plate
sketch001 = startSketchOn('XY')
sketch001 = startSketchOn(XY)
|> startProfileAt([-basePlateRadius, -basePlateRadius], %)
|> angledLine([0, 2 * basePlateRadius], %, $rectangleSegmentA001)
|> angledLine([
@ -30,17 +28,14 @@ extrude001 = extrude(sketch001, length = basePlateThickness)
getNextAdjacentEdge(rectangleSegmentB001),
getNextAdjacentEdge(rectangleSegmentC001),
getNextAdjacentEdge(rectangleSegmentD001)
]
],
)
// Base Motor for actuating first joint
sketch002 = startSketchOn(extrude001, 'END')
|> circle(center = [0, 0], radius = 4, tag = $referenceEdge)
extrude002 = extrude(sketch002, length = baseHeight - basePlateThickness - 1.5)
|> fillet(
radius = 0.1,
tags = [getOppositeEdge(referenceEdge)]
)
|> fillet(radius = 0.1, tags = [getOppositeEdge(referenceEdge)])
sketch003 = startSketchOn(extrude002, 'END')
|> circle(center = [0, 0], radius = 0.5)
extrude003 = extrude(sketch003, length = 1)
@ -52,13 +47,13 @@ sketch4A = startSketchOn(extrude001, 'END')
-basePlateRadius + 1,
-basePlateRadius + baseChamfer + 0.5
],
radius = 0.4
radius = 0.4,
)
|> patternCircular2d(
arcDegrees = 360,
center = [0, 0],
instances = 4,
rotateDuplicates = true
rotateDuplicates = true,
)
extrude4A = extrude(sketch4A, length = -basePlateThickness)
@ -69,13 +64,13 @@ sketch4B = startSketchOn(extrude001, 'END')
-basePlateRadius + 0.5 + baseChamfer,
-basePlateRadius + 1
],
radius = 0.4
radius = 0.4,
)
|> patternCircular2d(
arcDegrees = 360,
center = [0, 0],
instances = 4,
rotateDuplicates = true
rotateDuplicates = true,
)
extrude(sketch4B, length = -basePlateThickness)

View File

@ -1,10 +1,8 @@
// J2 Axis for Robot Arm
// Set Units
@settings(defaultLengthUnit = in)
import axisJ1, axisJ2, axisJ2ArmWidth, axisJ2ArmLength, axisJ2ArmThickness, plane003 from "globals.kcl"
// Create Body of J2 Robot Arm
@ -35,24 +33,19 @@ sketch012 = startSketchOn(extrude011, 'START')
|> circle(center = [-1.75, 8], radius = 1.9, tag = $referenceEdge4)
extrude012 = extrude(sketch012, length = 0.15)
|> fillet(
radius = 0.1,
tags = [getOppositeEdge(referenceEdge4)]
)
|> fillet(radius = 0.1, tags = [getOppositeEdge(referenceEdge4)])
sketch013 = startSketchOn(extrude011, 'START')
|> circle(
center = [
center = [
-1.75 - (axisJ2ArmLength * cos(toRadians(axisJ2))),
8 + axisJ2ArmLength * sin(toRadians(axisJ2))
],
radius = 1.9,
tag = $referenceEdge5)
radius = 1.9,
tag = $referenceEdge5,
)
extrude013 = extrude(sketch013, length = 1)
|> fillet(
radius = 0.1,
tags = [getOppositeEdge(referenceEdge5)]
)
|> fillet(radius = 0.1, tags = [getOppositeEdge(referenceEdge5)])
// Draw Bolt Patterns on J2 Robot Arm
sketch014 = startSketchOn(extrude012, 'END')
@ -61,7 +54,7 @@ sketch014 = startSketchOn(extrude012, 'END')
center = [-1.75, 8],
instances = 8,
arcDegrees = 360,
rotateDuplicates = true
rotateDuplicates = true,
)
extrude014 = extrude(sketch014, length = 0.15)
@ -72,7 +65,7 @@ sketch015 = startSketchOn(extrude013, 'END')
-1.75 - ((axisJ2ArmLength - 1) * cos(toRadians(axisJ2))),
8 + (axisJ2ArmLength - 1.5) * sin(toRadians(axisJ2))
],
radius = 0.2
radius = 0.2,
)
|> patternCircular2d(
center = [
@ -81,7 +74,7 @@ sketch015 = startSketchOn(extrude013, 'END')
],
instances = 4,
arcDegrees = 360,
rotateDuplicates = true
rotateDuplicates = true,
)
extrude015 = extrude(sketch015, length = 0.15)
@ -92,7 +85,7 @@ sketch016 = startSketchOn(extrude011, 'END')
1.75 + axisJ2ArmLength * cos(toRadians(axisJ2)),
8 + axisJ2ArmLength * sin(toRadians(axisJ2))
],
radius = 0.3
radius = 0.3,
)
extrude(sketch016, length = 1)

View File

@ -1,10 +1,8 @@
// J3 Robot Arm
// Set Units
@settings(defaultLengthUnit = in)
import plane002, axisJ2, axisJ3C, axisJ4, axisJ2ArmLength, axisJ3CArmLength, axisJ3CArmWidth, axisJ3CArmThickness from "globals.kcl"
// Create Body of J3 Robot Arm
@ -38,13 +36,11 @@ sketch018 = startSketchOn(extrude017, 'END')
8 + axisJ2ArmLength * sin(toRadians(axisJ2))
],
radius = 3.7 / 2,
tag = $referenceEdge6)
tag = $referenceEdge6,
)
extrude018 = extrude(sketch018, length = 0.15)
|> fillet(
radius = 0.1,
tags = [getOppositeEdge(referenceEdge6)]
)
|> fillet(radius = 0.1, tags = [getOppositeEdge(referenceEdge6)])
// Draw Bolt Pattern on J3 Robot Arm
sketch019 = startSketchOn(extrude018, 'END')
@ -53,7 +49,7 @@ sketch019 = startSketchOn(extrude018, 'END')
1.75 + (axisJ2ArmLength - 1) * cos(toRadians(axisJ2)),
8 + (axisJ2ArmLength - 1.5) * sin(toRadians(axisJ2))
],
radius = 0.2
radius = 0.2,
)
|> patternCircular2d(
center = [
@ -62,7 +58,7 @@ sketch019 = startSketchOn(extrude018, 'END')
],
instances = 8,
arcDegrees = 360,
rotateDuplicates = true
rotateDuplicates = true,
)
extrude019 = extrude(sketch019, length = 0.15)
@ -74,7 +70,7 @@ sketch020 = startSketchOn(extrude017, 'START')
-1.75 - (axisJ2ArmLength * cos(toRadians(axisJ2))) - (axisJ3CArmLength * cos(toRadians(axisJ3C))),
8 + axisJ2ArmLength * sin(toRadians(axisJ2)) + axisJ3CArmLength * sin(toRadians(axisJ3C))
],
radius = axisJ3CArmWidth / 2
radius = axisJ3CArmWidth / 2,
)
extrude020 = extrude(sketch020, length = -0.5)
@ -84,7 +80,7 @@ sketch021 = startSketchOn(extrude017, 'END')
1.75 + axisJ2ArmLength * cos(toRadians(axisJ2)) + axisJ3CArmLength * cos(toRadians(axisJ3C)),
8 + axisJ2ArmLength * sin(toRadians(axisJ2)) + axisJ3CArmLength * sin(toRadians(axisJ3C))
],
radius = axisJ3CArmWidth / 2.01
radius = axisJ3CArmWidth / 2.01,
)
extrude021 = extrude(sketch021, length = -0.5)

View File

@ -1,20 +1,15 @@
// Robot Rotating Base
// Set Units
@settings(defaultLengthUnit = in)
import axisJ1, baseHeight, plane001, plane002 from "globals.kcl"
// Create Rotating Base
sketch005 = startSketchOn(plane001)
|> circle(center = [0, 0], radius = 3.9, tag = $referenceEdge1)
extrude005 = extrude(sketch005, length = 1.5 - 0.1)
|> fillet(
radius = 0.1,
tags = [getOppositeEdge(referenceEdge1)]
)
|> fillet(radius = 0.1, tags = [getOppositeEdge(referenceEdge1)])
|> appearance(color = "#4f7d54", metalness = 90, roughness = 90)
sketch006 = startSketchOn(plane002)
@ -38,12 +33,10 @@ sketch007 = startSketchOn(extrude006, 'END')
8
],
radius = 2.75,
tag = $referenceEdge2)
extrude007 = extrude(sketch007, length = 1.5)
|> fillet(
radius = 0.1,
tags = [getOppositeEdge(referenceEdge2)]
tag = $referenceEdge2,
)
extrude007 = extrude(sketch007, length = 1.5)
|> fillet(radius = 0.1, tags = [getOppositeEdge(referenceEdge2)])
// Draw Bolt Pattern on Rotating Base
sketch008 = startSketchOn(extrude007, 'END')
@ -52,7 +45,7 @@ sketch008 = startSketchOn(extrude007, 'END')
1.75 * cos(toRadians(axisJ1)) / abs(cos(toRadians(axisJ1))),
6.75
],
radius = 0.2
radius = 0.2,
)
|> patternCircular2d(
center = [
@ -61,7 +54,7 @@ sketch008 = startSketchOn(extrude007, 'END')
],
instances = 4,
arcDegrees = 360,
rotateDuplicates = true
rotateDuplicates = true,
)
extrude008 = extrude(sketch008, length = 0.2)
@ -72,12 +65,10 @@ sketch009 = startSketchOn(extrude007, 'END')
8
],
radius = 0.5,
tag = $referenceEdge3)
extrude009 = extrude(sketch009, length = 0.15)
|> fillet(
radius = 0.1,
tags = [getOppositeEdge(referenceEdge3)]
tag = $referenceEdge3,
)
extrude009 = extrude(sketch009, length = 0.15)
|> fillet(radius = 0.1, tags = [getOppositeEdge(referenceEdge3)])
|> appearance(color = "#4f7d54", metalness = 90, roughness = 90)
sketch010 = startSketchOn(plane002)

View File

@ -1,16 +1,16 @@
// 1120t74 Pipe
// import constants
import pipeInnerDiameter, pipeOuterDiameter, pipeLength from "globals.kcl"
// Pipe
// piping for the pipe flange assembly
// set units
@settings(defaultLengthUnit = in)
// import constants
import pipeInnerDiameter, pipeOuterDiameter, pipeLength from "globals.kcl"
// create a function to make the pipe
export fn pipe() {
// create the pipe base
pipeBase = startSketchOn('XZ')
pipeBase = startSketchOn(XZ)
|> circle(%, center = [0, 0], radius = pipeOuterDiameter / 2)
|> extrude(%, length = pipeLength)

View File

@ -1,16 +1,16 @@
// 68095k348 flange
// import constants
import pipeDiameter, mountingHoleDiameter, mountingHolePlacementDiameter, flangeDiameter, flangeTotalThickness, flangeBackHeight, flangeFrontHeight, flangeBaseThickness, flangeBackDiameter, flangeFrontDiameter from "globals.kcl"
// flange used for mating two pipes together in the pipe flange assembly.
// set units
@settings(defaultLengthUnit = in)
// import constants
import pipeDiameter, mountingHoleDiameter, mountingHolePlacementDiameter, flangeDiameter, flangeTotalThickness, flangeBackHeight, flangeFrontHeight, flangeBaseThickness, flangeBackDiameter, flangeFrontDiameter from "globals.kcl"
// create a function to create the flange
export fn flange() {
// sketch the mounting hole pattern
mountingHoles = startSketchOn("XY")
mountingHoles = startSketchOn(XY)
|> circle(%, center = [0, mountingHolePlacementDiameter / 2], radius = mountingHoleDiameter / 2)
|> patternCircular2d(
%,
@ -21,7 +21,7 @@ export fn flange() {
)
// create the flange base
flangeBase = startSketchOn("XY")
flangeBase = startSketchOn(XY)
|> circle(%, center = [0, 0], radius = flangeDiameter / 2)
|> hole(mountingHoles, %)
|> extrude(%, length = flangeBaseThickness)

View File

@ -1,16 +1,17 @@
// 91251A404 Socket Head Cap Screw
// import constants
import boltDiameter, boltLength, boltHeadLength, boltHeadDiameter, boltHexDrive, boltHexFlatLength, boltThreadLength from "globals.kcl"
// screw for mating the flanges together in the pipe flange assembly
// set units
@settings(defaultLengthUnit = in)
// import constants
import boltDiameter, boltLength, boltHeadLength, boltHeadDiameter, boltHexDrive, boltHexFlatLength, boltThreadLength from "globals.kcl"
// create a function to make a the bolt
export fn bolt() {
// Create the head of the cap screw
boltHead = startSketchOn('XZ')
boltHead = startSketchOn(XZ)
|> circle(center = [0, 0], radius = boltHeadDiameter / 2, tag = $topEdge)
|> extrude(length = -boltHeadLength)
|> fillet(radius = 0.020, tags = [topEdge, getOppositeEdge(topEdge)])

View File

@ -1,16 +1,16 @@
// 9472K188 Gasket
// import constants
import gasketOutsideDiameter, gasketInnerDiameter, gasketThickness from "globals.kcl"
// gasket for the pipe flange assembly. A gasket is a mechanical seal that fills the space between two or more mating surfaces, preventing leaks of liquids or gases under compression
// set units
@settings(defaultLengthUnit = in)
// import constants
import gasketOutsideDiameter, gasketInnerDiameter, gasketThickness from "globals.kcl"
// create a function to make the gasket
export fn gasket() {
// create the base of the gasket
gasketBase = startSketchOn("XY")
gasketBase = startSketchOn(XY)
|> circle(%, center = [0, 0], radius = gasketOutsideDiameter / 2)
|> extrude(%, length = gasketThickness)

View File

@ -1,16 +1,16 @@
// 95479A127 Hex Nut
// import constants
import hexNutDiameter, hexNutFlatToFlat, hexNutThickness, hexNutFlatLength from "globals.kcl"
// hex nut for the screws in the pipe flange assembly.
// set units
@settings(defaultLengthUnit = in)
// import constants
import hexNutDiameter, hexNutFlatToFlat, hexNutThickness, hexNutFlatLength from "globals.kcl"
// create a function to make the hex nut
export fn hexNut() {
// create the base of the hex nut
hexNutBase = startSketchOn('XY')
hexNutBase = startSketchOn(XY)
|> startProfileAt([
hexNutFlatToFlat / 2,
hexNutFlatLength / 2

View File

@ -1,16 +1,16 @@
// 98017A257 Washer
// import constants
import washerInnerDia, washerOuterDia, washerThickness from "globals.kcl"
// washer for the screws in the pipe flange assembly.
// set units
@settings(defaultLengthUnit = in)
// import constants
import washerInnerDia, washerOuterDia, washerThickness from "globals.kcl"
// create a function to make the washer
export fn washer() {
// create the base of the washer
washerBase = startSketchOn('XY')
washerBase = startSketchOn(XY)
|> circle(center = [0, 0], radius = washerOuterDia / 2)
|> extrude(length = washerThickness)

View File

@ -5,54 +5,120 @@
@settings(defaultLengthUnit = in)
// import constants
import * from 'globals.kcl'
import * from "globals.kcl"
// 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'
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])
|> translate(translate = [
0,
0,
flangeBackHeight * 2 + gasketThickness
])
// place gasket between the flanges
gasket()
|> translate(translate = [0, 0, -flangeBackHeight - gasketThickness])
|> translate(translate = [
0,
0,
-flangeBackHeight - gasketThickness
])
// 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])
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
])
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)
|> patternCircular3d(
%,
instances = 4,
axis = [0, 0, 1],
center = [0, 0, 0],
arcDegrees = 360,
rotateDuplicates = false,
)
// 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)
|> 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,
)
// place both pieces of pipe
pipe()
|> rotate(%, roll = -90, pitch = 0, yaw = 0)
|> translate(%, translate = [0, 0, flangeBaseThickness + flangeFrontHeight - 0.5], global = true)
|> rotate(
%,
roll = -90,
pitch = 0,
yaw = 0,
)
|> translate(
%,
translate = [
0,
0,
flangeBaseThickness + flangeFrontHeight - 0.5
],
global = true,
)
pipe()
|> rotate(%, roll = 90, pitch = 0, yaw = 0)
|> translate(%, translate = [0, 0, -(flangeBackHeight * 2 + gasketThickness + flangeBaseThickness + flangeFrontHeight - 0.5)], global = true)
|> rotate(
%,
roll = 90,
pitch = 0,
yaw = 0,
)
|> translate(
%,
translate = [
0,
0,
-(flangeBackHeight * 2 + gasketThickness + flangeBaseThickness + flangeFrontHeight - 0.5)
],
global = true,
)

View File

@ -1,7 +1,6 @@
// 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)
@ -12,7 +11,7 @@ bendRadius = 30
bendAngle = 90
// create a sketch in the 'XZ' plane
sketch000 = startSketchOn("XZ")
sketch000 = startSketchOn(XZ)
// create a profile for the outer diameter
outerProfile = circle(sketch000, center = [bendRadius, 0], radius = outerDiameter / 2)

View File

@ -15,7 +15,7 @@ pipeTransitionLength = 0.5
pipeSmallDiaLength = pipeTotalLength - pipeTransitionLength - pipeLargeDiaLength
// Create the sketch to be revolved around the y-axis. Use the small diameter, large diameter, length, and thickness to define the sketch.
pipeSketch = startSketchOn('XY')
pipeSketch = startSketchOn(XY)
|> startProfileAt([pipeSmallDia - (thickness / 2), 38], %)
|> line(end = [thickness, 0])
|> line(end = [0, -pipeSmallDiaLength])

View File

@ -1,11 +1,9 @@
// Poopy Shoe
// poop shute for bambu labs printer - optimized for printing.
// Set units
@settings(defaultLengthUnit = in)
wallThickness = 0.125
wallsWidth = 3
height = 5.125
@ -14,7 +12,7 @@ backLength = 6
exitHeight = 1
frontLength = 7
sketch001 = startSketchOn("-YZ")
sketch001 = startSketchOn(-YZ)
|> startProfileAt([wallsWidth / 2, 0], %)
|> xLine(length = wallThickness / 2)
|> angledLineToX({ angle = 60, to = wallsWidth }, %, $seg01)
@ -32,17 +30,18 @@ sketch001 = startSketchOn("-YZ")
|> yLine(endAbsolute = segEndY(seg01))
|> angledLineToY({ angle = 180 - 60, to = 0 }, %)
|> close()
part001 = revolve(sketch001,
part001 = revolve(
sketch001,
angle = 90,
axis = {
custom = {
axis = [1.0, 0.0],
origin = [0.0, height + .0001]
}
}
},
)
sketch002 = startSketchOn('-YZ')
sketch002 = startSketchOn(-YZ)
|> startProfileAt([wallsWidth / 2, 0], %)
|> xLine(length = wallThickness / 2)
|> angledLineToX({ angle = 60, to = wallsWidth }, %, $seg02)

View File

@ -13,7 +13,7 @@ templateThickness = 10
radius = 10
depth = 30
distanceToInsideEdge = slateWidthHalf + templateThickness + templateGap
sketch001 = startSketchOn('XZ')
sketch001 = startSketchOn(XZ)
|> startProfileAt([ZERO, depth + templateGap], %)
|> xLine(length = slateWidthHalf - radius, tag = $seg01)
|> arc({

View File

@ -17,7 +17,7 @@ length001 = slateWidthHalf - radius
length002 = depth + minClampingDistance
// Create the first sketch
sketch001 = startSketchOn('XZ')
sketch001 = startSketchOn(XZ)
|> startProfileAt([0, depth - templateGap], %)
|> xLine(length = length001, tag = $seg01)
|> arc({

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 90 KiB

View File

@ -15,7 +15,7 @@ boltSize = 0.25
flangeWidth = 1.5
// Sketch and extrude the base shape and fillet the inside and outside edges.
baseExtrusion = startSketchOn('-XZ')
baseExtrusion = startSketchOn(-XZ)
|> startProfileAt([0, 0], %)
|> line(end = [0, thickness], tag = $e1)
|> line(end = [flangeLength, 0], tag = $e2)
@ -30,82 +30,46 @@ baseExtrusion = startSketchOn('-XZ')
|> line(end = [0, -hatHeight], tag = $e11)
|> close(tag = $e12)
|> extrude(length = hatWidth)
|> fillet(
radius = bendRad,
tags = [getNextAdjacentEdge(e2)]
)
|> fillet(
radius = outsideBendRad,
tags = [getNextAdjacentEdge(e3)]
)
|> fillet(
radius = outsideBendRad,
tags = [getNextAdjacentEdge(e4)]
)
|> fillet(
radius = bendRad,
tags = [getNextAdjacentEdge(e5)]
)
|> fillet(
radius = outsideBendRad,
tags = [getNextAdjacentEdge(e8)]
)
|> fillet(
radius = bendRad,
tags = [getNextAdjacentEdge(e9)]
)
|> fillet(
radius = bendRad,
tags = [getNextAdjacentEdge(e10)]
)
|> fillet(
radius = outsideBendRad,
tags = [getNextAdjacentEdge(e11)]
)
|> fillet(radius = bendRad, tags = [getNextAdjacentEdge(e2)])
|> fillet(radius = outsideBendRad, tags = [getNextAdjacentEdge(e3)])
|> fillet(radius = outsideBendRad, tags = [getNextAdjacentEdge(e4)])
|> fillet(radius = bendRad, tags = [getNextAdjacentEdge(e5)])
|> fillet(radius = outsideBendRad, tags = [getNextAdjacentEdge(e8)])
|> fillet(radius = bendRad, tags = [getNextAdjacentEdge(e9)])
|> fillet(radius = bendRad, tags = [getNextAdjacentEdge(e10)])
|> fillet(radius = outsideBendRad, tags = [getNextAdjacentEdge(e11)])
// Define the flanges and place the bolt holes
flange1 = startSketchOn('XY')
flange1 = startSketchOn(XY)
|> startProfileAt([0, 0], %)
|> line(end = [0, hatWidth])
|> line(end = [flangeWidth, 0], tag = $e13)
|> line(end = [0, -hatWidth], tag = $e14)
|> close()
|> hole(circle(
center = [0.75, 1],
radius = boltSize
), %)
|> hole(circle(
center = [0.75, 4],
radius = boltSize
), %)
|> hole(circle(center = [0.75, 1], radius = boltSize), %)
|> hole(circle(center = [0.75, 4], radius = boltSize), %)
|> extrude(length = thickness)
|> fillet(
radius = 0.5,
tags = [
getNextAdjacentEdge(e13),
getNextAdjacentEdge(e14)
]
],
)
flange2 = startSketchOn('XY')
flange2 = startSketchOn(XY)
|> startProfileAt([-6, 0], %)
|> line(end = [0, hatWidth])
|> line(end = [-flangeWidth, 0], tag = $e15)
|> line(end = [0, -hatWidth], tag = $e16)
|> close()
|> hole(circle(
center = [-6.75, 1],
radius = boltSize
), %)
|> hole(circle(
center = [-6.75, 4],
radius = boltSize
), %)
|> hole(circle(center = [-6.75, 1], radius = boltSize), %)
|> hole(circle(center = [-6.75, 4], radius = boltSize), %)
|> extrude(length = thickness)
|> fillet(
radius = 0.25,
tags = [
getNextAdjacentEdge(e15),
getNextAdjacentEdge(e16)
]
],
)

View File

@ -5,24 +5,19 @@
@settings(defaultLengthUnit = in, defaultAngleUnit = deg)
export boltDiameter = 0.190
export boltLength = 1.00
export boltLength = 1.0
export boltHeadLength = boltDiameter
export boltHeadDiameter = 0.313
export boltHexDrive = 5/32
export boltHexDrive = 5 / 32
export boltHexFlatLength = boltHexDrive / (2 * cos(toRadians(30)))
export fn bolt () {
export fn bolt() {
// Create the head of the cap screw
boltHead = startSketchOn('XZ')
|> circle(
center = [0, 0],
radius = boltHeadDiameter / 2,
tag = $topEdge
)
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
hexPatternSketch = startSketchOn(boltHead, 'start')
|> startProfileAt([
@ -51,7 +46,6 @@ export fn bolt () {
}, %)
|> close()
|> extrude(length = -boltHeadLength * 0.75)
boltBody = startSketchOn(boltHead, 'end')
|> circle(center = [0, 0], radius = boltDiameter / 2, tag = $filletEdge)
|> extrude(length = boltLength)

View File

@ -1,24 +1,23 @@
// Antenna
// import constants
import antennaLength, antennaBaseWidth, antennaBaseHeight, antennaTopWidth, antennaTopHeight from "globals.kcl"
// Walkie talkie antenna
// antenna for the walkie talkie assembly
// Set units
@settings(defaultLengthUnit = in)
export fn antenna () {
// import constants
import antennaLength, antennaBaseWidth, antennaBaseHeight, antennaTopWidth, antennaTopHeight from "globals.kcl"
export fn antenna() {
// Create the antenna base sketch
sketch001 = startSketchOn('XY')
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)
loftPlane = offsetPlane(XY, offset = antennaLength)
sketch002 = startSketchOn(loftPlane)
|> startProfileAt([
(antennaBaseWidth - antennaTopWidth) / 2,
@ -28,10 +27,9 @@ export fn antenna () {
|> yLine(length = -antennaTopHeight)
|> xLine(length = -antennaTopWidth)
|> close()
// Create the antenna using a loft
antenna = loft([sketch001, sketch002])
|> appearance(color = "#000000")
return antenna
}

View File

@ -1,16 +1,16 @@
// Walkie talkie body
// import constants
import height, width, thickness, chamferLength, offset, screenWidth, screenHeight, screenYPosition, screenDepth, speakerBoxWidth, speakerBoxHeight from "globals.kcl"
// the main body of the walkie talkie assembly
// set units
@settings(defaultLengthUnit = in)
// create a function to define the body
export fn body () {
// import constants
import height, width, thickness, chamferLength, offset, screenWidth, screenHeight, screenYPosition, screenDepth, speakerBoxWidth, speakerBoxHeight from "globals.kcl"
// create a function to define the body
export fn body() {
// sketch and extrude the body of the walkie talkie
bodySketch = startSketchOn('XZ')
bodySketch = startSketchOn(XZ)
|> startProfileAt([-width / 2, height / 2], %)
|> xLine(length = width, tag = $chamfer1)
|> yLine(length = -height, tag = $chamfer2)
@ -24,7 +24,7 @@ export fn body () {
getNextAdjacentEdge(chamfer2),
getNextAdjacentEdge(chamfer3),
getNextAdjacentEdge(chamfer4)
]
],
)
// cut out the indentation for the case
@ -57,7 +57,7 @@ export fn body () {
}, %)
|> close()
extrude002 = extrude(sketch002, length = -0.0625)
// Create the pocket for the screen
sketch003 = startSketchOn(extrude002, 'start')
|> startProfileAt([-screenWidth / 2, screenYPosition], %)
@ -67,7 +67,7 @@ export fn body () {
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
extrude003 = extrude(sketch003, length = screenDepth)
// Create the speaker box
sketch004 = startSketchOn(extrude002, 'start')
|> startProfileAt([-1.25 / 2, -.125], %)
@ -77,9 +77,7 @@ export fn body () {
|> close()
body = extrude(sketch004, length = -.5)
|> appearance(
color = "#277bb0",
)
|> appearance(color = "#277bb0")
return body
}

View File

@ -4,26 +4,16 @@
@settings(defaultLengthUnit = in)
// import constants
import buttonWidth, buttonHeight, buttonThickness from 'globals.kcl'
import buttonWidth, buttonHeight, buttonThickness from "globals.kcl"
// create a function to define the button
export fn button() {
// sketch the button profile and extrude
buttonSketch = startSketchOn('XZ')
buttonSketch = startSketchOn(XZ)
|> startProfileAt([0, 0], %)
|> angledLine({
angle = 180,
length = buttonWidth
}, %, $tag1)
|> angledLine({
angle = 270,
length = buttonHeight
}, %, $tag2)
|> angledLine({
angle = 0,
length = buttonWidth
}, %)
|> angledLine({ angle = 180, length = buttonWidth }, %, $tag1)
|> angledLine({ angle = 270, length = buttonHeight }, %, $tag2)
|> angledLine({ angle = 0, length = buttonWidth }, %)
|> close()
buttonExtrude = extrude(buttonSketch, length = buttonThickness)
|> chamfer(
@ -31,9 +21,9 @@ export fn button() {
tags = [
getNextAdjacentEdge(tag1),
getNextAdjacentEdge(tag2)
]
],
)
|> appearance(color = "#ff0000")
|> appearance(color = "#ff0000")
return buttonExtrude
}
}

View File

@ -1,25 +1,24 @@
// Walkie talkie case
// the plastic case for the front of the walkie talkie
// set units
@settings(defaultLengthUnit = in)
// 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"
// set units
@settings(defaultLengthUnit = in)
// create a function to define the case
export fn case () {
export fn case() {
// sketch the profile of the screen
sketch006 = startSketchOn(startSketchOn('XZ'))
sketch006 = startSketchOn(startSketchOn(XZ))
|> startProfileAt([-screenWidth / 2, screenYPosition], %)
|> xLine(length = screenWidth)
|> yLine(length = -screenHeight)
|> xLine(length = -screenWidth)
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
// create transform functions for the speaker grid pattern
fn transformX(i) {
return { translate = [.125 * i, 0] }
@ -29,7 +28,7 @@ export fn case () {
}
// sketch the square hole grid pattern
squareHolePatternSketch = startSketchOn(startSketchOn('XZ'))
squareHolePatternSketch = startSketchOn(startSketchOn(XZ))
|> startProfileAt([-screenWidth / 2 + .100, 0], %)
|> line(end = [squareHoleSideLength / 2, 0])
|> line(end = [0, -squareHoleSideLength / 2])
@ -38,8 +37,8 @@ export fn case () {
|> patternTransform2d(instances = 13, transform = transformX)
|> patternTransform2d(instances = 11, transform = transformY)
// sketch the outer profile of the case and extrude with holes using the previously made profiles
sketch005 = startSketchOn(startSketchOn('XZ'))
// 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)))
@ -77,14 +76,13 @@ export fn case () {
|> 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), %)
|> 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

@ -40,4 +40,4 @@ export knobRadius = 0.050
// talk-button
export talkButtonSideLength = 0.5
export talkButtonHeight = 0.050
export talkButtonHeight = 0.050

View File

@ -1,31 +1,28 @@
// Walkie Talkie Frequency Knob
// import constants
import width, thickness, height, knobDiameter, knobHeight, knobRadius from "globals.kcl"
// Walkie talkie frequency knob
// the frequency knob for the walkie talkie assembly
// set units
@settings(defaultLengthUnit = in)
// create a function to define the knob
export fn knob () {
// import constants
import width, thickness, height, knobDiameter, knobHeight, knobRadius from "globals.kcl"
// Create the knob sketch and revolve
knob = startSketchOn('XZ')
|> startProfileAt([0.0001, 0], %)
|> xLine(length = knobDiameter / 2)
|> yLine(length = knobHeight - 0.05)
|> arc({
angleStart = 0,
angleEnd = 90,
radius = .05
}, %)
|> xLine(endAbsolute = 0.0001)
|> close()
|> revolve(
axis = "Y",
)
|> appearance(color = '#D0FF01', metalness = 90, roughness = 50)
// create a function to define the knob
export fn knob() {
// Create the knob sketch and revolve
knob = startSketchOn(XZ)
|> startProfileAt([0.0001, 0], %)
|> xLine(length = knobDiameter / 2)
|> yLine(length = knobHeight - 0.05)
|> arc({
angleStart = 0,
angleEnd = 90,
radius = .05
}, %)
|> xLine(endAbsolute = 0.0001)
|> close()
|> revolve(axis = "Y")
|> appearance(color = '#D0FF01', metalness = 90, roughness = 50)
return knob
}
}

View File

@ -5,14 +5,14 @@
@settings(defaultLengthUnit = in)
// import constants
import * from 'globals.kcl'
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 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 the body
@ -20,7 +20,7 @@ body()
// import the antenna
antenna()
|> translate(translate = [-width / 2 + .45, -0.10, height/2])
|> translate(translate = [-width / 2 + .45, -0.10, height / 2])
// import the case
case()
@ -32,16 +32,52 @@ talkButton()
// import the frequency knob
knob()
|> translate(translate = [width / 2 - 0.70, -thickness / 2, height / 2])
|> translate(translate = [
width / 2 - 0.70,
-thickness / 2,
height / 2
])
// import the buttons
button()
|> translate(translate = [-(screenWidth / 2 + tolerance), -1, screenYPosition])
|> translate(translate = [
-(screenWidth / 2 + tolerance),
-1,
screenYPosition
])
button()
|> translate(translate = [-(screenWidth / 2 + tolerance), -1, screenYPosition - buttonHeight - tolerance*2])
|> 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)
|> 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)
|> rotate(
%,
roll = 0,
pitch = 180,
yaw = 0,
)
|> translate(
translate = [
screenWidth / 2 + tolerance,
-1,
screenYPosition - (buttonHeight * 2) - (tolerance * 2)
],
global = true,
)

View File

@ -1,6 +1,5 @@
// Walkie talkie talk button
// set units
@settings(defaultLengthUnit = in)
@ -8,9 +7,8 @@
import width, thickness, talkButtonSideLength, talkButtonHeight from "globals.kcl"
export fn talkButton() {
// create the talk button sketch
talkButtonSketch = startSketchOn('YZ')
talkButtonSketch = startSketchOn(YZ)
|> startProfileAt([
-talkButtonSideLength / 2,
talkButtonSideLength / 2
@ -23,14 +21,14 @@ export fn talkButton() {
// 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)
]
)
radius = 0.050,
tags = [
getNextAdjacentEdge(tag1),
getNextAdjacentEdge(tag2),
getNextAdjacentEdge(tag3),
getNextAdjacentEdge(tag4)
],
)
|> appearance(color = '#D0FF01', metalness = 90, roughness = 90)
return talkButton

View File

@ -80,4 +80,4 @@ export fn oLogo2(surface, origin, scale) {
}, %)
|> close()
return oSketch002
}
}

View File

@ -14,17 +14,11 @@ thicknessMin = 0.024
fn washer(plane, innerDia, outerDia, thk) {
// Define the sketch of the washer
washerSketch = startSketchOn(plane)
|> circle(
center = [0, 0],
radius = outerDia / 2
)
|> hole(circle(
center = [0, 0],
radius = innerDia / 2
), %)
|> circle(center = [0, 0], radius = outerDia / 2)
|> hole(circle(center = [0, 0], radius = innerDia / 2), %)
washer = extrude(washerSketch, length = thk)
return washer
}
washer('XY', innerDiameter, outerDiameter, thicknessMax)
washer(XY, innerDiameter, outerDiameter, thicknessMax)

20
rust/Cargo.lock generated
View File

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

View File

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

View File

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

View File

@ -158,13 +158,13 @@ fn named_view_point_version_one() -> f64 {
#[ts(export)]
pub struct NamedView {
/// User defined name to identify the named view. A label.
#[serde(default, alias = "name", skip_serializing_if = "is_default")]
#[serde(default, alias = "name")]
pub name: String,
/// Engine camera eye off set
#[serde(default, alias = "eyeOffset", skip_serializing_if = "is_default")]
#[serde(default, alias = "eyeOffset")]
pub eye_offset: f64,
/// Engine camera vertical FOV
#[serde(default, alias = "fovY", skip_serializing_if = "is_default")]
#[serde(default, alias = "fovY")]
pub fov_y: f64,
// Engine camera is orthographic or perspective projection
#[serde(default, alias = "isOrtho")]
@ -173,16 +173,16 @@ pub struct NamedView {
#[serde(default, alias = "orthoScaleEnabled")]
pub ortho_scale_enabled: bool,
/// Engine camera orthographic scaling factor
#[serde(default, alias = "orthoScaleFactor", skip_serializing_if = "is_default")]
#[serde(default, alias = "orthoScaleFactor")]
pub ortho_scale_factor: f64,
/// Engine camera position that the camera pivots around
#[serde(default, alias = "pivotPosition", skip_serializing_if = "is_default")]
#[serde(default, alias = "pivotPosition")]
pub pivot_position: [f64; 3],
/// Engine camera orientation in relation to the pivot position
#[serde(default, alias = "pivotRotation", skip_serializing_if = "is_default")]
#[serde(default, alias = "pivotRotation")]
pub pivot_rotation: [f64; 4],
/// Engine camera world coordinate system orientation
#[serde(default, alias = "worldCoordSystem", skip_serializing_if = "is_default")]
#[serde(default, alias = "worldCoordSystem")]
pub world_coord_system: String,
/// Version number of the view point if the engine camera API changes
#[serde(default = "named_view_point_version_one")]

View File

@ -1,81 +1,81 @@
```mermaid
flowchart LR
subgraph path2 [Path]
2["Path<br>[326, 423, 0]"]
3["Segment<br>[431, 536, 0]"]
4["Segment<br>[544, 653, 0]"]
5["Segment<br>[661, 693, 0]"]
6["Segment<br>[701, 810, 0]"]
7["Segment<br>[818, 865, 0]"]
8["Segment<br>[873, 921, 0]"]
9["Segment<br>[929, 978, 0]"]
10["Segment<br>[986, 1103, 0]"]
11["Segment<br>[1111, 1159, 0]"]
12["Segment<br>[1167, 1275, 0]"]
13["Segment<br>[1283, 1332, 0]"]
14["Segment<br>[1340, 1389, 0]"]
15["Segment<br>[1397, 1430, 0]"]
16["Segment<br>[1438, 1547, 0]"]
17["Segment<br>[1555, 1587, 0]"]
18["Segment<br>[1595, 1704, 0]"]
19["Segment<br>[1712, 1815, 0]"]
20["Segment<br>[1856, 1966, 0]"]
21["Segment<br>[1974, 2006, 0]"]
22["Segment<br>[2014, 2124, 0]"]
23["Segment<br>[2132, 2179, 0]"]
24["Segment<br>[2187, 2237, 0]"]
25["Segment<br>[2245, 2295, 0]"]
26["Segment<br>[2313, 2442, 0]"]
27["Segment<br>[2460, 2509, 0]"]
28["Segment<br>[2523, 2637, 0]"]
29["Segment<br>[2651, 2701, 0]"]
30["Segment<br>[2715, 2764, 0]"]
31["Segment<br>[2772, 2805, 0]"]
32["Segment<br>[2813, 2923, 0]"]
33["Segment<br>[2931, 2963, 0]"]
34["Segment<br>[2971, 3081, 0]"]
35["Segment<br>[3122, 3224, 0]"]
36["Segment<br>[3232, 3342, 0]"]
37["Segment<br>[3350, 3383, 0]"]
38["Segment<br>[3391, 3501, 0]"]
39["Segment<br>[3509, 3558, 0]"]
40["Segment<br>[3566, 3616, 0]"]
41["Segment<br>[3624, 3673, 0]"]
42["Segment<br>[3681, 3809, 0]"]
43["Segment<br>[3817, 3867, 0]"]
44["Segment<br>[3875, 3990, 0]"]
45["Segment<br>[3998, 4047, 0]"]
46["Segment<br>[4055, 4104, 0]"]
47["Segment<br>[4112, 4146, 0]"]
48["Segment<br>[4154, 4264, 0]"]
49["Segment<br>[4272, 4305, 0]"]
50["Segment<br>[4313, 4423, 0]"]
51["Segment<br>[4431, 4535, 0]"]
52["Segment<br>[4576, 4686, 0]"]
53["Segment<br>[4694, 4727, 0]"]
54["Segment<br>[4735, 4845, 0]"]
55["Segment<br>[4853, 4902, 0]"]
56["Segment<br>[4910, 4959, 0]"]
57["Segment<br>[4967, 5016, 0]"]
58["Segment<br>[5024, 5143, 0]"]
59["Segment<br>[5151, 5201, 0]"]
60["Segment<br>[5209, 5317, 0]"]
61["Segment<br>[5325, 5374, 0]"]
62["Segment<br>[5382, 5432, 0]"]
63["Segment<br>[5440, 5474, 0]"]
64["Segment<br>[5482, 5592, 0]"]
65["Segment<br>[5600, 5633, 0]"]
66["Segment<br>[5641, 5751, 0]"]
67["Segment<br>[5759, 5766, 0]"]
2["Path<br>[324, 421, 0]"]
3["Segment<br>[429, 534, 0]"]
4["Segment<br>[542, 651, 0]"]
5["Segment<br>[659, 691, 0]"]
6["Segment<br>[699, 808, 0]"]
7["Segment<br>[816, 863, 0]"]
8["Segment<br>[871, 919, 0]"]
9["Segment<br>[927, 976, 0]"]
10["Segment<br>[984, 1101, 0]"]
11["Segment<br>[1109, 1157, 0]"]
12["Segment<br>[1165, 1273, 0]"]
13["Segment<br>[1281, 1330, 0]"]
14["Segment<br>[1338, 1387, 0]"]
15["Segment<br>[1395, 1428, 0]"]
16["Segment<br>[1436, 1545, 0]"]
17["Segment<br>[1553, 1585, 0]"]
18["Segment<br>[1593, 1702, 0]"]
19["Segment<br>[1710, 1813, 0]"]
20["Segment<br>[1854, 1964, 0]"]
21["Segment<br>[1972, 2004, 0]"]
22["Segment<br>[2012, 2122, 0]"]
23["Segment<br>[2130, 2177, 0]"]
24["Segment<br>[2185, 2235, 0]"]
25["Segment<br>[2243, 2293, 0]"]
26["Segment<br>[2311, 2440, 0]"]
27["Segment<br>[2458, 2507, 0]"]
28["Segment<br>[2521, 2635, 0]"]
29["Segment<br>[2649, 2699, 0]"]
30["Segment<br>[2713, 2762, 0]"]
31["Segment<br>[2770, 2803, 0]"]
32["Segment<br>[2811, 2921, 0]"]
33["Segment<br>[2929, 2961, 0]"]
34["Segment<br>[2969, 3079, 0]"]
35["Segment<br>[3120, 3222, 0]"]
36["Segment<br>[3230, 3340, 0]"]
37["Segment<br>[3348, 3381, 0]"]
38["Segment<br>[3389, 3499, 0]"]
39["Segment<br>[3507, 3556, 0]"]
40["Segment<br>[3564, 3614, 0]"]
41["Segment<br>[3622, 3671, 0]"]
42["Segment<br>[3679, 3807, 0]"]
43["Segment<br>[3815, 3865, 0]"]
44["Segment<br>[3873, 3988, 0]"]
45["Segment<br>[3996, 4045, 0]"]
46["Segment<br>[4053, 4102, 0]"]
47["Segment<br>[4110, 4144, 0]"]
48["Segment<br>[4152, 4262, 0]"]
49["Segment<br>[4270, 4303, 0]"]
50["Segment<br>[4311, 4421, 0]"]
51["Segment<br>[4429, 4533, 0]"]
52["Segment<br>[4574, 4684, 0]"]
53["Segment<br>[4692, 4725, 0]"]
54["Segment<br>[4733, 4843, 0]"]
55["Segment<br>[4851, 4900, 0]"]
56["Segment<br>[4908, 4957, 0]"]
57["Segment<br>[4965, 5014, 0]"]
58["Segment<br>[5022, 5141, 0]"]
59["Segment<br>[5149, 5199, 0]"]
60["Segment<br>[5207, 5315, 0]"]
61["Segment<br>[5323, 5372, 0]"]
62["Segment<br>[5380, 5430, 0]"]
63["Segment<br>[5438, 5472, 0]"]
64["Segment<br>[5480, 5590, 0]"]
65["Segment<br>[5598, 5631, 0]"]
66["Segment<br>[5639, 5749, 0]"]
67["Segment<br>[5757, 5764, 0]"]
68[Solid2d]
end
subgraph path69 [Path]
69["Path<br>[5817, 5994, 0]"]
70["Segment<br>[5817, 5994, 0]"]
69["Path<br>[5815, 5993, 0]"]
70["Segment<br>[5815, 5993, 0]"]
71[Solid2d]
end
1["Plane<br>[298, 318, 0]"]
72["Sweep Extrusion<br>[6006, 6034, 0]"]
1["Plane<br>[298, 316, 0]"]
72["Sweep Extrusion<br>[6005, 6033, 0]"]
73[Wall]
74[Wall]
75[Wall]
@ -270,38 +270,38 @@ flowchart LR
264["SweepEdge Adjacent"]
265["SweepEdge Opposite"]
266["SweepEdge Adjacent"]
267["EdgeCut Fillet<br>[6042, 6746, 0]"]
268["EdgeCut Fillet<br>[6042, 6746, 0]"]
269["EdgeCut Fillet<br>[6042, 6746, 0]"]
270["EdgeCut Fillet<br>[6042, 6746, 0]"]
271["EdgeCut Fillet<br>[6042, 6746, 0]"]
272["EdgeCut Fillet<br>[6042, 6746, 0]"]
273["EdgeCut Fillet<br>[6042, 6746, 0]"]
274["EdgeCut Fillet<br>[6042, 6746, 0]"]
275["EdgeCut Fillet<br>[6042, 6746, 0]"]
276["EdgeCut Fillet<br>[6042, 6746, 0]"]
277["EdgeCut Fillet<br>[6042, 6746, 0]"]
278["EdgeCut Fillet<br>[6042, 6746, 0]"]
279["EdgeCut Fillet<br>[6042, 6746, 0]"]
280["EdgeCut Fillet<br>[6042, 6746, 0]"]
281["EdgeCut Fillet<br>[6042, 6746, 0]"]
282["EdgeCut Fillet<br>[6042, 6746, 0]"]
283["EdgeCut Fillet<br>[6754, 7457, 0]"]
284["EdgeCut Fillet<br>[6754, 7457, 0]"]
285["EdgeCut Fillet<br>[6754, 7457, 0]"]
286["EdgeCut Fillet<br>[6754, 7457, 0]"]
287["EdgeCut Fillet<br>[6754, 7457, 0]"]
288["EdgeCut Fillet<br>[6754, 7457, 0]"]
289["EdgeCut Fillet<br>[6754, 7457, 0]"]
290["EdgeCut Fillet<br>[6754, 7457, 0]"]
291["EdgeCut Fillet<br>[6754, 7457, 0]"]
292["EdgeCut Fillet<br>[6754, 7457, 0]"]
293["EdgeCut Fillet<br>[6754, 7457, 0]"]
294["EdgeCut Fillet<br>[6754, 7457, 0]"]
295["EdgeCut Fillet<br>[6754, 7457, 0]"]
296["EdgeCut Fillet<br>[6754, 7457, 0]"]
297["EdgeCut Fillet<br>[6754, 7457, 0]"]
298["EdgeCut Fillet<br>[6754, 7457, 0]"]
267["EdgeCut Fillet<br>[6041, 6746, 0]"]
268["EdgeCut Fillet<br>[6041, 6746, 0]"]
269["EdgeCut Fillet<br>[6041, 6746, 0]"]
270["EdgeCut Fillet<br>[6041, 6746, 0]"]
271["EdgeCut Fillet<br>[6041, 6746, 0]"]
272["EdgeCut Fillet<br>[6041, 6746, 0]"]
273["EdgeCut Fillet<br>[6041, 6746, 0]"]
274["EdgeCut Fillet<br>[6041, 6746, 0]"]
275["EdgeCut Fillet<br>[6041, 6746, 0]"]
276["EdgeCut Fillet<br>[6041, 6746, 0]"]
277["EdgeCut Fillet<br>[6041, 6746, 0]"]
278["EdgeCut Fillet<br>[6041, 6746, 0]"]
279["EdgeCut Fillet<br>[6041, 6746, 0]"]
280["EdgeCut Fillet<br>[6041, 6746, 0]"]
281["EdgeCut Fillet<br>[6041, 6746, 0]"]
282["EdgeCut Fillet<br>[6041, 6746, 0]"]
283["EdgeCut Fillet<br>[6754, 7458, 0]"]
284["EdgeCut Fillet<br>[6754, 7458, 0]"]
285["EdgeCut Fillet<br>[6754, 7458, 0]"]
286["EdgeCut Fillet<br>[6754, 7458, 0]"]
287["EdgeCut Fillet<br>[6754, 7458, 0]"]
288["EdgeCut Fillet<br>[6754, 7458, 0]"]
289["EdgeCut Fillet<br>[6754, 7458, 0]"]
290["EdgeCut Fillet<br>[6754, 7458, 0]"]
291["EdgeCut Fillet<br>[6754, 7458, 0]"]
292["EdgeCut Fillet<br>[6754, 7458, 0]"]
293["EdgeCut Fillet<br>[6754, 7458, 0]"]
294["EdgeCut Fillet<br>[6754, 7458, 0]"]
295["EdgeCut Fillet<br>[6754, 7458, 0]"]
296["EdgeCut Fillet<br>[6754, 7458, 0]"]
297["EdgeCut Fillet<br>[6754, 7458, 0]"]
298["EdgeCut Fillet<br>[6754, 7458, 0]"]
1 --- 2
1 --- 69
2 --- 3

File diff suppressed because it is too large Load Diff

View File

@ -8,7 +8,7 @@ description: Operations executed 80-20-rail.kcl
"name": "rail8020",
"functionSourceRange": [
214,
7478,
7479,
0
],
"unlabeledArg": null,
@ -19,8 +19,8 @@ description: Operations executed 80-20-rail.kcl
"labeledArgs": {
"data": {
"value": {
"type": "String",
"value": "-XZ"
"type": "Plane",
"artifact_id": "[uuid]"
},
"sourceRange": []
}

View File

@ -1,30 +1,30 @@
```mermaid
flowchart LR
subgraph path2 [Path]
2["Path<br>[971, 1015, 0]"]
3["Segment<br>[1021, 1065, 0]"]
4["Segment<br>[1071, 1114, 0]"]
5["Segment<br>[1120, 1164, 0]"]
6["Segment<br>[1170, 1177, 0]"]
2["Path<br>[969, 1013, 0]"]
3["Segment<br>[1019, 1063, 0]"]
4["Segment<br>[1069, 1112, 0]"]
5["Segment<br>[1118, 1162, 0]"]
6["Segment<br>[1168, 1175, 0]"]
7[Solid2d]
end
subgraph path23 [Path]
23["Path<br>[1262, 1406, 0]"]
24["Segment<br>[1262, 1406, 0]"]
23["Path<br>[1257, 1404, 0]"]
24["Segment<br>[1257, 1404, 0]"]
25[Solid2d]
end
subgraph path34 [Path]
34["Path<br>[1706, 1862, 0]"]
35["Segment<br>[1706, 1862, 0]"]
34["Path<br>[1653, 1802, 0]"]
35["Segment<br>[1653, 1802, 0]"]
36[Solid2d]
end
subgraph path44 [Path]
44["Path<br>[2165, 2230, 0]"]
45["Segment<br>[2165, 2230, 0]"]
44["Path<br>[2055, 2103, 0]"]
45["Segment<br>[2055, 2103, 0]"]
46[Solid2d]
end
1["Plane<br>[946, 965, 0]"]
8["Sweep Extrusion<br>[1183, 1207, 0]"]
1["Plane<br>[946, 963, 0]"]
8["Sweep Extrusion<br>[1181, 1205, 0]"]
9[Wall]
10[Wall]
11[Wall]
@ -39,28 +39,28 @@ flowchart LR
20["SweepEdge Adjacent"]
21["SweepEdge Opposite"]
22["SweepEdge Adjacent"]
26["Sweep Extrusion<br>[1622, 1651, 0]"]
26["Sweep Extrusion<br>[1569, 1598, 0]"]
27[Wall]
28["Cap Start"]
29["SweepEdge Opposite"]
30["SweepEdge Adjacent"]
31["Sweep Extrusion<br>[1622, 1651, 0]"]
32["Sweep Extrusion<br>[1622, 1651, 0]"]
33["Sweep Extrusion<br>[1622, 1651, 0]"]
37["Sweep Extrusion<br>[2077, 2112, 0]"]
31["Sweep Extrusion<br>[1569, 1598, 0]"]
32["Sweep Extrusion<br>[1569, 1598, 0]"]
33["Sweep Extrusion<br>[1569, 1598, 0]"]
37["Sweep Extrusion<br>[1967, 2002, 0]"]
38[Wall]
39["SweepEdge Opposite"]
40["SweepEdge Adjacent"]
41["Sweep Extrusion<br>[2077, 2112, 0]"]
42["Sweep Extrusion<br>[2077, 2112, 0]"]
43["Sweep Extrusion<br>[2077, 2112, 0]"]
47["Sweep Extrusion<br>[2236, 2261, 0]"]
41["Sweep Extrusion<br>[1967, 2002, 0]"]
42["Sweep Extrusion<br>[1967, 2002, 0]"]
43["Sweep Extrusion<br>[1967, 2002, 0]"]
47["Sweep Extrusion<br>[2109, 2134, 0]"]
48[Wall]
49["SweepEdge Opposite"]
50["SweepEdge Adjacent"]
51["StartSketchOnFace<br>[1224, 1256, 0]"]
52["StartSketchOnFace<br>[1666, 1700, 0]"]
53["StartSketchOnFace<br>[2127, 2159, 0]"]
51["StartSketchOnFace<br>[1219, 1251, 0]"]
52["StartSketchOnFace<br>[1613, 1647, 0]"]
53["StartSketchOnFace<br>[2017, 2049, 0]"]
1 --- 2
2 --- 3
2 --- 4

View File

@ -7,8 +7,8 @@ description: Operations executed a-parametric-bearing-pillow-block.kcl
"labeledArgs": {
"data": {
"value": {
"type": "String",
"value": "XY"
"type": "Plane",
"artifact_id": "[uuid]"
},
"sourceRange": []
}

View File

@ -1,58 +1,58 @@
```mermaid
flowchart LR
subgraph path2 [Path]
2["Path<br>[733, 816, 0]"]
3["Segment<br>[733, 816, 0]"]
2["Path<br>[731, 793, 0]"]
3["Segment<br>[731, 793, 0]"]
4[Solid2d]
end
subgraph path5 [Path]
5["Path<br>[827, 894, 0]"]
6["Segment<br>[827, 894, 0]"]
5["Path<br>[804, 850, 0]"]
6["Segment<br>[804, 850, 0]"]
7[Solid2d]
end
subgraph path15 [Path]
15["Path<br>[1083, 1139, 0]"]
16["Segment<br>[1145, 1237, 0]"]
17["Segment<br>[1243, 1250, 0]"]
15["Path<br>[1037, 1093, 0]"]
16["Segment<br>[1099, 1191, 0]"]
17["Segment<br>[1197, 1204, 0]"]
18[Solid2d]
end
subgraph path24 [Path]
24["Path<br>[1623, 1756, 0]"]
25["Segment<br>[1762, 1855, 0]"]
26["Segment<br>[1861, 1892, 0]"]
27["Segment<br>[1898, 1926, 0]"]
28["Segment<br>[1932, 1939, 0]"]
24["Path<br>[1576, 1709, 0]"]
25["Segment<br>[1715, 1808, 0]"]
26["Segment<br>[1814, 1845, 0]"]
27["Segment<br>[1851, 1879, 0]"]
28["Segment<br>[1885, 1892, 0]"]
29[Solid2d]
end
subgraph path40 [Path]
40["Path<br>[2276, 2417, 0]"]
41["Segment<br>[2276, 2417, 0]"]
40["Path<br>[2228, 2370, 0]"]
41["Segment<br>[2228, 2370, 0]"]
42[Solid2d]
end
subgraph path50 [Path]
50["Path<br>[2814, 2888, 0]"]
51["Segment<br>[2814, 2888, 0]"]
50["Path<br>[2766, 2819, 0]"]
51["Segment<br>[2766, 2819, 0]"]
52[Solid2d]
end
subgraph path53 [Path]
53["Path<br>[2899, 2994, 0]"]
54["Segment<br>[2899, 2994, 0]"]
53["Path<br>[2830, 2904, 0]"]
54["Segment<br>[2830, 2904, 0]"]
55[Solid2d]
end
1["Plane<br>[677, 726, 0]"]
8["Sweep Extrusion<br>[949, 1001, 0]"]
1["Plane<br>[677, 724, 0]"]
8["Sweep Extrusion<br>[905, 957, 0]"]
9[Wall]
10["Cap Start"]
11["Cap End"]
12["SweepEdge Opposite"]
13["SweepEdge Adjacent"]
14["Plane<br>[1058, 1077, 0]"]
19["Sweep Revolve<br>[1332, 1364, 0]"]
14["Plane<br>[1014, 1031, 0]"]
19["Sweep Revolve<br>[1286, 1318, 0]"]
20[Wall]
21[Wall]
22["SweepEdge Adjacent"]
23["Plane<br>[1598, 1617, 0]"]
30["Sweep Revolve<br>[1981, 2013, 0]"]
23["Plane<br>[1553, 1570, 0]"]
30["Sweep Revolve<br>[1934, 1966, 0]"]
31[Wall]
32[Wall]
33[Wall]
@ -61,22 +61,22 @@ flowchart LR
36["SweepEdge Adjacent"]
37["SweepEdge Adjacent"]
38["SweepEdge Adjacent"]
39["Plane<br>[2251, 2270, 0]"]
43["Sweep Revolve<br>[2460, 2513, 0]"]
39["Plane<br>[2205, 2222, 0]"]
43["Sweep Revolve<br>[2413, 2466, 0]"]
44[Wall]
45["Cap Start"]
46["Cap End"]
47["SweepEdge Opposite"]
48["SweepEdge Adjacent"]
49["Plane<br>[2758, 2807, 0]"]
56["Sweep Extrusion<br>[3014, 3067, 0]"]
49["Plane<br>[2712, 2759, 0]"]
56["Sweep Extrusion<br>[2924, 2977, 0]"]
57[Wall]
58["Cap Start"]
59["Cap End"]
60["SweepEdge Opposite"]
61["SweepEdge Adjacent"]
62["StartSketchOnPlane<br>[663, 727, 0]"]
63["StartSketchOnPlane<br>[2744, 2808, 0]"]
62["StartSketchOnPlane<br>[663, 725, 0]"]
63["StartSketchOnPlane<br>[2698, 2760, 0]"]
1 --- 2
1 --- 5
2 --- 3

File diff suppressed because it is too large Load Diff

View File

@ -21,8 +21,8 @@ description: Operations executed ball-bearing.kcl
"type": "StdLibCall",
"unlabeledArg": {
"value": {
"type": "String",
"value": "XY"
"type": "Plane",
"artifact_id": "[uuid]"
},
"sourceRange": []
}
@ -224,8 +224,8 @@ description: Operations executed ball-bearing.kcl
"labeledArgs": {
"data": {
"value": {
"type": "String",
"value": "XY"
"type": "Plane",
"artifact_id": "[uuid]"
},
"sourceRange": []
}
@ -411,8 +411,8 @@ description: Operations executed ball-bearing.kcl
"labeledArgs": {
"data": {
"value": {
"type": "String",
"value": "XY"
"type": "Plane",
"artifact_id": "[uuid]"
},
"sourceRange": []
}
@ -613,8 +613,8 @@ description: Operations executed ball-bearing.kcl
"labeledArgs": {
"data": {
"value": {
"type": "String",
"value": "XZ"
"type": "Plane",
"artifact_id": "[uuid]"
},
"sourceRange": []
}
@ -878,8 +878,8 @@ description: Operations executed ball-bearing.kcl
"type": "StdLibCall",
"unlabeledArg": {
"value": {
"type": "String",
"value": "XY"
"type": "Plane",
"artifact_id": "[uuid]"
},
"sourceRange": []
}

View File

@ -1853,8 +1853,8 @@ description: Artifact commands bench.kcl
"adjust_camera": false,
"planar_normal": {
"x": -1.0,
"y": 0.0,
"z": 0.0
"y": -0.0,
"z": -0.0
}
}
},
@ -2244,8 +2244,8 @@ description: Artifact commands bench.kcl
"adjust_camera": false,
"planar_normal": {
"x": -1.0,
"y": 0.0,
"z": 0.0
"y": -0.0,
"z": -0.0
}
}
},
@ -2694,8 +2694,8 @@ description: Artifact commands bench.kcl
"adjust_camera": false,
"planar_normal": {
"x": -1.0,
"y": 0.0,
"z": 0.0
"y": -0.0,
"z": -0.0
}
}
},
@ -3085,8 +3085,8 @@ description: Artifact commands bench.kcl
"adjust_camera": false,
"planar_normal": {
"x": -1.0,
"y": 0.0,
"z": 0.0
"y": -0.0,
"z": -0.0
}
}
},
@ -7461,8 +7461,8 @@ description: Artifact commands bench.kcl
"adjust_camera": false,
"planar_normal": {
"x": -1.0,
"y": 0.0,
"z": 0.0
"y": -0.0,
"z": -0.0
}
}
},
@ -7546,7 +7546,7 @@ description: Artifact commands bench.kcl
"z": 0.0
},
"x_axis": {
"x": -1.0,
"x": 1.0,
"y": 0.0,
"z": 0.0
},
@ -7584,9 +7584,9 @@ description: Artifact commands bench.kcl
"animated": false,
"adjust_camera": false,
"planar_normal": {
"x": 0.0,
"x": -0.0,
"y": 1.0,
"z": 0.0
"z": -0.0
}
}
},
@ -7945,8 +7945,8 @@ description: Artifact commands bench.kcl
"adjust_camera": false,
"planar_normal": {
"x": -1.0,
"y": 0.0,
"z": 0.0
"y": -0.0,
"z": -0.0
}
}
},
@ -8030,7 +8030,7 @@ description: Artifact commands bench.kcl
"z": 0.0
},
"x_axis": {
"x": -1.0,
"x": 1.0,
"y": 0.0,
"z": 0.0
},
@ -8068,9 +8068,9 @@ description: Artifact commands bench.kcl
"animated": false,
"adjust_camera": false,
"planar_normal": {
"x": 0.0,
"x": -0.0,
"y": 1.0,
"z": 0.0
"z": -0.0
}
}
},

View File

@ -360,7 +360,7 @@ flowchart LR
172["SweepEdge Adjacent"]
173["SweepEdge Opposite"]
174["SweepEdge Adjacent"]
175["Plane<br>[825, 869, 0]"]
175["Plane<br>[823, 865, 0]"]
199["Sweep Extrusion<br>[1379, 1417, 4]"]
200[Wall]
201[Wall]
@ -487,7 +487,7 @@ flowchart LR
345["SweepEdge Adjacent"]
346["SweepEdge Opposite"]
347["SweepEdge Adjacent"]
348["Plane<br>[879, 922, 0]"]
348["Plane<br>[875, 916, 0]"]
372["Sweep Extrusion<br>[1379, 1417, 4]"]
373[Wall]
374[Wall]
@ -614,7 +614,7 @@ flowchart LR
518["SweepEdge Adjacent"]
519["SweepEdge Opposite"]
520["SweepEdge Adjacent"]
521["Plane<br>[981, 1025, 0]"]
521["Plane<br>[975, 1017, 0]"]
532["Sweep Extrusion<br>[1949, 1973, 4]"]
533[Wall]
534[Wall]
@ -657,7 +657,7 @@ flowchart LR
581["SweepEdge Adjacent"]
582["SweepEdge Opposite"]
583["SweepEdge Adjacent"]
584["Plane<br>[1076, 1143, 0]"]
584["Plane<br>[1068, 1135, 0]"]
594["Sweep Extrusion<br>[2523, 2547, 4]"]
595[Wall]
596[Wall]
@ -681,7 +681,7 @@ flowchart LR
614["SweepEdge Adjacent"]
615["Sweep Extrusion<br>[2523, 2547, 4]"]
616["Sweep Extrusion<br>[2523, 2547, 4]"]
617["Plane<br>[1213, 1280, 0]"]
617["Plane<br>[1205, 1272, 0]"]
627["Sweep Extrusion<br>[3047, 3071, 4]"]
628[Wall]
629[Wall]
@ -705,8 +705,8 @@ flowchart LR
647["SweepEdge Adjacent"]
648["Sweep Extrusion<br>[3047, 3071, 4]"]
649["Plane<br>[3712, 3747, 4]"]
653["Plane<br>[3778, 3809, 4]"]
663["Sweep Sweep<br>[3821, 3848, 4]"]
653["Plane<br>[3778, 3807, 4]"]
663["Sweep Sweep<br>[3819, 3846, 4]"]
664[Wall]
665[Wall]
666[Wall]
@ -731,8 +731,8 @@ flowchart LR
685["SweepEdge Opposite"]
686["SweepEdge Adjacent"]
687["Plane<br>[3712, 3747, 4]"]
691["Plane<br>[3778, 3809, 4]"]
701["Sweep Sweep<br>[3821, 3848, 4]"]
691["Plane<br>[3778, 3807, 4]"]
701["Sweep Sweep<br>[3819, 3846, 4]"]
702[Wall]
703[Wall]
704[Wall]

View File

@ -232,13 +232,20 @@ description: Result of parsing bench.kcl
"expression": {
"arguments": [
{
"abs_path": false,
"commentStart": 811,
"end": 0,
"raw": "\"YZ\"",
"name": {
"commentStart": 811,
"end": 0,
"name": "YZ",
"start": 0,
"type": "Identifier"
},
"path": [],
"start": 0,
"type": "Literal",
"type": "Literal",
"value": "YZ"
"type": "Name",
"type": "Name"
}
],
"callee": {
@ -272,7 +279,7 @@ description: Result of parsing bench.kcl
"type": "ExpressionStatement"
},
{
"commentStart": 817,
"commentStart": 815,
"end": 0,
"expression": {
"arguments": [
@ -281,21 +288,21 @@ description: Result of parsing bench.kcl
{
"type": "LabeledArg",
"label": {
"commentStart": 844,
"commentStart": 840,
"end": 0,
"name": "offset",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 853,
"commentStart": 849,
"end": 0,
"left": {
"abs_path": false,
"commentStart": 853,
"commentStart": 849,
"end": 0,
"name": {
"commentStart": 853,
"commentStart": 849,
"end": 0,
"name": "benchLength",
"start": 0,
@ -308,7 +315,7 @@ description: Result of parsing bench.kcl
},
"operator": "/",
"right": {
"commentStart": 867,
"commentStart": 863,
"end": 0,
"raw": "2",
"start": 0,
@ -327,10 +334,10 @@ description: Result of parsing bench.kcl
],
"callee": {
"abs_path": false,
"commentStart": 825,
"commentStart": 823,
"end": 0,
"name": {
"commentStart": 825,
"commentStart": 823,
"end": 0,
"name": "offsetPlane",
"start": 0,
@ -340,28 +347,43 @@ description: Result of parsing bench.kcl
"start": 0,
"type": "Name"
},
"commentStart": 825,
"commentStart": 823,
"end": 0,
"start": 0,
"type": "CallExpressionKw",
"type": "CallExpressionKw",
"unlabeled": {
"commentStart": 837,
"argument": {
"abs_path": false,
"commentStart": 836,
"end": 0,
"name": {
"commentStart": 836,
"end": 0,
"name": "YZ",
"start": 0,
"type": "Identifier"
},
"path": [],
"start": 0,
"type": "Name",
"type": "Name"
},
"commentStart": 835,
"end": 0,
"raw": "\"-YZ\"",
"operator": "-",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": "-YZ"
"type": "UnaryExpression",
"type": "UnaryExpression"
}
}
],
"callee": {
"abs_path": false,
"commentStart": 817,
"commentStart": 815,
"end": 0,
"name": {
"commentStart": 817,
"commentStart": 815,
"end": 0,
"name": "divider",
"start": 0,
@ -371,7 +393,7 @@ description: Result of parsing bench.kcl
"start": 0,
"type": "Name"
},
"commentStart": 817,
"commentStart": 815,
"end": 0,
"start": 0,
"type": "CallExpression",
@ -382,7 +404,7 @@ description: Result of parsing bench.kcl
"type": "ExpressionStatement"
},
{
"commentStart": 871,
"commentStart": 867,
"end": 0,
"expression": {
"arguments": [
@ -391,21 +413,21 @@ description: Result of parsing bench.kcl
{
"type": "LabeledArg",
"label": {
"commentStart": 897,
"commentStart": 891,
"end": 0,
"name": "offset",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 906,
"commentStart": 900,
"end": 0,
"left": {
"abs_path": false,
"commentStart": 906,
"commentStart": 900,
"end": 0,
"name": {
"commentStart": 906,
"commentStart": 900,
"end": 0,
"name": "benchLength",
"start": 0,
@ -418,7 +440,7 @@ description: Result of parsing bench.kcl
},
"operator": "/",
"right": {
"commentStart": 920,
"commentStart": 914,
"end": 0,
"raw": "2",
"start": 0,
@ -437,10 +459,10 @@ description: Result of parsing bench.kcl
],
"callee": {
"abs_path": false,
"commentStart": 879,
"commentStart": 875,
"end": 0,
"name": {
"commentStart": 879,
"commentStart": 875,
"end": 0,
"name": "offsetPlane",
"start": 0,
@ -450,28 +472,35 @@ description: Result of parsing bench.kcl
"start": 0,
"type": "Name"
},
"commentStart": 879,
"commentStart": 875,
"end": 0,
"start": 0,
"type": "CallExpressionKw",
"type": "CallExpressionKw",
"unlabeled": {
"commentStart": 891,
"abs_path": false,
"commentStart": 887,
"end": 0,
"raw": "\"YZ\"",
"name": {
"commentStart": 887,
"end": 0,
"name": "YZ",
"start": 0,
"type": "Identifier"
},
"path": [],
"start": 0,
"type": "Literal",
"type": "Literal",
"value": "YZ"
"type": "Name",
"type": "Name"
}
}
],
"callee": {
"abs_path": false,
"commentStart": 871,
"commentStart": 867,
"end": 0,
"name": {
"commentStart": 871,
"commentStart": 867,
"end": 0,
"name": "divider",
"start": 0,
@ -481,7 +510,7 @@ description: Result of parsing bench.kcl
"start": 0,
"type": "Name"
},
"commentStart": 871,
"commentStart": 867,
"end": 0,
"start": 0,
"type": "CallExpression",
@ -492,7 +521,7 @@ description: Result of parsing bench.kcl
"type": "ExpressionStatement"
},
{
"commentStart": 923,
"commentStart": 917,
"end": 0,
"expression": {
"arguments": [
@ -501,22 +530,22 @@ description: Result of parsing bench.kcl
{
"type": "LabeledArg",
"label": {
"commentStart": 999,
"commentStart": 991,
"end": 0,
"name": "offset",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 1008,
"commentStart": 1000,
"end": 0,
"left": {
"argument": {
"abs_path": false,
"commentStart": 1009,
"commentStart": 1001,
"end": 0,
"name": {
"commentStart": 1009,
"commentStart": 1001,
"end": 0,
"name": "benchLength",
"start": 0,
@ -527,7 +556,7 @@ description: Result of parsing bench.kcl
"type": "Name",
"type": "Name"
},
"commentStart": 1008,
"commentStart": 1000,
"end": 0,
"operator": "-",
"start": 0,
@ -536,7 +565,7 @@ description: Result of parsing bench.kcl
},
"operator": "/",
"right": {
"commentStart": 1023,
"commentStart": 1015,
"end": 0,
"raw": "2",
"start": 0,
@ -555,10 +584,10 @@ description: Result of parsing bench.kcl
],
"callee": {
"abs_path": false,
"commentStart": 981,
"commentStart": 975,
"end": 0,
"name": {
"commentStart": 981,
"commentStart": 975,
"end": 0,
"name": "offsetPlane",
"start": 0,
@ -568,27 +597,34 @@ description: Result of parsing bench.kcl
"start": 0,
"type": "Name"
},
"commentStart": 981,
"commentStart": 975,
"end": 0,
"start": 0,
"type": "CallExpressionKw",
"type": "CallExpressionKw",
"unlabeled": {
"commentStart": 993,
"abs_path": false,
"commentStart": 987,
"end": 0,
"raw": "\"YZ\"",
"name": {
"commentStart": 987,
"end": 0,
"name": "YZ",
"start": 0,
"type": "Identifier"
},
"path": [],
"start": 0,
"type": "Literal",
"type": "Literal",
"value": "YZ"
"type": "Name",
"type": "Name"
}
},
{
"abs_path": false,
"commentStart": 1027,
"commentStart": 1019,
"end": 0,
"name": {
"commentStart": 1027,
"commentStart": 1019,
"end": 0,
"name": "benchLength",
"start": 0,
@ -602,10 +638,10 @@ description: Result of parsing bench.kcl
],
"callee": {
"abs_path": false,
"commentStart": 971,
"commentStart": 965,
"end": 0,
"name": {
"commentStart": 971,
"commentStart": 965,
"end": 0,
"name": "connector",
"start": 0,
@ -615,7 +651,7 @@ description: Result of parsing bench.kcl
"start": 0,
"type": "Name"
},
"commentStart": 971,
"commentStart": 965,
"end": 0,
"start": 0,
"type": "CallExpression",
@ -631,7 +667,7 @@ description: Result of parsing bench.kcl
"type": "ExpressionStatement"
},
{
"commentStart": 1039,
"commentStart": 1031,
"end": 0,
"expression": {
"arguments": [
@ -640,25 +676,25 @@ description: Result of parsing bench.kcl
{
"type": "LabeledArg",
"label": {
"commentStart": 1094,
"commentStart": 1084,
"end": 0,
"name": "offset",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 1103,
"commentStart": 1093,
"end": 0,
"left": {
"commentStart": 1103,
"commentStart": 1093,
"end": 0,
"left": {
"argument": {
"abs_path": false,
"commentStart": 1104,
"commentStart": 1094,
"end": 0,
"name": {
"commentStart": 1104,
"commentStart": 1094,
"end": 0,
"name": "benchLength",
"start": 0,
@ -669,7 +705,7 @@ description: Result of parsing bench.kcl
"type": "Name",
"type": "Name"
},
"commentStart": 1103,
"commentStart": 1093,
"end": 0,
"operator": "-",
"start": 0,
@ -678,7 +714,7 @@ description: Result of parsing bench.kcl
},
"operator": "/",
"right": {
"commentStart": 1118,
"commentStart": 1108,
"end": 0,
"raw": "2",
"start": 0,
@ -695,14 +731,14 @@ description: Result of parsing bench.kcl
},
"operator": "-",
"right": {
"commentStart": 1122,
"commentStart": 1113,
"end": 0,
"left": {
"abs_path": false,
"commentStart": 1122,
"commentStart": 1113,
"end": 0,
"name": {
"commentStart": 1122,
"commentStart": 1113,
"end": 0,
"name": "dividerThickness",
"start": 0,
@ -715,7 +751,7 @@ description: Result of parsing bench.kcl
},
"operator": "/",
"right": {
"commentStart": 1141,
"commentStart": 1132,
"end": 0,
"raw": "2",
"start": 0,
@ -738,10 +774,10 @@ description: Result of parsing bench.kcl
],
"callee": {
"abs_path": false,
"commentStart": 1076,
"commentStart": 1068,
"end": 0,
"name": {
"commentStart": 1076,
"commentStart": 1068,
"end": 0,
"name": "offsetPlane",
"start": 0,
@ -751,30 +787,37 @@ description: Result of parsing bench.kcl
"start": 0,
"type": "Name"
},
"commentStart": 1076,
"commentStart": 1068,
"end": 0,
"start": 0,
"type": "CallExpressionKw",
"type": "CallExpressionKw",
"unlabeled": {
"commentStart": 1088,
"abs_path": false,
"commentStart": 1080,
"end": 0,
"raw": "\"YZ\"",
"name": {
"commentStart": 1080,
"end": 0,
"name": "YZ",
"start": 0,
"type": "Identifier"
},
"path": [],
"start": 0,
"type": "Literal",
"type": "Literal",
"value": "YZ"
"type": "Name",
"type": "Name"
}
},
{
"commentStart": 1145,
"commentStart": 1137,
"end": 0,
"left": {
"abs_path": false,
"commentStart": 1145,
"commentStart": 1137,
"end": 0,
"name": {
"commentStart": 1145,
"commentStart": 1137,
"end": 0,
"name": "benchLength",
"start": 0,
@ -788,10 +831,10 @@ description: Result of parsing bench.kcl
"operator": "+",
"right": {
"abs_path": false,
"commentStart": 1159,
"commentStart": 1151,
"end": 0,
"name": {
"commentStart": 1159,
"commentStart": 1151,
"end": 0,
"name": "dividerThickness",
"start": 0,
@ -809,10 +852,10 @@ description: Result of parsing bench.kcl
],
"callee": {
"abs_path": false,
"commentStart": 1066,
"commentStart": 1058,
"end": 0,
"name": {
"commentStart": 1066,
"commentStart": 1058,
"end": 0,
"name": "seatSlats",
"start": 0,
@ -822,7 +865,7 @@ description: Result of parsing bench.kcl
"start": 0,
"type": "Name"
},
"commentStart": 1066,
"commentStart": 1058,
"end": 0,
"start": 0,
"type": "CallExpression",
@ -838,7 +881,7 @@ description: Result of parsing bench.kcl
"type": "ExpressionStatement"
},
{
"commentStart": 1176,
"commentStart": 1168,
"end": 0,
"expression": {
"arguments": [
@ -847,25 +890,25 @@ description: Result of parsing bench.kcl
{
"type": "LabeledArg",
"label": {
"commentStart": 1231,
"commentStart": 1221,
"end": 0,
"name": "offset",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 1240,
"commentStart": 1230,
"end": 0,
"left": {
"commentStart": 1240,
"commentStart": 1230,
"end": 0,
"left": {
"argument": {
"abs_path": false,
"commentStart": 1241,
"commentStart": 1231,
"end": 0,
"name": {
"commentStart": 1241,
"commentStart": 1231,
"end": 0,
"name": "benchLength",
"start": 0,
@ -876,7 +919,7 @@ description: Result of parsing bench.kcl
"type": "Name",
"type": "Name"
},
"commentStart": 1240,
"commentStart": 1230,
"end": 0,
"operator": "-",
"start": 0,
@ -885,7 +928,7 @@ description: Result of parsing bench.kcl
},
"operator": "/",
"right": {
"commentStart": 1255,
"commentStart": 1245,
"end": 0,
"raw": "2",
"start": 0,
@ -902,14 +945,14 @@ description: Result of parsing bench.kcl
},
"operator": "-",
"right": {
"commentStart": 1259,
"commentStart": 1250,
"end": 0,
"left": {
"abs_path": false,
"commentStart": 1259,
"commentStart": 1250,
"end": 0,
"name": {
"commentStart": 1259,
"commentStart": 1250,
"end": 0,
"name": "dividerThickness",
"start": 0,
@ -922,7 +965,7 @@ description: Result of parsing bench.kcl
},
"operator": "/",
"right": {
"commentStart": 1278,
"commentStart": 1269,
"end": 0,
"raw": "2",
"start": 0,
@ -945,10 +988,10 @@ description: Result of parsing bench.kcl
],
"callee": {
"abs_path": false,
"commentStart": 1213,
"commentStart": 1205,
"end": 0,
"name": {
"commentStart": 1213,
"commentStart": 1205,
"end": 0,
"name": "offsetPlane",
"start": 0,
@ -958,30 +1001,37 @@ description: Result of parsing bench.kcl
"start": 0,
"type": "Name"
},
"commentStart": 1213,
"commentStart": 1205,
"end": 0,
"start": 0,
"type": "CallExpressionKw",
"type": "CallExpressionKw",
"unlabeled": {
"commentStart": 1225,
"abs_path": false,
"commentStart": 1217,
"end": 0,
"raw": "\"YZ\"",
"name": {
"commentStart": 1217,
"end": 0,
"name": "YZ",
"start": 0,
"type": "Identifier"
},
"path": [],
"start": 0,
"type": "Literal",
"type": "Literal",
"value": "YZ"
"type": "Name",
"type": "Name"
}
},
{
"commentStart": 1282,
"commentStart": 1274,
"end": 0,
"left": {
"abs_path": false,
"commentStart": 1282,
"commentStart": 1274,
"end": 0,
"name": {
"commentStart": 1282,
"commentStart": 1274,
"end": 0,
"name": "benchLength",
"start": 0,
@ -995,10 +1045,10 @@ description: Result of parsing bench.kcl
"operator": "+",
"right": {
"abs_path": false,
"commentStart": 1296,
"commentStart": 1288,
"end": 0,
"name": {
"commentStart": 1296,
"commentStart": 1288,
"end": 0,
"name": "dividerThickness",
"start": 0,
@ -1016,10 +1066,10 @@ description: Result of parsing bench.kcl
],
"callee": {
"abs_path": false,
"commentStart": 1203,
"commentStart": 1195,
"end": 0,
"name": {
"commentStart": 1203,
"commentStart": 1195,
"end": 0,
"name": "backSlats",
"start": 0,
@ -1029,7 +1079,7 @@ description: Result of parsing bench.kcl
"start": 0,
"type": "Name"
},
"commentStart": 1203,
"commentStart": 1195,
"end": 0,
"start": 0,
"type": "CallExpression",
@ -1045,28 +1095,43 @@ description: Result of parsing bench.kcl
"type": "ExpressionStatement"
},
{
"commentStart": 1313,
"commentStart": 1305,
"end": 0,
"expression": {
"arguments": [
{
"commentStart": 1347,
"argument": {
"abs_path": false,
"commentStart": 1340,
"end": 0,
"name": {
"commentStart": 1340,
"end": 0,
"name": "YZ",
"start": 0,
"type": "Identifier"
},
"path": [],
"start": 0,
"type": "Name",
"type": "Name"
},
"commentStart": 1339,
"end": 0,
"raw": "\"-YZ\"",
"operator": "-",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": "-YZ"
"type": "UnaryExpression",
"type": "UnaryExpression"
},
{
"commentStart": 1354,
"commentStart": 1344,
"end": 0,
"left": {
"abs_path": false,
"commentStart": 1354,
"commentStart": 1344,
"end": 0,
"name": {
"commentStart": 1354,
"commentStart": 1344,
"end": 0,
"name": "benchLength",
"start": 0,
@ -1079,7 +1144,7 @@ description: Result of parsing bench.kcl
},
"operator": "/",
"right": {
"commentStart": 1368,
"commentStart": 1358,
"end": 0,
"raw": "2",
"start": 0,
@ -1097,10 +1162,10 @@ description: Result of parsing bench.kcl
],
"callee": {
"abs_path": false,
"commentStart": 1339,
"commentStart": 1331,
"end": 0,
"name": {
"commentStart": 1339,
"commentStart": 1331,
"end": 0,
"name": "armRest",
"start": 0,
@ -1110,7 +1175,7 @@ description: Result of parsing bench.kcl
"start": 0,
"type": "Name"
},
"commentStart": 1339,
"commentStart": 1331,
"end": 0,
"start": 0,
"type": "CallExpression",
@ -1126,29 +1191,44 @@ description: Result of parsing bench.kcl
"type": "ExpressionStatement"
},
{
"commentStart": 1371,
"commentStart": 1361,
"end": 0,
"expression": {
"arguments": [
{
"commentStart": 1379,
"argument": {
"abs_path": false,
"commentStart": 1370,
"end": 0,
"name": {
"commentStart": 1370,
"end": 0,
"name": "YZ",
"start": 0,
"type": "Identifier"
},
"path": [],
"start": 0,
"type": "Name",
"type": "Name"
},
"commentStart": 1369,
"end": 0,
"raw": "\"-YZ\"",
"operator": "-",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": "-YZ"
"type": "UnaryExpression",
"type": "UnaryExpression"
},
{
"commentStart": 1386,
"commentStart": 1374,
"end": 0,
"left": {
"argument": {
"abs_path": false,
"commentStart": 1387,
"commentStart": 1375,
"end": 0,
"name": {
"commentStart": 1387,
"commentStart": 1375,
"end": 0,
"name": "benchLength",
"start": 0,
@ -1159,7 +1239,7 @@ description: Result of parsing bench.kcl
"type": "Name",
"type": "Name"
},
"commentStart": 1386,
"commentStart": 1374,
"end": 0,
"operator": "-",
"start": 0,
@ -1168,7 +1248,7 @@ description: Result of parsing bench.kcl
},
"operator": "/",
"right": {
"commentStart": 1401,
"commentStart": 1389,
"end": 0,
"raw": "2",
"start": 0,
@ -1186,10 +1266,10 @@ description: Result of parsing bench.kcl
],
"callee": {
"abs_path": false,
"commentStart": 1371,
"commentStart": 1361,
"end": 0,
"name": {
"commentStart": 1371,
"commentStart": 1361,
"end": 0,
"name": "armRest",
"start": 0,
@ -1199,7 +1279,7 @@ description: Result of parsing bench.kcl
"start": 0,
"type": "Name"
},
"commentStart": 1371,
"commentStart": 1361,
"end": 0,
"start": 0,
"type": "CallExpression",

View File

@ -31,8 +31,8 @@ description: Operations executed bench.kcl
"labeledArgs": {
"data": {
"value": {
"type": "String",
"value": "YZ"
"type": "Plane",
"artifact_id": "[uuid]"
},
"sourceRange": []
}
@ -87,8 +87,8 @@ description: Operations executed bench.kcl
"labeledArgs": {
"data": {
"value": {
"type": "String",
"value": "YZ"
"type": "Plane",
"artifact_id": "[uuid]"
},
"sourceRange": []
}
@ -236,8 +236,8 @@ description: Operations executed bench.kcl
"type": "StdLibCall",
"unlabeledArg": {
"value": {
"type": "String",
"value": "-YZ"
"type": "Plane",
"artifact_id": "[uuid]"
},
"sourceRange": []
}
@ -475,8 +475,8 @@ description: Operations executed bench.kcl
"type": "StdLibCall",
"unlabeledArg": {
"value": {
"type": "String",
"value": "YZ"
"type": "Plane",
"artifact_id": "[uuid]"
},
"sourceRange": []
}
@ -714,8 +714,8 @@ description: Operations executed bench.kcl
"type": "StdLibCall",
"unlabeledArg": {
"value": {
"type": "String",
"value": "YZ"
"type": "Plane",
"artifact_id": "[uuid]"
},
"sourceRange": []
}
@ -877,8 +877,8 @@ description: Operations executed bench.kcl
"type": "StdLibCall",
"unlabeledArg": {
"value": {
"type": "String",
"value": "YZ"
"type": "Plane",
"artifact_id": "[uuid]"
},
"sourceRange": []
}
@ -995,8 +995,8 @@ description: Operations executed bench.kcl
"type": "StdLibCall",
"unlabeledArg": {
"value": {
"type": "String",
"value": "YZ"
"type": "Plane",
"artifact_id": "[uuid]"
},
"sourceRange": []
}
@ -1094,7 +1094,7 @@ description: Operations executed bench.kcl
"name": "armRest",
"functionSourceRange": [
3671,
3861,
3859,
4
],
"unlabeledArg": null,
@ -1119,8 +1119,8 @@ description: Operations executed bench.kcl
"type": "StdLibCall",
"unlabeledArg": {
"value": {
"type": "String",
"value": "-YZ"
"type": "Plane",
"artifact_id": "[uuid]"
},
"sourceRange": []
}
@ -1179,8 +1179,8 @@ description: Operations executed bench.kcl
"type": "StdLibCall",
"unlabeledArg": {
"value": {
"type": "String",
"value": "-XZ"
"type": "Plane",
"artifact_id": "[uuid]"
},
"sourceRange": []
}
@ -1248,7 +1248,7 @@ description: Operations executed bench.kcl
"name": "armRest",
"functionSourceRange": [
3671,
3861,
3859,
4
],
"unlabeledArg": null,
@ -1273,8 +1273,8 @@ description: Operations executed bench.kcl
"type": "StdLibCall",
"unlabeledArg": {
"value": {
"type": "String",
"value": "-YZ"
"type": "Plane",
"artifact_id": "[uuid]"
},
"sourceRange": []
}
@ -1333,8 +1333,8 @@ description: Operations executed bench.kcl
"type": "StdLibCall",
"unlabeledArg": {
"value": {
"type": "String",
"value": "-XZ"
"type": "Plane",
"artifact_id": "[uuid]"
},
"sourceRange": []
}

View File

@ -1,28 +1,28 @@
```mermaid
flowchart LR
subgraph path2 [Path]
2["Path<br>[1086, 1111, 0]"]
3["Segment<br>[1117, 1170, 0]"]
4["Segment<br>[1176, 1215, 0]"]
5["Segment<br>[1221, 1263, 0]"]
6["Segment<br>[1269, 1310, 0]"]
7["Segment<br>[1316, 1355, 0]"]
8["Segment<br>[1361, 1431, 0]"]
9["Segment<br>[1437, 1444, 0]"]
2["Path<br>[1085, 1110, 0]"]
3["Segment<br>[1116, 1169, 0]"]
4["Segment<br>[1175, 1214, 0]"]
5["Segment<br>[1220, 1262, 0]"]
6["Segment<br>[1268, 1309, 0]"]
7["Segment<br>[1315, 1354, 0]"]
8["Segment<br>[1360, 1430, 0]"]
9["Segment<br>[1436, 1443, 0]"]
10[Solid2d]
end
subgraph path38 [Path]
38["Path<br>[1906, 1981, 0]"]
39["Segment<br>[1906, 1981, 0]"]
38["Path<br>[1823, 1885, 0]"]
39["Segment<br>[1823, 1885, 0]"]
40[Solid2d]
end
subgraph path48 [Path]
48["Path<br>[2240, 2312, 0]"]
49["Segment<br>[2240, 2312, 0]"]
48["Path<br>[2112, 2171, 0]"]
49["Segment<br>[2112, 2171, 0]"]
50[Solid2d]
end
1["Plane<br>[1061, 1080, 0]"]
11["Sweep Extrusion<br>[1450, 1476, 0]"]
1["Plane<br>[1062, 1079, 0]"]
11["Sweep Extrusion<br>[1449, 1475, 0]"]
12[Wall]
13[Wall]
14[Wall]
@ -43,26 +43,26 @@ flowchart LR
29["SweepEdge Adjacent"]
30["SweepEdge Opposite"]
31["SweepEdge Adjacent"]
32["EdgeCut Fillet<br>[1482, 1573, 0]"]
33["EdgeCut Fillet<br>[1579, 1667, 0]"]
34["EdgeCut Fillet<br>[1673, 1761, 0]"]
35["EdgeCut Fillet<br>[1673, 1761, 0]"]
36["EdgeCut Fillet<br>[1767, 1855, 0]"]
37["EdgeCut Fillet<br>[1767, 1855, 0]"]
41["Sweep Extrusion<br>[2154, 2189, 0]"]
32["EdgeCut Fillet<br>[1481, 1550, 0]"]
33["EdgeCut Fillet<br>[1556, 1622, 0]"]
34["EdgeCut Fillet<br>[1628, 1697, 0]"]
35["EdgeCut Fillet<br>[1628, 1697, 0]"]
36["EdgeCut Fillet<br>[1703, 1772, 0]"]
37["EdgeCut Fillet<br>[1703, 1772, 0]"]
41["Sweep Extrusion<br>[2024, 2061, 0]"]
42[Wall]
43["SweepEdge Opposite"]
44["SweepEdge Adjacent"]
45["Sweep Extrusion<br>[2154, 2189, 0]"]
46["Sweep Extrusion<br>[2154, 2189, 0]"]
47["Sweep Extrusion<br>[2154, 2189, 0]"]
51["Sweep Extrusion<br>[2400, 2435, 0]"]
45["Sweep Extrusion<br>[2024, 2061, 0]"]
46["Sweep Extrusion<br>[2024, 2061, 0]"]
47["Sweep Extrusion<br>[2024, 2061, 0]"]
51["Sweep Extrusion<br>[2242, 2279, 0]"]
52[Wall]
53["SweepEdge Opposite"]
54["SweepEdge Adjacent"]
55["Sweep Extrusion<br>[2400, 2435, 0]"]
56["StartSketchOnFace<br>[1869, 1900, 0]"]
57["StartSketchOnFace<br>[2203, 2234, 0]"]
55["Sweep Extrusion<br>[2242, 2279, 0]"]
56["StartSketchOnFace<br>[1786, 1817, 0]"]
57["StartSketchOnFace<br>[2075, 2106, 0]"]
1 --- 2
2 --- 3
2 --- 4

File diff suppressed because it is too large Load Diff

View File

@ -7,8 +7,8 @@ description: Operations executed bracket.kcl
"labeledArgs": {
"data": {
"value": {
"type": "String",
"value": "XZ"
"type": "Plane",
"artifact_id": "[uuid]"
},
"sourceRange": []
}

File diff suppressed because it is too large Load Diff

View File

@ -1,264 +1,264 @@
```mermaid
flowchart LR
subgraph path2 [Path]
2["Path<br>[571, 643, 5]"]
3["Segment<br>[571, 643, 5]"]
2["Path<br>[567, 618, 5]"]
3["Segment<br>[567, 618, 5]"]
4[Solid2d]
end
subgraph path11 [Path]
11["Path<br>[828, 905, 5]"]
12["Segment<br>[828, 905, 5]"]
11["Path<br>[803, 859, 5]"]
12["Segment<br>[803, 859, 5]"]
13[Solid2d]
end
subgraph path19 [Path]
19["Path<br>[1030, 1104, 5]"]
20["Segment<br>[1030, 1104, 5]"]
19["Path<br>[984, 1037, 5]"]
20["Segment<br>[984, 1037, 5]"]
21[Solid2d]
end
subgraph path30 [Path]
30["Path<br>[1486, 1526, 5]"]
31["Segment<br>[1486, 1526, 5]"]
30["Path<br>[1420, 1460, 5]"]
31["Segment<br>[1420, 1460, 5]"]
32[Solid2d]
end
subgraph path38 [Path]
38["Path<br>[1630, 1702, 5]"]
39["Segment<br>[1630, 1702, 5]"]
38["Path<br>[1564, 1615, 5]"]
39["Segment<br>[1564, 1615, 5]"]
40[Solid2d]
end
subgraph path47 [Path]
47["Path<br>[1835, 1909, 5]"]
48["Segment<br>[1835, 1909, 5]"]
47["Path<br>[1748, 1801, 5]"]
48["Segment<br>[1748, 1801, 5]"]
49[Solid2d]
end
subgraph path58 [Path]
58["Path<br>[2151, 2244, 5]"]
59["Segment<br>[2151, 2244, 5]"]
58["Path<br>[2044, 2116, 5]"]
59["Segment<br>[2044, 2116, 5]"]
60[Solid2d]
end
subgraph path81 [Path]
81["Path<br>[2500, 2531, 5]"]
82["Segment<br>[2537, 2557, 5]"]
83["Segment<br>[2563, 2583, 5]"]
84["Segment<br>[2589, 2610, 5]"]
85["Segment<br>[2616, 2672, 5]"]
86["Segment<br>[2678, 2685, 5]"]
81["Path<br>[2373, 2404, 5]"]
82["Segment<br>[2410, 2430, 5]"]
83["Segment<br>[2436, 2456, 5]"]
84["Segment<br>[2462, 2483, 5]"]
85["Segment<br>[2489, 2545, 5]"]
86["Segment<br>[2551, 2558, 5]"]
87[Solid2d]
end
subgraph path106 [Path]
106["Path<br>[2986, 3018, 5]"]
107["Segment<br>[3024, 3045, 5]"]
108["Segment<br>[3051, 3071, 5]"]
109["Segment<br>[3077, 3097, 5]"]
110["Segment<br>[3103, 3159, 5]"]
111["Segment<br>[3165, 3172, 5]"]
106["Path<br>[2860, 2892, 5]"]
107["Segment<br>[2898, 2919, 5]"]
108["Segment<br>[2925, 2945, 5]"]
109["Segment<br>[2951, 2971, 5]"]
110["Segment<br>[2977, 3033, 5]"]
111["Segment<br>[3039, 3046, 5]"]
112[Solid2d]
end
subgraph path132 [Path]
132["Path<br>[354, 431, 4]"]
133["Segment<br>[354, 431, 4]"]
132["Path<br>[350, 406, 4]"]
133["Segment<br>[350, 406, 4]"]
134[Solid2d]
end
subgraph path135 [Path]
135["Path<br>[442, 519, 4]"]
136["Segment<br>[442, 519, 4]"]
135["Path<br>[417, 473, 4]"]
136["Segment<br>[417, 473, 4]"]
137[Solid2d]
end
subgraph path144 [Path]
144["Path<br>[684, 761, 4]"]
145["Segment<br>[684, 761, 4]"]
144["Path<br>[638, 694, 4]"]
145["Segment<br>[638, 694, 4]"]
146[Solid2d]
end
subgraph path147 [Path]
147["Path<br>[772, 849, 4]"]
148["Segment<br>[772, 849, 4]"]
147["Path<br>[705, 761, 4]"]
148["Segment<br>[705, 761, 4]"]
149[Solid2d]
end
subgraph path156 [Path]
156["Path<br>[993, 1068, 4]"]
157["Segment<br>[993, 1068, 4]"]
156["Path<br>[905, 959, 4]"]
157["Segment<br>[905, 959, 4]"]
158[Solid2d]
end
subgraph path167 [Path]
167["Path<br>[1345, 1426, 4]"]
168["Segment<br>[1345, 1426, 4]"]
167["Path<br>[1237, 1297, 4]"]
168["Segment<br>[1237, 1297, 4]"]
169[Solid2d]
end
subgraph path179 [Path]
179["Path<br>[1785, 1831, 4]"]
180["Segment<br>[1837, 1889, 4]"]
181["Segment<br>[1895, 2000, 4]"]
182["Segment<br>[2006, 2028, 4]"]
183["Segment<br>[2034, 2090, 4]"]
184["Segment<br>[2096, 2103, 4]"]
179["Path<br>[1655, 1701, 4]"]
180["Segment<br>[1707, 1759, 4]"]
181["Segment<br>[1765, 1870, 4]"]
182["Segment<br>[1876, 1898, 4]"]
183["Segment<br>[1904, 1960, 4]"]
184["Segment<br>[1966, 1973, 4]"]
185[Solid2d]
end
subgraph path195 [Path]
195["Path<br>[2239, 2285, 4]"]
196["Segment<br>[2291, 2343, 4]"]
197["Segment<br>[2349, 2456, 4]"]
198["Segment<br>[2462, 2499, 4]"]
199["Segment<br>[2505, 2561, 4]"]
200["Segment<br>[2567, 2574, 4]"]
195["Path<br>[2107, 2153, 4]"]
196["Segment<br>[2159, 2211, 4]"]
197["Segment<br>[2217, 2324, 4]"]
198["Segment<br>[2330, 2367, 4]"]
199["Segment<br>[2373, 2429, 4]"]
200["Segment<br>[2435, 2442, 4]"]
201[Solid2d]
end
subgraph path212 [Path]
212["Path<br>[3085, 3132, 4]"]
213["Segment<br>[3140, 3480, 4]"]
214["Segment<br>[3488, 3520, 4]"]
215["Segment<br>[3528, 3872, 4]"]
216["Segment<br>[3880, 3936, 4]"]
217["Segment<br>[3944, 3951, 4]"]
212["Path<br>[2953, 3000, 4]"]
213["Segment<br>[3008, 3348, 4]"]
214["Segment<br>[3356, 3388, 4]"]
215["Segment<br>[3396, 3740, 4]"]
216["Segment<br>[3748, 3804, 4]"]
217["Segment<br>[3812, 3819, 4]"]
218[Solid2d]
end
subgraph path235 [Path]
235["Path<br>[3085, 3132, 4]"]
236["Segment<br>[3140, 3480, 4]"]
237["Segment<br>[3488, 3520, 4]"]
238["Segment<br>[3528, 3872, 4]"]
239["Segment<br>[3880, 3936, 4]"]
240["Segment<br>[3944, 3951, 4]"]
235["Path<br>[2953, 3000, 4]"]
236["Segment<br>[3008, 3348, 4]"]
237["Segment<br>[3356, 3388, 4]"]
238["Segment<br>[3396, 3740, 4]"]
239["Segment<br>[3748, 3804, 4]"]
240["Segment<br>[3812, 3819, 4]"]
241[Solid2d]
end
subgraph path258 [Path]
258["Path<br>[4480, 4575, 4]"]
259["Segment<br>[4581, 4614, 4]"]
260["Segment<br>[4620, 4671, 4]"]
261["Segment<br>[4677, 4710, 4]"]
262["Segment<br>[4716, 4766, 4]"]
263["Segment<br>[4772, 4813, 4]"]
264["Segment<br>[4819, 4868, 4]"]
265["Segment<br>[4874, 4907, 4]"]
266["Segment<br>[4913, 4947, 4]"]
267["Segment<br>[4953, 4987, 4]"]
268["Segment<br>[4993, 5045, 4]"]
269["Segment<br>[5051, 5085, 4]"]
270["Segment<br>[5091, 5167, 4]"]
271["Segment<br>[5173, 5206, 4]"]
272["Segment<br>[5212, 5288, 4]"]
273["Segment<br>[5294, 5328, 4]"]
274["Segment<br>[5334, 5408, 4]"]
275["Segment<br>[5414, 5448, 4]"]
276["Segment<br>[5454, 5505, 4]"]
277["Segment<br>[5511, 5573, 4]"]
278["Segment<br>[5579, 5630, 4]"]
279["Segment<br>[5636, 5670, 4]"]
280["Segment<br>[5676, 5709, 4]"]
281["Segment<br>[5715, 5748, 4]"]
282["Segment<br>[5754, 5761, 4]"]
258["Path<br>[4347, 4442, 4]"]
259["Segment<br>[4448, 4481, 4]"]
260["Segment<br>[4487, 4538, 4]"]
261["Segment<br>[4544, 4577, 4]"]
262["Segment<br>[4583, 4633, 4]"]
263["Segment<br>[4639, 4680, 4]"]
264["Segment<br>[4686, 4735, 4]"]
265["Segment<br>[4741, 4774, 4]"]
266["Segment<br>[4780, 4814, 4]"]
267["Segment<br>[4820, 4854, 4]"]
268["Segment<br>[4860, 4912, 4]"]
269["Segment<br>[4918, 4952, 4]"]
270["Segment<br>[4958, 5034, 4]"]
271["Segment<br>[5040, 5073, 4]"]
272["Segment<br>[5079, 5155, 4]"]
273["Segment<br>[5161, 5195, 4]"]
274["Segment<br>[5201, 5275, 4]"]
275["Segment<br>[5281, 5315, 4]"]
276["Segment<br>[5321, 5372, 4]"]
277["Segment<br>[5378, 5440, 4]"]
278["Segment<br>[5446, 5497, 4]"]
279["Segment<br>[5503, 5537, 4]"]
280["Segment<br>[5543, 5576, 4]"]
281["Segment<br>[5582, 5615, 4]"]
282["Segment<br>[5621, 5628, 4]"]
283[Solid2d]
end
subgraph path334 [Path]
334["Path<br>[742, 782, 7]"]
335["Segment<br>[790, 852, 7]"]
336["Segment<br>[860, 896, 7]"]
337["Segment<br>[904, 934, 7]"]
338["Segment<br>[942, 994, 7]"]
339["Segment<br>[1002, 1042, 7]"]
340["Segment<br>[1050, 1085, 7]"]
341["Segment<br>[1093, 1131, 7]"]
342["Segment<br>[1139, 1161, 7]"]
343["Segment<br>[1169, 1176, 7]"]
334["Path<br>[740, 780, 7]"]
335["Segment<br>[788, 850, 7]"]
336["Segment<br>[858, 894, 7]"]
337["Segment<br>[902, 932, 7]"]
338["Segment<br>[940, 992, 7]"]
339["Segment<br>[1000, 1040, 7]"]
340["Segment<br>[1048, 1083, 7]"]
341["Segment<br>[1091, 1129, 7]"]
342["Segment<br>[1137, 1159, 7]"]
343["Segment<br>[1167, 1174, 7]"]
344[Solid2d]
end
subgraph path365 [Path]
365["Path<br>[511, 592, 6]"]
366["Segment<br>[598, 699, 6]"]
367["Segment<br>[705, 790, 6]"]
368["Segment<br>[796, 880, 6]"]
369["Segment<br>[886, 972, 6]"]
370["Segment<br>[978, 1063, 6]"]
371["Segment<br>[1069, 1155, 6]"]
372["Segment<br>[1161, 1284, 6]"]
373["Segment<br>[1290, 1376, 6]"]
374["Segment<br>[1382, 1517, 6]"]
375["Segment<br>[1523, 1609, 6]"]
376["Segment<br>[1615, 1739, 6]"]
377["Segment<br>[1745, 1831, 6]"]
378["Segment<br>[1837, 1922, 6]"]
379["Segment<br>[1928, 2014, 6]"]
380["Segment<br>[2020, 2105, 6]"]
381["Segment<br>[2111, 2196, 6]"]
382["Segment<br>[2202, 2209, 6]"]
365["Path<br>[507, 588, 6]"]
366["Segment<br>[594, 695, 6]"]
367["Segment<br>[701, 786, 6]"]
368["Segment<br>[792, 876, 6]"]
369["Segment<br>[882, 968, 6]"]
370["Segment<br>[974, 1059, 6]"]
371["Segment<br>[1065, 1151, 6]"]
372["Segment<br>[1157, 1280, 6]"]
373["Segment<br>[1286, 1372, 6]"]
374["Segment<br>[1378, 1513, 6]"]
375["Segment<br>[1519, 1605, 6]"]
376["Segment<br>[1611, 1735, 6]"]
377["Segment<br>[1741, 1827, 6]"]
378["Segment<br>[1833, 1918, 6]"]
379["Segment<br>[1924, 2010, 6]"]
380["Segment<br>[2016, 2101, 6]"]
381["Segment<br>[2107, 2192, 6]"]
382["Segment<br>[2198, 2205, 6]"]
383[Solid2d]
end
subgraph path439 [Path]
439["Path<br>[487, 544, 8]"]
440["Segment<br>[550, 656, 8]"]
441["Segment<br>[662, 717, 8]"]
442["Segment<br>[723, 820, 8]"]
443["Segment<br>[826, 858, 8]"]
444["Segment<br>[864, 896, 8]"]
445["Segment<br>[902, 933, 8]"]
446["Segment<br>[939, 1054, 8]"]
447["Segment<br>[1060, 1092, 8]"]
448["Segment<br>[1098, 1130, 8]"]
449["Segment<br>[1136, 1167, 8]"]
450["Segment<br>[1173, 1266, 8]"]
451["Segment<br>[1272, 1327, 8]"]
452["Segment<br>[1333, 1406, 8]"]
453["Segment<br>[1412, 1419, 8]"]
439["Path<br>[483, 540, 8]"]
440["Segment<br>[546, 680, 8]"]
441["Segment<br>[686, 741, 8]"]
442["Segment<br>[747, 844, 8]"]
443["Segment<br>[850, 882, 8]"]
444["Segment<br>[888, 920, 8]"]
445["Segment<br>[926, 957, 8]"]
446["Segment<br>[963, 1078, 8]"]
447["Segment<br>[1084, 1116, 8]"]
448["Segment<br>[1122, 1154, 8]"]
449["Segment<br>[1160, 1191, 8]"]
450["Segment<br>[1197, 1290, 8]"]
451["Segment<br>[1296, 1351, 8]"]
452["Segment<br>[1357, 1430, 8]"]
453["Segment<br>[1436, 1443, 8]"]
454[Solid2d]
end
1["Plane<br>[546, 565, 5]"]
5["Sweep Extrusion<br>[652, 708, 5]"]
1["Plane<br>[544, 561, 5]"]
5["Sweep Extrusion<br>[627, 683, 5]"]
6[Wall]
7["Cap Start"]
8["Cap End"]
9["SweepEdge Opposite"]
10["SweepEdge Adjacent"]
14["Sweep Extrusion<br>[918, 980, 5]"]
14["Sweep Extrusion<br>[872, 934, 5]"]
15[Wall]
16["Cap End"]
17["SweepEdge Opposite"]
18["SweepEdge Adjacent"]
22["Sweep Extrusion<br>[1250, 1329, 5]"]
22["Sweep Extrusion<br>[1184, 1263, 5]"]
23[Wall]
24["SweepEdge Opposite"]
25["SweepEdge Adjacent"]
26["Sweep Extrusion<br>[1250, 1329, 5]"]
27["Sweep Extrusion<br>[1250, 1329, 5]"]
28["Sweep Extrusion<br>[1250, 1329, 5]"]
29["Sweep Extrusion<br>[1250, 1329, 5]"]
33["Sweep Extrusion<br>[1532, 1565, 5]"]
26["Sweep Extrusion<br>[1184, 1263, 5]"]
27["Sweep Extrusion<br>[1184, 1263, 5]"]
28["Sweep Extrusion<br>[1184, 1263, 5]"]
29["Sweep Extrusion<br>[1184, 1263, 5]"]
33["Sweep Extrusion<br>[1466, 1499, 5]"]
34[Wall]
35["Cap End"]
36["SweepEdge Opposite"]
37["SweepEdge Adjacent"]
41["Sweep Extrusion<br>[1717, 1782, 5]"]
41["Sweep Extrusion<br>[1630, 1695, 5]"]
42[Wall]
43["Cap Start"]
44["Cap End"]
45["SweepEdge Opposite"]
46["SweepEdge Adjacent"]
50["Sweep Extrusion<br>[2055, 2099, 5]"]
50["Sweep Extrusion<br>[1948, 1992, 5]"]
51[Wall]
52["SweepEdge Opposite"]
53["SweepEdge Adjacent"]
54["Sweep Extrusion<br>[2055, 2099, 5]"]
55["Sweep Extrusion<br>[2055, 2099, 5]"]
56["Sweep Extrusion<br>[2055, 2099, 5]"]
57["Sweep Extrusion<br>[2055, 2099, 5]"]
61["Sweep Extrusion<br>[2398, 2442, 5]"]
54["Sweep Extrusion<br>[1948, 1992, 5]"]
55["Sweep Extrusion<br>[1948, 1992, 5]"]
56["Sweep Extrusion<br>[1948, 1992, 5]"]
57["Sweep Extrusion<br>[1948, 1992, 5]"]
61["Sweep Extrusion<br>[2271, 2315, 5]"]
62[Wall]
63["Cap End"]
64["SweepEdge Opposite"]
65["SweepEdge Adjacent"]
66["Sweep Extrusion<br>[2398, 2442, 5]"]
67["Sweep Extrusion<br>[2398, 2442, 5]"]
68["Sweep Extrusion<br>[2398, 2442, 5]"]
69["Sweep Extrusion<br>[2398, 2442, 5]"]
70["Sweep Extrusion<br>[2398, 2442, 5]"]
71["Sweep Extrusion<br>[2398, 2442, 5]"]
72["Sweep Extrusion<br>[2398, 2442, 5]"]
73["Sweep Extrusion<br>[2398, 2442, 5]"]
74["Sweep Extrusion<br>[2398, 2442, 5]"]
75["Sweep Extrusion<br>[2398, 2442, 5]"]
76["Sweep Extrusion<br>[2398, 2442, 5]"]
77["Sweep Extrusion<br>[2398, 2442, 5]"]
78["Sweep Extrusion<br>[2398, 2442, 5]"]
79["Sweep Extrusion<br>[2398, 2442, 5]"]
80["Sweep Extrusion<br>[2398, 2442, 5]"]
88["Sweep Extrusion<br>[2850, 2918, 5]"]
66["Sweep Extrusion<br>[2271, 2315, 5]"]
67["Sweep Extrusion<br>[2271, 2315, 5]"]
68["Sweep Extrusion<br>[2271, 2315, 5]"]
69["Sweep Extrusion<br>[2271, 2315, 5]"]
70["Sweep Extrusion<br>[2271, 2315, 5]"]
71["Sweep Extrusion<br>[2271, 2315, 5]"]
72["Sweep Extrusion<br>[2271, 2315, 5]"]
73["Sweep Extrusion<br>[2271, 2315, 5]"]
74["Sweep Extrusion<br>[2271, 2315, 5]"]
75["Sweep Extrusion<br>[2271, 2315, 5]"]
76["Sweep Extrusion<br>[2271, 2315, 5]"]
77["Sweep Extrusion<br>[2271, 2315, 5]"]
78["Sweep Extrusion<br>[2271, 2315, 5]"]
79["Sweep Extrusion<br>[2271, 2315, 5]"]
80["Sweep Extrusion<br>[2271, 2315, 5]"]
88["Sweep Extrusion<br>[2724, 2792, 5]"]
89[Wall]
90[Wall]
91[Wall]
@ -272,11 +272,11 @@ flowchart LR
99["SweepEdge Adjacent"]
100["SweepEdge Opposite"]
101["SweepEdge Adjacent"]
102["Sweep Extrusion<br>[2850, 2918, 5]"]
103["Sweep Extrusion<br>[2850, 2918, 5]"]
104["Sweep Extrusion<br>[2850, 2918, 5]"]
105["Sweep Extrusion<br>[2850, 2918, 5]"]
113["Sweep Extrusion<br>[3323, 3397, 5]"]
102["Sweep Extrusion<br>[2724, 2792, 5]"]
103["Sweep Extrusion<br>[2724, 2792, 5]"]
104["Sweep Extrusion<br>[2724, 2792, 5]"]
105["Sweep Extrusion<br>[2724, 2792, 5]"]
113["Sweep Extrusion<br>[3198, 3272, 5]"]
114[Wall]
115[Wall]
116[Wall]
@ -290,41 +290,41 @@ flowchart LR
124["SweepEdge Adjacent"]
125["SweepEdge Opposite"]
126["SweepEdge Adjacent"]
127["Sweep Extrusion<br>[3323, 3397, 5]"]
128["Sweep Extrusion<br>[3323, 3397, 5]"]
129["Sweep Extrusion<br>[3323, 3397, 5]"]
130["Sweep Extrusion<br>[3323, 3397, 5]"]
131["Plane<br>[329, 348, 4]"]
138["Sweep Extrusion<br>[529, 562, 4]"]
127["Sweep Extrusion<br>[3198, 3272, 5]"]
128["Sweep Extrusion<br>[3198, 3272, 5]"]
129["Sweep Extrusion<br>[3198, 3272, 5]"]
130["Sweep Extrusion<br>[3198, 3272, 5]"]
131["Plane<br>[327, 344, 4]"]
138["Sweep Extrusion<br>[483, 516, 4]"]
139[Wall]
140["Cap Start"]
141["Cap End"]
142["SweepEdge Opposite"]
143["SweepEdge Adjacent"]
150["Sweep Extrusion<br>[859, 892, 4]"]
150["Sweep Extrusion<br>[771, 804, 4]"]
151[Wall]
152["Cap Start"]
153["Cap End"]
154["SweepEdge Opposite"]
155["SweepEdge Adjacent"]
159["Sweep Extrusion<br>[1214, 1248, 4]"]
159["Sweep Extrusion<br>[1106, 1140, 4]"]
160[Wall]
161["SweepEdge Opposite"]
162["SweepEdge Adjacent"]
163["Sweep Extrusion<br>[1214, 1248, 4]"]
164["Sweep Extrusion<br>[1214, 1248, 4]"]
165["Sweep Extrusion<br>[1214, 1248, 4]"]
166["Sweep Extrusion<br>[1214, 1248, 4]"]
170["Sweep Extrusion<br>[1572, 1606, 4]"]
163["Sweep Extrusion<br>[1106, 1140, 4]"]
164["Sweep Extrusion<br>[1106, 1140, 4]"]
165["Sweep Extrusion<br>[1106, 1140, 4]"]
166["Sweep Extrusion<br>[1106, 1140, 4]"]
170["Sweep Extrusion<br>[1444, 1478, 4]"]
171[Wall]
172["SweepEdge Opposite"]
173["SweepEdge Adjacent"]
174["Sweep Extrusion<br>[1572, 1606, 4]"]
175["Sweep Extrusion<br>[1572, 1606, 4]"]
176["Sweep Extrusion<br>[1572, 1606, 4]"]
177["Sweep Extrusion<br>[1572, 1606, 4]"]
178["Plane<br>[1760, 1779, 4]"]
186["Sweep Revolve<br>[2109, 2128, 4]"]
174["Sweep Extrusion<br>[1444, 1478, 4]"]
175["Sweep Extrusion<br>[1444, 1478, 4]"]
176["Sweep Extrusion<br>[1444, 1478, 4]"]
177["Sweep Extrusion<br>[1444, 1478, 4]"]
178["Plane<br>[1632, 1649, 4]"]
186["Sweep Revolve<br>[1979, 1998, 4]"]
187[Wall]
188[Wall]
189[Wall]
@ -332,8 +332,8 @@ flowchart LR
191["SweepEdge Adjacent"]
192["SweepEdge Adjacent"]
193["SweepEdge Adjacent"]
194["Plane<br>[2214, 2233, 4]"]
202["Sweep Revolve<br>[2580, 2599, 4]"]
194["Plane<br>[2084, 2101, 4]"]
202["Sweep Revolve<br>[2448, 2467, 4]"]
203[Wall]
204[Wall]
205[Wall]
@ -342,8 +342,8 @@ flowchart LR
208["SweepEdge Adjacent"]
209["SweepEdge Adjacent"]
210["SweepEdge Adjacent"]
211["Plane<br>[3054, 3077, 4]"]
219["Sweep Extrusion<br>[3999, 4045, 4]"]
211["Plane<br>[2922, 2945, 4]"]
219["Sweep Extrusion<br>[3867, 3913, 4]"]
220[Wall]
221[Wall]
222[Wall]
@ -358,8 +358,8 @@ flowchart LR
231["SweepEdge Adjacent"]
232["SweepEdge Opposite"]
233["SweepEdge Adjacent"]
234["Plane<br>[3054, 3077, 4]"]
242["Sweep Extrusion<br>[3999, 4045, 4]"]
234["Plane<br>[2922, 2945, 4]"]
242["Sweep Extrusion<br>[3867, 3913, 4]"]
243[Wall]
244[Wall]
245[Wall]
@ -374,8 +374,8 @@ flowchart LR
254["SweepEdge Adjacent"]
255["SweepEdge Opposite"]
256["SweepEdge Adjacent"]
257["Plane<br>[4455, 4474, 4]"]
284["Sweep Revolve<br>[5767, 5786, 4]"]
257["Plane<br>[4324, 4341, 4]"]
284["Sweep Revolve<br>[5634, 5653, 4]"]
285[Wall]
286[Wall]
287[Wall]
@ -424,8 +424,8 @@ flowchart LR
330["SweepEdge Adjacent"]
331["SweepEdge Adjacent"]
332["SweepEdge Adjacent"]
333["Plane<br>[708, 734, 7]"]
345["Sweep Revolve<br>[1184, 1203, 7]"]
333["Plane<br>[706, 732, 7]"]
345["Sweep Revolve<br>[1182, 1201, 7]"]
346[Wall]
347[Wall]
348[Wall]
@ -444,8 +444,8 @@ flowchart LR
361["SweepEdge Adjacent"]
362["SweepEdge Adjacent"]
363["SweepEdge Adjacent"]
364["Plane<br>[486, 505, 6]"]
384["Sweep Revolve<br>[2247, 2299, 6]"]
364["Plane<br>[484, 501, 6]"]
384["Sweep Revolve<br>[2243, 2295, 6]"]
385[Wall]
386[Wall]
387[Wall]
@ -499,8 +499,8 @@ flowchart LR
435["SweepEdge Adjacent"]
436["SweepEdge Opposite"]
437["SweepEdge Adjacent"]
438["Plane<br>[462, 481, 8]"]
455["Sweep Revolve<br>[1462, 1493, 8]"]
438["Plane<br>[460, 477, 8]"]
455["Sweep Revolve<br>[1486, 1517, 8]"]
456[Wall]
457[Wall]
458[Wall]
@ -529,17 +529,17 @@ flowchart LR
481["SweepEdge Adjacent"]
482["SweepEdge Adjacent"]
483["SweepEdge Adjacent"]
484["StartSketchOnFace<br>[795, 822, 5]"]
485["StartSketchOnFace<br>[993, 1024, 5]"]
486["StartSketchOnFace<br>[1451, 1480, 5]"]
487["StartSketchOnFace<br>[1590, 1624, 5]"]
488["StartSketchOnFace<br>[1796, 1829, 5]"]
489["StartSketchOnFace<br>[2116, 2145, 5]"]
490["StartSketchOnFace<br>[2465, 2494, 5]"]
491["StartSketchOnFace<br>[2947, 2980, 5]"]
492["StartSketchOnFace<br>[649, 678, 4]"]
493["StartSketchOnFace<br>[953, 987, 4]"]
494["StartSketchOnFace<br>[1310, 1339, 4]"]
484["StartSketchOnFace<br>[770, 797, 5]"]
485["StartSketchOnFace<br>[947, 978, 5]"]
486["StartSketchOnFace<br>[1385, 1414, 5]"]
487["StartSketchOnFace<br>[1524, 1558, 5]"]
488["StartSketchOnFace<br>[1709, 1742, 5]"]
489["StartSketchOnFace<br>[2009, 2038, 5]"]
490["StartSketchOnFace<br>[2338, 2367, 5]"]
491["StartSketchOnFace<br>[2821, 2854, 5]"]
492["StartSketchOnFace<br>[603, 632, 4]"]
493["StartSketchOnFace<br>[865, 899, 4]"]
494["StartSketchOnFace<br>[1202, 1231, 4]"]
1 --- 2
2 --- 3
2 ---- 5

View File

@ -301,14 +301,14 @@ description: Result of parsing car-wheel-assembly.kcl
{
"type": "LabeledArg",
"label": {
"commentStart": 436,
"commentStart": 438,
"end": 0,
"name": "arcDegrees",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 449,
"commentStart": 451,
"end": 0,
"raw": "360",
"start": 0,
@ -323,17 +323,17 @@ description: Result of parsing car-wheel-assembly.kcl
{
"type": "LabeledArg",
"label": {
"commentStart": 459,
"commentStart": 463,
"end": 0,
"name": "axis",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 466,
"commentStart": 470,
"elements": [
{
"commentStart": 467,
"commentStart": 471,
"end": 0,
"raw": "0",
"start": 0,
@ -345,7 +345,7 @@ description: Result of parsing car-wheel-assembly.kcl
}
},
{
"commentStart": 470,
"commentStart": 474,
"end": 0,
"raw": "1",
"start": 0,
@ -357,7 +357,7 @@ description: Result of parsing car-wheel-assembly.kcl
}
},
{
"commentStart": 473,
"commentStart": 477,
"end": 0,
"raw": "0",
"start": 0,
@ -378,39 +378,15 @@ description: Result of parsing car-wheel-assembly.kcl
{
"type": "LabeledArg",
"label": {
"commentStart": 482,
"commentStart": 488,
"end": 0,
"name": "center",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 491,
"commentStart": 497,
"elements": [
{
"commentStart": 492,
"end": 0,
"raw": "0",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 0.0,
"suffix": "None"
}
},
{
"commentStart": 495,
"end": 0,
"raw": "0",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 0.0,
"suffix": "None"
}
},
{
"commentStart": 498,
"end": 0,
@ -422,6 +398,30 @@ description: Result of parsing car-wheel-assembly.kcl
"value": 0.0,
"suffix": "None"
}
},
{
"commentStart": 501,
"end": 0,
"raw": "0",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 0.0,
"suffix": "None"
}
},
{
"commentStart": 504,
"end": 0,
"raw": "0",
"start": 0,
"type": "Literal",
"type": "Literal",
"value": {
"value": 0.0,
"suffix": "None"
}
}
],
"end": 0,
@ -433,7 +433,7 @@ description: Result of parsing car-wheel-assembly.kcl
{
"type": "LabeledArg",
"label": {
"commentStart": 507,
"commentStart": 515,
"end": 0,
"name": "instances",
"start": 0,
@ -441,10 +441,10 @@ description: Result of parsing car-wheel-assembly.kcl
},
"arg": {
"abs_path": false,
"commentStart": 519,
"commentStart": 527,
"end": 0,
"name": {
"commentStart": 519,
"commentStart": 527,
"end": 0,
"name": "lugCount",
"start": 0,
@ -459,14 +459,14 @@ description: Result of parsing car-wheel-assembly.kcl
{
"type": "LabeledArg",
"label": {
"commentStart": 534,
"commentStart": 544,
"end": 0,
"name": "rotateDuplicates",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 553,
"commentStart": 563,
"end": 0,
"raw": "false",
"start": 0,
@ -510,16 +510,16 @@ description: Result of parsing car-wheel-assembly.kcl
"type": "ExpressionStatement"
},
{
"commentStart": 564,
"commentStart": 577,
"end": 0,
"expression": {
"body": [
{
"abs_path": false,
"commentStart": 564,
"commentStart": 577,
"end": 0,
"name": {
"commentStart": 564,
"commentStart": 577,
"end": 0,
"name": "brakeCaliper",
"start": 0,
@ -535,17 +535,17 @@ description: Result of parsing car-wheel-assembly.kcl
{
"type": "LabeledArg",
"label": {
"commentStart": 592,
"commentStart": 605,
"end": 0,
"name": "translate",
"start": 0,
"type": "Identifier"
},
"arg": {
"commentStart": 604,
"commentStart": 617,
"elements": [
{
"commentStart": 605,
"commentStart": 618,
"end": 0,
"raw": "0",
"start": 0,
@ -557,7 +557,7 @@ description: Result of parsing car-wheel-assembly.kcl
}
},
{
"commentStart": 608,
"commentStart": 621,
"end": 0,
"raw": "0.5",
"start": 0,
@ -569,7 +569,7 @@ description: Result of parsing car-wheel-assembly.kcl
}
},
{
"commentStart": 613,
"commentStart": 626,
"end": 0,
"raw": "0",
"start": 0,
@ -590,10 +590,10 @@ description: Result of parsing car-wheel-assembly.kcl
],
"callee": {
"abs_path": false,
"commentStart": 582,
"commentStart": 595,
"end": 0,
"name": {
"commentStart": 582,
"commentStart": 595,
"end": 0,
"name": "translate",
"start": 0,
@ -603,7 +603,7 @@ description: Result of parsing car-wheel-assembly.kcl
"start": 0,
"type": "Name"
},
"commentStart": 582,
"commentStart": 595,
"end": 0,
"start": 0,
"type": "CallExpressionKw",
@ -611,7 +611,7 @@ description: Result of parsing car-wheel-assembly.kcl
"unlabeled": null
}
],
"commentStart": 564,
"commentStart": 577,
"end": 0,
"start": 0,
"type": "PipeExpression",
@ -622,14 +622,14 @@ description: Result of parsing car-wheel-assembly.kcl
"type": "ExpressionStatement"
},
{
"commentStart": 617,
"commentStart": 630,
"end": 0,
"expression": {
"abs_path": false,
"commentStart": 617,
"commentStart": 630,
"end": 0,
"name": {
"commentStart": 617,
"commentStart": 630,
"end": 0,
"name": "carTire",
"start": 0,

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