Compare commits

...

6 Commits

Author SHA1 Message Date
0bdc50c78f bump kcl-lib and friends (#6063)
* bump kcl-lib and friends

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

* expose

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

* relevant files

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

* udpates

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

* fixes

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

* updates

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

---------

Signed-off-by: Jess Frazelle <github@jessfraz.com>
2025-03-29 19:26:20 -07:00
57d78b6094 Move artifact graph out of engine connection (#6062)
* cleanups

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

* cleanups

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

* fmt

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

---------

Signed-off-by: Jess Frazelle <github@jessfraz.com>
2025-03-29 20:25:26 -04:00
db5ce7ba85 Move turns to a submodule of std (#6039)
* Move turns to a submodule of std

Signed-off-by: Nick Cameron <nrc@ncameron.org>

* Cache module infos as well as memory; fix a bug with deprecated constants

Signed-off-by: Nick Cameron <nrc@ncameron.org>

---------

Signed-off-by: Nick Cameron <nrc@ncameron.org>
2025-03-30 11:10:44 +13:00
51c16d0048 only rust changes reset scene (#6060)
Signed-off-by: Jess Frazelle <github@jessfraz.com>
2025-03-29 11:43:42 -07:00
6532b23f1c Bump tar-fs from 2.1.1 to 2.1.2 in /rust/kcl-language-server in the security group (#6056) 2025-03-29 16:35:45 +00:00
49304b9ecd fix context closes (#6058)
Signed-off-by: Jess Frazelle <github@jessfraz.com>
2025-03-28 20:31:44 -07:00
100 changed files with 3132 additions and 2926 deletions

View File

@ -9,13 +9,9 @@ layout: manual
### `std`
- [`HALF_TURN`](/docs/kcl/consts/std-HALF_TURN)
- [`QUARTER_TURN`](/docs/kcl/consts/std-QUARTER_TURN)
- [`THREE_QUARTER_TURN`](/docs/kcl/consts/std-THREE_QUARTER_TURN)
- [`XY`](/docs/kcl/consts/std-XY)
- [`XZ`](/docs/kcl/consts/std-XZ)
- [`YZ`](/docs/kcl/consts/std-YZ)
- [`ZERO`](/docs/kcl/consts/std-ZERO)
### `std::math`
@ -23,3 +19,10 @@ layout: manual
- [`PI`](/docs/kcl/consts/std-math-PI)
- [`TAU`](/docs/kcl/consts/std-math-TAU)
### `std::turns`
- [`HALF_TURN`](/docs/kcl/consts/std-turns-HALF_TURN)
- [`QUARTER_TURN`](/docs/kcl/consts/std-turns-QUARTER_TURN)
- [`THREE_QUARTER_TURN`](/docs/kcl/consts/std-turns-THREE_QUARTER_TURN)
- [`ZERO`](/docs/kcl/consts/std-turns-ZERO)

View File

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

View File

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

View File

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

View File

@ -1,15 +0,0 @@
---
title: "std::ZERO"
excerpt: ""
layout: manual
---
```js
std::ZERO: number = 0
```

View File

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

View File

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

View File

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

View File

@ -0,0 +1,15 @@
---
title: "std::turns::ZERO"
excerpt: ""
layout: manual
---
```js
std::turns::ZERO: number = 0
```

View File

@ -23,19 +23,15 @@ layout: manual
* [`tag`](kcl/types/tag)
* **std**
* [`Face`](kcl/types/Face)
* [`HALF_TURN`](kcl/consts/std-HALF_TURN)
* [`Helix`](kcl/types/Helix)
* [`Plane`](kcl/types/Plane)
* [`Point2d`](kcl/types/Point2d)
* [`Point3d`](kcl/types/Point3d)
* [`QUARTER_TURN`](kcl/consts/std-QUARTER_TURN)
* [`Sketch`](kcl/types/Sketch)
* [`Solid`](kcl/types/Solid)
* [`THREE_QUARTER_TURN`](kcl/consts/std-THREE_QUARTER_TURN)
* [`XY`](kcl/consts/std-XY)
* [`XZ`](kcl/consts/std-XZ)
* [`YZ`](kcl/consts/std-YZ)
* [`ZERO`](kcl/consts/std-ZERO)
* [`abs`](kcl/abs)
* [`acos`](kcl/acos)
* [`angleToMatchLengthX`](kcl/angleToMatchLengthX)
@ -146,3 +142,8 @@ layout: manual
* [`tan`](kcl/std-math-tan)
* **std::sketch**
* [`circle`](kcl/std-sketch-circle)
* **std::turns**
* [`turns::HALF_TURN`](kcl/consts/std-turns-HALF_TURN)
* [`turns::QUARTER_TURN`](kcl/consts/std-turns-QUARTER_TURN)
* [`turns::THREE_QUARTER_TURN`](kcl/consts/std-turns-THREE_QUARTER_TURN)
* [`turns::ZERO`](kcl/consts/std-turns-ZERO)

View File

@ -76,11 +76,11 @@ part001 = startSketchOn(-XZ)
|> xLine(endAbsolute = totalLen, tag = $seg03)
|> yLine(length = -armThick, tag = $seg01)
|> angledLineThatIntersects({
angle = HALF_TURN,
angle = turns::HALF_TURN,
offset = -armThick,
intersectTag = seg04
}, %)
|> angledLineToY([segAng(seg04, %) + 180, ZERO], %)
|> angledLineToY([segAng(seg04, %) + 180, turns::ZERO], %)
|> angledLineToY({
angle = -bottomAng,
to = -totalHeightHalf - armThick,
@ -88,12 +88,12 @@ part001 = startSketchOn(-XZ)
|> xLine(length = endAbsolute = segEndX(seg03) + 0)
|> yLine(length = -segLen(seg01, %))
|> angledLineThatIntersects({
angle = HALF_TURN,
angle = turns::HALF_TURN,
offset = -armThick,
intersectTag = seg02
}, %)
|> angledLineToY([segAng(seg02, %) + 180, -baseHeight], %)
|> xLine(endAbsolute = ZERO)
|> xLine(endAbsolute = turns::ZERO)
|> close()
|> extrude(length = 4)`
)

View File

@ -486,13 +486,13 @@ test.describe('Testing constraints', { tag: ['@skipWin'] }, () => {
testName: 'Add variable, selecting axis',
addVariable: true,
axisSelect: true,
value: 'QUARTER_TURN - angle001',
value: 'turns::QUARTER_TURN - angle001',
},
{
testName: 'No variable, selecting axis',
addVariable: false,
axisSelect: true,
value: 'QUARTER_TURN - 7',
value: 'turns::QUARTER_TURN - 7',
},
] as const
for (const { testName, addVariable, value, axisSelect } of cases) {
@ -935,12 +935,12 @@ part002 = startSketchOn(XZ)
test.describe('Axis & segment - no modal constraints', () => {
const cases = [
{
codeAfter: `|> line(endAbsolute = [154.9, ZERO])`,
codeAfter: `|> line(endAbsolute = [154.9, turns::ZERO])`,
axisClick: { x: 950, y: 250 },
constraintName: 'Snap To X',
},
{
codeAfter: `|> line(endAbsolute = [ZERO, 61.34])`,
codeAfter: `|> line(endAbsolute = [turns::ZERO, 61.34])`,
axisClick: { x: 600, y: 150 },
constraintName: 'Snap To Y',
},

View File

@ -67,11 +67,11 @@ part001 = startSketchOn(-XZ)
|> xLine(endAbsolute = totalLen, tag = $seg03)
|> yLine(length = -armThick, tag = $seg01)
|> angledLineThatIntersects({
angle = HALF_TURN,
angle = turns::HALF_TURN,
offset = -armThick,
intersectTag = seg04
}, %)
|> angledLineToY([segAng(seg04) + 180, ZERO], %)
|> angledLineToY([segAng(seg04) + 180, turns::ZERO], %)
|> angledLineToY({
angle = -bottomAng,
to = -totalHeightHalf - armThick,
@ -79,12 +79,12 @@ part001 = startSketchOn(-XZ)
|> xLine(endAbsolute = segEndX(seg03) + 0)
|> yLine(length = -segLen(seg01))
|> angledLineThatIntersects({
angle = HALF_TURN,
angle = turns::HALF_TURN,
offset = -armThick,
intersectTag = seg02
}, %)
|> angledLineToY([segAng(seg02) + 180, -baseHeight], %)
|> xLine(endAbsolute = ZERO)
|> xLine(endAbsolute = turns::ZERO)
|> close()
|> extrude(length = 4)`
)

View File

@ -14,7 +14,7 @@ radius = 10
depth = 30
distanceToInsideEdge = slateWidthHalf + templateThickness + templateGap
sketch001 = startSketchOn(XZ)
|> startProfileAt([ZERO, depth + templateGap], %)
|> startProfileAt([0, depth + templateGap], %)
|> xLine(length = slateWidthHalf - radius, tag = $seg01)
|> arc({
angleEnd = 0,
@ -28,7 +28,7 @@ sketch001 = startSketchOn(XZ)
|> yLine(length = templateThickness * 2, tag = $seg08)
|> xLine(endAbsolute = segEndX(seg02) + 0, tag = $seg05)
|> yLine(endAbsolute = segEndY(seg01) + templateThickness, tag = $seg10)
|> xLine(endAbsolute = ZERO, tag = $seg04)
|> xLine(endAbsolute = 0, tag = $seg04)
|> xLine(length = -segLen(seg04))
|> yLine(length = -segLen(seg10))
|> xLine(length = -segLen(seg05))

View File

@ -28,7 +28,7 @@ sketch001 = startSketchOn(XZ)
|> yLine(endAbsolute = -templateGap * 2 - (templateDiameter / 2), tag = $seg05)
|> xLine(endAbsolute = slateWidthHalf + templateThickness, tag = $seg04)
|> yLine(length = -length002, tag = $seg03)
|> xLine(endAbsolute = ZERO, tag = $seg02)
|> xLine(endAbsolute = 0, tag = $seg02)
// |> line(end = [7.78, 11.16])
|> xLine(length = -segLen(seg02))
|> yLine(length = segLen(seg03))

24
rust/Cargo.lock generated
View File

@ -1780,7 +1780,7 @@ dependencies = [
[[package]]
name = "kcl-bumper"
version = "0.1.55"
version = "0.1.56"
dependencies = [
"anyhow",
"clap",
@ -1791,7 +1791,7 @@ dependencies = [
[[package]]
name = "kcl-derive-docs"
version = "0.1.55"
version = "0.1.56"
dependencies = [
"Inflector",
"anyhow",
@ -1810,7 +1810,7 @@ dependencies = [
[[package]]
name = "kcl-directory-test-macro"
version = "0.1.55"
version = "0.1.56"
dependencies = [
"proc-macro2",
"quote",
@ -1819,7 +1819,7 @@ dependencies = [
[[package]]
name = "kcl-language-server"
version = "0.2.55"
version = "0.2.56"
dependencies = [
"anyhow",
"clap",
@ -1840,7 +1840,7 @@ dependencies = [
[[package]]
name = "kcl-language-server-release"
version = "0.1.55"
version = "0.1.56"
dependencies = [
"anyhow",
"clap",
@ -1860,7 +1860,7 @@ dependencies = [
[[package]]
name = "kcl-lib"
version = "0.2.55"
version = "0.2.56"
dependencies = [
"anyhow",
"approx 0.5.1",
@ -1928,7 +1928,7 @@ dependencies = [
[[package]]
name = "kcl-python-bindings"
version = "0.3.55"
version = "0.3.56"
dependencies = [
"anyhow",
"kcl-lib",
@ -1943,7 +1943,7 @@ dependencies = [
[[package]]
name = "kcl-test-server"
version = "0.1.55"
version = "0.1.56"
dependencies = [
"anyhow",
"hyper 0.14.32",
@ -1956,7 +1956,7 @@ dependencies = [
[[package]]
name = "kcl-to-core"
version = "0.1.55"
version = "0.1.56"
dependencies = [
"anyhow",
"async-trait",
@ -1970,7 +1970,7 @@ dependencies = [
[[package]]
name = "kcl-wasm-lib"
version = "0.1.55"
version = "0.1.56"
dependencies = [
"bson",
"console_error_panic_hook",
@ -1996,9 +1996,9 @@ dependencies = [
[[package]]
name = "kittycad"
version = "0.3.33"
version = "0.3.36"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4f6f65645cc07a8f43c34584e4979bf4da16c047cce50c4715fa9381227574d5"
checksum = "0a345fd2a4cb16205f32bd1aa41715045830c59d78c59927fca6580e2a651ac9"
dependencies = [
"anyhow",
"async-trait",

View File

@ -35,7 +35,7 @@ clap = { version = "4.5.31", features = ["derive"] }
dashmap = { version = "6.1.0" }
http = "1"
indexmap = "2.7.0"
kittycad = { version = "0.3.33", default-features = false, features = ["js", "requests"] }
kittycad = { version = "0.3.36", default-features = false, features = ["js", "requests"] }
kittycad-modeling-cmds = { version = "0.2.107", features = ["ts-rs", "websocket"] }
lazy_static = "1.5.0"
miette = "7.5.0"

View File

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

View File

@ -2194,9 +2194,9 @@ supports-color@^8.1.1:
has-flag "^4.0.0"
tar-fs@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784"
integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==
version "2.1.2"
resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.2.tgz#425f154f3404cb16cb8ff6e671d45ab2ed9596c5"
integrity sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==
dependencies:
chownr "^1.1.1"
mkdirp-classic "^0.5.2"

View File

@ -1,7 +1,7 @@
[package]
name = "kcl-lib"
description = "KittyCAD Language implementation and tools"
version = "0.2.55"
version = "0.2.56"
edition = "2021"
license = "MIT"
repository = "https://github.com/KittyCAD/modeling-app"
@ -104,7 +104,7 @@ tower-lsp = { workspace = true, features = ["proposed", "default"] }
[features]
default = ["engine"]
cli = ["dep:clap"]
cli = ["dep:clap", "kittycad/clap"]
dhat-heap = ["dep:dhat"]
# For the lsp server, when run with stdout for rpc we want to disable println.
# This is used for editor extensions that use the lsp server.

View File

@ -1,6 +1,8 @@
//! Cache testing framework.
use kcl_lib::{bust_cache, ExecError, ExecOutcome};
use kcmc::{each_cmd as mcmd, ModelingCmd};
use kittycad_modeling_cmds as kcmc;
#[derive(Debug)]
struct Variation<'a> {
@ -253,3 +255,71 @@ extrude(sketch001, length = 4)
second.artifact_graph.len()
);
}
#[tokio::test(flavor = "multi_thread")]
async fn kcl_test_cache_empty_file_pop_cache_empty_file_planes_work() {
// Get the current working directory.
let code = "";
let ctx = kcl_lib::ExecutorContext::new_with_default_client(Default::default())
.await
.unwrap();
let program = kcl_lib::Program::parse_no_errs(code).unwrap();
let outcome = ctx.run_with_caching(program).await.unwrap();
// Ensure nothing is left in the batch
assert!(ctx.engine.batch().read().await.is_empty());
assert!(ctx.engine.batch_end().read().await.is_empty());
// Ensure the planes work, and we can show or hide them.
// Hide/show the grid.
let default_planes = ctx.engine.get_default_planes().read().await.clone().unwrap();
// Assure the outcome is the same.
assert_eq!(outcome.default_planes, Some(default_planes.clone()));
ctx.engine
.send_modeling_cmd(
uuid::Uuid::new_v4(),
Default::default(),
&ModelingCmd::from(mcmd::ObjectVisible {
hidden: false,
object_id: default_planes.xy,
}),
)
.await
.unwrap();
// Now simulate an engine pause/network disconnect.
// Raw dog clear the scene entirely.
ctx.engine
.send_modeling_cmd(
uuid::Uuid::new_v4(),
Default::default(),
&ModelingCmd::from(mcmd::SceneClearAll {}),
)
.await
.unwrap();
// Bust the cache and reset the scene.
let outcome = ctx.bust_cache_and_reset_scene().await.unwrap();
// Get the default planes.
let default_planes = ctx.engine.get_default_planes().read().await.clone().unwrap();
assert_eq!(outcome.default_planes, Some(default_planes.clone()));
// Ensure we can show a plane.
ctx.engine
.send_modeling_cmd(
uuid::Uuid::new_v4(),
Default::default(),
&ModelingCmd::from(mcmd::ObjectVisible {
hidden: false,
object_id: default_planes.xz,
}),
)
.await
.unwrap();
ctx.close().await;
}

View File

@ -53,7 +53,7 @@ pub trait CoreDump: Clone {
.meta()
.create_debug_uploads(vec![kittycad::types::multipart::Attachment {
name: "".to_string(),
filename: Some(format!(r#"modeling-app/coredump-{coredump_id}-screenshot.png"#)),
filepath: Some(format!(r#"modeling-app/coredump-{coredump_id}-screenshot.png"#).into()),
content_type: Some("image/png".to_string()),
data,
}])
@ -101,7 +101,7 @@ pub trait CoreDump: Clone {
.meta()
.create_debug_uploads(vec![kittycad::types::multipart::Attachment {
name: "".to_string(),
filename: Some(format!(r#"modeling-app/coredump-{}.json"#, coredump_id)),
filepath: Some(format!(r#"modeling-app/coredump-{}.json"#, coredump_id).into()),
content_type: Some("application/json".to_string()),
data,
}])

View File

@ -339,9 +339,9 @@ fn generate_index(combined: &IndexMap<String, Box<dyn StdLibFn>>, kcl_lib: &[Doc
}
functions.entry(d.mod_name()).or_default().push(match d {
DocData::Fn(f) => (f.name.clone(), d.file_name()),
DocData::Const(c) => (c.name.clone(), d.file_name()),
DocData::Ty(t) => (t.name.clone(), d.file_name()),
DocData::Fn(f) => (f.preferred_name.clone(), d.file_name()),
DocData::Const(c) => (c.preferred_name.clone(), d.file_name()),
DocData::Ty(t) => (t.preferred_name.clone(), d.file_name()),
});
if let DocData::Const(c) = d {

View File

@ -9,7 +9,7 @@ use tower_lsp::lsp_types::{
use crate::{
execution::annotations,
parsing::{
ast::types::{Annotation, Node, PrimitiveType, Type, VariableKind},
ast::types::{Annotation, ImportSelector, Node, PrimitiveType, Type, VariableKind},
token::NumericSuffix,
},
ModuleId,
@ -17,7 +17,7 @@ use crate::{
pub fn walk_prelude() -> Vec<DocData> {
let mut visitor = CollectionVisitor::default();
visitor.visit_module("prelude").unwrap();
visitor.visit_module("prelude", "").unwrap();
visitor.result
}
@ -29,7 +29,7 @@ struct CollectionVisitor {
}
impl CollectionVisitor {
fn visit_module(&mut self, name: &str) -> Result<(), String> {
fn visit_module(&mut self, name: &str, preferred_prefix: &str) -> Result<(), String> {
let old_name = std::mem::replace(&mut self.name, name.to_owned());
let source = crate::modules::read_std(name).unwrap();
let parsed = crate::parsing::parse_str(source, ModuleId::from_usize(self.id))
@ -40,14 +40,16 @@ impl CollectionVisitor {
for n in &parsed.body {
match n {
crate::parsing::ast::types::BodyItem::ImportStatement(import) if !import.visibility.is_default() => {
// Only supports glob imports for now.
assert!(matches!(
import.selector,
crate::parsing::ast::types::ImportSelector::Glob(..)
));
match &import.path {
crate::parsing::ast::types::ImportPath::Std { path } => {
self.visit_module(&path[1])?;
match import.selector {
ImportSelector::Glob(..) => self.visit_module(&path[1], "")?,
ImportSelector::None { .. } => {
self.visit_module(&path[1], &format!("{}::", import.module_name().unwrap()))?
}
// Only supports glob or whole-module imports for now.
_ => unimplemented!(),
}
}
p => return Err(format!("Unexpected import: `{p}`")),
}
@ -59,8 +61,8 @@ impl CollectionVisitor {
format!("std::{}::", self.name)
};
let mut dd = match var.kind {
VariableKind::Fn => DocData::Fn(FnData::from_ast(var, qual_name)),
VariableKind::Const => DocData::Const(ConstData::from_ast(var, qual_name)),
VariableKind::Fn => DocData::Fn(FnData::from_ast(var, qual_name, preferred_prefix)),
VariableKind::Const => DocData::Const(ConstData::from_ast(var, qual_name, preferred_prefix)),
};
dd.with_meta(&var.outer_attrs);
@ -77,7 +79,7 @@ impl CollectionVisitor {
} else {
format!("std::{}::", self.name)
};
let mut dd = DocData::Ty(TyData::from_ast(ty, qual_name));
let mut dd = DocData::Ty(TyData::from_ast(ty, qual_name, preferred_prefix));
dd.with_meta(&ty.outer_attrs);
for a in &ty.outer_attrs {
@ -200,6 +202,8 @@ impl DocData {
#[derive(Debug, Clone)]
pub struct ConstData {
pub name: String,
/// How the const is indexed, etc.
pub preferred_name: String,
/// The fully qualified name.
pub qual_name: String,
pub value: Option<String>,
@ -216,7 +220,11 @@ pub struct ConstData {
}
impl ConstData {
fn from_ast(var: &crate::parsing::ast::types::VariableDeclaration, mut qual_name: String) -> Self {
fn from_ast(
var: &crate::parsing::ast::types::VariableDeclaration,
mut qual_name: String,
preferred_prefix: &str,
) -> Self {
assert_eq!(var.kind, crate::parsing::ast::types::VariableKind::Const);
let (value, ty) = match &var.declaration.init {
@ -240,6 +248,7 @@ impl ConstData {
let name = var.declaration.id.name.clone();
qual_name.push_str(&name);
ConstData {
preferred_name: format!("{preferred_prefix}{name}"),
name,
qual_name,
value,
@ -272,7 +281,7 @@ impl ConstData {
detail.push_str(ty);
}
CompletionItem {
label: self.name.clone(),
label: self.preferred_name.clone(),
label_details: Some(CompletionItemLabelDetails {
detail: self.value.clone(),
description: None,
@ -306,6 +315,8 @@ impl ConstData {
pub struct FnData {
/// The name of the function.
pub name: String,
/// How the function is indexed, etc.
pub preferred_name: String,
/// The fully qualified name.
pub qual_name: String,
/// The args of the function.
@ -326,7 +337,11 @@ pub struct FnData {
}
impl FnData {
fn from_ast(var: &crate::parsing::ast::types::VariableDeclaration, mut qual_name: String) -> Self {
fn from_ast(
var: &crate::parsing::ast::types::VariableDeclaration,
mut qual_name: String,
preferred_prefix: &str,
) -> Self {
assert_eq!(var.kind, crate::parsing::ast::types::VariableKind::Fn);
let crate::parsing::ast::types::Expr::FunctionExpression(expr) = &var.declaration.init else {
unreachable!();
@ -345,6 +360,7 @@ impl FnData {
}
FnData {
preferred_name: format!("{preferred_prefix}{name}"),
name,
qual_name,
args: expr.params.iter().map(ArgData::from_ast).collect(),
@ -443,7 +459,7 @@ impl FnData {
}
// We end with ${} so you can jump to the end of the snippet.
// After the last argument.
format!("{}({})${{}}", self.name, args.join(", "))
format!("{}({})${{}}", self.preferred_name, args.join(", "))
}
fn to_signature_help(&self) -> SignatureHelp {
@ -452,7 +468,7 @@ impl FnData {
SignatureHelp {
signatures: vec![SignatureInformation {
label: self.name.clone(),
label: self.preferred_name.clone(),
documentation: self.short_docs().map(|s| {
Documentation::MarkupContent(MarkupContent {
kind: MarkupKind::Markdown,
@ -580,6 +596,8 @@ impl ArgKind {
pub struct TyData {
/// The name of the function.
pub name: String,
/// How the type is indexed, etc.
pub preferred_name: String,
/// The fully qualified name.
pub qual_name: String,
pub properties: Properties,
@ -597,7 +615,11 @@ pub struct TyData {
}
impl TyData {
fn from_ast(ty: &crate::parsing::ast::types::TypeDeclaration, mut qual_name: String) -> Self {
fn from_ast(
ty: &crate::parsing::ast::types::TypeDeclaration,
mut qual_name: String,
preferred_prefix: &str,
) -> Self {
let name = ty.name.name.clone();
qual_name.push_str(&name);
let mut referenced_types = HashSet::new();
@ -606,6 +628,7 @@ impl TyData {
}
TyData {
preferred_name: format!("{preferred_prefix}{name}"),
name,
qual_name,
properties: Properties {
@ -641,7 +664,7 @@ impl TyData {
fn to_completion_item(&self) -> CompletionItem {
CompletionItem {
label: self.name.clone(),
label: self.preferred_name.clone(),
label_details: self.alias.as_ref().map(|t| CompletionItemLabelDetails {
detail: Some(format!("type {} = {t}", self.name)),
description: None,
@ -658,7 +681,7 @@ impl TyData {
preselect: None,
sort_text: None,
filter_text: None,
insert_text: Some(self.name.clone()),
insert_text: Some(self.preferred_name.clone()),
insert_text_format: Some(InsertTextFormat::SNIPPET),
insert_text_mode: None,
text_edit: None,

View File

@ -6,7 +6,7 @@ use itertools::{EitherOrBoth, Itertools};
use tokio::sync::RwLock;
use crate::{
execution::{annotations, memory::Stack, EnvironmentRef, ExecState, ExecutorSettings},
execution::{annotations, memory::Stack, state::ModuleInfoMap, EnvironmentRef, ExecState, ExecutorSettings},
parsing::ast::types::{Annotation, Node, Program},
walk::Node as WalkNode,
};
@ -15,7 +15,7 @@ lazy_static::lazy_static! {
/// A static mutable lock for updating the last successful execution state for the cache.
static ref OLD_AST: Arc<RwLock<Option<OldAstState>>> = Default::default();
// The last successful run's memory. Not cleared after an unssuccessful run.
static ref PREV_MEMORY: Arc<RwLock<Option<Stack>>> = Default::default();
static ref PREV_MEMORY: Arc<RwLock<Option<(Stack, ModuleInfoMap)>>> = Default::default();
}
/// Read the old ast memory from the lock.
@ -29,12 +29,12 @@ pub(super) async fn write_old_ast(old_state: OldAstState) {
*old_ast = Some(old_state);
}
pub(crate) async fn read_old_memory() -> Option<Stack> {
pub(crate) async fn read_old_memory() -> Option<(Stack, ModuleInfoMap)> {
let old_mem = PREV_MEMORY.read().await;
old_mem.clone()
}
pub(super) async fn write_old_memory(mem: Stack) {
pub(super) async fn write_old_memory(mem: (Stack, ModuleInfoMap)) {
let mut old_mem = PREV_MEMORY.write().await;
*old_mem = Some(mem);
}

View File

@ -529,6 +529,18 @@ impl ExecutorContext {
.await
}
pub async fn bust_cache_and_reset_scene(&self) -> Result<ExecOutcome, KclErrorWithOutputs> {
cache::bust_cache().await;
// Execute an empty program to clear and reset the scene.
// We specifically want to be returned the objects after the scene is reset.
// Like the default planes so it is easier to just execute an empty program
// after the cache is busted.
let outcome = self.run_with_caching(crate::Program::empty()).await?;
Ok(outcome)
}
async fn prepare_mem(&self, exec_state: &mut ExecState) -> Result<(), KclErrorWithOutputs> {
self.eval_prelude(exec_state, SourceRange::synthetic())
.await
@ -547,7 +559,10 @@ impl ExecutorContext {
let mut exec_state = ExecState::new(self);
if use_prev_memory {
match cache::read_old_memory().await {
Some(mem) => *exec_state.mut_stack() = mem,
Some(mem) => {
*exec_state.mut_stack() = mem.0;
exec_state.global.module_infos = mem.1;
}
None => self.prepare_mem(&mut exec_state).await?,
}
} else {
@ -565,10 +580,11 @@ impl ExecutorContext {
// memory, not to the exec_state which is not cached for mock execution.
let mut mem = exec_state.stack().clone();
let module_infos = exec_state.global.module_infos.clone();
let outcome = exec_state.to_mock_wasm_outcome(result.0).await;
mem.squash_env(result.0);
cache::write_old_memory(mem).await;
cache::write_old_memory((mem, module_infos)).await;
Ok(outcome)
}
@ -758,7 +774,7 @@ impl ExecutorContext {
if !self.is_mock() {
let mut mem = exec_state.stack().deep_clone();
mem.restore_env(env_ref);
cache::write_old_memory(mem).await;
cache::write_old_memory((mem, exec_state.global.module_infos.clone())).await;
}
let session_data = self.engine.get_session_data().await;
Ok((env_ref, session_data))

View File

@ -30,6 +30,8 @@ pub struct ExecState {
pub(super) exec_context: Option<super::ExecutorContext>,
}
pub type ModuleInfoMap = IndexMap<ModuleId, ModuleInfo>;
#[derive(Debug, Clone)]
pub(super) struct GlobalState {
/// Map from source file absolute path to module ID.
@ -37,7 +39,7 @@ pub(super) struct GlobalState {
/// Map from module ID to source file.
pub id_to_source: IndexMap<ModuleId, ModuleSource>,
/// Map from module ID to module info.
pub module_infos: IndexMap<ModuleId, ModuleInfo>,
pub module_infos: ModuleInfoMap,
/// Output map of UUIDs to artifacts.
pub artifacts: IndexMap<ArtifactId, Artifact>,
/// Output commands to allow building the artifact graph by the caller.

View File

@ -97,7 +97,7 @@ pub use parsing::ast::{modify::modify_ast_for_sketch, types::FormatOptions};
pub use settings::types::{project::ProjectConfiguration, Configuration, UnitLength};
pub use source_range::SourceRange;
#[cfg(not(target_arch = "wasm32"))]
pub use unparser::recast_dir;
pub use unparser::{recast_dir, walk_dir};
// Rather than make executor public and make lots of it pub(crate), just re-export into a new module.
// Ideally we wouldn't export these things at all, they should only be used for testing.
@ -211,6 +211,14 @@ impl Program {
pub fn recast_with_options(&self, options: &FormatOptions) -> String {
self.ast.recast(options, 0)
}
/// Create an empty program.
pub fn empty() -> Self {
Self {
ast: parsing::ast::types::Node::no_src(parsing::ast::types::Program::default()),
original_file_contents: String::new(),
}
}
}
#[inline]

View File

@ -786,7 +786,7 @@ impl Backend {
vec![kittycad::types::multipart::Attachment {
// Clean the URI part.
name: "attachment".to_string(),
filename: Some("attachment.zip".to_string()),
filepath: Some("attachment.zip".into()),
content_type: Some("application/x-zip".to_string()),
data: self.create_zip().await?,
}],
@ -1635,7 +1635,7 @@ fn position_to_char_index(position: Position, code: &str) -> usize {
async fn with_cached_var<T>(name: &str, f: impl Fn(&KclValue) -> T) -> Option<T> {
let mem = cache::read_old_memory().await?;
let value = mem.get(name, SourceRange::default()).ok()?;
let value = mem.0.get(name, SourceRange::default()).ok()?;
Some(f(value))
}

View File

@ -1016,6 +1016,8 @@ startSketchOn(XY)
}
_ => unreachable!(),
}
server.executor_ctx().await.clone().unwrap().close().await;
}
#[tokio::test(flavor = "multi_thread")]
@ -2318,6 +2320,8 @@ async fn kcl_test_kcl_lsp_on_change_update_memory() {
}],
})
.await;
server.executor_ctx().await.clone().unwrap().close().await;
}
#[tokio::test(flavor = "multi_thread", worker_threads = 10)]
@ -2390,6 +2394,8 @@ part001 = cube([0,0], 20)
let units = server.executor_ctx().await.clone().unwrap().settings.units;
assert_eq!(units, crate::settings::types::UnitLength::M);
server.executor_ctx().await.clone().unwrap().close().await;
}
#[tokio::test(flavor = "multi_thread")]
@ -2506,6 +2512,8 @@ async fn kcl_test_kcl_lsp_diagnostics_on_execution_error() {
// Get the diagnostics.
assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 0);
server.executor_ctx().await.clone().unwrap().close().await;
}
#[tokio::test(flavor = "multi_thread")]
@ -2556,6 +2564,8 @@ async fn kcl_test_kcl_lsp_full_to_empty_file_updates_ast_and_memory() {
// Get the ast.
let ast = server.ast_map.get("file:///test.kcl").unwrap().clone();
assert_eq!(ast.ast, default_hashed);
server.executor_ctx().await.clone().unwrap().close().await;
}
#[tokio::test(flavor = "multi_thread")]
@ -2642,6 +2652,8 @@ async fn kcl_test_kcl_lsp_code_unchanged_but_has_diagnostics_reexecute() {
// Assure we have no diagnostics.
assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 0);
server.executor_ctx().await.clone().unwrap().close().await;
}
#[tokio::test(flavor = "multi_thread")]
@ -2717,6 +2729,8 @@ async fn kcl_test_kcl_lsp_code_and_ast_unchanged_but_has_diagnostics_reexecute()
// Assure we have no diagnostics.
assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 0);
server.executor_ctx().await.clone().unwrap().close().await;
}
#[tokio::test(flavor = "multi_thread")]
@ -2795,6 +2809,8 @@ async fn kcl_test_kcl_lsp_code_and_ast_units_unchanged_but_has_diagnostics_reexe
// Assure we have no diagnostics.
assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 0);
server.executor_ctx().await.clone().unwrap().close().await;
}
#[tokio::test(flavor = "multi_thread")]
@ -2852,6 +2868,8 @@ async fn kcl_test_kcl_lsp_code_and_ast_units_unchanged_but_has_memory_reexecute_
// Assure we have no diagnostics.
assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 0);
server.executor_ctx().await.clone().unwrap().close().await;
}
#[tokio::test(flavor = "multi_thread")]
@ -2975,6 +2993,8 @@ async fn kcl_test_kcl_lsp_cant_execute_set() {
// Assure we have no diagnostics.
assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 0);
server.executor_ctx().await.clone().unwrap().close().await;
}
#[tokio::test(flavor = "multi_thread")]
@ -3243,6 +3263,8 @@ part001 = startSketchOn(XY)
// Check the diagnostics.
assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 2);
server.executor_ctx().await.clone().unwrap().close().await;
}
#[tokio::test(flavor = "multi_thread")]
@ -3310,6 +3332,8 @@ NEW_LINT = 1"#
// Check the diagnostics.
assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 2);
server.executor_ctx().await.clone().unwrap().close().await;
}
#[tokio::test(flavor = "multi_thread")]
@ -3377,6 +3401,8 @@ NEW_LINT = 1"#
// Check the diagnostics.
assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 1);
server.executor_ctx().await.clone().unwrap().close().await;
}
#[tokio::test(flavor = "multi_thread")]
@ -3460,6 +3486,8 @@ NEW_LINT = 1"#
// Check the diagnostics.
assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 1);
server.executor_ctx().await.clone().unwrap().close().await;
}
#[tokio::test(flavor = "multi_thread")]
@ -3551,6 +3579,8 @@ part001 = startSketchOn(XY)
// Check the diagnostics.
assert_diagnostic_count(server.diagnostics_map.get("file:///test.kcl").as_deref(), 2);
server.executor_ctx().await.clone().unwrap().close().await;
}
#[tokio::test(flavor = "multi_thread")]
@ -3649,4 +3679,6 @@ async fn kcl_test_kcl_lsp_multi_file_error() {
} else {
panic!("Expected diagnostics");
}
server.executor_ctx().await.clone().unwrap().close().await;
}

View File

@ -88,6 +88,7 @@ pub(crate) fn read_std(mod_name: &str) -> Option<&'static str> {
"prelude" => Some(include_str!("../std/prelude.kcl")),
"math" => Some(include_str!("../std/math.kcl")),
"sketch" => Some(include_str!("../std/sketch.kcl")),
"turns" => Some(include_str!("../std/turns.kcl")),
_ => None,
}
}

View File

@ -1619,10 +1619,9 @@ impl ImportStatement {
return Some(alias.name.clone());
}
let mut parts = match &self.path {
ImportPath::Kcl { filename: s } | ImportPath::Foreign { path: s } => s.split('.'),
_ => return None,
};
match &self.path {
ImportPath::Kcl { filename: s } | ImportPath::Foreign { path: s } => {
let mut parts = s.split('.');
let path = parts.next()?;
let _ext = parts.next()?;
let rest = parts.next();
@ -1633,6 +1632,9 @@ impl ImportStatement {
path.rsplit(&['/', '\\']).next().map(str::to_owned)
}
ImportPath::Std { path } => path.last().cloned(),
}
}
}
impl From<&ImportStatement> for Vec<CompletionItem> {

View File

@ -152,7 +152,12 @@ const STR_DEPRECATIONS: [(&str, &str); 6] = [
("-YZ", "-YZ"),
];
const FN_DEPRECATIONS: [(&str, &str); 3] = [("pi", "PI"), ("e", "E"), ("tau", "TAU")];
const CONST_DEPRECATIONS: [(&str, &str); 0] = [];
const CONST_DEPRECATIONS: [(&str, &str); 4] = [
("ZERO", "turns::ZERO"),
("QUARTER_TURN", "turns::QUARTER_TURN"),
("HALF_TURN", "turns::HALF_TURN"),
("THREE_QUARTER_TURN", "turns::THREE_QUARTER_TURN"),
];
#[derive(Clone, Copy)]
pub enum DeprecationKind {

View File

@ -1823,14 +1823,6 @@ fn import_stmt(i: &mut TokenSlice) -> PResult<BoxNode<ImportStatement>> {
)
.into(),
));
} else if matches!(path, ImportPath::Std { .. }) && matches!(selector, ImportSelector::None { .. }) {
return Err(ErrMode::Cut(
CompilationError::fatal(
SourceRange::new(start, end, module_id),
"the standard library cannot be imported as a part",
)
.into(),
));
}
Ok(Node::boxed(
@ -2341,21 +2333,6 @@ fn nameable_identifier(i: &mut TokenSlice) -> PResult<Node<Identifier>> {
));
}
if let Some(suggestion) = super::deprecation(&result.name, DeprecationKind::Const) {
ParseContext::warn(
CompilationError::err(
result.as_source_range(),
format!("Using `{}` is deprecated, prefer using `{}`.", result.name, suggestion),
)
.with_suggestion(
format!("Replace `{}` with `{}`", result.name, suggestion),
suggestion,
None,
Tag::Deprecated,
),
);
}
Ok(result)
}
@ -2374,8 +2351,7 @@ fn name(i: &mut TokenSlice) -> PResult<Node<Name>> {
let name = idents.pop().unwrap();
let end = name.end;
let module_id = name.module_id;
Ok(Node::new(
let result = Node::new(
Name {
name,
path: idents,
@ -2385,7 +2361,24 @@ fn name(i: &mut TokenSlice) -> PResult<Node<Name>> {
start,
end,
module_id,
))
);
if let Some(suggestion) = super::deprecation(&result.to_string(), DeprecationKind::Const) {
ParseContext::warn(
CompilationError::err(
result.as_source_range(),
format!("Using `{result}` is deprecated, prefer using `{suggestion}`."),
)
.with_suggestion(
format!("Replace `{result}` with `{suggestion}`"),
suggestion,
None,
Tag::Deprecated,
),
);
}
Ok(result)
}
impl TryFrom<Token> for Node<TagDeclarator> {

View File

@ -114,6 +114,8 @@ async fn unparse_test(test: &Test) {
let kcl_files = kcl_files.into_iter().filter(|f| f != &entry_point);
let futures = kcl_files
.into_iter()
.filter(|file| file.extension().is_some_and(|ext| ext == "kcl")) // We only care about kcl
// files here.
.map(|file| {
let snap_path = Path::new("..").join(&test.output_dir);
tokio::spawn(async move {

View File

@ -1,5 +1,8 @@
use std::fmt::Write;
#[cfg(feature = "cli")]
use clap::ValueEnum;
use crate::parsing::{
ast::types::{
Annotation, ArrayExpression, ArrayRangeExpression, BinaryExpression, BinaryOperator, BinaryPart, BodyItem,
@ -864,10 +867,33 @@ impl Parameter {
}
}
/// Collect all the kcl files in a directory, recursively.
lazy_static::lazy_static! {
pub static ref IMPORT_FILE_EXTENSIONS: Vec<String> = {
let mut import_file_extensions = vec!["stp".to_string(), "glb".to_string(), "fbxb".to_string()];
#[cfg(feature = "cli")]
let named_extensions = kittycad::types::FileImportFormat::value_variants()
.iter()
.map(|x| format!("{}", x))
.collect::<Vec<String>>();
#[cfg(not(feature = "cli"))]
let named_extensions = vec![]; // We don't really need this outside of the CLI.
// Add all the default import formats.
import_file_extensions.extend_from_slice(&named_extensions);
import_file_extensions
};
pub static ref RELEVANT_EXTENSIONS: Vec<String> = {
let mut relevant_extensions = IMPORT_FILE_EXTENSIONS.clone();
relevant_extensions.push("kcl".to_string());
relevant_extensions
};
}
/// Collect all the kcl (and other relevant) files in a directory, recursively.
#[cfg(not(target_arch = "wasm32"))]
#[async_recursion::async_recursion]
pub(crate) async fn walk_dir(dir: &std::path::PathBuf) -> Result<Vec<std::path::PathBuf>, anyhow::Error> {
pub async fn walk_dir(dir: &std::path::PathBuf) -> Result<Vec<std::path::PathBuf>, anyhow::Error> {
// Make sure we actually have a directory.
if !dir.is_dir() {
anyhow::bail!("`{}` is not a directory", dir.display());
@ -881,7 +907,10 @@ pub(crate) async fn walk_dir(dir: &std::path::PathBuf) -> Result<Vec<std::path::
if path.is_dir() {
files.extend(walk_dir(&path).await?);
} else if path.extension().is_some_and(|ext| ext == "kcl") {
} else if path
.extension()
.is_some_and(|ext| RELEVANT_EXTENSIONS.contains(&ext.to_string_lossy().to_string()))
{
files.push(path);
}
}
@ -901,6 +930,8 @@ pub async fn recast_dir(dir: &std::path::Path, options: &crate::FormatOptions) -
let futures = files
.into_iter()
.filter(|file| file.extension().is_some_and(|ext| ext == "kcl")) // We only care about kcl
// files here.
.map(|file| {
let options = options.clone();
tokio::spawn(async move {

View File

@ -5,6 +5,7 @@
export import * from "std::math"
export import * from "std::sketch"
export import "std::turns"
/// A number
///
@ -245,11 +246,6 @@ export type Point2d = [number; 2]
/// with type `Point3d`, use an array, e.g., `[0, 0, 0]` or `[5.0, 3.14, 6.8]`.
export type Point3d = [number; 3]
export ZERO = 0
export QUARTER_TURN = 90deg
export HALF_TURN = 180deg
export THREE_QUARTER_TURN = 270deg
export XY = {
origin = { x = 0, y = 0, z = 0 },
xAxis = { x = 1, y = 0, z = 0 },

View File

@ -0,0 +1,6 @@
@no_std
export ZERO = 0
export QUARTER_TURN = 90deg
export HALF_TURN = 180deg
export THREE_QUARTER_TURN = 270deg

View File

@ -1,25 +1,25 @@
```mermaid
flowchart LR
subgraph path2 [Path]
2["Path<br>[76, 113, 4]"]
3["Segment<br>[119, 136, 4]"]
4["Segment<br>[142, 160, 4]"]
5["Segment<br>[166, 184, 4]"]
6["Segment<br>[190, 246, 4]"]
7["Segment<br>[252, 259, 4]"]
2["Path<br>[76, 113, 5]"]
3["Segment<br>[119, 136, 5]"]
4["Segment<br>[142, 160, 5]"]
5["Segment<br>[166, 184, 5]"]
6["Segment<br>[190, 246, 5]"]
7["Segment<br>[252, 259, 5]"]
8[Solid2d]
end
subgraph path25 [Path]
25["Path<br>[76, 111, 5]"]
26["Segment<br>[117, 134, 5]"]
27["Segment<br>[140, 158, 5]"]
28["Segment<br>[164, 182, 5]"]
29["Segment<br>[188, 244, 5]"]
30["Segment<br>[250, 257, 5]"]
25["Path<br>[76, 111, 6]"]
26["Segment<br>[117, 134, 6]"]
27["Segment<br>[140, 158, 6]"]
28["Segment<br>[164, 182, 6]"]
29["Segment<br>[188, 244, 6]"]
30["Segment<br>[250, 257, 6]"]
31[Solid2d]
end
1["Plane<br>[47, 66, 4]"]
9["Sweep Extrusion<br>[265, 287, 4]"]
1["Plane<br>[47, 66, 5]"]
9["Sweep Extrusion<br>[265, 287, 5]"]
10[Wall]
11[Wall]
12[Wall]
@ -34,8 +34,8 @@ flowchart LR
21["SweepEdge Adjacent"]
22["SweepEdge Opposite"]
23["SweepEdge Adjacent"]
24["Plane<br>[47, 66, 5]"]
32["Sweep Extrusion<br>[263, 285, 5]"]
24["Plane<br>[47, 66, 6]"]
32["Sweep Extrusion<br>[263, 285, 6]"]
33[Wall]
34[Wall]
35[Wall]

View File

@ -5,10 +5,10 @@ description: Variables in memory after executing assembly_mixed_units_cubes.kcl
{
"cubeIn": {
"type": "Module",
"value": 4
"value": 5
},
"cubeMm": {
"type": "Module",
"value": 5
"value": 6
}
}

View File

@ -1,17 +1,17 @@
```mermaid
flowchart LR
subgraph path2 [Path]
2["Path<br>[197, 232, 4]"]
3["Segment<br>[197, 232, 4]"]
2["Path<br>[197, 232, 5]"]
3["Segment<br>[197, 232, 5]"]
4[Solid2d]
end
subgraph path6 [Path]
6["Path<br>[113, 148, 5]"]
7["Segment<br>[113, 148, 5]"]
6["Path<br>[113, 148, 6]"]
7["Segment<br>[113, 148, 6]"]
8[Solid2d]
end
1["Plane<br>[172, 191, 4]"]
5["Plane<br>[88, 107, 5]"]
1["Plane<br>[172, 191, 5]"]
5["Plane<br>[88, 107, 6]"]
1 --- 2
2 --- 3
2 --- 4

View File

@ -5,10 +5,10 @@ description: Variables in memory after executing assembly_non_default_units.kcl
{
"other1": {
"type": "Module",
"value": 4
"value": 5
},
"other2": {
"type": "Module",
"value": 5
"value": 6
}
}

View File

@ -5,7 +5,7 @@ description: Variables in memory after executing import_foreign.kcl
{
"cube": {
"type": "Module",
"value": 4
"value": 5
},
"model": {
"type": "ImportedGeometry",

View File

@ -5,6 +5,6 @@ description: Variables in memory after executing import_transform.kcl
{
"screw": {
"type": "Module",
"value": 4
"value": 5
}
}

View File

@ -1,12 +1,12 @@
```mermaid
flowchart LR
subgraph path2 [Path]
2["Path<br>[83, 119, 4]"]
3["Segment<br>[83, 119, 4]"]
2["Path<br>[83, 119, 5]"]
3["Segment<br>[83, 119, 5]"]
4[Solid2d]
end
1["Plane<br>[60, 77, 4]"]
5["Sweep Extrusion<br>[125, 145, 4]"]
1["Plane<br>[60, 77, 5]"]
5["Sweep Extrusion<br>[125, 145, 5]"]
6[Wall]
7["Cap Start"]
8["Cap End"]

View File

@ -111,6 +111,6 @@ description: Variables in memory after executing import_whole.kcl
},
"foo": {
"type": "Module",
"value": 4
"value": 5
}
}

View File

@ -1,239 +1,239 @@
```mermaid
flowchart LR
subgraph path2 [Path]
2["Path<br>[361, 394, 4]"]
3["Segment<br>[402, 428, 4]"]
4["Segment<br>[436, 489, 4]"]
5["Segment<br>[497, 550, 4]"]
6["Segment<br>[558, 612, 4]"]
7["Segment<br>[620, 645, 4]"]
8["Segment<br>[653, 673, 4]"]
9["Segment<br>[681, 705, 4]"]
10["Segment<br>[713, 766, 4]"]
11["Segment<br>[774, 799, 4]"]
12["Segment<br>[807, 827, 4]"]
13["Segment<br>[835, 859, 4]"]
14["Segment<br>[867, 919, 4]"]
15["Segment<br>[927, 979, 4]"]
16["Segment<br>[987, 1012, 4]"]
17["Segment<br>[1020, 1044, 4]"]
18["Segment<br>[1052, 1105, 4]"]
19["Segment<br>[1113, 1138, 4]"]
20["Segment<br>[1146, 1173, 4]"]
21["Segment<br>[1181, 1233, 4]"]
22["Segment<br>[1241, 1276, 4]"]
23["Segment<br>[1284, 1291, 4]"]
2["Path<br>[361, 394, 5]"]
3["Segment<br>[402, 428, 5]"]
4["Segment<br>[436, 489, 5]"]
5["Segment<br>[497, 550, 5]"]
6["Segment<br>[558, 612, 5]"]
7["Segment<br>[620, 645, 5]"]
8["Segment<br>[653, 673, 5]"]
9["Segment<br>[681, 705, 5]"]
10["Segment<br>[713, 766, 5]"]
11["Segment<br>[774, 799, 5]"]
12["Segment<br>[807, 827, 5]"]
13["Segment<br>[835, 859, 5]"]
14["Segment<br>[867, 919, 5]"]
15["Segment<br>[927, 979, 5]"]
16["Segment<br>[987, 1012, 5]"]
17["Segment<br>[1020, 1044, 5]"]
18["Segment<br>[1052, 1105, 5]"]
19["Segment<br>[1113, 1138, 5]"]
20["Segment<br>[1146, 1173, 5]"]
21["Segment<br>[1181, 1233, 5]"]
22["Segment<br>[1241, 1276, 5]"]
23["Segment<br>[1284, 1291, 5]"]
24[Solid2d]
end
subgraph path89 [Path]
89["Path<br>[361, 394, 4]"]
90["Segment<br>[402, 428, 4]"]
91["Segment<br>[436, 489, 4]"]
92["Segment<br>[497, 550, 4]"]
93["Segment<br>[558, 612, 4]"]
94["Segment<br>[620, 645, 4]"]
95["Segment<br>[653, 673, 4]"]
96["Segment<br>[681, 705, 4]"]
97["Segment<br>[713, 766, 4]"]
98["Segment<br>[774, 799, 4]"]
99["Segment<br>[807, 827, 4]"]
100["Segment<br>[835, 859, 4]"]
101["Segment<br>[867, 919, 4]"]
102["Segment<br>[927, 979, 4]"]
103["Segment<br>[987, 1012, 4]"]
104["Segment<br>[1020, 1044, 4]"]
105["Segment<br>[1052, 1105, 4]"]
106["Segment<br>[1113, 1138, 4]"]
107["Segment<br>[1146, 1173, 4]"]
108["Segment<br>[1181, 1233, 4]"]
109["Segment<br>[1241, 1276, 4]"]
110["Segment<br>[1284, 1291, 4]"]
89["Path<br>[361, 394, 5]"]
90["Segment<br>[402, 428, 5]"]
91["Segment<br>[436, 489, 5]"]
92["Segment<br>[497, 550, 5]"]
93["Segment<br>[558, 612, 5]"]
94["Segment<br>[620, 645, 5]"]
95["Segment<br>[653, 673, 5]"]
96["Segment<br>[681, 705, 5]"]
97["Segment<br>[713, 766, 5]"]
98["Segment<br>[774, 799, 5]"]
99["Segment<br>[807, 827, 5]"]
100["Segment<br>[835, 859, 5]"]
101["Segment<br>[867, 919, 5]"]
102["Segment<br>[927, 979, 5]"]
103["Segment<br>[987, 1012, 5]"]
104["Segment<br>[1020, 1044, 5]"]
105["Segment<br>[1052, 1105, 5]"]
106["Segment<br>[1113, 1138, 5]"]
107["Segment<br>[1146, 1173, 5]"]
108["Segment<br>[1181, 1233, 5]"]
109["Segment<br>[1241, 1276, 5]"]
110["Segment<br>[1284, 1291, 5]"]
111[Solid2d]
end
subgraph path176 [Path]
176["Path<br>[361, 394, 4]"]
177["Segment<br>[402, 428, 4]"]
178["Segment<br>[436, 489, 4]"]
179["Segment<br>[497, 550, 4]"]
180["Segment<br>[558, 612, 4]"]
181["Segment<br>[620, 645, 4]"]
182["Segment<br>[653, 673, 4]"]
183["Segment<br>[681, 705, 4]"]
184["Segment<br>[713, 766, 4]"]
185["Segment<br>[774, 799, 4]"]
186["Segment<br>[807, 827, 4]"]
187["Segment<br>[835, 859, 4]"]
188["Segment<br>[867, 919, 4]"]
189["Segment<br>[927, 979, 4]"]
190["Segment<br>[987, 1012, 4]"]
191["Segment<br>[1020, 1044, 4]"]
192["Segment<br>[1052, 1105, 4]"]
193["Segment<br>[1113, 1138, 4]"]
194["Segment<br>[1146, 1173, 4]"]
195["Segment<br>[1181, 1233, 4]"]
196["Segment<br>[1241, 1276, 4]"]
197["Segment<br>[1284, 1291, 4]"]
176["Path<br>[361, 394, 5]"]
177["Segment<br>[402, 428, 5]"]
178["Segment<br>[436, 489, 5]"]
179["Segment<br>[497, 550, 5]"]
180["Segment<br>[558, 612, 5]"]
181["Segment<br>[620, 645, 5]"]
182["Segment<br>[653, 673, 5]"]
183["Segment<br>[681, 705, 5]"]
184["Segment<br>[713, 766, 5]"]
185["Segment<br>[774, 799, 5]"]
186["Segment<br>[807, 827, 5]"]
187["Segment<br>[835, 859, 5]"]
188["Segment<br>[867, 919, 5]"]
189["Segment<br>[927, 979, 5]"]
190["Segment<br>[987, 1012, 5]"]
191["Segment<br>[1020, 1044, 5]"]
192["Segment<br>[1052, 1105, 5]"]
193["Segment<br>[1113, 1138, 5]"]
194["Segment<br>[1146, 1173, 5]"]
195["Segment<br>[1181, 1233, 5]"]
196["Segment<br>[1241, 1276, 5]"]
197["Segment<br>[1284, 1291, 5]"]
198[Solid2d]
end
subgraph path262 [Path]
262["Path<br>[361, 394, 4]"]
263["Segment<br>[402, 428, 4]"]
264["Segment<br>[436, 489, 4]"]
265["Segment<br>[497, 550, 4]"]
266["Segment<br>[558, 612, 4]"]
267["Segment<br>[620, 645, 4]"]
268["Segment<br>[653, 673, 4]"]
269["Segment<br>[681, 705, 4]"]
270["Segment<br>[713, 766, 4]"]
271["Segment<br>[774, 799, 4]"]
272["Segment<br>[807, 827, 4]"]
273["Segment<br>[835, 859, 4]"]
274["Segment<br>[867, 919, 4]"]
275["Segment<br>[927, 979, 4]"]
276["Segment<br>[987, 1012, 4]"]
277["Segment<br>[1020, 1044, 4]"]
278["Segment<br>[1052, 1105, 4]"]
279["Segment<br>[1113, 1138, 4]"]
280["Segment<br>[1146, 1173, 4]"]
281["Segment<br>[1181, 1233, 4]"]
282["Segment<br>[1241, 1276, 4]"]
283["Segment<br>[1284, 1291, 4]"]
262["Path<br>[361, 394, 5]"]
263["Segment<br>[402, 428, 5]"]
264["Segment<br>[436, 489, 5]"]
265["Segment<br>[497, 550, 5]"]
266["Segment<br>[558, 612, 5]"]
267["Segment<br>[620, 645, 5]"]
268["Segment<br>[653, 673, 5]"]
269["Segment<br>[681, 705, 5]"]
270["Segment<br>[713, 766, 5]"]
271["Segment<br>[774, 799, 5]"]
272["Segment<br>[807, 827, 5]"]
273["Segment<br>[835, 859, 5]"]
274["Segment<br>[867, 919, 5]"]
275["Segment<br>[927, 979, 5]"]
276["Segment<br>[987, 1012, 5]"]
277["Segment<br>[1020, 1044, 5]"]
278["Segment<br>[1052, 1105, 5]"]
279["Segment<br>[1113, 1138, 5]"]
280["Segment<br>[1146, 1173, 5]"]
281["Segment<br>[1181, 1233, 5]"]
282["Segment<br>[1241, 1276, 5]"]
283["Segment<br>[1284, 1291, 5]"]
284[Solid2d]
end
subgraph path349 [Path]
349["Path<br>[361, 394, 4]"]
350["Segment<br>[402, 428, 4]"]
351["Segment<br>[436, 489, 4]"]
352["Segment<br>[497, 550, 4]"]
353["Segment<br>[558, 612, 4]"]
354["Segment<br>[620, 645, 4]"]
355["Segment<br>[653, 673, 4]"]
356["Segment<br>[681, 705, 4]"]
357["Segment<br>[713, 766, 4]"]
358["Segment<br>[774, 799, 4]"]
359["Segment<br>[807, 827, 4]"]
360["Segment<br>[835, 859, 4]"]
361["Segment<br>[867, 919, 4]"]
362["Segment<br>[927, 979, 4]"]
363["Segment<br>[987, 1012, 4]"]
364["Segment<br>[1020, 1044, 4]"]
365["Segment<br>[1052, 1105, 4]"]
366["Segment<br>[1113, 1138, 4]"]
367["Segment<br>[1146, 1173, 4]"]
368["Segment<br>[1181, 1233, 4]"]
369["Segment<br>[1241, 1276, 4]"]
370["Segment<br>[1284, 1291, 4]"]
349["Path<br>[361, 394, 5]"]
350["Segment<br>[402, 428, 5]"]
351["Segment<br>[436, 489, 5]"]
352["Segment<br>[497, 550, 5]"]
353["Segment<br>[558, 612, 5]"]
354["Segment<br>[620, 645, 5]"]
355["Segment<br>[653, 673, 5]"]
356["Segment<br>[681, 705, 5]"]
357["Segment<br>[713, 766, 5]"]
358["Segment<br>[774, 799, 5]"]
359["Segment<br>[807, 827, 5]"]
360["Segment<br>[835, 859, 5]"]
361["Segment<br>[867, 919, 5]"]
362["Segment<br>[927, 979, 5]"]
363["Segment<br>[987, 1012, 5]"]
364["Segment<br>[1020, 1044, 5]"]
365["Segment<br>[1052, 1105, 5]"]
366["Segment<br>[1113, 1138, 5]"]
367["Segment<br>[1146, 1173, 5]"]
368["Segment<br>[1181, 1233, 5]"]
369["Segment<br>[1241, 1276, 5]"]
370["Segment<br>[1284, 1291, 5]"]
371[Solid2d]
end
subgraph path435 [Path]
435["Path<br>[361, 394, 4]"]
436["Segment<br>[402, 428, 4]"]
437["Segment<br>[436, 489, 4]"]
438["Segment<br>[497, 550, 4]"]
439["Segment<br>[558, 612, 4]"]
440["Segment<br>[620, 645, 4]"]
441["Segment<br>[653, 673, 4]"]
442["Segment<br>[681, 705, 4]"]
443["Segment<br>[713, 766, 4]"]
444["Segment<br>[774, 799, 4]"]
445["Segment<br>[807, 827, 4]"]
446["Segment<br>[835, 859, 4]"]
447["Segment<br>[867, 919, 4]"]
448["Segment<br>[927, 979, 4]"]
449["Segment<br>[987, 1012, 4]"]
450["Segment<br>[1020, 1044, 4]"]
451["Segment<br>[1052, 1105, 4]"]
452["Segment<br>[1113, 1138, 4]"]
453["Segment<br>[1146, 1173, 4]"]
454["Segment<br>[1181, 1233, 4]"]
455["Segment<br>[1241, 1276, 4]"]
456["Segment<br>[1284, 1291, 4]"]
435["Path<br>[361, 394, 5]"]
436["Segment<br>[402, 428, 5]"]
437["Segment<br>[436, 489, 5]"]
438["Segment<br>[497, 550, 5]"]
439["Segment<br>[558, 612, 5]"]
440["Segment<br>[620, 645, 5]"]
441["Segment<br>[653, 673, 5]"]
442["Segment<br>[681, 705, 5]"]
443["Segment<br>[713, 766, 5]"]
444["Segment<br>[774, 799, 5]"]
445["Segment<br>[807, 827, 5]"]
446["Segment<br>[835, 859, 5]"]
447["Segment<br>[867, 919, 5]"]
448["Segment<br>[927, 979, 5]"]
449["Segment<br>[987, 1012, 5]"]
450["Segment<br>[1020, 1044, 5]"]
451["Segment<br>[1052, 1105, 5]"]
452["Segment<br>[1113, 1138, 5]"]
453["Segment<br>[1146, 1173, 5]"]
454["Segment<br>[1181, 1233, 5]"]
455["Segment<br>[1241, 1276, 5]"]
456["Segment<br>[1284, 1291, 5]"]
457[Solid2d]
end
subgraph path522 [Path]
522["Path<br>[1685, 1709, 4]"]
522["Path<br>[1685, 1709, 5]"]
end
subgraph path523 [Path]
523["Path<br>[1717, 1847, 4]"]
524["Segment<br>[1717, 1847, 4]"]
525["Segment<br>[1717, 1847, 4]"]
526["Segment<br>[1717, 1847, 4]"]
527["Segment<br>[1717, 1847, 4]"]
528["Segment<br>[1717, 1847, 4]"]
529["Segment<br>[1717, 1847, 4]"]
530["Segment<br>[1717, 1847, 4]"]
523["Path<br>[1717, 1847, 5]"]
524["Segment<br>[1717, 1847, 5]"]
525["Segment<br>[1717, 1847, 5]"]
526["Segment<br>[1717, 1847, 5]"]
527["Segment<br>[1717, 1847, 5]"]
528["Segment<br>[1717, 1847, 5]"]
529["Segment<br>[1717, 1847, 5]"]
530["Segment<br>[1717, 1847, 5]"]
531[Solid2d]
end
subgraph path553 [Path]
553["Path<br>[1685, 1709, 4]"]
553["Path<br>[1685, 1709, 5]"]
end
subgraph path554 [Path]
554["Path<br>[1717, 1847, 4]"]
555["Segment<br>[1717, 1847, 4]"]
556["Segment<br>[1717, 1847, 4]"]
557["Segment<br>[1717, 1847, 4]"]
558["Segment<br>[1717, 1847, 4]"]
559["Segment<br>[1717, 1847, 4]"]
560["Segment<br>[1717, 1847, 4]"]
561["Segment<br>[1717, 1847, 4]"]
554["Path<br>[1717, 1847, 5]"]
555["Segment<br>[1717, 1847, 5]"]
556["Segment<br>[1717, 1847, 5]"]
557["Segment<br>[1717, 1847, 5]"]
558["Segment<br>[1717, 1847, 5]"]
559["Segment<br>[1717, 1847, 5]"]
560["Segment<br>[1717, 1847, 5]"]
561["Segment<br>[1717, 1847, 5]"]
562[Solid2d]
end
subgraph path585 [Path]
585["Path<br>[2123, 2150, 4]"]
586["Segment<br>[2158, 2180, 4]"]
587["Segment<br>[2188, 2210, 4]"]
588["Segment<br>[2218, 2240, 4]"]
589["Segment<br>[2248, 2271, 4]"]
590["Segment<br>[2279, 2302, 4]"]
591["Segment<br>[2310, 2345, 4]"]
592["Segment<br>[2353, 2360, 4]"]
585["Path<br>[2123, 2150, 5]"]
586["Segment<br>[2158, 2180, 5]"]
587["Segment<br>[2188, 2210, 5]"]
588["Segment<br>[2218, 2240, 5]"]
589["Segment<br>[2248, 2271, 5]"]
590["Segment<br>[2279, 2302, 5]"]
591["Segment<br>[2310, 2345, 5]"]
592["Segment<br>[2353, 2360, 5]"]
593[Solid2d]
end
subgraph path618 [Path]
618["Path<br>[2632, 2661, 4]"]
619["Segment<br>[2669, 2692, 4]"]
620["Segment<br>[2700, 2725, 4]"]
621["Segment<br>[2733, 2757, 4]"]
622["Segment<br>[2765, 2789, 4]"]
623["Segment<br>[2797, 2819, 4]"]
624["Segment<br>[2827, 2862, 4]"]
625["Segment<br>[2870, 2877, 4]"]
618["Path<br>[2632, 2661, 5]"]
619["Segment<br>[2669, 2692, 5]"]
620["Segment<br>[2700, 2725, 5]"]
621["Segment<br>[2733, 2757, 5]"]
622["Segment<br>[2765, 2789, 5]"]
623["Segment<br>[2797, 2819, 5]"]
624["Segment<br>[2827, 2862, 5]"]
625["Segment<br>[2870, 2877, 5]"]
626[Solid2d]
end
subgraph path650 [Path]
650["Path<br>[3152, 3179, 4]"]
651["Segment<br>[3187, 3206, 4]"]
652["Segment<br>[3214, 3304, 4]"]
650["Path<br>[3152, 3179, 5]"]
651["Segment<br>[3187, 3206, 5]"]
652["Segment<br>[3214, 3304, 5]"]
end
subgraph path654 [Path]
654["Path<br>[3404, 3437, 4]"]
655["Segment<br>[3445, 3464, 4]"]
656["Segment<br>[3472, 3494, 4]"]
657["Segment<br>[3502, 3525, 4]"]
658["Segment<br>[3533, 3553, 4]"]
659["Segment<br>[3561, 3585, 4]"]
660["Segment<br>[3593, 3616, 4]"]
661["Segment<br>[3624, 3631, 4]"]
654["Path<br>[3404, 3437, 5]"]
655["Segment<br>[3445, 3464, 5]"]
656["Segment<br>[3472, 3494, 5]"]
657["Segment<br>[3502, 3525, 5]"]
658["Segment<br>[3533, 3553, 5]"]
659["Segment<br>[3561, 3585, 5]"]
660["Segment<br>[3593, 3616, 5]"]
661["Segment<br>[3624, 3631, 5]"]
662[Solid2d]
end
subgraph path688 [Path]
688["Path<br>[3152, 3179, 4]"]
689["Segment<br>[3187, 3206, 4]"]
690["Segment<br>[3214, 3304, 4]"]
688["Path<br>[3152, 3179, 5]"]
689["Segment<br>[3187, 3206, 5]"]
690["Segment<br>[3214, 3304, 5]"]
end
subgraph path692 [Path]
692["Path<br>[3404, 3437, 4]"]
693["Segment<br>[3445, 3464, 4]"]
694["Segment<br>[3472, 3494, 4]"]
695["Segment<br>[3502, 3525, 4]"]
696["Segment<br>[3533, 3553, 4]"]
697["Segment<br>[3561, 3585, 4]"]
698["Segment<br>[3593, 3616, 4]"]
699["Segment<br>[3624, 3631, 4]"]
692["Path<br>[3404, 3437, 5]"]
693["Segment<br>[3445, 3464, 5]"]
694["Segment<br>[3472, 3494, 5]"]
695["Segment<br>[3502, 3525, 5]"]
696["Segment<br>[3533, 3553, 5]"]
697["Segment<br>[3561, 3585, 5]"]
698["Segment<br>[3593, 3616, 5]"]
699["Segment<br>[3624, 3631, 5]"]
700[Solid2d]
end
1["Plane<br>[333, 353, 4]"]
25["Sweep Extrusion<br>[1379, 1417, 4]"]
1["Plane<br>[333, 353, 5]"]
25["Sweep Extrusion<br>[1379, 1417, 5]"]
26[Wall]
27[Wall]
28[Wall]
@ -296,8 +296,8 @@ flowchart LR
85["SweepEdge Adjacent"]
86["SweepEdge Opposite"]
87["SweepEdge Adjacent"]
88["Plane<br>[333, 353, 4]"]
112["Sweep Extrusion<br>[1455, 1494, 4]"]
88["Plane<br>[333, 353, 5]"]
112["Sweep Extrusion<br>[1455, 1494, 5]"]
113[Wall]
114[Wall]
115[Wall]
@ -361,7 +361,7 @@ flowchart LR
173["SweepEdge Opposite"]
174["SweepEdge Adjacent"]
175["Plane<br>[823, 865, 0]"]
199["Sweep Extrusion<br>[1379, 1417, 4]"]
199["Sweep Extrusion<br>[1379, 1417, 5]"]
200[Wall]
201[Wall]
202[Wall]
@ -424,7 +424,7 @@ flowchart LR
259["SweepEdge Adjacent"]
260["SweepEdge Opposite"]
261["SweepEdge Adjacent"]
285["Sweep Extrusion<br>[1455, 1494, 4]"]
285["Sweep Extrusion<br>[1455, 1494, 5]"]
286[Wall]
287[Wall]
288[Wall]
@ -488,7 +488,7 @@ flowchart LR
346["SweepEdge Opposite"]
347["SweepEdge Adjacent"]
348["Plane<br>[875, 916, 0]"]
372["Sweep Extrusion<br>[1379, 1417, 4]"]
372["Sweep Extrusion<br>[1379, 1417, 5]"]
373[Wall]
374[Wall]
375[Wall]
@ -551,7 +551,7 @@ flowchart LR
432["SweepEdge Adjacent"]
433["SweepEdge Opposite"]
434["SweepEdge Adjacent"]
458["Sweep Extrusion<br>[1455, 1494, 4]"]
458["Sweep Extrusion<br>[1455, 1494, 5]"]
459[Wall]
460[Wall]
461[Wall]
@ -615,7 +615,7 @@ flowchart LR
519["SweepEdge Opposite"]
520["SweepEdge Adjacent"]
521["Plane<br>[975, 1017, 0]"]
532["Sweep Extrusion<br>[1949, 1973, 4]"]
532["Sweep Extrusion<br>[1949, 1973, 5]"]
533[Wall]
534[Wall]
535[Wall]
@ -636,7 +636,7 @@ flowchart LR
550["SweepEdge Adjacent"]
551["SweepEdge Opposite"]
552["SweepEdge Adjacent"]
563["Sweep Extrusion<br>[2015, 2039, 4]"]
563["Sweep Extrusion<br>[2015, 2039, 5]"]
564[Wall]
565[Wall]
566[Wall]
@ -658,7 +658,7 @@ flowchart LR
582["SweepEdge Opposite"]
583["SweepEdge Adjacent"]
584["Plane<br>[1068, 1135, 0]"]
594["Sweep Extrusion<br>[2523, 2547, 4]"]
594["Sweep Extrusion<br>[2523, 2547, 5]"]
595[Wall]
596[Wall]
597[Wall]
@ -679,10 +679,10 @@ flowchart LR
612["SweepEdge Adjacent"]
613["SweepEdge Opposite"]
614["SweepEdge Adjacent"]
615["Sweep Extrusion<br>[2523, 2547, 4]"]
616["Sweep Extrusion<br>[2523, 2547, 4]"]
615["Sweep Extrusion<br>[2523, 2547, 5]"]
616["Sweep Extrusion<br>[2523, 2547, 5]"]
617["Plane<br>[1205, 1272, 0]"]
627["Sweep Extrusion<br>[3047, 3071, 4]"]
627["Sweep Extrusion<br>[3047, 3071, 5]"]
628[Wall]
629[Wall]
630[Wall]
@ -703,10 +703,10 @@ flowchart LR
645["SweepEdge Adjacent"]
646["SweepEdge Opposite"]
647["SweepEdge Adjacent"]
648["Sweep Extrusion<br>[3047, 3071, 4]"]
649["Plane<br>[3712, 3747, 4]"]
653["Plane<br>[3778, 3807, 4]"]
663["Sweep Sweep<br>[3819, 3846, 4]"]
648["Sweep Extrusion<br>[3047, 3071, 5]"]
649["Plane<br>[3712, 3747, 5]"]
653["Plane<br>[3778, 3807, 5]"]
663["Sweep Sweep<br>[3819, 3846, 5]"]
664[Wall]
665[Wall]
666[Wall]
@ -730,9 +730,9 @@ flowchart LR
684["SweepEdge Adjacent"]
685["SweepEdge Opposite"]
686["SweepEdge Adjacent"]
687["Plane<br>[3712, 3747, 4]"]
691["Plane<br>[3778, 3807, 4]"]
701["Sweep Sweep<br>[3819, 3846, 4]"]
687["Plane<br>[3712, 3747, 5]"]
691["Plane<br>[3778, 3807, 5]"]
701["Sweep Sweep<br>[3819, 3846, 5]"]
702[Wall]
703[Wall]
704[Wall]
@ -756,18 +756,18 @@ flowchart LR
722["SweepEdge Adjacent"]
723["SweepEdge Opposite"]
724["SweepEdge Adjacent"]
725["StartSketchOnPlane<br>[333, 353, 4]"]
726["StartSketchOnPlane<br>[333, 353, 4]"]
727["StartSketchOnPlane<br>[333, 353, 4]"]
728["StartSketchOnPlane<br>[333, 353, 4]"]
729["StartSketchOnPlane<br>[1657, 1677, 4]"]
730["StartSketchOnPlane<br>[1657, 1677, 4]"]
731["StartSketchOnPlane<br>[2095, 2115, 4]"]
732["StartSketchOnPlane<br>[2604, 2624, 4]"]
733["StartSketchOnPlane<br>[3124, 3144, 4]"]
734["StartSketchOnPlane<br>[3376, 3396, 4]"]
735["StartSketchOnPlane<br>[3124, 3144, 4]"]
736["StartSketchOnPlane<br>[3376, 3396, 4]"]
725["StartSketchOnPlane<br>[333, 353, 5]"]
726["StartSketchOnPlane<br>[333, 353, 5]"]
727["StartSketchOnPlane<br>[333, 353, 5]"]
728["StartSketchOnPlane<br>[333, 353, 5]"]
729["StartSketchOnPlane<br>[1657, 1677, 5]"]
730["StartSketchOnPlane<br>[1657, 1677, 5]"]
731["StartSketchOnPlane<br>[2095, 2115, 5]"]
732["StartSketchOnPlane<br>[2604, 2624, 5]"]
733["StartSketchOnPlane<br>[3124, 3144, 5]"]
734["StartSketchOnPlane<br>[3376, 3396, 5]"]
735["StartSketchOnPlane<br>[3124, 3144, 5]"]
736["StartSketchOnPlane<br>[3376, 3396, 5]"]
1 --- 2
2 --- 3
2 --- 4

View File

@ -9,7 +9,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
1331,
1606,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -21,7 +21,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
309,
1312,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -77,7 +77,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
309,
1312,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -248,7 +248,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
1331,
1606,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -260,7 +260,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
309,
1312,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -316,7 +316,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
309,
1312,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -487,7 +487,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
1331,
1606,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -499,7 +499,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
309,
1312,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -555,7 +555,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
309,
1312,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -726,7 +726,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
1889,
2052,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -738,7 +738,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
1626,
1868,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -800,7 +800,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
1626,
1868,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -889,7 +889,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
2474,
2560,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -901,7 +901,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
2071,
2453,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -1007,7 +1007,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
2993,
3084,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -1019,7 +1019,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
2580,
2972,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -1095,7 +1095,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
3671,
3859,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -1131,7 +1131,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
3100,
3325,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -1191,7 +1191,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
3344,
3652,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -1249,7 +1249,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
3671,
3859,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -1285,7 +1285,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
3100,
3325,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -1345,7 +1345,7 @@ description: Operations executed bench.kcl
"functionSourceRange": [
3344,
3652,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},

View File

@ -1,264 +1,264 @@
```mermaid
flowchart LR
subgraph path2 [Path]
2["Path<br>[567, 618, 5]"]
3["Segment<br>[567, 618, 5]"]
2["Path<br>[567, 618, 6]"]
3["Segment<br>[567, 618, 6]"]
4[Solid2d]
end
subgraph path11 [Path]
11["Path<br>[803, 859, 5]"]
12["Segment<br>[803, 859, 5]"]
11["Path<br>[803, 859, 6]"]
12["Segment<br>[803, 859, 6]"]
13[Solid2d]
end
subgraph path19 [Path]
19["Path<br>[984, 1037, 5]"]
20["Segment<br>[984, 1037, 5]"]
19["Path<br>[984, 1037, 6]"]
20["Segment<br>[984, 1037, 6]"]
21[Solid2d]
end
subgraph path30 [Path]
30["Path<br>[1420, 1460, 5]"]
31["Segment<br>[1420, 1460, 5]"]
30["Path<br>[1420, 1460, 6]"]
31["Segment<br>[1420, 1460, 6]"]
32[Solid2d]
end
subgraph path38 [Path]
38["Path<br>[1564, 1615, 5]"]
39["Segment<br>[1564, 1615, 5]"]
38["Path<br>[1564, 1615, 6]"]
39["Segment<br>[1564, 1615, 6]"]
40[Solid2d]
end
subgraph path47 [Path]
47["Path<br>[1748, 1801, 5]"]
48["Segment<br>[1748, 1801, 5]"]
47["Path<br>[1748, 1801, 6]"]
48["Segment<br>[1748, 1801, 6]"]
49[Solid2d]
end
subgraph path58 [Path]
58["Path<br>[2044, 2116, 5]"]
59["Segment<br>[2044, 2116, 5]"]
58["Path<br>[2044, 2116, 6]"]
59["Segment<br>[2044, 2116, 6]"]
60[Solid2d]
end
subgraph path81 [Path]
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]"]
81["Path<br>[2373, 2404, 6]"]
82["Segment<br>[2410, 2430, 6]"]
83["Segment<br>[2436, 2456, 6]"]
84["Segment<br>[2462, 2483, 6]"]
85["Segment<br>[2489, 2545, 6]"]
86["Segment<br>[2551, 2558, 6]"]
87[Solid2d]
end
subgraph path106 [Path]
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]"]
106["Path<br>[2860, 2892, 6]"]
107["Segment<br>[2898, 2919, 6]"]
108["Segment<br>[2925, 2945, 6]"]
109["Segment<br>[2951, 2971, 6]"]
110["Segment<br>[2977, 3033, 6]"]
111["Segment<br>[3039, 3046, 6]"]
112[Solid2d]
end
subgraph path132 [Path]
132["Path<br>[350, 406, 4]"]
133["Segment<br>[350, 406, 4]"]
132["Path<br>[350, 406, 5]"]
133["Segment<br>[350, 406, 5]"]
134[Solid2d]
end
subgraph path135 [Path]
135["Path<br>[417, 473, 4]"]
136["Segment<br>[417, 473, 4]"]
135["Path<br>[417, 473, 5]"]
136["Segment<br>[417, 473, 5]"]
137[Solid2d]
end
subgraph path144 [Path]
144["Path<br>[638, 694, 4]"]
145["Segment<br>[638, 694, 4]"]
144["Path<br>[638, 694, 5]"]
145["Segment<br>[638, 694, 5]"]
146[Solid2d]
end
subgraph path147 [Path]
147["Path<br>[705, 761, 4]"]
148["Segment<br>[705, 761, 4]"]
147["Path<br>[705, 761, 5]"]
148["Segment<br>[705, 761, 5]"]
149[Solid2d]
end
subgraph path156 [Path]
156["Path<br>[905, 959, 4]"]
157["Segment<br>[905, 959, 4]"]
156["Path<br>[905, 959, 5]"]
157["Segment<br>[905, 959, 5]"]
158[Solid2d]
end
subgraph path167 [Path]
167["Path<br>[1237, 1297, 4]"]
168["Segment<br>[1237, 1297, 4]"]
167["Path<br>[1237, 1297, 5]"]
168["Segment<br>[1237, 1297, 5]"]
169[Solid2d]
end
subgraph path179 [Path]
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]"]
179["Path<br>[1655, 1701, 5]"]
180["Segment<br>[1707, 1759, 5]"]
181["Segment<br>[1765, 1870, 5]"]
182["Segment<br>[1876, 1898, 5]"]
183["Segment<br>[1904, 1960, 5]"]
184["Segment<br>[1966, 1973, 5]"]
185[Solid2d]
end
subgraph path195 [Path]
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]"]
195["Path<br>[2107, 2153, 5]"]
196["Segment<br>[2159, 2211, 5]"]
197["Segment<br>[2217, 2324, 5]"]
198["Segment<br>[2330, 2367, 5]"]
199["Segment<br>[2373, 2429, 5]"]
200["Segment<br>[2435, 2442, 5]"]
201[Solid2d]
end
subgraph path212 [Path]
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]"]
212["Path<br>[2953, 3000, 5]"]
213["Segment<br>[3008, 3348, 5]"]
214["Segment<br>[3356, 3388, 5]"]
215["Segment<br>[3396, 3740, 5]"]
216["Segment<br>[3748, 3804, 5]"]
217["Segment<br>[3812, 3819, 5]"]
218[Solid2d]
end
subgraph path235 [Path]
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]"]
235["Path<br>[2953, 3000, 5]"]
236["Segment<br>[3008, 3348, 5]"]
237["Segment<br>[3356, 3388, 5]"]
238["Segment<br>[3396, 3740, 5]"]
239["Segment<br>[3748, 3804, 5]"]
240["Segment<br>[3812, 3819, 5]"]
241[Solid2d]
end
subgraph path258 [Path]
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]"]
258["Path<br>[4347, 4442, 5]"]
259["Segment<br>[4448, 4481, 5]"]
260["Segment<br>[4487, 4538, 5]"]
261["Segment<br>[4544, 4577, 5]"]
262["Segment<br>[4583, 4633, 5]"]
263["Segment<br>[4639, 4680, 5]"]
264["Segment<br>[4686, 4735, 5]"]
265["Segment<br>[4741, 4774, 5]"]
266["Segment<br>[4780, 4814, 5]"]
267["Segment<br>[4820, 4854, 5]"]
268["Segment<br>[4860, 4912, 5]"]
269["Segment<br>[4918, 4952, 5]"]
270["Segment<br>[4958, 5034, 5]"]
271["Segment<br>[5040, 5073, 5]"]
272["Segment<br>[5079, 5155, 5]"]
273["Segment<br>[5161, 5195, 5]"]
274["Segment<br>[5201, 5275, 5]"]
275["Segment<br>[5281, 5315, 5]"]
276["Segment<br>[5321, 5372, 5]"]
277["Segment<br>[5378, 5440, 5]"]
278["Segment<br>[5446, 5497, 5]"]
279["Segment<br>[5503, 5537, 5]"]
280["Segment<br>[5543, 5576, 5]"]
281["Segment<br>[5582, 5615, 5]"]
282["Segment<br>[5621, 5628, 5]"]
283[Solid2d]
end
subgraph path334 [Path]
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]"]
334["Path<br>[740, 780, 8]"]
335["Segment<br>[788, 850, 8]"]
336["Segment<br>[858, 894, 8]"]
337["Segment<br>[902, 932, 8]"]
338["Segment<br>[940, 992, 8]"]
339["Segment<br>[1000, 1040, 8]"]
340["Segment<br>[1048, 1083, 8]"]
341["Segment<br>[1091, 1129, 8]"]
342["Segment<br>[1137, 1159, 8]"]
343["Segment<br>[1167, 1174, 8]"]
344[Solid2d]
end
subgraph path365 [Path]
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]"]
365["Path<br>[507, 588, 7]"]
366["Segment<br>[594, 695, 7]"]
367["Segment<br>[701, 786, 7]"]
368["Segment<br>[792, 876, 7]"]
369["Segment<br>[882, 968, 7]"]
370["Segment<br>[974, 1059, 7]"]
371["Segment<br>[1065, 1151, 7]"]
372["Segment<br>[1157, 1280, 7]"]
373["Segment<br>[1286, 1372, 7]"]
374["Segment<br>[1378, 1513, 7]"]
375["Segment<br>[1519, 1605, 7]"]
376["Segment<br>[1611, 1735, 7]"]
377["Segment<br>[1741, 1827, 7]"]
378["Segment<br>[1833, 1918, 7]"]
379["Segment<br>[1924, 2010, 7]"]
380["Segment<br>[2016, 2101, 7]"]
381["Segment<br>[2107, 2192, 7]"]
382["Segment<br>[2198, 2205, 7]"]
383[Solid2d]
end
subgraph path439 [Path]
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]"]
439["Path<br>[483, 540, 9]"]
440["Segment<br>[546, 680, 9]"]
441["Segment<br>[686, 741, 9]"]
442["Segment<br>[747, 844, 9]"]
443["Segment<br>[850, 882, 9]"]
444["Segment<br>[888, 920, 9]"]
445["Segment<br>[926, 957, 9]"]
446["Segment<br>[963, 1078, 9]"]
447["Segment<br>[1084, 1116, 9]"]
448["Segment<br>[1122, 1154, 9]"]
449["Segment<br>[1160, 1191, 9]"]
450["Segment<br>[1197, 1290, 9]"]
451["Segment<br>[1296, 1351, 9]"]
452["Segment<br>[1357, 1430, 9]"]
453["Segment<br>[1436, 1443, 9]"]
454[Solid2d]
end
1["Plane<br>[544, 561, 5]"]
5["Sweep Extrusion<br>[627, 683, 5]"]
1["Plane<br>[544, 561, 6]"]
5["Sweep Extrusion<br>[627, 683, 6]"]
6[Wall]
7["Cap Start"]
8["Cap End"]
9["SweepEdge Opposite"]
10["SweepEdge Adjacent"]
14["Sweep Extrusion<br>[872, 934, 5]"]
14["Sweep Extrusion<br>[872, 934, 6]"]
15[Wall]
16["Cap End"]
17["SweepEdge Opposite"]
18["SweepEdge Adjacent"]
22["Sweep Extrusion<br>[1184, 1263, 5]"]
22["Sweep Extrusion<br>[1184, 1263, 6]"]
23[Wall]
24["SweepEdge Opposite"]
25["SweepEdge Adjacent"]
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]"]
26["Sweep Extrusion<br>[1184, 1263, 6]"]
27["Sweep Extrusion<br>[1184, 1263, 6]"]
28["Sweep Extrusion<br>[1184, 1263, 6]"]
29["Sweep Extrusion<br>[1184, 1263, 6]"]
33["Sweep Extrusion<br>[1466, 1499, 6]"]
34[Wall]
35["Cap End"]
36["SweepEdge Opposite"]
37["SweepEdge Adjacent"]
41["Sweep Extrusion<br>[1630, 1695, 5]"]
41["Sweep Extrusion<br>[1630, 1695, 6]"]
42[Wall]
43["Cap Start"]
44["Cap End"]
45["SweepEdge Opposite"]
46["SweepEdge Adjacent"]
50["Sweep Extrusion<br>[1948, 1992, 5]"]
50["Sweep Extrusion<br>[1948, 1992, 6]"]
51[Wall]
52["SweepEdge Opposite"]
53["SweepEdge Adjacent"]
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]"]
54["Sweep Extrusion<br>[1948, 1992, 6]"]
55["Sweep Extrusion<br>[1948, 1992, 6]"]
56["Sweep Extrusion<br>[1948, 1992, 6]"]
57["Sweep Extrusion<br>[1948, 1992, 6]"]
61["Sweep Extrusion<br>[2271, 2315, 6]"]
62[Wall]
63["Cap End"]
64["SweepEdge Opposite"]
65["SweepEdge Adjacent"]
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]"]
66["Sweep Extrusion<br>[2271, 2315, 6]"]
67["Sweep Extrusion<br>[2271, 2315, 6]"]
68["Sweep Extrusion<br>[2271, 2315, 6]"]
69["Sweep Extrusion<br>[2271, 2315, 6]"]
70["Sweep Extrusion<br>[2271, 2315, 6]"]
71["Sweep Extrusion<br>[2271, 2315, 6]"]
72["Sweep Extrusion<br>[2271, 2315, 6]"]
73["Sweep Extrusion<br>[2271, 2315, 6]"]
74["Sweep Extrusion<br>[2271, 2315, 6]"]
75["Sweep Extrusion<br>[2271, 2315, 6]"]
76["Sweep Extrusion<br>[2271, 2315, 6]"]
77["Sweep Extrusion<br>[2271, 2315, 6]"]
78["Sweep Extrusion<br>[2271, 2315, 6]"]
79["Sweep Extrusion<br>[2271, 2315, 6]"]
80["Sweep Extrusion<br>[2271, 2315, 6]"]
88["Sweep Extrusion<br>[2724, 2792, 6]"]
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>[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]"]
102["Sweep Extrusion<br>[2724, 2792, 6]"]
103["Sweep Extrusion<br>[2724, 2792, 6]"]
104["Sweep Extrusion<br>[2724, 2792, 6]"]
105["Sweep Extrusion<br>[2724, 2792, 6]"]
113["Sweep Extrusion<br>[3198, 3272, 6]"]
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>[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]"]
127["Sweep Extrusion<br>[3198, 3272, 6]"]
128["Sweep Extrusion<br>[3198, 3272, 6]"]
129["Sweep Extrusion<br>[3198, 3272, 6]"]
130["Sweep Extrusion<br>[3198, 3272, 6]"]
131["Plane<br>[327, 344, 5]"]
138["Sweep Extrusion<br>[483, 516, 5]"]
139[Wall]
140["Cap Start"]
141["Cap End"]
142["SweepEdge Opposite"]
143["SweepEdge Adjacent"]
150["Sweep Extrusion<br>[771, 804, 4]"]
150["Sweep Extrusion<br>[771, 804, 5]"]
151[Wall]
152["Cap Start"]
153["Cap End"]
154["SweepEdge Opposite"]
155["SweepEdge Adjacent"]
159["Sweep Extrusion<br>[1106, 1140, 4]"]
159["Sweep Extrusion<br>[1106, 1140, 5]"]
160[Wall]
161["SweepEdge Opposite"]
162["SweepEdge Adjacent"]
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]"]
163["Sweep Extrusion<br>[1106, 1140, 5]"]
164["Sweep Extrusion<br>[1106, 1140, 5]"]
165["Sweep Extrusion<br>[1106, 1140, 5]"]
166["Sweep Extrusion<br>[1106, 1140, 5]"]
170["Sweep Extrusion<br>[1444, 1478, 5]"]
171[Wall]
172["SweepEdge Opposite"]
173["SweepEdge Adjacent"]
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]"]
174["Sweep Extrusion<br>[1444, 1478, 5]"]
175["Sweep Extrusion<br>[1444, 1478, 5]"]
176["Sweep Extrusion<br>[1444, 1478, 5]"]
177["Sweep Extrusion<br>[1444, 1478, 5]"]
178["Plane<br>[1632, 1649, 5]"]
186["Sweep Revolve<br>[1979, 1998, 5]"]
187[Wall]
188[Wall]
189[Wall]
@ -332,8 +332,8 @@ flowchart LR
191["SweepEdge Adjacent"]
192["SweepEdge Adjacent"]
193["SweepEdge Adjacent"]
194["Plane<br>[2084, 2101, 4]"]
202["Sweep Revolve<br>[2448, 2467, 4]"]
194["Plane<br>[2084, 2101, 5]"]
202["Sweep Revolve<br>[2448, 2467, 5]"]
203[Wall]
204[Wall]
205[Wall]
@ -342,8 +342,8 @@ flowchart LR
208["SweepEdge Adjacent"]
209["SweepEdge Adjacent"]
210["SweepEdge Adjacent"]
211["Plane<br>[2922, 2945, 4]"]
219["Sweep Extrusion<br>[3867, 3913, 4]"]
211["Plane<br>[2922, 2945, 5]"]
219["Sweep Extrusion<br>[3867, 3913, 5]"]
220[Wall]
221[Wall]
222[Wall]
@ -358,8 +358,8 @@ flowchart LR
231["SweepEdge Adjacent"]
232["SweepEdge Opposite"]
233["SweepEdge Adjacent"]
234["Plane<br>[2922, 2945, 4]"]
242["Sweep Extrusion<br>[3867, 3913, 4]"]
234["Plane<br>[2922, 2945, 5]"]
242["Sweep Extrusion<br>[3867, 3913, 5]"]
243[Wall]
244[Wall]
245[Wall]
@ -374,8 +374,8 @@ flowchart LR
254["SweepEdge Adjacent"]
255["SweepEdge Opposite"]
256["SweepEdge Adjacent"]
257["Plane<br>[4324, 4341, 4]"]
284["Sweep Revolve<br>[5634, 5653, 4]"]
257["Plane<br>[4324, 4341, 5]"]
284["Sweep Revolve<br>[5634, 5653, 5]"]
285[Wall]
286[Wall]
287[Wall]
@ -424,8 +424,8 @@ flowchart LR
330["SweepEdge Adjacent"]
331["SweepEdge Adjacent"]
332["SweepEdge Adjacent"]
333["Plane<br>[706, 732, 7]"]
345["Sweep Revolve<br>[1182, 1201, 7]"]
333["Plane<br>[706, 732, 8]"]
345["Sweep Revolve<br>[1182, 1201, 8]"]
346[Wall]
347[Wall]
348[Wall]
@ -444,8 +444,8 @@ flowchart LR
361["SweepEdge Adjacent"]
362["SweepEdge Adjacent"]
363["SweepEdge Adjacent"]
364["Plane<br>[484, 501, 6]"]
384["Sweep Revolve<br>[2243, 2295, 6]"]
364["Plane<br>[484, 501, 7]"]
384["Sweep Revolve<br>[2243, 2295, 7]"]
385[Wall]
386[Wall]
387[Wall]
@ -499,8 +499,8 @@ flowchart LR
435["SweepEdge Adjacent"]
436["SweepEdge Opposite"]
437["SweepEdge Adjacent"]
438["Plane<br>[460, 477, 8]"]
455["Sweep Revolve<br>[1486, 1517, 8]"]
438["Plane<br>[460, 477, 9]"]
455["Sweep Revolve<br>[1486, 1517, 9]"]
456[Wall]
457[Wall]
458[Wall]
@ -529,17 +529,17 @@ flowchart LR
481["SweepEdge Adjacent"]
482["SweepEdge Adjacent"]
483["SweepEdge Adjacent"]
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]"]
484["StartSketchOnFace<br>[770, 797, 6]"]
485["StartSketchOnFace<br>[947, 978, 6]"]
486["StartSketchOnFace<br>[1385, 1414, 6]"]
487["StartSketchOnFace<br>[1524, 1558, 6]"]
488["StartSketchOnFace<br>[1709, 1742, 6]"]
489["StartSketchOnFace<br>[2009, 2038, 6]"]
490["StartSketchOnFace<br>[2338, 2367, 6]"]
491["StartSketchOnFace<br>[2821, 2854, 6]"]
492["StartSketchOnFace<br>[603, 632, 5]"]
493["StartSketchOnFace<br>[865, 899, 5]"]
494["StartSketchOnFace<br>[1202, 1231, 5]"]
1 --- 2
2 --- 3
2 ---- 5

View File

@ -1848,7 +1848,7 @@ description: Operations executed car-wheel-assembly.kcl
"functionSourceRange": [
2620,
4193,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -2235,7 +2235,7 @@ description: Operations executed car-wheel-assembly.kcl
"functionSourceRange": [
2620,
4193,
4
5
],
"unlabeledArg": null,
"labeledArgs": {},
@ -2660,7 +2660,7 @@ description: Operations executed car-wheel-assembly.kcl
"functionSourceRange": [
664,
1291,
7
8
],
"unlabeledArg": null,
"labeledArgs": {},

View File

@ -5,7 +5,7 @@ description: Variables in memory after executing car-wheel-assembly.kcl
{
"brakeCaliper": {
"type": "Module",
"value": 6
"value": 7
},
"c1": {
"type": "TagIdentifier",
@ -14,15 +14,15 @@ description: Variables in memory after executing car-wheel-assembly.kcl
},
"carRotor": {
"type": "Module",
"value": 5
"value": 6
},
"carTire": {
"type": "Module",
"value": 8
"value": 9
},
"carWheel": {
"type": "Module",
"value": 4
"value": 5
},
"lugCount": {
"type": "Number",
@ -39,6 +39,6 @@ description: Variables in memory after executing car-wheel-assembly.kcl
},
"lugNut": {
"type": "Module",
"value": 7
"value": 8
}
}

View File

@ -1,162 +1,162 @@
```mermaid
flowchart LR
subgraph path2 [Path]
2["Path<br>[224, 279, 4]"]
3["Segment<br>[285, 347, 4]"]
4["Segment<br>[353, 468, 4]"]
5["Segment<br>[474, 594, 4]"]
6["Segment<br>[600, 685, 4]"]
7["Segment<br>[691, 698, 4]"]
2["Path<br>[224, 279, 5]"]
3["Segment<br>[285, 347, 5]"]
4["Segment<br>[353, 468, 5]"]
5["Segment<br>[474, 594, 5]"]
6["Segment<br>[600, 685, 5]"]
7["Segment<br>[691, 698, 5]"]
8[Solid2d]
end
subgraph path28 [Path]
28["Path<br>[1134, 1191, 4]"]
29["Segment<br>[1134, 1191, 4]"]
28["Path<br>[1134, 1191, 5]"]
29["Segment<br>[1134, 1191, 5]"]
30[Solid2d]
end
subgraph path36 [Path]
36["Path<br>[1389, 1426, 4]"]
37["Segment<br>[1389, 1426, 4]"]
36["Path<br>[1389, 1426, 5]"]
37["Segment<br>[1389, 1426, 5]"]
38[Solid2d]
end
subgraph path44 [Path]
44["Path<br>[1558, 1698, 4]"]
45["Segment<br>[1558, 1698, 4]"]
44["Path<br>[1558, 1698, 5]"]
45["Segment<br>[1558, 1698, 5]"]
46[Solid2d]
end
subgraph path54 [Path]
54["Path<br>[1944, 2084, 4]"]
55["Segment<br>[1944, 2084, 4]"]
54["Path<br>[1944, 2084, 5]"]
55["Segment<br>[1944, 2084, 5]"]
56[Solid2d]
end
subgraph path65 [Path]
65["Path<br>[203, 263, 5]"]
66["Segment<br>[203, 263, 5]"]
65["Path<br>[203, 263, 6]"]
66["Segment<br>[203, 263, 6]"]
67[Solid2d]
end
subgraph path75 [Path]
75["Path<br>[493, 529, 5]"]
76["Segment<br>[535, 579, 5]"]
77["Segment<br>[585, 673, 5]"]
78["Segment<br>[679, 728, 5]"]
79["Segment<br>[734, 790, 5]"]
80["Segment<br>[796, 803, 5]"]
75["Path<br>[493, 529, 6]"]
76["Segment<br>[535, 579, 6]"]
77["Segment<br>[585, 673, 6]"]
78["Segment<br>[679, 728, 6]"]
79["Segment<br>[734, 790, 6]"]
80["Segment<br>[796, 803, 6]"]
81[Solid2d]
end
subgraph path97 [Path]
97["Path<br>[900, 1075, 5]"]
98["Segment<br>[900, 1075, 5]"]
97["Path<br>[900, 1075, 6]"]
98["Segment<br>[900, 1075, 6]"]
99[Solid2d]
end
subgraph path105 [Path]
105["Path<br>[1279, 1426, 5]"]
106["Segment<br>[1279, 1426, 5]"]
105["Path<br>[1279, 1426, 6]"]
106["Segment<br>[1279, 1426, 6]"]
107[Solid2d]
end
subgraph path116 [Path]
116["Path<br>[1743, 1917, 5]"]
117["Segment<br>[1743, 1917, 5]"]
116["Path<br>[1743, 1917, 6]"]
117["Segment<br>[1743, 1917, 6]"]
118[Solid2d]
end
subgraph path125 [Path]
125["Path<br>[2142, 2182, 5]"]
126["Segment<br>[2142, 2182, 5]"]
125["Path<br>[2142, 2182, 6]"]
126["Segment<br>[2142, 2182, 6]"]
127[Solid2d]
end
subgraph path137 [Path]
137["Path<br>[251, 394, 6]"]
138["Segment<br>[400, 516, 6]"]
139["Segment<br>[522, 600, 6]"]
140["Segment<br>[606, 722, 6]"]
141["Segment<br>[728, 784, 6]"]
142["Segment<br>[790, 797, 6]"]
137["Path<br>[251, 394, 7]"]
138["Segment<br>[400, 516, 7]"]
139["Segment<br>[522, 600, 7]"]
140["Segment<br>[606, 722, 7]"]
141["Segment<br>[728, 784, 7]"]
142["Segment<br>[790, 797, 7]"]
143[Solid2d]
end
subgraph path159 [Path]
159["Path<br>[913, 977, 6]"]
160["Segment<br>[913, 977, 6]"]
159["Path<br>[913, 977, 7]"]
160["Segment<br>[913, 977, 7]"]
161[Solid2d]
end
subgraph path167 [Path]
167["Path<br>[1146, 1354, 6]"]
168["Segment<br>[1146, 1354, 6]"]
167["Path<br>[1146, 1354, 7]"]
168["Segment<br>[1146, 1354, 7]"]
169[Solid2d]
end
subgraph path175 [Path]
175["Path<br>[1557, 1601, 6]"]
176["Segment<br>[1557, 1601, 6]"]
175["Path<br>[1557, 1601, 7]"]
176["Segment<br>[1557, 1601, 7]"]
177[Solid2d]
end
subgraph path190 [Path]
190["Path<br>[1839, 2031, 6]"]
191["Segment<br>[1839, 2031, 6]"]
190["Path<br>[1839, 2031, 7]"]
191["Segment<br>[1839, 2031, 7]"]
192[Solid2d]
end
subgraph path201 [Path]
201["Path<br>[2384, 2559, 6]"]
202["Segment<br>[2384, 2559, 6]"]
201["Path<br>[2384, 2559, 7]"]
202["Segment<br>[2384, 2559, 7]"]
203[Solid2d]
end
subgraph path210 [Path]
210["Path<br>[271, 504, 7]"]
211["Segment<br>[510, 629, 7]"]
212["Segment<br>[635, 715, 7]"]
213["Segment<br>[721, 840, 7]"]
214["Segment<br>[846, 916, 7]"]
215["Segment<br>[922, 929, 7]"]
210["Path<br>[271, 504, 8]"]
211["Segment<br>[510, 629, 8]"]
212["Segment<br>[635, 715, 8]"]
213["Segment<br>[721, 840, 8]"]
214["Segment<br>[846, 916, 8]"]
215["Segment<br>[922, 929, 8]"]
216[Solid2d]
end
subgraph path232 [Path]
232["Path<br>[1043, 1252, 7]"]
233["Segment<br>[1043, 1252, 7]"]
232["Path<br>[1043, 1252, 8]"]
233["Segment<br>[1043, 1252, 8]"]
234[Solid2d]
end
subgraph path240 [Path]
240["Path<br>[1457, 1646, 7]"]
241["Segment<br>[1457, 1646, 7]"]
240["Path<br>[1457, 1646, 8]"]
241["Segment<br>[1457, 1646, 8]"]
242[Solid2d]
end
subgraph path255 [Path]
255["Path<br>[2067, 2353, 7]"]
256["Segment<br>[2067, 2353, 7]"]
255["Path<br>[2067, 2353, 8]"]
256["Segment<br>[2067, 2353, 8]"]
257[Solid2d]
end
subgraph path264 [Path]
264["Path<br>[2452, 2736, 7]"]
265["Segment<br>[2452, 2736, 7]"]
264["Path<br>[2452, 2736, 8]"]
265["Segment<br>[2452, 2736, 8]"]
266[Solid2d]
end
subgraph path273 [Path]
273["Path<br>[2890, 2928, 7]"]
274["Segment<br>[2890, 2928, 7]"]
273["Path<br>[2890, 2928, 8]"]
274["Segment<br>[2890, 2928, 8]"]
275[Solid2d]
end
subgraph path282 [Path]
282["Path<br>[3058, 3283, 7]"]
283["Segment<br>[3289, 3383, 7]"]
284["Segment<br>[3389, 3532, 7]"]
285["Segment<br>[3538, 3632, 7]"]
286["Segment<br>[3638, 3740, 7]"]
287["Segment<br>[3746, 3848, 7]"]
288["Segment<br>[3854, 3954, 7]"]
289["Segment<br>[3960, 4016, 7]"]
290["Segment<br>[4022, 4029, 7]"]
282["Path<br>[3058, 3283, 8]"]
283["Segment<br>[3289, 3383, 8]"]
284["Segment<br>[3389, 3532, 8]"]
285["Segment<br>[3538, 3632, 8]"]
286["Segment<br>[3638, 3740, 8]"]
287["Segment<br>[3746, 3848, 8]"]
288["Segment<br>[3854, 3954, 8]"]
289["Segment<br>[3960, 4016, 8]"]
290["Segment<br>[4022, 4029, 8]"]
291[Solid2d]
end
subgraph path316 [Path]
316["Path<br>[4158, 4383, 7]"]
317["Segment<br>[4389, 4485, 7]"]
318["Segment<br>[4491, 4639, 7]"]
319["Segment<br>[4645, 4741, 7]"]
320["Segment<br>[4747, 4851, 7]"]
321["Segment<br>[4857, 4961, 7]"]
322["Segment<br>[4967, 5069, 7]"]
323["Segment<br>[5075, 5131, 7]"]
324["Segment<br>[5137, 5144, 7]"]
316["Path<br>[4158, 4383, 8]"]
317["Segment<br>[4389, 4485, 8]"]
318["Segment<br>[4491, 4639, 8]"]
319["Segment<br>[4645, 4741, 8]"]
320["Segment<br>[4747, 4851, 8]"]
321["Segment<br>[4857, 4961, 8]"]
322["Segment<br>[4967, 5069, 8]"]
323["Segment<br>[5075, 5131, 8]"]
324["Segment<br>[5137, 5144, 8]"]
325[Solid2d]
end
1["Plane<br>[201, 218, 4]"]
9["Sweep Extrusion<br>[712, 759, 4]"]
1["Plane<br>[201, 218, 5]"]
9["Sweep Extrusion<br>[712, 759, 5]"]
10[Wall]
11[Wall]
12[Wall]
@ -171,43 +171,43 @@ flowchart LR
21["SweepEdge Adjacent"]
22["SweepEdge Opposite"]
23["SweepEdge Adjacent"]
24["EdgeCut Chamfer<br>[765, 1042, 4]"]
25["EdgeCut Chamfer<br>[765, 1042, 4]"]
26["EdgeCut Chamfer<br>[765, 1042, 4]"]
27["EdgeCut Chamfer<br>[765, 1042, 4]"]
31["Sweep Extrusion<br>[1205, 1271, 4]"]
24["EdgeCut Chamfer<br>[765, 1042, 5]"]
25["EdgeCut Chamfer<br>[765, 1042, 5]"]
26["EdgeCut Chamfer<br>[765, 1042, 5]"]
27["EdgeCut Chamfer<br>[765, 1042, 5]"]
31["Sweep Extrusion<br>[1205, 1271, 5]"]
32[Wall]
33["Cap End"]
34["SweepEdge Opposite"]
35["SweepEdge Adjacent"]
39["Sweep Extrusion<br>[1440, 1470, 4]"]
39["Sweep Extrusion<br>[1440, 1470, 5]"]
40[Wall]
41["Cap End"]
42["SweepEdge Opposite"]
43["SweepEdge Adjacent"]
47["Sweep Extrusion<br>[1846, 1893, 4]"]
47["Sweep Extrusion<br>[1846, 1893, 5]"]
48[Wall]
49["SweepEdge Opposite"]
50["SweepEdge Adjacent"]
51["Sweep Extrusion<br>[1846, 1893, 4]"]
52["Sweep Extrusion<br>[1846, 1893, 4]"]
53["Sweep Extrusion<br>[1846, 1893, 4]"]
57["Sweep Extrusion<br>[2220, 2267, 4]"]
51["Sweep Extrusion<br>[1846, 1893, 5]"]
52["Sweep Extrusion<br>[1846, 1893, 5]"]
53["Sweep Extrusion<br>[1846, 1893, 5]"]
57["Sweep Extrusion<br>[2220, 2267, 5]"]
58[Wall]
59["SweepEdge Opposite"]
60["SweepEdge Adjacent"]
61["Sweep Extrusion<br>[2220, 2267, 4]"]
62["Sweep Extrusion<br>[2220, 2267, 4]"]
63["Sweep Extrusion<br>[2220, 2267, 4]"]
64["Plane<br>[174, 197, 5]"]
68["Sweep Extrusion<br>[277, 315, 5]"]
61["Sweep Extrusion<br>[2220, 2267, 5]"]
62["Sweep Extrusion<br>[2220, 2267, 5]"]
63["Sweep Extrusion<br>[2220, 2267, 5]"]
64["Plane<br>[174, 197, 6]"]
68["Sweep Extrusion<br>[277, 315, 6]"]
69[Wall]
70["Cap Start"]
71["Cap End"]
72["SweepEdge Opposite"]
73["SweepEdge Adjacent"]
74["Plane<br>[464, 487, 5]"]
82["Sweep Extrusion<br>[818, 848, 5]"]
74["Plane<br>[464, 487, 6]"]
82["Sweep Extrusion<br>[818, 848, 6]"]
83[Wall]
84[Wall]
85[Wall]
@ -222,35 +222,35 @@ flowchart LR
94["SweepEdge Adjacent"]
95["SweepEdge Opposite"]
96["SweepEdge Adjacent"]
100["Sweep Extrusion<br>[1089, 1121, 5]"]
100["Sweep Extrusion<br>[1089, 1121, 6]"]
101[Wall]
102["Cap End"]
103["SweepEdge Opposite"]
104["SweepEdge Adjacent"]
108["Sweep Extrusion<br>[1659, 1691, 5]"]
108["Sweep Extrusion<br>[1659, 1691, 6]"]
109[Wall]
110["Cap End"]
111["SweepEdge Opposite"]
112["SweepEdge Adjacent"]
113["Sweep Extrusion<br>[1659, 1691, 5]"]
114["Sweep Extrusion<br>[1659, 1691, 5]"]
115["Sweep Extrusion<br>[1659, 1691, 5]"]
119["Sweep Extrusion<br>[1931, 1964, 5]"]
113["Sweep Extrusion<br>[1659, 1691, 6]"]
114["Sweep Extrusion<br>[1659, 1691, 6]"]
115["Sweep Extrusion<br>[1659, 1691, 6]"]
119["Sweep Extrusion<br>[1931, 1964, 6]"]
120[Wall]
121["Cap End"]
122["SweepEdge Opposite"]
123["SweepEdge Adjacent"]
124["Plane<br>[2113, 2136, 5]"]
128["Sweep Extrusion<br>[2184, 2215, 5]"]
124["Plane<br>[2113, 2136, 6]"]
128["Sweep Extrusion<br>[2184, 2215, 6]"]
129[Wall]
130["Cap Start"]
131["Cap End"]
132["SweepEdge Opposite"]
133["SweepEdge Adjacent"]
134["EdgeCut Fillet<br>[321, 383, 5]"]
135["EdgeCut Fillet<br>[1970, 2032, 5]"]
136["Plane<br>[222, 245, 6]"]
144["Sweep Extrusion<br>[811, 859, 6]"]
134["EdgeCut Fillet<br>[321, 383, 6]"]
135["EdgeCut Fillet<br>[1970, 2032, 6]"]
136["Plane<br>[222, 245, 7]"]
144["Sweep Extrusion<br>[811, 859, 7]"]
145[Wall]
146[Wall]
147[Wall]
@ -265,43 +265,43 @@ flowchart LR
156["SweepEdge Adjacent"]
157["SweepEdge Opposite"]
158["SweepEdge Adjacent"]
162["Sweep Extrusion<br>[992, 1025, 6]"]
162["Sweep Extrusion<br>[992, 1025, 7]"]
163[Wall]
164["Cap End"]
165["SweepEdge Opposite"]
166["SweepEdge Adjacent"]
170["Sweep Extrusion<br>[1369, 1399, 6]"]
170["Sweep Extrusion<br>[1369, 1399, 7]"]
171[Wall]
172["Cap End"]
173["SweepEdge Opposite"]
174["SweepEdge Adjacent"]
178["Sweep Extrusion<br>[1754, 1787, 6]"]
178["Sweep Extrusion<br>[1754, 1787, 7]"]
179[Wall]
180["Cap End"]
181["SweepEdge Opposite"]
182["SweepEdge Adjacent"]
183["Sweep Extrusion<br>[1754, 1787, 6]"]
184["Sweep Extrusion<br>[1754, 1787, 6]"]
185["Sweep Extrusion<br>[1754, 1787, 6]"]
186["Sweep Extrusion<br>[1754, 1787, 6]"]
187["Sweep Extrusion<br>[1754, 1787, 6]"]
188["Sweep Extrusion<br>[1754, 1787, 6]"]
189["Sweep Extrusion<br>[1754, 1787, 6]"]
193["Sweep Extrusion<br>[2299, 2332, 6]"]
183["Sweep Extrusion<br>[1754, 1787, 7]"]
184["Sweep Extrusion<br>[1754, 1787, 7]"]
185["Sweep Extrusion<br>[1754, 1787, 7]"]
186["Sweep Extrusion<br>[1754, 1787, 7]"]
187["Sweep Extrusion<br>[1754, 1787, 7]"]
188["Sweep Extrusion<br>[1754, 1787, 7]"]
189["Sweep Extrusion<br>[1754, 1787, 7]"]
193["Sweep Extrusion<br>[2299, 2332, 7]"]
194[Wall]
195["Cap End"]
196["SweepEdge Opposite"]
197["SweepEdge Adjacent"]
198["Sweep Extrusion<br>[2299, 2332, 6]"]
199["Sweep Extrusion<br>[2299, 2332, 6]"]
200["Sweep Extrusion<br>[2299, 2332, 6]"]
204["Sweep Extrusion<br>[2561, 2591, 6]"]
198["Sweep Extrusion<br>[2299, 2332, 7]"]
199["Sweep Extrusion<br>[2299, 2332, 7]"]
200["Sweep Extrusion<br>[2299, 2332, 7]"]
204["Sweep Extrusion<br>[2561, 2591, 7]"]
205[Wall]
206["Cap End"]
207["SweepEdge Opposite"]
208["SweepEdge Adjacent"]
209["Plane<br>[242, 265, 7]"]
217["Sweep Extrusion<br>[943, 991, 7]"]
209["Plane<br>[242, 265, 8]"]
217["Sweep Extrusion<br>[943, 991, 8]"]
218[Wall]
219[Wall]
220[Wall]
@ -316,42 +316,42 @@ flowchart LR
229["SweepEdge Adjacent"]
230["SweepEdge Opposite"]
231["SweepEdge Adjacent"]
235["Sweep Extrusion<br>[1267, 1300, 7]"]
235["Sweep Extrusion<br>[1267, 1300, 8]"]
236[Wall]
237["Cap End"]
238["SweepEdge Opposite"]
239["SweepEdge Adjacent"]
243["Sweep Extrusion<br>[1911, 1944, 7]"]
243["Sweep Extrusion<br>[1911, 1944, 8]"]
244[Wall]
245["Cap End"]
246["SweepEdge Opposite"]
247["SweepEdge Adjacent"]
248["Sweep Extrusion<br>[1911, 1944, 7]"]
249["Sweep Extrusion<br>[1911, 1944, 7]"]
250["Sweep Extrusion<br>[1911, 1944, 7]"]
251["Sweep Extrusion<br>[1911, 1944, 7]"]
252["Sweep Extrusion<br>[1911, 1944, 7]"]
253["Sweep Extrusion<br>[1911, 1944, 7]"]
254["Sweep Extrusion<br>[1911, 1944, 7]"]
258["Sweep Extrusion<br>[2367, 2400, 7]"]
248["Sweep Extrusion<br>[1911, 1944, 8]"]
249["Sweep Extrusion<br>[1911, 1944, 8]"]
250["Sweep Extrusion<br>[1911, 1944, 8]"]
251["Sweep Extrusion<br>[1911, 1944, 8]"]
252["Sweep Extrusion<br>[1911, 1944, 8]"]
253["Sweep Extrusion<br>[1911, 1944, 8]"]
254["Sweep Extrusion<br>[1911, 1944, 8]"]
258["Sweep Extrusion<br>[2367, 2400, 8]"]
259[Wall]
260["Cap Start"]
261["Cap End"]
262["SweepEdge Opposite"]
263["SweepEdge Adjacent"]
267["Sweep Extrusion<br>[2751, 2784, 7]"]
267["Sweep Extrusion<br>[2751, 2784, 8]"]
268[Wall]
269["Cap Start"]
270["Cap End"]
271["SweepEdge Opposite"]
272["SweepEdge Adjacent"]
276["Sweep Extrusion<br>[2943, 2977, 7]"]
276["Sweep Extrusion<br>[2943, 2977, 8]"]
277[Wall]
278["Cap Start"]
279["Cap End"]
280["SweepEdge Opposite"]
281["SweepEdge Adjacent"]
292["Sweep Extrusion<br>[4044, 4077, 7]"]
292["Sweep Extrusion<br>[4044, 4077, 8]"]
293[Wall]
294[Wall]
295[Wall]
@ -375,7 +375,7 @@ flowchart LR
313["SweepEdge Adjacent"]
314["SweepEdge Opposite"]
315["SweepEdge Adjacent"]
326["Sweep Extrusion<br>[5146, 5179, 7]"]
326["Sweep Extrusion<br>[5146, 5179, 8]"]
327[Wall]
328[Wall]
329[Wall]
@ -399,25 +399,25 @@ flowchart LR
347["SweepEdge Adjacent"]
348["SweepEdge Opposite"]
349["SweepEdge Adjacent"]
350["StartSketchOnFace<br>[1096, 1128, 4]"]
351["StartSketchOnFace<br>[1351, 1383, 4]"]
352["StartSketchOnFace<br>[1520, 1552, 4]"]
353["StartSketchOnFace<br>[1906, 1938, 4]"]
354["StartSketchOnFace<br>[862, 894, 5]"]
355["StartSketchOnFace<br>[1241, 1273, 5]"]
356["StartSketchOnFace<br>[1705, 1737, 5]"]
357["StartSketchOnFace<br>[873, 907, 6]"]
358["StartSketchOnFace<br>[1106, 1140, 6]"]
359["StartSketchOnFace<br>[1519, 1551, 6]"]
360["StartSketchOnFace<br>[1801, 1833, 6]"]
361["StartSketchOnFace<br>[2346, 2378, 6]"]
362["StartSketchOnFace<br>[1005, 1037, 7]"]
363["StartSketchOnFace<br>[1419, 1451, 7]"]
364["StartSketchOnFace<br>[2027, 2061, 7]"]
365["StartSketchOnFace<br>[2414, 2446, 7]"]
366["StartSketchOnFace<br>[2850, 2884, 7]"]
367["StartSketchOnFace<br>[3018, 3052, 7]"]
368["StartSketchOnFace<br>[4118, 4152, 7]"]
350["StartSketchOnFace<br>[1096, 1128, 5]"]
351["StartSketchOnFace<br>[1351, 1383, 5]"]
352["StartSketchOnFace<br>[1520, 1552, 5]"]
353["StartSketchOnFace<br>[1906, 1938, 5]"]
354["StartSketchOnFace<br>[862, 894, 6]"]
355["StartSketchOnFace<br>[1241, 1273, 6]"]
356["StartSketchOnFace<br>[1705, 1737, 6]"]
357["StartSketchOnFace<br>[873, 907, 7]"]
358["StartSketchOnFace<br>[1106, 1140, 7]"]
359["StartSketchOnFace<br>[1519, 1551, 7]"]
360["StartSketchOnFace<br>[1801, 1833, 7]"]
361["StartSketchOnFace<br>[2346, 2378, 7]"]
362["StartSketchOnFace<br>[1005, 1037, 8]"]
363["StartSketchOnFace<br>[1419, 1451, 8]"]
364["StartSketchOnFace<br>[2027, 2061, 8]"]
365["StartSketchOnFace<br>[2414, 2446, 8]"]
366["StartSketchOnFace<br>[2850, 2884, 8]"]
367["StartSketchOnFace<br>[3018, 3052, 8]"]
368["StartSketchOnFace<br>[4118, 4152, 8]"]
1 --- 2
2 --- 3
2 --- 4

View File

@ -5,18 +5,18 @@ description: Variables in memory after executing multi-axis-robot.kcl
{
"j2RobotArm": {
"type": "Module",
"value": 6
"value": 7
},
"j3RobotArm": {
"type": "Module",
"value": 7
"value": 8
},
"robotArmBase": {
"type": "Module",
"value": 4
"value": 5
},
"rotatingBase": {
"type": "Module",
"value": 5
"value": 6
}
}

View File

@ -1,206 +1,206 @@
```mermaid
flowchart LR
subgraph path2 [Path]
2["Path<br>[537, 630, 5]"]
3["Segment<br>[537, 630, 5]"]
2["Path<br>[537, 630, 6]"]
3["Segment<br>[537, 630, 6]"]
4[Solid2d]
end
subgraph path6 [Path]
6["Path<br>[859, 914, 5]"]
7["Segment<br>[859, 914, 5]"]
6["Path<br>[859, 914, 6]"]
7["Segment<br>[859, 914, 6]"]
8[Solid2d]
end
subgraph path15 [Path]
15["Path<br>[1129, 1188, 5]"]
16["Segment<br>[1129, 1188, 5]"]
15["Path<br>[1129, 1188, 6]"]
16["Segment<br>[1129, 1188, 6]"]
17[Solid2d]
end
subgraph path23 [Path]
23["Path<br>[1290, 1350, 5]"]
24["Segment<br>[1290, 1350, 5]"]
23["Path<br>[1290, 1350, 6]"]
24["Segment<br>[1290, 1350, 6]"]
25[Solid2d]
end
subgraph path31 [Path]
31["Path<br>[1507, 1560, 5]"]
32["Segment<br>[1507, 1560, 5]"]
31["Path<br>[1507, 1560, 6]"]
32["Segment<br>[1507, 1560, 6]"]
33[Solid2d]
end
subgraph path39 [Path]
39["Path<br>[537, 630, 5]"]
40["Segment<br>[537, 630, 5]"]
39["Path<br>[537, 630, 6]"]
40["Segment<br>[537, 630, 6]"]
41[Solid2d]
end
subgraph path43 [Path]
43["Path<br>[859, 914, 5]"]
44["Segment<br>[859, 914, 5]"]
43["Path<br>[859, 914, 6]"]
44["Segment<br>[859, 914, 6]"]
45[Solid2d]
end
subgraph path52 [Path]
52["Path<br>[1129, 1188, 5]"]
53["Segment<br>[1129, 1188, 5]"]
52["Path<br>[1129, 1188, 6]"]
53["Segment<br>[1129, 1188, 6]"]
54[Solid2d]
end
subgraph path60 [Path]
60["Path<br>[1290, 1350, 5]"]
61["Segment<br>[1290, 1350, 5]"]
60["Path<br>[1290, 1350, 6]"]
61["Segment<br>[1290, 1350, 6]"]
62[Solid2d]
end
subgraph path68 [Path]
68["Path<br>[1507, 1560, 5]"]
69["Segment<br>[1507, 1560, 5]"]
68["Path<br>[1507, 1560, 6]"]
69["Segment<br>[1507, 1560, 6]"]
70[Solid2d]
end
subgraph path76 [Path]
76["Path<br>[494, 556, 6]"]
77["Segment<br>[494, 556, 6]"]
76["Path<br>[494, 556, 7]"]
77["Segment<br>[494, 556, 7]"]
78[Solid2d]
end
subgraph path85 [Path]
85["Path<br>[706, 766, 6]"]
86["Segment<br>[706, 766, 6]"]
85["Path<br>[706, 766, 7]"]
86["Segment<br>[706, 766, 7]"]
87[Solid2d]
end
subgraph path93 [Path]
93["Path<br>[355, 407, 7]"]
94["Segment<br>[355, 407, 7]"]
93["Path<br>[355, 407, 8]"]
94["Segment<br>[355, 407, 8]"]
95[Solid2d]
end
subgraph path102 [Path]
102["Path<br>[540, 592, 7]"]
103["Segment<br>[540, 592, 7]"]
102["Path<br>[540, 592, 8]"]
103["Segment<br>[540, 592, 8]"]
104[Solid2d]
end
subgraph path110 [Path]
110["Path<br>[446, 516, 8]"]
111["Segment<br>[446, 516, 8]"]
110["Path<br>[446, 516, 9]"]
111["Segment<br>[446, 516, 9]"]
112[Solid2d]
end
subgraph path121 [Path]
121["Path<br>[780, 867, 8]"]
122["Segment<br>[875, 958, 8]"]
123["Segment<br>[966, 1049, 8]"]
124["Segment<br>[1057, 1140, 8]"]
125["Segment<br>[1148, 1230, 8]"]
126["Segment<br>[1238, 1320, 8]"]
127["Segment<br>[1328, 1335, 8]"]
121["Path<br>[780, 867, 9]"]
122["Segment<br>[875, 958, 9]"]
123["Segment<br>[966, 1049, 9]"]
124["Segment<br>[1057, 1140, 9]"]
125["Segment<br>[1148, 1230, 9]"]
126["Segment<br>[1238, 1320, 9]"]
127["Segment<br>[1328, 1335, 9]"]
128[Solid2d]
end
subgraph path149 [Path]
149["Path<br>[1469, 1538, 8]"]
150["Segment<br>[1469, 1538, 8]"]
149["Path<br>[1469, 1538, 9]"]
150["Segment<br>[1469, 1538, 9]"]
151[Solid2d]
end
subgraph path158 [Path]
158["Path<br>[378, 468, 9]"]
159["Segment<br>[476, 558, 9]"]
160["Segment<br>[566, 648, 9]"]
161["Segment<br>[656, 738, 9]"]
162["Segment<br>[746, 827, 9]"]
163["Segment<br>[835, 916, 9]"]
164["Segment<br>[924, 931, 9]"]
158["Path<br>[378, 468, 10]"]
159["Segment<br>[476, 558, 10]"]
160["Segment<br>[566, 648, 10]"]
161["Segment<br>[656, 738, 10]"]
162["Segment<br>[746, 827, 10]"]
163["Segment<br>[835, 916, 10]"]
164["Segment<br>[924, 931, 10]"]
165[Solid2d]
end
subgraph path187 [Path]
187["Path<br>[1075, 1127, 9]"]
188["Segment<br>[1075, 1127, 9]"]
187["Path<br>[1075, 1127, 10]"]
188["Segment<br>[1075, 1127, 10]"]
189[Solid2d]
end
subgraph path195 [Path]
195["Path<br>[313, 371, 10]"]
196["Segment<br>[313, 371, 10]"]
195["Path<br>[313, 371, 11]"]
196["Segment<br>[313, 371, 11]"]
197[Solid2d]
end
subgraph path204 [Path]
204["Path<br>[510, 565, 10]"]
205["Segment<br>[510, 565, 10]"]
204["Path<br>[510, 565, 11]"]
205["Segment<br>[510, 565, 11]"]
206[Solid2d]
end
subgraph path212 [Path]
212["Path<br>[313, 371, 10]"]
213["Segment<br>[313, 371, 10]"]
212["Path<br>[313, 371, 11]"]
213["Segment<br>[313, 371, 11]"]
214[Solid2d]
end
subgraph path221 [Path]
221["Path<br>[510, 565, 10]"]
222["Segment<br>[510, 565, 10]"]
221["Path<br>[510, 565, 11]"]
222["Segment<br>[510, 565, 11]"]
223[Solid2d]
end
1["Plane<br>[512, 529, 5]"]
5["Plane<br>[834, 851, 5]"]
9["Sweep Extrusion<br>[952, 992, 5]"]
1["Plane<br>[512, 529, 6]"]
5["Plane<br>[834, 851, 6]"]
9["Sweep Extrusion<br>[952, 992, 6]"]
10[Wall]
11["Cap Start"]
12["Cap End"]
13["SweepEdge Opposite"]
14["SweepEdge Adjacent"]
18["Sweep Extrusion<br>[1196, 1233, 5]"]
18["Sweep Extrusion<br>[1196, 1233, 6]"]
19[Wall]
20["Cap End"]
21["SweepEdge Opposite"]
22["SweepEdge Adjacent"]
26["Sweep Extrusion<br>[1358, 1396, 5]"]
26["Sweep Extrusion<br>[1358, 1396, 6]"]
27[Wall]
28["Cap End"]
29["SweepEdge Opposite"]
30["SweepEdge Adjacent"]
34["Sweep Extrusion<br>[1568, 1610, 5]"]
34["Sweep Extrusion<br>[1568, 1610, 6]"]
35[Wall]
36["SweepEdge Opposite"]
37["SweepEdge Adjacent"]
38["Plane<br>[512, 529, 5]"]
42["Plane<br>[834, 851, 5]"]
46["Sweep Extrusion<br>[952, 992, 5]"]
38["Plane<br>[512, 529, 6]"]
42["Plane<br>[834, 851, 6]"]
46["Sweep Extrusion<br>[952, 992, 6]"]
47[Wall]
48["Cap Start"]
49["Cap End"]
50["SweepEdge Opposite"]
51["SweepEdge Adjacent"]
55["Sweep Extrusion<br>[1196, 1233, 5]"]
55["Sweep Extrusion<br>[1196, 1233, 6]"]
56[Wall]
57["Cap End"]
58["SweepEdge Opposite"]
59["SweepEdge Adjacent"]
63["Sweep Extrusion<br>[1358, 1396, 5]"]
63["Sweep Extrusion<br>[1358, 1396, 6]"]
64[Wall]
65["Cap End"]
66["SweepEdge Opposite"]
67["SweepEdge Adjacent"]
71["Sweep Extrusion<br>[1568, 1610, 5]"]
71["Sweep Extrusion<br>[1568, 1610, 6]"]
72[Wall]
73["SweepEdge Opposite"]
74["SweepEdge Adjacent"]
75["Plane<br>[469, 486, 6]"]
79["Sweep Extrusion<br>[564, 600, 6]"]
75["Plane<br>[469, 486, 7]"]
79["Sweep Extrusion<br>[564, 600, 7]"]
80[Wall]
81["Cap Start"]
82["Cap End"]
83["SweepEdge Opposite"]
84["SweepEdge Adjacent"]
88["Sweep Extrusion<br>[774, 811, 6]"]
88["Sweep Extrusion<br>[774, 811, 7]"]
89[Wall]
90["SweepEdge Opposite"]
91["SweepEdge Adjacent"]
92["Plane<br>[330, 347, 7]"]
96["Sweep Extrusion<br>[415, 448, 7]"]
92["Plane<br>[330, 347, 8]"]
96["Sweep Extrusion<br>[415, 448, 8]"]
97[Wall]
98["Cap Start"]
99["Cap End"]
100["SweepEdge Opposite"]
101["SweepEdge Adjacent"]
105["Sweep Extrusion<br>[600, 637, 7]"]
105["Sweep Extrusion<br>[600, 637, 8]"]
106[Wall]
107["SweepEdge Opposite"]
108["SweepEdge Adjacent"]
109["Plane<br>[421, 438, 8]"]
113["Sweep Extrusion<br>[524, 557, 8]"]
109["Plane<br>[421, 438, 9]"]
113["Sweep Extrusion<br>[524, 557, 9]"]
114[Wall]
115["Cap Start"]
116["Cap End"]
117["SweepEdge Opposite"]
118["SweepEdge Adjacent"]
119["EdgeCut Fillet<br>[565, 631, 8]"]
120["EdgeCut Fillet<br>[565, 631, 8]"]
129["Sweep Extrusion<br>[1343, 1383, 8]"]
119["EdgeCut Fillet<br>[565, 631, 9]"]
120["EdgeCut Fillet<br>[565, 631, 9]"]
129["Sweep Extrusion<br>[1343, 1383, 9]"]
130[Wall]
131[Wall]
132[Wall]
@ -220,13 +220,13 @@ flowchart LR
146["SweepEdge Adjacent"]
147["SweepEdge Opposite"]
148["SweepEdge Adjacent"]
152["Sweep Extrusion<br>[1546, 1574, 8]"]
152["Sweep Extrusion<br>[1546, 1574, 9]"]
153[Wall]
154["Cap End"]
155["SweepEdge Opposite"]
156["SweepEdge Adjacent"]
157["Plane<br>[353, 370, 9]"]
166["Sweep Extrusion<br>[939, 972, 9]"]
157["Plane<br>[353, 370, 10]"]
166["Sweep Extrusion<br>[939, 972, 10]"]
167[Wall]
168[Wall]
169[Wall]
@ -247,45 +247,45 @@ flowchart LR
184["SweepEdge Adjacent"]
185["SweepEdge Opposite"]
186["SweepEdge Adjacent"]
190["Sweep Extrusion<br>[1135, 1172, 9]"]
190["Sweep Extrusion<br>[1135, 1172, 10]"]
191[Wall]
192["SweepEdge Opposite"]
193["SweepEdge Adjacent"]
194["Plane<br>[288, 305, 10]"]
198["Sweep Extrusion<br>[379, 410, 10]"]
194["Plane<br>[288, 305, 11]"]
198["Sweep Extrusion<br>[379, 410, 11]"]
199[Wall]
200["Cap Start"]
201["Cap End"]
202["SweepEdge Opposite"]
203["SweepEdge Adjacent"]
207["Sweep Extrusion<br>[573, 605, 10]"]
207["Sweep Extrusion<br>[573, 605, 11]"]
208[Wall]
209["SweepEdge Opposite"]
210["SweepEdge Adjacent"]
211["Plane<br>[288, 305, 10]"]
215["Sweep Extrusion<br>[379, 410, 10]"]
211["Plane<br>[288, 305, 11]"]
215["Sweep Extrusion<br>[379, 410, 11]"]
216[Wall]
217["Cap Start"]
218["Cap End"]
219["SweepEdge Opposite"]
220["SweepEdge Adjacent"]
224["Sweep Extrusion<br>[573, 605, 10]"]
224["Sweep Extrusion<br>[573, 605, 11]"]
225[Wall]
226["SweepEdge Opposite"]
227["SweepEdge Adjacent"]
228["StartSketchOnFace<br>[1087, 1121, 5]"]
229["StartSketchOnFace<br>[1250, 1282, 5]"]
230["StartSketchOnFace<br>[1466, 1499, 5]"]
231["StartSketchOnFace<br>[1087, 1121, 5]"]
232["StartSketchOnFace<br>[1250, 1282, 5]"]
233["StartSketchOnFace<br>[1466, 1499, 5]"]
234["StartSketchOnFace<br>[666, 698, 6]"]
235["StartSketchOnFace<br>[500, 532, 7]"]
236["StartSketchOnFace<br>[740, 772, 8]"]
237["StartSketchOnFace<br>[1431, 1461, 8]"]
238["StartSketchOnFace<br>[1035, 1067, 9]"]
239["StartSketchOnFace<br>[472, 502, 10]"]
240["StartSketchOnFace<br>[472, 502, 10]"]
228["StartSketchOnFace<br>[1087, 1121, 6]"]
229["StartSketchOnFace<br>[1250, 1282, 6]"]
230["StartSketchOnFace<br>[1466, 1499, 6]"]
231["StartSketchOnFace<br>[1087, 1121, 6]"]
232["StartSketchOnFace<br>[1250, 1282, 6]"]
233["StartSketchOnFace<br>[1466, 1499, 6]"]
234["StartSketchOnFace<br>[666, 698, 7]"]
235["StartSketchOnFace<br>[500, 532, 8]"]
236["StartSketchOnFace<br>[740, 772, 9]"]
237["StartSketchOnFace<br>[1431, 1461, 9]"]
238["StartSketchOnFace<br>[1035, 1067, 10]"]
239["StartSketchOnFace<br>[472, 502, 11]"]
240["StartSketchOnFace<br>[472, 502, 11]"]
1 --- 2
2 --- 3
2 --- 4

View File

@ -39,7 +39,7 @@ description: Operations executed pipe-flange-assembly.kcl
"functionSourceRange": [
451,
1670,
5
6
],
"unlabeledArg": null,
"labeledArgs": {},
@ -657,7 +657,7 @@ description: Operations executed pipe-flange-assembly.kcl
"functionSourceRange": [
451,
1670,
5
6
],
"unlabeledArg": null,
"labeledArgs": {},
@ -1275,7 +1275,7 @@ description: Operations executed pipe-flange-assembly.kcl
"functionSourceRange": [
414,
870,
6
7
],
"unlabeledArg": null,
"labeledArgs": {},
@ -1525,7 +1525,7 @@ description: Operations executed pipe-flange-assembly.kcl
"functionSourceRange": [
275,
696,
7
8
],
"unlabeledArg": null,
"labeledArgs": {},
@ -2024,7 +2024,7 @@ description: Operations executed pipe-flange-assembly.kcl
"functionSourceRange": [
365,
1664,
8
9
],
"unlabeledArg": null,
"labeledArgs": {},
@ -2524,7 +2524,7 @@ description: Operations executed pipe-flange-assembly.kcl
"functionSourceRange": [
297,
1231,
9
10
],
"unlabeledArg": null,
"labeledArgs": {},
@ -2839,7 +2839,7 @@ description: Operations executed pipe-flange-assembly.kcl
"functionSourceRange": [
244,
658,
10
11
],
"unlabeledArg": null,
"labeledArgs": {},
@ -3083,7 +3083,7 @@ description: Operations executed pipe-flange-assembly.kcl
"functionSourceRange": [
244,
658,
10
11
],
"unlabeledArg": null,
"labeledArgs": {},

View File

@ -1,59 +1,59 @@
```mermaid
flowchart LR
subgraph path2 [Path]
2["Path<br>[460, 506, 0]"]
3["Segment<br>[512, 565, 0]"]
4["Segment<br>[571, 673, 0]"]
5["Segment<br>[679, 732, 0]"]
6["Segment<br>[738, 785, 0]"]
7["Segment<br>[791, 886, 0]"]
8["Segment<br>[892, 963, 0]"]
9["Segment<br>[969, 1020, 0]"]
10["Segment<br>[1026, 1079, 0]"]
11["Segment<br>[1085, 1154, 0]"]
12["Segment<br>[1160, 1199, 0]"]
13["Segment<br>[1205, 1235, 0]"]
14["Segment<br>[1241, 1271, 0]"]
15["Segment<br>[1277, 1307, 0]"]
16["Segment<br>[1313, 1343, 0]"]
17["Segment<br>[1349, 1378, 0]"]
18["Segment<br>[1384, 1414, 0]"]
19["Segment<br>[1420, 1449, 0]"]
20["Segment<br>[1455, 1484, 0]"]
21["Segment<br>[1490, 1586, 0]"]
22["Segment<br>[1592, 1648, 0]"]
23["Segment<br>[1654, 1661, 0]"]
2["Path<br>[460, 503, 0]"]
3["Segment<br>[509, 562, 0]"]
4["Segment<br>[568, 670, 0]"]
5["Segment<br>[676, 729, 0]"]
6["Segment<br>[735, 782, 0]"]
7["Segment<br>[788, 883, 0]"]
8["Segment<br>[889, 960, 0]"]
9["Segment<br>[966, 1017, 0]"]
10["Segment<br>[1023, 1076, 0]"]
11["Segment<br>[1082, 1151, 0]"]
12["Segment<br>[1157, 1193, 0]"]
13["Segment<br>[1199, 1229, 0]"]
14["Segment<br>[1235, 1265, 0]"]
15["Segment<br>[1271, 1301, 0]"]
16["Segment<br>[1307, 1337, 0]"]
17["Segment<br>[1343, 1372, 0]"]
18["Segment<br>[1378, 1408, 0]"]
19["Segment<br>[1414, 1443, 0]"]
20["Segment<br>[1449, 1478, 0]"]
21["Segment<br>[1484, 1580, 0]"]
22["Segment<br>[1586, 1642, 0]"]
23["Segment<br>[1648, 1655, 0]"]
24[Solid2d]
end
subgraph path85 [Path]
85["Path<br>[1759, 1803, 0]"]
86["Segment<br>[1809, 1871, 0]"]
87["Segment<br>[1877, 1990, 0]"]
88["Segment<br>[1996, 2116, 0]"]
89["Segment<br>[2122, 2178, 0]"]
90["Segment<br>[2184, 2191, 0]"]
85["Path<br>[1753, 1797, 0]"]
86["Segment<br>[1803, 1865, 0]"]
87["Segment<br>[1871, 1984, 0]"]
88["Segment<br>[1990, 2110, 0]"]
89["Segment<br>[2116, 2172, 0]"]
90["Segment<br>[2178, 2185, 0]"]
91[Solid2d]
end
subgraph path107 [Path]
107["Path<br>[2290, 2335, 0]"]
108["Segment<br>[2341, 2401, 0]"]
109["Segment<br>[2407, 2520, 0]"]
110["Segment<br>[2526, 2646, 0]"]
111["Segment<br>[2652, 2708, 0]"]
112["Segment<br>[2714, 2721, 0]"]
107["Path<br>[2284, 2329, 0]"]
108["Segment<br>[2335, 2395, 0]"]
109["Segment<br>[2401, 2514, 0]"]
110["Segment<br>[2520, 2640, 0]"]
111["Segment<br>[2646, 2702, 0]"]
112["Segment<br>[2708, 2715, 0]"]
113[Solid2d]
end
subgraph path129 [Path]
129["Path<br>[2819, 2864, 0]"]
130["Segment<br>[2870, 2937, 0]"]
131["Segment<br>[2943, 3056, 0]"]
132["Segment<br>[3062, 3182, 0]"]
133["Segment<br>[3188, 3244, 0]"]
134["Segment<br>[3250, 3257, 0]"]
129["Path<br>[2813, 2858, 0]"]
130["Segment<br>[2864, 2931, 0]"]
131["Segment<br>[2937, 3050, 0]"]
132["Segment<br>[3056, 3176, 0]"]
133["Segment<br>[3182, 3238, 0]"]
134["Segment<br>[3244, 3251, 0]"]
135[Solid2d]
end
1["Plane<br>[437, 454, 0]"]
25["Sweep Extrusion<br>[1675, 1705, 0]"]
25["Sweep Extrusion<br>[1669, 1699, 0]"]
26[Wall]
27[Wall]
28[Wall]
@ -113,7 +113,7 @@ flowchart LR
82["SweepEdge Adjacent"]
83["SweepEdge Opposite"]
84["SweepEdge Adjacent"]
92["Sweep Extrusion<br>[2205, 2236, 0]"]
92["Sweep Extrusion<br>[2199, 2230, 0]"]
93[Wall]
94[Wall]
95[Wall]
@ -128,7 +128,7 @@ flowchart LR
104["SweepEdge Adjacent"]
105["SweepEdge Opposite"]
106["SweepEdge Adjacent"]
114["Sweep Extrusion<br>[2736, 2767, 0]"]
114["Sweep Extrusion<br>[2730, 2761, 0]"]
115[Wall]
116[Wall]
117[Wall]
@ -143,7 +143,7 @@ flowchart LR
126["SweepEdge Adjacent"]
127["SweepEdge Opposite"]
128["SweepEdge Adjacent"]
136["Sweep Extrusion<br>[3271, 3301, 0]"]
136["Sweep Extrusion<br>[3265, 3295, 0]"]
137[Wall]
138[Wall]
139[Wall]
@ -158,9 +158,9 @@ flowchart LR
148["SweepEdge Adjacent"]
149["SweepEdge Opposite"]
150["SweepEdge Adjacent"]
151["StartSketchOnFace<br>[1719, 1753, 0]"]
152["StartSketchOnFace<br>[2250, 2284, 0]"]
153["StartSketchOnFace<br>[2781, 2813, 0]"]
151["StartSketchOnFace<br>[1713, 1747, 0]"]
152["StartSketchOnFace<br>[2244, 2278, 0]"]
153["StartSketchOnFace<br>[2775, 2807, 0]"]
1 --- 2
2 --- 3
2 --- 4

View File

@ -7,36 +7,36 @@ flowchart LR
5["Segment<br>[705, 781, 0]"]
6["Segment<br>[787, 856, 0]"]
7["Segment<br>[862, 902, 0]"]
8["Segment<br>[908, 947, 0]"]
9["Segment<br>[987, 1017, 0]"]
10["Segment<br>[1023, 1052, 0]"]
11["Segment<br>[1058, 1087, 0]"]
12["Segment<br>[1093, 1122, 0]"]
13["Segment<br>[1128, 1228, 0]"]
14["Segment<br>[1234, 1290, 0]"]
15["Segment<br>[1296, 1303, 0]"]
8["Segment<br>[908, 944, 0]"]
9["Segment<br>[984, 1014, 0]"]
10["Segment<br>[1020, 1049, 0]"]
11["Segment<br>[1055, 1084, 0]"]
12["Segment<br>[1090, 1119, 0]"]
13["Segment<br>[1125, 1225, 0]"]
14["Segment<br>[1231, 1287, 0]"]
15["Segment<br>[1293, 1300, 0]"]
16[Solid2d]
end
subgraph path52 [Path]
52["Path<br>[1458, 1558, 0]"]
53["Segment<br>[1564, 1611, 0]"]
54["Segment<br>[1617, 1732, 0]"]
55["Segment<br>[1738, 1858, 0]"]
56["Segment<br>[1864, 1920, 0]"]
57["Segment<br>[1926, 1933, 0]"]
52["Path<br>[1455, 1555, 0]"]
53["Segment<br>[1561, 1608, 0]"]
54["Segment<br>[1614, 1729, 0]"]
55["Segment<br>[1735, 1855, 0]"]
56["Segment<br>[1861, 1917, 0]"]
57["Segment<br>[1923, 1930, 0]"]
58[Solid2d]
end
subgraph path74 [Path]
74["Path<br>[2090, 2189, 0]"]
75["Segment<br>[2195, 2241, 0]"]
76["Segment<br>[2247, 2339, 0]"]
77["Segment<br>[2345, 2442, 0]"]
78["Segment<br>[2448, 2504, 0]"]
79["Segment<br>[2510, 2517, 0]"]
74["Path<br>[2087, 2186, 0]"]
75["Segment<br>[2192, 2238, 0]"]
76["Segment<br>[2244, 2336, 0]"]
77["Segment<br>[2342, 2439, 0]"]
78["Segment<br>[2445, 2501, 0]"]
79["Segment<br>[2507, 2514, 0]"]
80[Solid2d]
end
1["Plane<br>[484, 501, 0]"]
17["Sweep Extrusion<br>[1346, 1376, 0]"]
17["Sweep Extrusion<br>[1343, 1373, 0]"]
18[Wall]
19[Wall]
20[Wall]
@ -71,7 +71,7 @@ flowchart LR
49["SweepEdge Opposite"]
50["SweepEdge Adjacent"]
51["SweepEdge Opposite"]
59["Sweep Extrusion<br>[1977, 2009, 0]"]
59["Sweep Extrusion<br>[1974, 2006, 0]"]
60[Wall]
61[Wall]
62[Wall]
@ -86,7 +86,7 @@ flowchart LR
71["SweepEdge Adjacent"]
72["SweepEdge Opposite"]
73["SweepEdge Adjacent"]
81["Sweep Extrusion<br>[2560, 2592, 0]"]
81["Sweep Extrusion<br>[2557, 2589, 0]"]
82[Wall]
83[Wall]
84[Wall]
@ -101,8 +101,8 @@ flowchart LR
93["SweepEdge Adjacent"]
94["SweepEdge Opposite"]
95["SweepEdge Adjacent"]
96["StartSketchOnFace<br>[1418, 1452, 0]"]
97["StartSketchOnFace<br>[2050, 2084, 0]"]
96["StartSketchOnFace<br>[1415, 1449, 0]"]
97["StartSketchOnFace<br>[2047, 2081, 0]"]
1 --- 2
2 --- 3
2 --- 4

File diff suppressed because it is too large Load Diff

View File

@ -264,9 +264,9 @@ description: Variables in memory after executing router-template-slate.kcl
-122.4938
],
"tag": {
"commentStart": 940,
"end": 946,
"start": 940,
"commentStart": 937,
"end": 943,
"start": 937,
"type": "TagDeclarator",
"value": "seg02"
},
@ -514,9 +514,9 @@ description: Variables in memory after executing router-template-slate.kcl
"id": "[uuid]",
"sourceRange": [],
"tag": {
"commentStart": 1589,
"end": 1610,
"start": 1589,
"commentStart": 1586,
"end": 1607,
"start": 1586,
"type": "TagDeclarator",
"value": "rectangleSegmentA001"
},
@ -527,9 +527,9 @@ description: Variables in memory after executing router-template-slate.kcl
"id": "[uuid]",
"sourceRange": [],
"tag": {
"commentStart": 1710,
"end": 1731,
"start": 1710,
"commentStart": 1707,
"end": 1728,
"start": 1707,
"type": "TagDeclarator",
"value": "rectangleSegmentB001"
},
@ -540,9 +540,9 @@ description: Variables in memory after executing router-template-slate.kcl
"id": "[uuid]",
"sourceRange": [],
"tag": {
"commentStart": 1836,
"end": 1857,
"start": 1836,
"commentStart": 1833,
"end": 1854,
"start": 1833,
"type": "TagDeclarator",
"value": "rectangleSegmentC001"
},
@ -570,9 +570,9 @@ description: Variables in memory after executing router-template-slate.kcl
-12.4937
],
"tag": {
"commentStart": 1589,
"end": 1610,
"start": 1589,
"commentStart": 1586,
"end": 1607,
"start": 1586,
"type": "TagDeclarator",
"value": "rectangleSegmentA001"
},
@ -595,9 +595,9 @@ description: Variables in memory after executing router-template-slate.kcl
-12.4937
],
"tag": {
"commentStart": 1710,
"end": 1731,
"start": 1710,
"commentStart": 1707,
"end": 1728,
"start": 1707,
"type": "TagDeclarator",
"value": "rectangleSegmentB001"
},
@ -620,9 +620,9 @@ description: Variables in memory after executing router-template-slate.kcl
-92.4938
],
"tag": {
"commentStart": 1836,
"end": 1857,
"start": 1836,
"commentStart": 1833,
"end": 1854,
"start": 1833,
"type": "TagDeclarator",
"value": "rectangleSegmentC001"
},
@ -940,9 +940,9 @@ description: Variables in memory after executing router-template-slate.kcl
-122.4938
],
"tag": {
"commentStart": 940,
"end": 946,
"start": 940,
"commentStart": 937,
"end": 943,
"start": 937,
"type": "TagDeclarator",
"value": "seg02"
},
@ -1239,9 +1239,9 @@ description: Variables in memory after executing router-template-slate.kcl
"id": "[uuid]",
"sourceRange": [],
"tag": {
"commentStart": 2219,
"end": 2240,
"start": 2219,
"commentStart": 2216,
"end": 2237,
"start": 2216,
"type": "TagDeclarator",
"value": "rectangleSegmentA002"
},
@ -1283,9 +1283,9 @@ description: Variables in memory after executing router-template-slate.kcl
-12.4937
],
"tag": {
"commentStart": 2219,
"end": 2240,
"start": 2219,
"commentStart": 2216,
"end": 2237,
"start": 2216,
"type": "TagDeclarator",
"value": "rectangleSegmentA002"
},
@ -1641,9 +1641,9 @@ description: Variables in memory after executing router-template-slate.kcl
-122.4938
],
"tag": {
"commentStart": 940,
"end": 946,
"start": 940,
"commentStart": 937,
"end": 943,
"start": 937,
"type": "TagDeclarator",
"value": "seg02"
},
@ -2165,9 +2165,9 @@ description: Variables in memory after executing router-template-slate.kcl
-122.4938
],
"tag": {
"commentStart": 940,
"end": 946,
"start": 940,
"commentStart": 937,
"end": 943,
"start": 937,
"type": "TagDeclarator",
"value": "seg02"
},
@ -2412,9 +2412,9 @@ description: Variables in memory after executing router-template-slate.kcl
-12.4937
],
"tag": {
"commentStart": 1589,
"end": 1610,
"start": 1589,
"commentStart": 1586,
"end": 1607,
"start": 1586,
"type": "TagDeclarator",
"value": "rectangleSegmentA001"
},
@ -2437,9 +2437,9 @@ description: Variables in memory after executing router-template-slate.kcl
-12.4937
],
"tag": {
"commentStart": 1710,
"end": 1731,
"start": 1710,
"commentStart": 1707,
"end": 1728,
"start": 1707,
"type": "TagDeclarator",
"value": "rectangleSegmentB001"
},
@ -2462,9 +2462,9 @@ description: Variables in memory after executing router-template-slate.kcl
-92.4938
],
"tag": {
"commentStart": 1836,
"end": 1857,
"start": 1836,
"commentStart": 1833,
"end": 1854,
"start": 1833,
"type": "TagDeclarator",
"value": "rectangleSegmentC001"
},
@ -2782,9 +2782,9 @@ description: Variables in memory after executing router-template-slate.kcl
-122.4938
],
"tag": {
"commentStart": 940,
"end": 946,
"start": 940,
"commentStart": 937,
"end": 943,
"start": 937,
"type": "TagDeclarator",
"value": "seg02"
},
@ -3078,9 +3078,9 @@ description: Variables in memory after executing router-template-slate.kcl
-12.4937
],
"tag": {
"commentStart": 2219,
"end": 2240,
"start": 2219,
"commentStart": 2216,
"end": 2237,
"start": 2216,
"type": "TagDeclarator",
"value": "rectangleSegmentA002"
},
@ -3436,9 +3436,9 @@ description: Variables in memory after executing router-template-slate.kcl
-122.4938
],
"tag": {
"commentStart": 940,
"end": 946,
"start": 940,
"commentStart": 937,
"end": 943,
"start": 937,
"type": "TagDeclarator",
"value": "seg02"
},

View File

@ -1,186 +1,186 @@
```mermaid
flowchart LR
subgraph path2 [Path]
2["Path<br>[458, 501, 5]"]
3["Segment<br>[509, 547, 5]"]
4["Segment<br>[555, 595, 5]"]
5["Segment<br>[603, 642, 5]"]
6["Segment<br>[650, 672, 5]"]
2["Path<br>[458, 501, 6]"]
3["Segment<br>[509, 547, 6]"]
4["Segment<br>[555, 595, 6]"]
5["Segment<br>[603, 642, 6]"]
6["Segment<br>[650, 672, 6]"]
7[Solid2d]
end
subgraph path27 [Path]
27["Path<br>[1082, 1213, 5]"]
28["Segment<br>[1221, 1279, 5]"]
29["Segment<br>[1287, 1418, 5]"]
30["Segment<br>[1426, 1484, 5]"]
31["Segment<br>[1492, 1626, 5]"]
32["Segment<br>[1634, 1720, 5]"]
33["Segment<br>[1728, 1863, 5]"]
34["Segment<br>[1871, 1956, 5]"]
35["Segment<br>[1964, 1971, 5]"]
27["Path<br>[1082, 1213, 6]"]
28["Segment<br>[1221, 1279, 6]"]
29["Segment<br>[1287, 1418, 6]"]
30["Segment<br>[1426, 1484, 6]"]
31["Segment<br>[1492, 1626, 6]"]
32["Segment<br>[1634, 1720, 6]"]
33["Segment<br>[1728, 1863, 6]"]
34["Segment<br>[1871, 1956, 6]"]
35["Segment<br>[1964, 1971, 6]"]
36[Solid2d]
end
subgraph path63 [Path]
63["Path<br>[2119, 2173, 5]"]
64["Segment<br>[2181, 2222, 5]"]
65["Segment<br>[2230, 2259, 5]"]
66["Segment<br>[2267, 2297, 5]"]
67["Segment<br>[2305, 2361, 5]"]
68["Segment<br>[2369, 2376, 5]"]
63["Path<br>[2119, 2173, 6]"]
64["Segment<br>[2181, 2222, 6]"]
65["Segment<br>[2230, 2259, 6]"]
66["Segment<br>[2267, 2297, 6]"]
67["Segment<br>[2305, 2361, 6]"]
68["Segment<br>[2369, 2376, 6]"]
69[Solid2d]
end
subgraph path84 [Path]
84["Path<br>[2518, 2555, 5]"]
85["Segment<br>[2563, 2594, 5]"]
86["Segment<br>[2602, 2635, 5]"]
87["Segment<br>[2643, 2675, 5]"]
88["Segment<br>[2683, 2690, 5]"]
84["Path<br>[2518, 2555, 6]"]
85["Segment<br>[2563, 2594, 6]"]
86["Segment<br>[2602, 2635, 6]"]
87["Segment<br>[2643, 2675, 6]"]
88["Segment<br>[2683, 2690, 6]"]
89[Solid2d]
end
subgraph path105 [Path]
105["Path<br>[346, 371, 8]"]
106["Segment<br>[379, 412, 8]"]
107["Segment<br>[420, 455, 8]"]
108["Segment<br>[463, 497, 8]"]
109["Segment<br>[505, 512, 8]"]
105["Path<br>[346, 371, 9]"]
106["Segment<br>[379, 412, 9]"]
107["Segment<br>[420, 455, 9]"]
108["Segment<br>[463, 497, 9]"]
109["Segment<br>[505, 512, 9]"]
110[Solid2d]
end
subgraph path112 [Path]
112["Path<br>[649, 781, 8]"]
112["Path<br>[649, 781, 9]"]
117[Solid2d]
end
subgraph path130 [Path]
130["Path<br>[551, 605, 6]"]
131["Segment<br>[613, 640, 6]"]
132["Segment<br>[648, 677, 6]"]
133["Segment<br>[685, 713, 6]"]
134["Segment<br>[721, 777, 6]"]
135["Segment<br>[785, 792, 6]"]
130["Path<br>[551, 605, 7]"]
131["Segment<br>[613, 640, 7]"]
132["Segment<br>[648, 677, 7]"]
133["Segment<br>[685, 713, 7]"]
134["Segment<br>[721, 777, 7]"]
135["Segment<br>[785, 792, 7]"]
136[Solid2d]
end
subgraph path138 [Path]
138["Path<br>[1098, 1145, 6]"]
139["Segment<br>[1153, 1194, 6]"]
140["Segment<br>[1202, 1244, 6]"]
141["Segment<br>[1252, 1294, 6]"]
142["Segment<br>[1302, 1309, 6]"]
138["Path<br>[1098, 1145, 7]"]
139["Segment<br>[1153, 1194, 7]"]
140["Segment<br>[1202, 1244, 7]"]
141["Segment<br>[1252, 1294, 7]"]
142["Segment<br>[1302, 1309, 7]"]
143[Solid2d]
end
subgraph path145 [Path]
145["Path<br>[1597, 1762, 6]"]
146["Segment<br>[1770, 1871, 6]"]
147["Segment<br>[1879, 2046, 6]"]
148["Segment<br>[2054, 2155, 6]"]
149["Segment<br>[2163, 2333, 6]"]
150["Segment<br>[2341, 2443, 6]"]
151["Segment<br>[2451, 2620, 6]"]
152["Segment<br>[2628, 2729, 6]"]
153["Segment<br>[2737, 2744, 6]"]
145["Path<br>[1597, 1762, 7]"]
146["Segment<br>[1770, 1871, 7]"]
147["Segment<br>[1879, 2046, 7]"]
148["Segment<br>[2054, 2155, 7]"]
149["Segment<br>[2163, 2333, 7]"]
150["Segment<br>[2341, 2443, 7]"]
151["Segment<br>[2451, 2620, 7]"]
152["Segment<br>[2628, 2729, 7]"]
153["Segment<br>[2737, 2744, 7]"]
154[Solid2d]
end
subgraph path156 [Path]
156["Path<br>[123, 210, 7]"]
157["Segment<br>[218, 247, 7]"]
158["Segment<br>[255, 283, 7]"]
159["Segment<br>[291, 388, 7]"]
160["Segment<br>[396, 443, 7]"]
161["Segment<br>[451, 479, 7]"]
162["Segment<br>[487, 516, 7]"]
163["Segment<br>[524, 553, 7]"]
164["Segment<br>[561, 652, 7]"]
165["Segment<br>[660, 688, 7]"]
166["Segment<br>[696, 725, 7]"]
167["Segment<br>[733, 821, 7]"]
168["Segment<br>[829, 857, 7]"]
169["Segment<br>[865, 899, 7]"]
170["Segment<br>[907, 937, 7]"]
171["Segment<br>[945, 1054, 7]"]
172["Segment<br>[1062, 1069, 7]"]
156["Path<br>[123, 210, 8]"]
157["Segment<br>[218, 247, 8]"]
158["Segment<br>[255, 283, 8]"]
159["Segment<br>[291, 388, 8]"]
160["Segment<br>[396, 443, 8]"]
161["Segment<br>[451, 479, 8]"]
162["Segment<br>[487, 516, 8]"]
163["Segment<br>[524, 553, 8]"]
164["Segment<br>[561, 652, 8]"]
165["Segment<br>[660, 688, 8]"]
166["Segment<br>[696, 725, 8]"]
167["Segment<br>[733, 821, 8]"]
168["Segment<br>[829, 857, 8]"]
169["Segment<br>[865, 899, 8]"]
170["Segment<br>[907, 937, 8]"]
171["Segment<br>[945, 1054, 8]"]
172["Segment<br>[1062, 1069, 8]"]
173[Solid2d]
end
subgraph path175 [Path]
175["Path<br>[1203, 1301, 7]"]
176["Segment<br>[1309, 1428, 7]"]
177["Segment<br>[1436, 1490, 7]"]
178["Segment<br>[1498, 1619, 7]"]
179["Segment<br>[1627, 1634, 7]"]
175["Path<br>[1203, 1301, 8]"]
176["Segment<br>[1309, 1428, 8]"]
177["Segment<br>[1436, 1490, 8]"]
178["Segment<br>[1498, 1619, 8]"]
179["Segment<br>[1627, 1634, 8]"]
180[Solid2d]
end
subgraph path182 [Path]
182["Path<br>[1731, 1828, 7]"]
183["Segment<br>[1836, 1955, 7]"]
184["Segment<br>[1963, 2018, 7]"]
185["Segment<br>[2026, 2147, 7]"]
186["Segment<br>[2155, 2162, 7]"]
182["Path<br>[1731, 1828, 8]"]
183["Segment<br>[1836, 1955, 8]"]
184["Segment<br>[1963, 2018, 8]"]
185["Segment<br>[2026, 2147, 8]"]
186["Segment<br>[2155, 2162, 8]"]
187[Solid2d]
end
subgraph path189 [Path]
189["Path<br>[1203, 1301, 7]"]
190["Segment<br>[1309, 1428, 7]"]
191["Segment<br>[1436, 1490, 7]"]
192["Segment<br>[1498, 1619, 7]"]
193["Segment<br>[1627, 1634, 7]"]
189["Path<br>[1203, 1301, 8]"]
190["Segment<br>[1309, 1428, 8]"]
191["Segment<br>[1436, 1490, 8]"]
192["Segment<br>[1498, 1619, 8]"]
193["Segment<br>[1627, 1634, 8]"]
194[Solid2d]
end
subgraph path196 [Path]
196["Path<br>[1731, 1828, 7]"]
197["Segment<br>[1836, 1955, 7]"]
198["Segment<br>[1963, 2018, 7]"]
199["Segment<br>[2026, 2147, 7]"]
200["Segment<br>[2155, 2162, 7]"]
196["Path<br>[1731, 1828, 8]"]
197["Segment<br>[1836, 1955, 8]"]
198["Segment<br>[1963, 2018, 8]"]
199["Segment<br>[2026, 2147, 8]"]
200["Segment<br>[2155, 2162, 8]"]
201[Solid2d]
end
subgraph path230 [Path]
230["Path<br>[288, 387, 9]"]
231["Segment<br>[395, 444, 9]"]
232["Segment<br>[452, 502, 9]"]
233["Segment<br>[510, 560, 9]"]
234["Segment<br>[568, 586, 9]"]
230["Path<br>[288, 387, 10]"]
231["Segment<br>[395, 444, 10]"]
232["Segment<br>[452, 502, 10]"]
233["Segment<br>[510, 560, 10]"]
234["Segment<br>[568, 586, 10]"]
235[Solid2d]
end
subgraph path256 [Path]
256["Path<br>[377, 407, 10]"]
257["Segment<br>[415, 447, 10]"]
258["Segment<br>[455, 488, 10]"]
259["Segment<br>[496, 585, 10]"]
260["Segment<br>[593, 620, 10]"]
261["Segment<br>[628, 635, 10]"]
256["Path<br>[377, 407, 11]"]
257["Segment<br>[415, 447, 11]"]
258["Segment<br>[455, 488, 11]"]
259["Segment<br>[496, 585, 11]"]
260["Segment<br>[593, 620, 11]"]
261["Segment<br>[628, 635, 11]"]
262[Solid2d]
end
subgraph path274 [Path]
274["Path<br>[311, 336, 11]"]
275["Segment<br>[344, 403, 11]"]
276["Segment<br>[411, 471, 11]"]
277["Segment<br>[479, 529, 11]"]
278["Segment<br>[537, 544, 11]"]
274["Path<br>[311, 336, 12]"]
275["Segment<br>[344, 403, 12]"]
276["Segment<br>[411, 471, 12]"]
277["Segment<br>[479, 529, 12]"]
278["Segment<br>[537, 544, 12]"]
279[Solid2d]
end
subgraph path298 [Path]
298["Path<br>[311, 336, 11]"]
299["Segment<br>[344, 403, 11]"]
300["Segment<br>[411, 471, 11]"]
301["Segment<br>[479, 529, 11]"]
302["Segment<br>[537, 544, 11]"]
298["Path<br>[311, 336, 12]"]
299["Segment<br>[344, 403, 12]"]
300["Segment<br>[411, 471, 12]"]
301["Segment<br>[479, 529, 12]"]
302["Segment<br>[537, 544, 12]"]
303[Solid2d]
end
subgraph path322 [Path]
322["Path<br>[311, 336, 11]"]
323["Segment<br>[344, 403, 11]"]
324["Segment<br>[411, 471, 11]"]
325["Segment<br>[479, 529, 11]"]
326["Segment<br>[537, 544, 11]"]
322["Path<br>[311, 336, 12]"]
323["Segment<br>[344, 403, 12]"]
324["Segment<br>[411, 471, 12]"]
325["Segment<br>[479, 529, 12]"]
326["Segment<br>[537, 544, 12]"]
327[Solid2d]
end
subgraph path346 [Path]
346["Path<br>[311, 336, 11]"]
347["Segment<br>[344, 403, 11]"]
348["Segment<br>[411, 471, 11]"]
349["Segment<br>[479, 529, 11]"]
350["Segment<br>[537, 544, 11]"]
346["Path<br>[311, 336, 12]"]
347["Segment<br>[344, 403, 12]"]
348["Segment<br>[411, 471, 12]"]
349["Segment<br>[479, 529, 12]"]
350["Segment<br>[537, 544, 12]"]
351[Solid2d]
end
1["Plane<br>[433, 450, 5]"]
8["Sweep Extrusion<br>[689, 728, 5]"]
1["Plane<br>[433, 450, 6]"]
8["Sweep Extrusion<br>[689, 728, 6]"]
9[Wall]
10[Wall]
11[Wall]
@ -195,11 +195,11 @@ flowchart LR
20["SweepEdge Adjacent"]
21["SweepEdge Opposite"]
22["SweepEdge Adjacent"]
23["EdgeCut Chamfer<br>[736, 983, 5]"]
24["EdgeCut Chamfer<br>[736, 983, 5]"]
25["EdgeCut Chamfer<br>[736, 983, 5]"]
26["EdgeCut Chamfer<br>[736, 983, 5]"]
37["Sweep Extrusion<br>[1987, 2023, 5]"]
23["EdgeCut Chamfer<br>[736, 983, 6]"]
24["EdgeCut Chamfer<br>[736, 983, 6]"]
25["EdgeCut Chamfer<br>[736, 983, 6]"]
26["EdgeCut Chamfer<br>[736, 983, 6]"]
37["Sweep Extrusion<br>[1987, 2023, 6]"]
38[Wall]
39[Wall]
40[Wall]
@ -225,7 +225,7 @@ flowchart LR
60["SweepEdge Adjacent"]
61["SweepEdge Opposite"]
62["SweepEdge Adjacent"]
70["Sweep Extrusion<br>[2392, 2432, 5]"]
70["Sweep Extrusion<br>[2392, 2432, 6]"]
71[Wall]
72[Wall]
73[Wall]
@ -239,7 +239,7 @@ flowchart LR
81["SweepEdge Adjacent"]
82["SweepEdge Opposite"]
83["SweepEdge Adjacent"]
90["Sweep Extrusion<br>[2701, 2733, 5]"]
90["Sweep Extrusion<br>[2701, 2733, 6]"]
91[Wall]
92[Wall]
93[Wall]
@ -253,13 +253,13 @@ flowchart LR
101["SweepEdge Adjacent"]
102["SweepEdge Opposite"]
103["SweepEdge Adjacent"]
104["Plane<br>[321, 338, 8]"]
111["Plane<br>[563, 602, 8]"]
104["Plane<br>[321, 338, 9]"]
111["Plane<br>[563, 602, 9]"]
113["SweepEdge Opposite"]
114["SweepEdge Opposite"]
115["SweepEdge Opposite"]
116["SweepEdge Opposite"]
118["Sweep Loft<br>[967, 995, 8]"]
118["Sweep Loft<br>[967, 995, 9]"]
119[Wall]
120[Wall]
121[Wall]
@ -270,15 +270,15 @@ flowchart LR
126["SweepEdge Adjacent"]
127["SweepEdge Adjacent"]
128["SweepEdge Adjacent"]
129["Plane<br>[525, 542, 6]"]
137["Plane<br>[1072, 1089, 6]"]
144["Plane<br>[1571, 1588, 6]"]
155["Plane<br>[2857, 2874, 6]"]
174["Plane<br>[2919, 2936, 6]"]
181["Plane<br>[2983, 3000, 6]"]
188["Plane<br>[3046, 3063, 6]"]
195["Plane<br>[3109, 3126, 6]"]
202["Sweep Extrusion<br>[3162, 3198, 6]"]
129["Plane<br>[525, 542, 7]"]
137["Plane<br>[1072, 1089, 7]"]
144["Plane<br>[1571, 1588, 7]"]
155["Plane<br>[2857, 2874, 7]"]
174["Plane<br>[2919, 2936, 7]"]
181["Plane<br>[2983, 3000, 7]"]
188["Plane<br>[3046, 3063, 7]"]
195["Plane<br>[3109, 3126, 7]"]
202["Sweep Extrusion<br>[3162, 3198, 7]"]
203[Wall]
204[Wall]
205[Wall]
@ -305,8 +305,8 @@ flowchart LR
226["SweepEdge Adjacent"]
227["SweepEdge Opposite"]
228["SweepEdge Adjacent"]
229["Plane<br>[263, 280, 9]"]
236["Sweep Extrusion<br>[649, 701, 9]"]
229["Plane<br>[263, 280, 10]"]
236["Sweep Extrusion<br>[649, 701, 10]"]
237[Wall]
238[Wall]
239[Wall]
@ -321,12 +321,12 @@ flowchart LR
248["SweepEdge Adjacent"]
249["SweepEdge Opposite"]
250["SweepEdge Adjacent"]
251["EdgeCut Fillet<br>[709, 931, 9]"]
252["EdgeCut Fillet<br>[709, 931, 9]"]
253["EdgeCut Fillet<br>[709, 931, 9]"]
254["EdgeCut Fillet<br>[709, 931, 9]"]
255["Plane<br>[352, 369, 10]"]
263["Sweep Revolve<br>[643, 662, 10]"]
251["EdgeCut Fillet<br>[709, 931, 10]"]
252["EdgeCut Fillet<br>[709, 931, 10]"]
253["EdgeCut Fillet<br>[709, 931, 10]"]
254["EdgeCut Fillet<br>[709, 931, 10]"]
255["Plane<br>[352, 369, 11]"]
263["Sweep Revolve<br>[643, 662, 11]"]
264[Wall]
265[Wall]
266[Wall]
@ -336,8 +336,8 @@ flowchart LR
270["SweepEdge Adjacent"]
271["SweepEdge Adjacent"]
272["SweepEdge Adjacent"]
273["Plane<br>[286, 303, 11]"]
280["Sweep Extrusion<br>[563, 610, 11]"]
273["Plane<br>[286, 303, 12]"]
280["Sweep Extrusion<br>[563, 610, 12]"]
281[Wall]
282[Wall]
283[Wall]
@ -352,10 +352,10 @@ flowchart LR
292["SweepEdge Adjacent"]
293["SweepEdge Opposite"]
294["SweepEdge Adjacent"]
295["EdgeCut Chamfer<br>[618, 764, 11]"]
296["EdgeCut Chamfer<br>[618, 764, 11]"]
297["Plane<br>[286, 303, 11]"]
304["Sweep Extrusion<br>[563, 610, 11]"]
295["EdgeCut Chamfer<br>[618, 764, 12]"]
296["EdgeCut Chamfer<br>[618, 764, 12]"]
297["Plane<br>[286, 303, 12]"]
304["Sweep Extrusion<br>[563, 610, 12]"]
305[Wall]
306[Wall]
307[Wall]
@ -370,10 +370,10 @@ flowchart LR
316["SweepEdge Adjacent"]
317["SweepEdge Opposite"]
318["SweepEdge Adjacent"]
319["EdgeCut Chamfer<br>[618, 764, 11]"]
320["EdgeCut Chamfer<br>[618, 764, 11]"]
321["Plane<br>[286, 303, 11]"]
328["Sweep Extrusion<br>[563, 610, 11]"]
319["EdgeCut Chamfer<br>[618, 764, 12]"]
320["EdgeCut Chamfer<br>[618, 764, 12]"]
321["Plane<br>[286, 303, 12]"]
328["Sweep Extrusion<br>[563, 610, 12]"]
329[Wall]
330[Wall]
331[Wall]
@ -388,10 +388,10 @@ flowchart LR
340["SweepEdge Adjacent"]
341["SweepEdge Opposite"]
342["SweepEdge Adjacent"]
343["EdgeCut Chamfer<br>[618, 764, 11]"]
344["EdgeCut Chamfer<br>[618, 764, 11]"]
345["Plane<br>[286, 303, 11]"]
352["Sweep Extrusion<br>[563, 610, 11]"]
343["EdgeCut Chamfer<br>[618, 764, 12]"]
344["EdgeCut Chamfer<br>[618, 764, 12]"]
345["Plane<br>[286, 303, 12]"]
352["Sweep Extrusion<br>[563, 610, 12]"]
353[Wall]
354[Wall]
355[Wall]
@ -406,18 +406,18 @@ flowchart LR
364["SweepEdge Adjacent"]
365["SweepEdge Opposite"]
366["SweepEdge Adjacent"]
367["EdgeCut Chamfer<br>[618, 764, 11]"]
368["EdgeCut Chamfer<br>[618, 764, 11]"]
369["StartSketchOnFace<br>[1041, 1074, 5]"]
370["StartSketchOnFace<br>[2077, 2111, 5]"]
371["StartSketchOnFace<br>[2476, 2510, 5]"]
372["StartSketchOnFace<br>[1041, 1074, 5]"]
373["StartSketchOnFace<br>[2077, 2111, 5]"]
374["StartSketchOnFace<br>[2476, 2510, 5]"]
375["StartSketchOnPlane<br>[617, 641, 8]"]
376["StartSketchOnPlane<br>[511, 543, 6]"]
377["StartSketchOnPlane<br>[1058, 1090, 6]"]
378["StartSketchOnPlane<br>[1557, 1589, 6]"]
367["EdgeCut Chamfer<br>[618, 764, 12]"]
368["EdgeCut Chamfer<br>[618, 764, 12]"]
369["StartSketchOnFace<br>[1041, 1074, 6]"]
370["StartSketchOnFace<br>[2077, 2111, 6]"]
371["StartSketchOnFace<br>[2476, 2510, 6]"]
372["StartSketchOnFace<br>[1041, 1074, 6]"]
373["StartSketchOnFace<br>[2077, 2111, 6]"]
374["StartSketchOnFace<br>[2476, 2510, 6]"]
375["StartSketchOnPlane<br>[617, 641, 9]"]
376["StartSketchOnPlane<br>[511, 543, 7]"]
377["StartSketchOnPlane<br>[1058, 1090, 7]"]
378["StartSketchOnPlane<br>[1557, 1589, 7]"]
1 --- 2
2 --- 3
2 --- 4

View File

@ -9,7 +9,7 @@ description: Operations executed walkie-talkie.kcl
"functionSourceRange": [
359,
2786,
5
6
],
"unlabeledArg": null,
"labeledArgs": {},
@ -355,7 +355,7 @@ description: Operations executed walkie-talkie.kcl
"functionSourceRange": [
359,
2786,
5
6
],
"unlabeledArg": null,
"labeledArgs": {},
@ -701,7 +701,7 @@ description: Operations executed walkie-talkie.kcl
"functionSourceRange": [
266,
1051,
8
9
],
"unlabeledArg": null,
"labeledArgs": {},
@ -804,7 +804,7 @@ description: Operations executed walkie-talkie.kcl
"functionSourceRange": [
454,
3283,
6
7
],
"unlabeledArg": null,
"labeledArgs": {},
@ -1890,7 +1890,7 @@ description: Operations executed walkie-talkie.kcl
"functionSourceRange": [
69,
1088,
7
8
],
"unlabeledArg": null,
"labeledArgs": {},
@ -1946,7 +1946,7 @@ description: Operations executed walkie-talkie.kcl
"functionSourceRange": [
1146,
1656,
7
8
],
"unlabeledArg": null,
"labeledArgs": {},
@ -2002,7 +2002,7 @@ description: Operations executed walkie-talkie.kcl
"functionSourceRange": [
1674,
2184,
7
8
],
"unlabeledArg": null,
"labeledArgs": {},
@ -2058,7 +2058,7 @@ description: Operations executed walkie-talkie.kcl
"functionSourceRange": [
1146,
1656,
7
8
],
"unlabeledArg": null,
"labeledArgs": {},
@ -2114,7 +2114,7 @@ description: Operations executed walkie-talkie.kcl
"functionSourceRange": [
1674,
2184,
7
8
],
"unlabeledArg": null,
"labeledArgs": {},
@ -2190,7 +2190,7 @@ description: Operations executed walkie-talkie.kcl
"functionSourceRange": [
202,
1023,
9
10
],
"unlabeledArg": null,
"labeledArgs": {},
@ -2308,7 +2308,7 @@ description: Operations executed walkie-talkie.kcl
"functionSourceRange": [
298,
748,
10
11
],
"unlabeledArg": null,
"labeledArgs": {},
@ -2361,7 +2361,7 @@ description: Operations executed walkie-talkie.kcl
"functionSourceRange": [
221,
827,
11
12
],
"unlabeledArg": null,
"labeledArgs": {},
@ -2471,7 +2471,7 @@ description: Operations executed walkie-talkie.kcl
"functionSourceRange": [
221,
827,
11
12
],
"unlabeledArg": null,
"labeledArgs": {},
@ -2581,7 +2581,7 @@ description: Operations executed walkie-talkie.kcl
"functionSourceRange": [
221,
827,
11
12
],
"unlabeledArg": null,
"labeledArgs": {},
@ -2691,7 +2691,7 @@ description: Operations executed walkie-talkie.kcl
"functionSourceRange": [
221,
827,
11
12
],
"unlabeledArg": null,
"labeledArgs": {},

View File

@ -1,6 +1,6 @@
[package]
name = "kcl-python-bindings"
version = "0.3.55"
version = "0.3.56"
edition = "2021"
repository = "https://github.com/kittycad/modeling-app"

View File

@ -1,7 +1,7 @@
[package]
name = "kcl-test-server"
description = "A test server for KCL"
version = "0.1.55"
version = "0.1.56"
edition = "2021"
license = "MIT"

View File

@ -1,7 +1,7 @@
[package]
name = "kcl-to-core"
description = "Utility methods to convert kcl to engine core executable tests"
version = "0.1.55"
version = "0.1.56"
edition = "2021"
license = "MIT"
repository = "https://github.com/KittyCAD/modeling-app"

View File

@ -1,6 +1,6 @@
[package]
name = "kcl-wasm-lib"
version = "0.1.55"
version = "0.1.56"
edition = "2021"
repository = "https://github.com/KittyCAD/modeling-app"
rust-version = "1.83"

View File

@ -85,6 +85,21 @@ impl Context {
}
}
/// Reset the scene and bust the cache.
/// ONLY use this if you absolutely need to reset the scene and bust the cache.
#[wasm_bindgen(js_name = bustCacheAndResetScene)]
pub async fn bust_cache_and_reset_scene(&self, settings: &str, path: Option<String>) -> Result<JsValue, String> {
console_error_panic_hook::set_once();
let ctx = self.create_executor_ctx(settings, path, false)?;
match ctx.bust_cache_and_reset_scene().await {
// The serde-wasm-bindgen does not work here because of weird HashMap issues.
// DO NOT USE serde_wasm_bindgen::to_value it will break the frontend.
Ok(outcome) => JsValue::from_serde(&outcome).map_err(|e| e.to_string()),
Err(err) => Err(serde_json::to_string(&err).map_err(|serde_err| serde_err.to_string())?),
}
}
/// Execute a program in mock mode.
#[wasm_bindgen(js_name = executeMock)]
pub async fn execute_mock(

View File

@ -1,6 +1,6 @@
import { useRef, useMemo, memo, useCallback, useState } from 'react'
import { isCursorInSketchCommandRange } from 'lang/util'
import { editorManager, engineCommandManager, kclManager } from 'lib/singletons'
import { editorManager, kclManager } from 'lib/singletons'
import { useModelingContext } from 'hooks/useModelingContext'
import { useNetworkContext } from 'hooks/useNetworkContext'
import { NetworkHealthState } from 'hooks/useNetworkStatus'
@ -45,10 +45,10 @@ export function Toolbar({
)
return false
return isCursorInSketchCommandRange(
engineCommandManager.artifactGraph,
kclManager.artifactGraph,
context.selectionRanges
)
}, [engineCommandManager.artifactGraph, context.selectionRanges])
}, [kclManager.artifactGraph, context.selectionRanges])
const toolbarButtonsRef = useRef<HTMLUListElement>(null)
const { overallState } = useNetworkContext()

View File

@ -3700,7 +3700,7 @@ function computeSelectionFromSourceRangeAndAST(
sourceRange: SourceRange,
ast: Node<Program>
): Selections {
const artifactGraph = engineCommandManager.artifactGraph
const artifactGraph = kclManager.artifactGraph
const artifact = getArtifactFromRange(sourceRange, artifactGraph) || undefined
const selection: Selections = {
graphSelections: [

View File

@ -1,5 +1,5 @@
import { useModelingContext } from 'hooks/useModelingContext'
import { editorManager, engineCommandManager, kclManager } from 'lib/singletons'
import { editorManager, kclManager } from 'lib/singletons'
import { getNodeFromPath } from 'lang/queryAst'
import { getNodePathFromSourceRange } from 'lang/queryAstNodePathUtils'
import { useEffect, useRef, useState } from 'react'
@ -135,12 +135,10 @@ function DisplayObj({
const range = topLevelRange(obj?.start || 0, obj.end || 0)
const idInfo = codeToIdSelections(
[{ codeRef: codeRefFromRange(range, kclManager.ast) }],
engineCommandManager.artifactGraph,
engineCommandManager.artifactIndex
kclManager.artifactGraph,
kclManager.artifactIndex
)[0]
const artifact = engineCommandManager.artifactGraph.get(
idInfo?.id || ''
)
const artifact = kclManager.artifactGraph.get(idInfo?.id || '')
if (!artifact) return
send({
type: 'Set selection',

View File

@ -1,13 +1,13 @@
import { useMemo } from 'react'
import { engineCommandManager } from 'lib/singletons'
import { kclManager } from 'lib/singletons'
import { expandPlane, PlaneArtifactRich } from 'lang/std/artifactGraph'
import { ArtifactGraph } from 'lang/wasm'
import { DebugDisplayArray, GenericObj } from './DebugDisplayObj'
export function DebugArtifactGraph() {
const artifactGraphTree = useMemo(() => {
return computeTree(engineCommandManager.artifactGraph)
}, [engineCommandManager.artifactGraph])
return computeTree(kclManager.artifactGraph)
}, [kclManager.artifactGraph])
const filterKeys: string[] = ['codeRef', 'pathToNode']
return (

View File

@ -566,7 +566,7 @@ export const ModelingMachineProvider = ({
// See if the selection is "close enough" to be coerced to the plane later
const maybePlane = getPlaneFromArtifact(
selectionRanges.graphSelections[0].artifact,
engineCommandManager.artifactGraph
kclManager.artifactGraph
)
return !err(maybePlane)
}
@ -579,7 +579,7 @@ export const ModelingMachineProvider = ({
return false
}
return !!isCursorInSketchCommandRange(
engineCommandManager.artifactGraph,
kclManager.artifactGraph,
selectionRanges
)
},
@ -841,7 +841,7 @@ export const ModelingMachineProvider = ({
const artifact = selectionRanges.graphSelections[0].artifact
const plane = getPlaneFromArtifact(
artifact,
engineCommandManager.artifactGraph
kclManager.artifactGraph
)
if (err(plane)) return Promise.reject(plane)
// if the user selected a segment, make sure we enter the right sketch as there can be multiple on a plane
@ -917,14 +917,13 @@ export const ModelingMachineProvider = ({
info?.sketchDetails?.faceId || ''
)
const sketchArtifact =
engineCommandManager.artifactGraph.get(mainPath)
const sketchArtifact = kclManager.artifactGraph.get(mainPath)
if (sketchArtifact?.type !== 'path')
return Promise.reject(new Error('No sketch artifact'))
const sketchPaths = getPathsFromArtifact({
artifact: engineCommandManager.artifactGraph.get(plane.id),
artifact: kclManager.artifactGraph.get(plane.id),
sketchPathToNode: sketchArtifact?.codeRef?.pathToNode,
artifactGraph: engineCommandManager.artifactGraph,
artifactGraph: kclManager.artifactGraph,
ast: kclManager.ast,
})
if (err(sketchPaths)) return Promise.reject(sketchPaths)
@ -1743,7 +1742,7 @@ export const ModelingMachineProvider = ({
prompt: input.prompt,
selections: input.selection,
token,
artifactGraph: engineCommandManager.artifactGraph,
artifactGraph: kclManager.artifactGraph,
projectName: context.project.name,
})
}),

View File

@ -13,7 +13,7 @@ import {
getOperationLabel,
stdLibMap,
} from 'lib/operations'
import { editorManager, engineCommandManager, kclManager } from 'lib/singletons'
import { editorManager, kclManager } from 'lib/singletons'
import { ComponentProps, useEffect, useMemo, useRef, useState } from 'react'
import { Operation } from '@rust/kcl-lib/bindings/Operation'
import { Actor, Prop } from 'xstate'
@ -58,7 +58,7 @@ export const FeatureTreePane = () => {
const artifact = context.targetSourceRange
? getArtifactFromRange(
context.targetSourceRange,
engineCommandManager.artifactGraph
kclManager.artifactGraph
)
: null

View File

@ -304,7 +304,7 @@ export const Stream = () => {
}
const path = getArtifactOfTypes(
{ key: entity_id, types: ['path', 'solid2d', 'segment', 'helix'] },
engineCommandManager.artifactGraph
kclManager.artifactGraph
)
if (err(path)) {
return path

View File

@ -16,7 +16,7 @@ import { TransformInfo } from 'lang/std/stdTypes'
import { GetInfoModal, createInfoModal } from '../SetHorVertDistanceModal'
import { createVariableDeclaration } from '../../lang/modifyAst'
import { removeDoubleNegatives } from '../AvailableVarsHelpers'
import { engineCommandManager, kclManager } from 'lib/singletons'
import { kclManager } from 'lib/singletons'
import { err } from 'lib/trap'
import { Node } from '@rust/kcl-lib/bindings/Node'
@ -45,7 +45,7 @@ export function intersectInfo({
selectionRanges.graphSelections.length > 1 &&
isLinesParallelAndConstrained(
kclManager.ast,
engineCommandManager.artifactGraph,
kclManager.artifactGraph,
kclManager.variables,
selectionRanges.graphSelections[0],
selectionRanges.graphSelections[1]

View File

@ -13,10 +13,7 @@ import {
SetAngleLengthModal,
createSetAngleLengthModal,
} from '../SetAngleLengthModal'
import {
createLocalName,
createVariableDeclaration,
} from '../../lang/modifyAst'
import { createName, createVariableDeclaration } from '../../lang/modifyAst'
import { removeDoubleNegatives } from '../AvailableVarsHelpers'
import { kclManager } from 'lib/singletons'
import { err } from 'lib/trap'
@ -169,7 +166,7 @@ export function applyConstraintAxisAlign({
if (err(info)) return info
const transformInfos = info.transforms
let finalValue = createLocalName('ZERO')
let finalValue = createName(['turns'], 'ZERO')
return transformAstSketchLines({
ast: structuredClone(kclManager.ast),

View File

@ -16,6 +16,7 @@ import {
import {
createBinaryExpressionWithUnary,
createLocalName,
createName,
createVariableDeclaration,
} from '../../lang/modifyAst'
import { removeDoubleNegatives } from '../AvailableVarsHelpers'
@ -167,14 +168,16 @@ export async function applyConstraintAngleLength({
isReferencingXAxis && angleOrLength === 'setAngle'
let forceVal = valueUsedInTransform || 0
let calcIdentifier = createLocalName('ZERO')
let calcIdentifier = createName(['turns'], 'ZERO')
if (isReferencingYAxisAngle) {
calcIdentifier = createLocalName(
calcIdentifier = createName(
['turns'],
forceVal < 0 ? 'THREE_QUARTER_TURN' : 'QUARTER_TURN'
)
forceVal = normaliseAngle(forceVal + (forceVal < 0 ? 90 : -90))
} else if (isReferencingXAxisAngle) {
calcIdentifier = createLocalName(
calcIdentifier = createName(
['turns'],
Math.abs(forceVal) > 90 ? 'HALF_TURN' : 'ZERO'
)
forceVal =

View File

@ -374,7 +374,7 @@ export default class EditorManager {
selectionRanges: this._selectionRanges,
isShiftDown: this._isShiftDown,
ast: kclManager.ast,
artifactGraph: engineCommandManager.artifactGraph,
artifactGraph: kclManager.artifactGraph,
})
if (!eventInfo) {

View File

@ -39,7 +39,7 @@ export function useEngineConnectionSubscriptions() {
if (data?.entity_id) {
const codeRefs = getCodeRefsByArtifactId(
data.entity_id,
engineCommandManager.artifactGraph
kclManager.artifactGraph
)
if (codeRefs) {
editorManager.setHighlightRange(codeRefs.map(({ range }) => range))
@ -140,8 +140,7 @@ export function useEngineConnectionSubscriptions() {
})
return
}
const artifact =
engineCommandManager.artifactGraph.get(planeOrFaceId)
const artifact = kclManager.artifactGraph.get(planeOrFaceId)
if (artifact?.type === 'plane') {
const planeInfo = await getFaceDetails(planeOrFaceId)
@ -179,7 +178,7 @@ export function useEngineConnectionSubscriptions() {
const faceId = planeOrFaceId
const extrusion = getSweepFromSuspectedSweepSurface(
faceId,
engineCommandManager.artifactGraph
kclManager.artifactGraph
)
if (
@ -193,9 +192,9 @@ export function useEngineConnectionSubscriptions() {
const codeRef =
artifact.type === 'cap'
? getCapCodeRef(artifact, engineCommandManager.artifactGraph)
? getCapCodeRef(artifact, kclManager.artifactGraph)
: artifact.type === 'wall'
? getWallCodeRef(artifact, engineCommandManager.artifactGraph)
? getWallCodeRef(artifact, kclManager.artifactGraph)
: artifact.codeRef
const faceInfo = await getFaceDetails(faceId)
@ -221,7 +220,7 @@ export function useEngineConnectionSubscriptions() {
key: artifact.consumedEdgeId,
types: ['segment', 'sweepEdge'],
},
engineCommandManager.artifactGraph
kclManager.artifactGraph
)
if (err(consumedArtifact)) return null
if (consumedArtifact.type === 'segment') {
@ -232,7 +231,7 @@ export function useEngineConnectionSubscriptions() {
} else {
const segment = getArtifactOfTypes(
{ key: consumedArtifact.segId, types: ['segment'] },
engineCommandManager.artifactGraph
kclManager.artifactGraph
)
if (err(segment)) return null
chamferInfo = {

View File

@ -5,10 +5,12 @@ import {
compilationErrorsToDiagnostics,
kclErrorsToDiagnostics,
} from './errors'
import { uuidv4 } from 'lib/utils'
import { uuidv4, isOverlap, deferExecution } from 'lib/utils'
import { EngineCommandManager } from './std/engineConnection'
import { err, reportRejection } from 'lib/trap'
import { EXECUTE_AST_INTERRUPT_ERROR_MESSAGE } from 'lib/constants'
import { buildArtifactIndex } from 'lib/artifactIndex'
import { ArtifactIndex } from 'lib/artifactIndex'
import {
emptyExecState,
@ -24,6 +26,7 @@ import {
SourceRange,
topLevelRange,
VariableMap,
ArtifactGraph,
} from 'lang/wasm'
import { getNodeFromPath, getSettingsAnnotation } from './queryAst'
import {
@ -53,6 +56,14 @@ interface ExecuteArgs {
}
export class KclManager {
/**
* The artifactGraph is a client-side representation of the commands that have been sent
* see: src/lang/std/artifactGraph-README.md for a full explanation.
*/
artifactGraph: ArtifactGraph = new Map()
artifactIndex: ArtifactIndex = []
defaultPlanesShown: boolean = false
private _ast: Node<Program> = {
body: [],
shebang: null,
@ -289,6 +300,47 @@ export class KclManager {
}
}
private async updateArtifactGraph(
execStateArtifactGraph: ExecState['artifactGraph']
) {
this.artifactGraph = execStateArtifactGraph
this.artifactIndex = buildArtifactIndex(execStateArtifactGraph)
if (this.artifactGraph.size) {
// TODO: we wanna remove this logic from xstate, it is racey
// This defer is bullshit but playwright wants it
// It was like this in engineConnection.ts already
deferExecution((a?: null) => {
this.engineCommandManager.modelingSend({
type: 'Artifact graph emptied',
})
}, 200)(null)
} else {
deferExecution((a?: null) => {
this.engineCommandManager.modelingSend({
type: 'Artifact graph populated',
})
}, 200)(null)
}
}
// Some "objects" have the same source range, such as sketch_mode_start and start_path.
// So when passing a range, we need to also specify the command type
private mapRangeToObjectId(
range: SourceRange,
commandTypeToTarget: string
): string | undefined {
for (const [artifactId, artifact] of this.artifactGraph) {
if (
'codeRef' in artifact &&
artifact.codeRef &&
isOverlap(range, artifact.codeRef.range)
) {
if (commandTypeToTarget === artifact.type) return artifactId
}
}
return undefined
}
async safeParse(code: string): Promise<Node<Program> | null> {
const result = parse(code)
this.diagnostics = []
@ -330,6 +382,7 @@ export class KclManager {
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
} catch (e) {
console.error(e)
this.wasmInitFailed = true
}
}
@ -370,12 +423,12 @@ export class KclManager {
// Do not send send scene commands if the program was interrupted, go to clean up
if (!isInterrupted) {
this.addDiagnostics(await lintAst({ ast: ast }))
setSelectionFilterToDefault(this.engineCommandManager)
await setSelectionFilterToDefault(this.engineCommandManager)
if (args.zoomToFit) {
let zoomObjectId: string | undefined = ''
if (args.zoomOnRangeAndType) {
zoomObjectId = this.engineCommandManager?.mapRangeToObjectId(
zoomObjectId = this.mapRangeToObjectId(
args.zoomOnRangeAndType.range,
args.zoomOnRangeAndType.type
)
@ -429,7 +482,7 @@ export class KclManager {
}
this.ast = { ...ast }
// updateArtifactGraph relies on updated executeState/variables
this.engineCommandManager.updateArtifactGraph(execState.artifactGraph)
await this.updateArtifactGraph(execState.artifactGraph)
this._executeCallback()
if (!isInterrupted) {
sceneInfra.modelingSend({ type: 'code edit during sketch' })

View File

@ -1087,6 +1087,22 @@ export function createLocalName(name: string): Node<Name> {
}
}
export function createName(path: [string], name: string): Node<Name> {
return {
type: 'Name',
start: 0,
end: 0,
moduleId: 0,
outerAttrs: [],
preComments: [],
commentStart: 0,
abs_path: false,
path: path.map(createIdentifier),
name: createIdentifier(name),
}
}
export function createPipeSubstitution(): Node<PipeSubstitution> {
return {
type: 'PipeSubstitution',

View File

@ -139,7 +139,7 @@ const runGetPathToExtrudeForSegmentSelectionTest = async (
// executeAst and artifactGraph
await kclManager.executeAst({ ast })
const artifactGraph = engineCommandManager.artifactGraph
const artifactGraph = kclManager.artifactGraph
// find artifact
const maybeArtifact = [...artifactGraph].find(([, artifact]) => {
@ -348,7 +348,7 @@ const runModifyAstCloneWithEdgeTreatmentAndTag = async (
// executeAst
await kclManager.executeAst({ ast })
const artifactGraph = engineCommandManager.artifactGraph
const artifactGraph = kclManager.artifactGraph
const selection: Selections = {
graphSelections: segmentRanges.map((segmentRange) => {
@ -390,7 +390,7 @@ const runDeleteEdgeTreatmentTest = async (
// update artifact graph
await kclManager.executeAst({ ast })
const artifactGraph = engineCommandManager.artifactGraph
const artifactGraph = kclManager.artifactGraph
// define snippet range
const edgeTreatmentRange = topLevelRange(

View File

@ -118,7 +118,7 @@ export function modifyAstWithEdgeTreatmentAndTag(
const astResult = insertParametersIntoAst(clonedAst, parameters)
if (err(astResult)) return astResult
const artifactGraph = dependencies.engineCommandManager.artifactGraph
const artifactGraph = dependencies.kclManager.artifactGraph
// Step 1: modify ast with tags and group them by extrude nodes (bodies)
const extrudeToTagsMap: Map<

View File

@ -42,11 +42,11 @@ export async function applySubtractFromTargetOperatorSelections(
}
const orderedChildrenTarget = findAllChildrenAndOrderByPlaceInCode(
target.artifact,
dependencies.engineCommandManager.artifactGraph
dependencies.kclManager.artifactGraph
)
const orderedChildrenTool = findAllChildrenAndOrderByPlaceInCode(
tool.artifact,
dependencies.engineCommandManager.artifactGraph
dependencies.kclManager.artifactGraph
)
const lastVarTarget = getLastVariable(orderedChildrenTarget, ast)
@ -89,7 +89,7 @@ export async function applyUnionFromTargetOperatorSelections(
const orderedChildrenEach = artifacts.map((artifact) =>
findAllChildrenAndOrderByPlaceInCode(
artifact,
dependencies.engineCommandManager.artifactGraph
dependencies.kclManager.artifactGraph
)
)
@ -136,7 +136,7 @@ export async function applyIntersectFromTargetOperatorSelections(
const orderedChildrenEach = artifacts.map((artifact) =>
findAllChildrenAndOrderByPlaceInCode(
artifact,
dependencies.engineCommandManager.artifactGraph
dependencies.kclManager.artifactGraph
)
)

View File

@ -4,7 +4,6 @@ import { deleteFromSelection } from 'lang/modifyAst'
import {
codeManager,
editorManager,
engineCommandManager,
kclManager,
rustContext,
} from 'lib/singletons'
@ -25,7 +24,7 @@ export async function deleteSelectionPromise(
ast,
selection,
kclManager.variables,
engineCommandManager.artifactGraph,
kclManager.artifactGraph,
getFaceDetails
)
if (err(modifiedAst)) {

View File

@ -1,13 +1,8 @@
import {
ArtifactGraph,
defaultSourceRange,
ExecState,
SourceRange,
} from 'lang/wasm'
import { defaultSourceRange, SourceRange } from 'lang/wasm'
import { VITE_KC_API_WS_MODELING_URL, VITE_KC_DEV_TOKEN } from 'env'
import { Models } from '@kittycad/lib'
import { deferExecution, isOverlap, uuidv4 } from 'lib/utils'
import { BSON, Binary as BSONBinary } from 'bson'
import { uuidv4, binaryToUuid } from 'lib/utils'
import { BSON } from 'bson'
import {
Themes,
getThemeColorForEngine,
@ -22,8 +17,6 @@ import { KclManager } from 'lang/KclSingleton'
import { reportRejection } from 'lib/trap'
import { markOnce } from 'lib/performance'
import { MachineManager } from 'components/MachineManagerProvider'
import { buildArtifactIndex } from 'lib/artifactIndex'
import { ArtifactIndex } from 'lib/artifactIndex'
// TODO(paultag): This ought to be tweakable.
const pingIntervalMs = 5_000
@ -1047,11 +1040,9 @@ class EngineConnection extends EventTarget {
})
.join('\n')
if (message.request_id) {
const artifactThatFailed =
this.engineCommandManager.artifactGraph.get(message.request_id)
console.error(
`Error in response to request ${message.request_id}:\n${errorsString}
failed cmd type was ${artifactThatFailed?.type}`
failed`
)
} else {
console.error(`Error from server:\n${errorsString}`)
@ -1355,8 +1346,7 @@ export enum EngineCommandManagerEvents {
*
* As commands are send their state is tracked in {@link pendingCommands} and clear as soon as we receive a response.
*
* Also all commands that are sent are kept track of in WASM artifactCommands and their responses are kept in {@link responseMap}
* Both of these data structures are used to process the {@link artifactGraph}.
* Also all commands that are sent are kept track of in WASM and their responses are kept in {@link responseMap}
*/
interface PendingMessage {
@ -1369,12 +1359,6 @@ interface PendingMessage {
isSceneCommand: boolean
}
export class EngineCommandManager extends EventTarget {
/**
* The artifactGraph is a client-side representation of the commands that have been sent
* see: src/lang/std/artifactGraph-README.md for a full explanation.
*/
artifactGraph: ArtifactGraph = new Map()
artifactIndex: ArtifactIndex = []
/**
* The pendingCommands object is a map of the commands that have been sent to the engine that are still waiting on a reply
*/
@ -1382,7 +1366,7 @@ export class EngineCommandManager extends EventTarget {
[commandId: string]: PendingMessage
} = {}
/**
* A map of the responses to the WASM artifactCommands, when processing the commands into the artifactGraph, this response map allow
* A map of the responses to the WASM, this response map allow
* us to look up the response by command id
*/
responseMap: ResponseMap = {}
@ -1878,7 +1862,7 @@ export class EngineCommandManager extends EventTarget {
registerCommandLogCallback(callback: (command: CommandLog[]) => void) {
this._commandLogCallBack = callback
}
sendSceneCommand(
async sendSceneCommand(
command: EngineCommand,
forceWebsocket = false
): Promise<Models['WebSocketResponse_type'] | null> {
@ -2032,13 +2016,6 @@ export class EngineCommandManager extends EventTarget {
return promise
}
deferredArtifactPopulated = deferExecution((a?: null) => {
this.modelingSend({ type: 'Artifact graph populated' })
}, 200)
deferredArtifactEmptied = deferExecution((a?: null) => {
this.modelingSend({ type: 'Artifact graph emptied' })
}, 200)
/**
* When an execution takes place we want to wait until we've got replies for all of the commands
* When this is done when we build the artifact map synchronously.
@ -2048,16 +2025,6 @@ export class EngineCommandManager extends EventTarget {
Object.values(this.pendingCommands).map((a) => a.promise)
)
}
updateArtifactGraph(execStateArtifactGraph: ExecState['artifactGraph']) {
this.artifactGraph = execStateArtifactGraph
this.artifactIndex = buildArtifactIndex(execStateArtifactGraph)
// TODO check if these still need to be deferred once e2e tests are working again.
if (this.artifactGraph.size) {
this.deferredArtifactEmptied(null)
} else {
this.deferredArtifactPopulated(null)
}
}
/**
* Reject all of the modeling pendingCommands created from sendModelingCommandFromWasm
@ -2121,24 +2088,6 @@ export class EngineCommandManager extends EventTarget {
},
}).catch(reportRejection)
}
// Some "objects" have the same source range, such as sketch_mode_start and start_path.
// So when passing a range, we need to also specify the command type
mapRangeToObjectId(
range: SourceRange,
commandTypeToTarget: string
): string | undefined {
for (const [artifactId, artifact] of this.artifactGraph) {
if (
'codeRef' in artifact &&
artifact.codeRef &&
isOverlap(range, artifact.codeRef.range)
) {
if (commandTypeToTarget === artifact.type) return artifactId
}
}
return undefined
}
}
function promiseFactory<T>() {
@ -2150,65 +2099,3 @@ function promiseFactory<T>() {
})
return { promise, resolve, reject }
}
/**
* Converts a binary buffer to a UUID string.
*
* @param buffer - The binary buffer containing the UUID bytes.
* @returns A string representation of the UUID in the format 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'.
*/
function binaryToUuid(
binaryData: Buffer | Uint8Array | BSONBinary | string
): string {
if (typeof binaryData === 'string') {
return binaryData
}
let buffer: Uint8Array
// Handle MongoDB BSON Binary object
if (
binaryData &&
'_bsontype' in binaryData &&
binaryData._bsontype === 'Binary'
) {
// Extract the buffer from the BSON Binary object
buffer = binaryData.buffer
}
// Handle case where buffer property exists (some MongoDB drivers structure)
else if (binaryData && binaryData.buffer instanceof Uint8Array) {
buffer = binaryData.buffer
}
// Handle direct Buffer or Uint8Array
else if (binaryData instanceof Uint8Array || Buffer.isBuffer(binaryData)) {
buffer = binaryData
} else {
console.error(
'Invalid input type: expected MongoDB BSON Binary, Buffer, or Uint8Array'
)
return ''
}
// Ensure we have exactly 16 bytes (128 bits) for a UUID
if (buffer.length !== 16) {
// For debugging
console.log('Buffer length:', buffer.length)
console.log('Buffer content:', Array.from(buffer))
console.error('UUID must be exactly 16 bytes')
return ''
}
// Convert each byte to a hex string and pad with zeros if needed
const hexValues = Array.from(buffer).map((byte) =>
byte.toString(16).padStart(2, '0')
)
// Format into UUID structure (8-4-4-4-12 characters)
return [
hexValues.slice(0, 4).join(''),
hexValues.slice(4, 6).join(''),
hexValues.slice(6, 8).join(''),
hexValues.slice(8, 10).join(''),
hexValues.slice(10, 16).join(''),
].join('-')
}

View File

@ -35,6 +35,7 @@ import {
createLabeledArg,
createLiteral,
createLocalName,
createName,
createObjectExpression,
createPipeSubstitution,
createUnaryExpression,
@ -612,7 +613,7 @@ const setAngledIntersectLineForLines: CreateStdLibSketchCallExpr = ({
270: 'THREE_QUARTER_TURN',
}
const angleVal = [0, 90, 180, 270].includes(angle)
? createLocalName(varNamMap[angle])
? createName(['turns'], varNamMap[angle])
: createLiteral(angle)
return intersectCallWrapper({
fnName: 'angledLineThatIntersects',
@ -665,7 +666,7 @@ const setAngleBetweenCreateNode =
firstHalfValue = createBinaryExpression([
firstHalfValue,
'+',
createLocalName('HALF_TURN'),
createName(['turns'], 'HALF_TURN'),
])
valueUsedInTransform = normaliseAngle(valueUsedInTransform - 180)
}

View File

@ -1,5 +1,5 @@
import { Models } from '@kittycad/lib'
import { engineCommandManager } from 'lib/singletons'
import { engineCommandManager, kclManager } from 'lib/singletons'
import { uuidv4 } from 'lib/utils'
import { CommandBarContext } from 'machines/commandBarMachine'
import { Selections } from 'lib/selections'
@ -188,7 +188,7 @@ export const shellValidator = async ({
// So we're listing out the sweeps as if they were solids and taking the first one, just like in Rust for Shell:
// https://github.com/KittyCAD/modeling-app/blob/e61fff115b9fa94aaace6307b1842cc15d41655e/src/wasm-lib/kcl/src/std/shell.rs#L237-L238
// TODO: This is one cheap way to make sketch-on-face supported now but will likely fail multiple solids
const object_id = engineCommandManager.artifactGraph
const object_id = kclManager.artifactGraph
.values()
.find((v) => v.type === 'sweep')?.pathId

View File

@ -200,17 +200,6 @@ export class CoreDumpManager {
// engine_command_manager
debugLog('CoreDump: engineCommandManager', this.engineCommandManager)
// artifact map - this.engineCommandManager.artifactGraph
if (this.engineCommandManager?.artifactGraph) {
debugLog(
'CoreDump: Engine Command Manager artifact map',
this.engineCommandManager.artifactGraph
)
clientState.engine_command_manager.artifact_map = structuredClone(
this.engineCommandManager.artifactGraph
)
}
// command logs - this.engineCommandManager.commandLogs
if (this.engineCommandManager?.commandLogs) {
debugLog(
@ -274,6 +263,21 @@ export class CoreDumpManager {
clientState.kcl_manager.ast = structuredClone(kclManager.ast)
}
// artifact map - this.kclManager.artifactGraph
debugLog(
'CoreDump: KCL Manager artifact map',
kclManager?.artifactGraph
)
if (kclManager.artifactGraph) {
debugLog(
'CoreDump: Engine Command Manager artifact map',
kclManager.artifactGraph
)
clientState.engine_command_manager.artifact_map = structuredClone(
kclManager.artifactGraph
)
}
// KCL Errors
debugLog('CoreDump: KCL Errors', kclManager?.kclErrors)
if (kclManager?.kclErrors) {

View File

@ -8,7 +8,7 @@ import {
getWallCodeRef,
} from 'lang/std/artifactGraph'
import { Operation } from '@rust/kcl-lib/bindings/Operation'
import { codeManager, engineCommandManager, kclManager } from './singletons'
import { codeManager, kclManager, rustContext } from './singletons'
import { err } from './trap'
import { getNodePathFromSourceRange } from 'lang/queryAstNodePathUtils'
import { sourceRangeFromRust } from 'lang/wasm'
@ -20,7 +20,6 @@ import {
} from './commandBarConfigs/modelingCommandConfig'
import { isDefaultPlaneStr } from './planes'
import { Selection, Selections } from './selections'
import { rustContext } from './singletons'
import { KclExpression } from './commandTypes'
type ExecuteCommandEvent = CommandBarMachineEvent & {
@ -73,7 +72,7 @@ const prepareToEditExtrude: PrepareToEditCallback =
key: artifact.pathId,
types: ['path'],
},
engineCommandManager.artifactGraph
kclManager.artifactGraph
)
if (
err(pathArtifact) ||
@ -86,7 +85,7 @@ const prepareToEditExtrude: PrepareToEditCallback =
key: pathArtifact.solid2dId,
types: ['solid2d'],
},
engineCommandManager.artifactGraph
kclManager.artifactGraph
)
if (err(solid2DArtifact) || solid2DArtifact.type !== 'solid2d') {
return baseCommand
@ -157,7 +156,7 @@ const prepareToEditEdgeTreatment: PrepareToEditCallback = async ({
key: artifact.consumedEdgeId,
types: ['segment', 'sweepEdge'],
},
engineCommandManager.artifactGraph
kclManager.artifactGraph
)
if (err(edgeArtifact)) {
return { reason: "Couldn't find edge artifact" }
@ -165,7 +164,7 @@ const prepareToEditEdgeTreatment: PrepareToEditCallback = async ({
let edgeCodeRef = getEdgeCutConsumedCodeRef(
artifact,
engineCommandManager.artifactGraph
kclManager.artifactGraph
)
if (err(edgeCodeRef)) {
return { reason: "Couldn't find edge coderef" }
@ -272,16 +271,13 @@ const prepareToEditShell: PrepareToEditCallback =
// that we can query in another loop later
const sweepId = operation.unlabeledArg.value.value.artifactId
const candidates: Map<string, Selection> = new Map()
for (const artifact of engineCommandManager.artifactGraph.values()) {
for (const artifact of kclManager.artifactGraph.values()) {
if (
artifact.type === 'cap' &&
artifact.sweepId === sweepId &&
artifact.subType
) {
const codeRef = getCapCodeRef(
artifact,
engineCommandManager.artifactGraph
)
const codeRef = getCapCodeRef(artifact, kclManager.artifactGraph)
if (err(codeRef)) {
return baseCommand
}
@ -297,7 +293,7 @@ const prepareToEditShell: PrepareToEditCallback =
) {
const segArtifact = getArtifactOfTypes(
{ key: artifact.segId, types: ['segment'] },
engineCommandManager.artifactGraph
kclManager.artifactGraph
)
if (err(segArtifact)) {
return baseCommand
@ -461,7 +457,7 @@ const prepareToEditSweep: PrepareToEditCallback = async ({
key: artifact.pathId,
types: ['path'],
},
engineCommandManager.artifactGraph
kclManager.artifactGraph
)
if (
@ -477,7 +473,7 @@ const prepareToEditSweep: PrepareToEditCallback = async ({
key: pathArtifact.solid2dId,
types: ['solid2d'],
},
engineCommandManager.artifactGraph
kclManager.artifactGraph
)
if (err(targetArtifact) || targetArtifact.type !== 'solid2d') {
@ -508,7 +504,7 @@ const prepareToEditSweep: PrepareToEditCallback = async ({
key: operation.labeledArgs.path.value.value.artifactId,
types: ['path'],
},
engineCommandManager.artifactGraph
kclManager.artifactGraph
)
if (err(trajectoryPathArtifact) || trajectoryPathArtifact.type !== 'path') {
@ -520,7 +516,7 @@ const prepareToEditSweep: PrepareToEditCallback = async ({
key: trajectoryPathArtifact.segIds[0],
types: ['segment'],
},
engineCommandManager.artifactGraph
kclManager.artifactGraph
)
if (err(trajectoryArtifact) || trajectoryArtifact.type !== 'segment') {
@ -607,7 +603,7 @@ const prepareToEditHelix: PrepareToEditCallback = async ({ operation }) => {
key: axisValue.artifact_id,
types: ['segment'],
},
engineCommandManager.artifactGraph
kclManager.artifactGraph
)
if (err(artifact)) {
return { reason: "Couldn't find related edge artifact" }
@ -630,16 +626,13 @@ const prepareToEditHelix: PrepareToEditCallback = async ({ operation }) => {
key: axisValue.value,
types: ['sweepEdge'],
},
engineCommandManager.artifactGraph
kclManager.artifactGraph
)
if (err(artifact)) {
return { reason: "Couldn't find related edge artifact" }
}
const codeRef = getSweepEdgeCodeRef(
artifact,
engineCommandManager.artifactGraph
)
const codeRef = getSweepEdgeCodeRef(artifact, kclManager.artifactGraph)
if (err(codeRef)) {
return { reason: "Couldn't find related edge code ref" }
}
@ -667,7 +660,7 @@ const prepareToEditHelix: PrepareToEditCallback = async ({ operation }) => {
}
const sweepId = operation.labeledArgs.cylinder.value.value.artifactId
const wallArtifact = [...engineCommandManager.artifactGraph.values()].find(
const wallArtifact = [...kclManager.artifactGraph.values()].find(
(p) => p.type === 'wall' && p.sweepId === sweepId
)
if (!wallArtifact || wallArtifact.type !== 'wall') {
@ -676,10 +669,7 @@ const prepareToEditHelix: PrepareToEditCallback = async ({ operation }) => {
}
}
const wallCodeRef = getWallCodeRef(
wallArtifact,
engineCommandManager.artifactGraph
)
const wallCodeRef = getWallCodeRef(wallArtifact, kclManager.artifactGraph)
if (err(wallCodeRef)) {
return {
reason: "Cylinder arg found doesn't point to a valid sweep code ref",

View File

@ -146,16 +146,13 @@ export default class RustContext {
return this._defaultPlanes
}
// Clear the scene and bust the cache.
// Clear/reset the scene and bust the cache.
async clearSceneAndBustCache(
settings: DeepPartial<Configuration>,
path?: string
) {
// Send through and empty ast to clear the scene.
// This will also bust the cache and reset the default planes.
// We do it like this so it works better with adding stuff later and the
// cache.
// It also works better with the id generator.
): Promise<ExecState> {
const instance = await this._checkInstance()
const ast: Node<Program> = {
body: [],
shebang: null,
@ -172,7 +169,23 @@ export default class RustContext {
commentStart: 0,
}
await this.execute(ast, settings, path)
try {
const result = await instance.bustCacheAndResetScene(
JSON.stringify(settings),
path
)
/* Set the default planes, safe to call after execute. */
const outcome = execStateFromRust(result, ast)
this._defaultPlanes = outcome.defaultPlanes
// Return the result.
return outcome
} catch (e: any) {
const err = errFromErrWithOutputs(e)
this._defaultPlanes = err.defaultPlanes
return Promise.reject(err)
}
}
getDefaultPlaneId(name: DefaultPlaneStr): string | Error {

View File

@ -102,10 +102,10 @@ export async function getEventForSelectWithPoint({
}
}
let _artifact = engineCommandManager.artifactGraph.get(data.entity_id)
let _artifact = kclManager.artifactGraph.get(data.entity_id)
const codeRefs = getCodeRefsByArtifactId(
data.entity_id,
engineCommandManager.artifactGraph
kclManager.artifactGraph
)
if (_artifact && codeRefs) {
return {
@ -140,15 +140,15 @@ export function getEventForSegmentSelection(
// id does not match up with the artifact graph when in sketch mode, because mock executions
// do not update the artifact graph, therefore we match up the pathToNode instead
// we can reliably use `type === 'segment'` since it's in sketch mode and we're concerned with segments
const segWithMatchingPathToNode__Id = [
...engineCommandManager.artifactGraph,
].find((entry) => {
const segWithMatchingPathToNode__Id = [...kclManager.artifactGraph].find(
(entry) => {
return (
entry[1].type === 'segment' &&
JSON.stringify(entry[1].codeRef.pathToNode) ===
JSON.stringify(group?.userData?.pathToNode)
)
})?.[0]
}
)?.[0]
const id = segWithMatchingPathToNode__Id
@ -172,7 +172,7 @@ export function getEventForSegmentSelection(
}
}
if (!id || !group) return null
const artifact = engineCommandManager.artifactGraph.get(id)
const artifact = kclManager.artifactGraph.get(id)
if (!artifact) return null
const node = getNodeFromPath<Expr>(kclManager.ast, group.userData.pathToNode)
if (err(node)) return null
@ -208,10 +208,8 @@ export function handleSelectionBatch({
selectionToEngine.push({
id: artifact?.id,
range:
getCodeRefsByArtifactId(
artifact.id,
engineCommandManager.artifactGraph
)?.[0].range || defaultSourceRange(),
getCodeRefsByArtifactId(artifact.id, kclManager.artifactGraph)?.[0]
.range || defaultSourceRange(),
})
})
const engineEvents: Models['WebSocketRequest_type'][] =
@ -291,7 +289,7 @@ export function processCodeMirrorRanges({
const idBasedSelections: SelectionToEngine[] = codeToIdSelections(
codeBasedSelections,
artifactGraph,
engineCommandManager.artifactIndex
kclManager.artifactIndex
)
const selections: Selection[] = []
for (const { id, range } of idBasedSelections) {
@ -396,10 +394,7 @@ function resetAndSetEngineEntitySelectionCmds(
*/
export function isSketchPipe(selectionRanges: Selections) {
if (!isSingleCursorInPipe(selectionRanges, kclManager.ast)) return false
return isCursorInSketchCommandRange(
engineCommandManager.artifactGraph,
selectionRanges
)
return isCursorInSketchCommandRange(kclManager.artifactGraph, selectionRanges)
}
// This accounts for non-geometry selections under "other"
@ -692,12 +687,9 @@ export function updateSelections(
if (err(nodeMeta)) return undefined
const node = nodeMeta.node
let artifact: Artifact | null = null
for (const [id, a] of engineCommandManager.artifactGraph) {
for (const [id, a] of kclManager.artifactGraph) {
if (previousSelection?.artifact?.type === a.type) {
const codeRefs = getCodeRefsByArtifactId(
id,
engineCommandManager.artifactGraph
)
const codeRefs = getCodeRefsByArtifactId(id, kclManager.artifactGraph)
if (!codeRefs) continue
if (
JSON.stringify(codeRefs[0].pathToNode) ===

View File

@ -4,6 +4,7 @@ import { v4 } from 'uuid'
import { isDesktop } from './isDesktop'
import { AnyMachineSnapshot } from 'xstate'
import { AsyncFn } from './types'
import { Binary as BSONBinary } from 'bson'
export const uuidv4 = v4
@ -406,3 +407,65 @@ export function isClockwise(points: [number, number][]): boolean {
// If sum is positive, the points are in clockwise order
return sum > 0
}
/**
* Converts a binary buffer to a UUID string.
*
* @param buffer - The binary buffer containing the UUID bytes.
* @returns A string representation of the UUID in the format 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'.
*/
export function binaryToUuid(
binaryData: Buffer | Uint8Array | BSONBinary | string
): string {
if (typeof binaryData === 'string') {
return binaryData
}
let buffer: Uint8Array
// Handle MongoDB BSON Binary object
if (
binaryData &&
'_bsontype' in binaryData &&
binaryData._bsontype === 'Binary'
) {
// Extract the buffer from the BSON Binary object
buffer = binaryData.buffer
}
// Handle case where buffer property exists (some MongoDB drivers structure)
else if (binaryData && binaryData.buffer instanceof Uint8Array) {
buffer = binaryData.buffer
}
// Handle direct Buffer or Uint8Array
else if (binaryData instanceof Uint8Array || Buffer.isBuffer(binaryData)) {
buffer = binaryData
} else {
console.error(
'Invalid input type: expected MongoDB BSON Binary, Buffer, or Uint8Array'
)
return ''
}
// Ensure we have exactly 16 bytes (128 bits) for a UUID
if (buffer.length !== 16) {
// For debugging
console.log('Buffer length:', buffer.length)
console.log('Buffer content:', Array.from(buffer))
console.error('UUID must be exactly 16 bytes')
return ''
}
// Convert each byte to a hex string and pad with zeros if needed
const hexValues = Array.from(buffer).map((byte) =>
byte.toString(16).padStart(2, '0')
)
// Format into UUID structure (8-4-4-4-12 characters)
return [
hexValues.slice(0, 4).join(''),
hexValues.slice(4, 6).join(''),
hexValues.slice(6, 8).join(''),
hexValues.slice(8, 10).join(''),
hexValues.slice(10, 16).join(''),
].join('-')
}

View File

@ -5,7 +5,7 @@ import {
enterEditFlow,
EnterEditFlowProps,
} from 'lib/operations'
import { engineCommandManager, kclManager } from 'lib/singletons'
import { kclManager } from 'lib/singletons'
import { err } from 'lib/trap'
import toast from 'react-hot-toast'
import { Operation } from '@rust/kcl-lib/bindings/Operation'
@ -275,7 +275,7 @@ export const featureTreeMachine = setup({
const artifact = context.targetSourceRange
? getArtifactFromRange(
context.targetSourceRange,
engineCommandManager.artifactGraph
kclManager.artifactGraph
) ?? undefined
: undefined
return {
@ -329,7 +329,7 @@ export const featureTreeMachine = setup({
const artifact = context.targetSourceRange
? getArtifactFromRange(
context.targetSourceRange,
engineCommandManager.artifactGraph
kclManager.artifactGraph
) ?? undefined
: undefined
return {
@ -383,7 +383,7 @@ export const featureTreeMachine = setup({
const artifact = context.targetSourceRange
? getArtifactFromRange(
context.targetSourceRange,
engineCommandManager.artifactGraph
kclManager.artifactGraph
) ?? undefined
: undefined
return {

View File

@ -766,7 +766,7 @@ export const modelingMachine = setup({
axisOrEdge,
axis,
edge,
engineCommandManager.artifactGraph,
kclManager.artifactGraph,
selection.graphSelections[0]?.artifact
)
if (trap(revolveSketchRes)) return
@ -1123,9 +1123,7 @@ export const modelingMachine = setup({
}),
're-eval nodePaths': assign(({ context: { sketchDetails } }) => {
if (!sketchDetails) return {}
const planeArtifact = [
...engineCommandManager.artifactGraph.values(),
].find(
const planeArtifact = [...kclManager.artifactGraph.values()].find(
(artifact) =>
artifact.type === 'plane' &&
stringifyPathToNode(artifact.codeRef.pathToNode) ===
@ -1134,7 +1132,7 @@ export const modelingMachine = setup({
if (planeArtifact?.type !== 'plane') return {}
const newPaths = getPathsFromPlaneArtifact(
planeArtifact,
engineCommandManager.artifactGraph,
kclManager.artifactGraph,
kclManager.ast
)
return {
@ -1794,7 +1792,7 @@ export const modelingMachine = setup({
node: ast,
pathToNode,
artifact: selection.graphSelections[0].artifact,
artifactGraph: engineCommandManager.artifactGraph,
artifactGraph: kclManager.artifactGraph,
distance:
'variableName' in distance
? distance.variableIdentifierAst
@ -1987,7 +1985,7 @@ export const modelingMachine = setup({
const extrudeLookupResult = getPathToExtrudeForSegmentSelection(
clonedAstForGetExtrude,
cylinder.graphSelections[0],
engineCommandManager.artifactGraph
kclManager.artifactGraph
)
if (err(extrudeLookupResult)) {
return extrudeLookupResult
@ -2249,7 +2247,7 @@ export const modelingMachine = setup({
const extrudeLookupResult = getPathToExtrudeForSegmentSelection(
clonedAstForGetExtrude,
graphSelection,
engineCommandManager.artifactGraph
kclManager.artifactGraph
)
if (err(extrudeLookupResult)) {
return new Error(