From 8d8fb5efce1503d1ec6ea05c1ed8c8f9df8cc837 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Thu, 27 Feb 2025 11:46:28 -0800 Subject: [PATCH 01/14] rust side of circle args Signed-off-by: Jess Frazelle --- docs/kcl/appearance.md | 6 +- docs/kcl/circle.md | 16 +- docs/kcl/const_std-math-PI.md | 2 +- docs/kcl/helix.md | 6 +- docs/kcl/helixRevolutions.md | 2 +- docs/kcl/hole.md | 6 +- docs/kcl/hollow.md | 10 +- docs/kcl/int.md | 2 +- docs/kcl/loft.md | 8 +- docs/kcl/map.md | 4 +- docs/kcl/offsetPlane.md | 10 +- docs/kcl/patternCircular3d.md | 2 +- docs/kcl/patternLinear2d.md | 2 +- docs/kcl/patternLinear3d.md | 15 +- docs/kcl/patternTransform.md | 6 +- docs/kcl/patternTransform2d.md | 2 +- docs/kcl/pi.md | 5 +- docs/kcl/revolve.md | 8 +- docs/kcl/rotate.md | 8 +- docs/kcl/scale.md | 4 +- docs/kcl/segEnd.md | 5 +- docs/kcl/segStart.md | 5 +- docs/kcl/shell.md | 30 +- docs/kcl/std.json | 3353 ++++++++++++++++- docs/kcl/sweep.md | 6 +- docs/kcl/tangentToEnd.md | 2 +- docs/kcl/translate.md | 4 +- src/wasm-lib/kcl/src/docs/mod.rs | 5 +- src/wasm-lib/kcl/src/execution/mod.rs | 43 +- ...__parsing__parser__snapshot_tests__au.snap | 137 +- src/wasm-lib/kcl/src/std/appearance.rs | 10 +- src/wasm-lib/kcl/src/std/args.rs | 22 - src/wasm-lib/kcl/src/std/array.rs | 4 +- src/wasm-lib/kcl/src/std/convert.rs | 2 +- src/wasm-lib/kcl/src/std/helix.rs | 8 +- src/wasm-lib/kcl/src/std/loft.rs | 8 +- src/wasm-lib/kcl/src/std/math.rs | 2 +- src/wasm-lib/kcl/src/std/patterns.rs | 18 +- src/wasm-lib/kcl/src/std/planes.rs | 10 +- src/wasm-lib/kcl/src/std/revolve.rs | 8 +- src/wasm-lib/kcl/src/std/segment.rs | 6 +- src/wasm-lib/kcl/src/std/shapes.rs | 54 +- src/wasm-lib/kcl/src/std/shell.rs | 16 +- src/wasm-lib/kcl/src/std/sketch.rs | 6 +- src/wasm-lib/kcl/src/std/sweep.rs | 10 +- src/wasm-lib/kcl/src/std/transform.rs | 81 +- src/wasm-lib/kcl/src/unparser.rs | 20 +- src/wasm-lib/kcl/std/math.kcl | 2 +- .../artifact_commands.snap | 20 +- .../artifact_graph_flowchart.snap.md | 8 +- .../assembly_non_default_units/other1.kcl | 2 +- .../assembly_non_default_units/other2.kcl | 2 +- .../fillet-and-shell/artifact_commands.snap | 301 +- .../artifact_graph_flowchart.snap.md | 40 +- .../kcl/tests/fillet-and-shell/ast.snap | 701 ++-- .../kcl/tests/fillet-and-shell/input.kcl | 4 +- .../kcl/tests/fillet-and-shell/ops.snap | 120 +- .../fillet-and-shell/program_memory.snap | 2 +- .../tests/helix_ccw/artifact_commands.snap | 43 +- .../artifact_graph_flowchart.snap.md | 6 +- src/wasm-lib/kcl/tests/helix_ccw/ast.snap | 189 +- src/wasm-lib/kcl/tests/helix_ccw/input.kcl | 2 +- src/wasm-lib/kcl/tests/helix_ccw/ops.snap | 20 +- .../kcl/tests/helix_ccw/program_memory.snap | 10 +- .../import_side_effect/export_side_effect.kcl | 2 +- .../tests/import_whole/artifact_commands.snap | 39 +- .../artifact_graph_flowchart.snap | 1 - .../artifact_graph_flowchart.snap.md | 6 +- .../kcl/tests/import_whole/exported_mod.kcl | 2 +- src/wasm-lib/kcl/tests/import_whole/ops.snap | 8 +- .../tests/import_whole/program_memory.snap | 10 +- .../revolve_about_edge/artifact_commands.snap | 30 +- .../artifact_graph_flowchart.snap.md | 6 +- .../kcl/tests/revolve_about_edge/ast.snap | 177 +- .../kcl/tests/revolve_about_edge/input.kcl | 2 +- .../kcl/tests/revolve_about_edge/ops.snap | 12 +- .../revolve_about_edge/program_memory.snap | 10 +- .../artifact_commands.snap | 39 +- .../artifact_graph_flowchart.snap.md | 6 +- .../sketch_on_face_circle_tagged/ast.snap | 154 +- .../sketch_on_face_circle_tagged/input.kcl | 2 +- .../sketch_on_face_circle_tagged/ops.snap | 6 +- .../program_memory.snap | 50 +- .../tests/ssi_pattern/artifact_commands.snap | 874 ++--- .../artifact_graph_flowchart.snap.md | 6 +- src/wasm-lib/kcl/tests/ssi_pattern/ast.snap | 217 +- src/wasm-lib/kcl/tests/ssi_pattern/input.kcl | 2 +- src/wasm-lib/kcl/tests/ssi_pattern/ops.snap | 8 +- .../kcl/tests/ssi_pattern/program_memory.snap | 300 +- .../tests/executor/inputs/cylinder.kcl | 2 +- .../executor/inputs/fillet-and-shell.kcl | 4 +- .../focusrite_scarlett_mounting_braket.kcl | 16 +- .../tests/executor/inputs/global-tags.kcl | 16 +- .../tests/executor/inputs/helix_defaults.kcl | 2 +- .../helix_defaults_negative_extrude.kcl | 2 +- .../executor/inputs/helix_with_length.kcl | 2 +- src/wasm-lib/tests/executor/inputs/lego.kcl | 4 +- .../tests/executor/inputs/pattern_vase.kcl | 2 +- .../executor/inputs/server-rack-heavy.kcl | 18 +- .../executor/inputs/server-rack-lite.kcl | 18 +- .../inputs/sketch_on_face_circle_tagged.kcl | 2 +- .../tests/executor/inputs/slow_lego.kcl.tmpl | 4 +- .../executor/inputs/test-circle-extrude.kcl | 4 +- src/wasm-lib/tests/executor/main.rs | 63 +- 104 files changed, 5295 insertions(+), 2304 deletions(-) diff --git a/docs/kcl/appearance.md b/docs/kcl/appearance.md index ad6c5f1103..4822f62447 100644 --- a/docs/kcl/appearance.md +++ b/docs/kcl/appearance.md @@ -53,7 +53,7 @@ example = extrude(exampleSketch, length = 5) ```js // Add color to a revolved solid. sketch001 = startSketchOn('XY') - |> circle({ center = [15, 0], radius = 5 }, %) + |> circle(center = [15, 0], radius = 5) |> revolve({ angle = 360, axis = 'y' }, %) |> appearance(color = '#ff0000', metalness = 90, roughness = 90) ``` @@ -195,10 +195,10 @@ sweepPath = startSketchOn('XZ') |> line(end = [0, 7]) pipeHole = startSketchOn('XY') - |> circle({ center = [0, 0], radius = 1.5 }, %) + |> circle(center = [0, 0], radius = 1.5) sweepSketch = startSketchOn('XY') - |> circle({ center = [0, 0], radius = 2 }, %) + |> circle(center = [0, 0], radius = 2) |> hole(pipeHole, %) |> sweep(path = sweepPath) |> appearance(color = "#ff0000", metalness = 50, roughness = 50) diff --git a/docs/kcl/circle.md b/docs/kcl/circle.md index 24c76ce503..34d52c49e1 100644 --- a/docs/kcl/circle.md +++ b/docs/kcl/circle.md @@ -10,8 +10,9 @@ the provided (x, y) origin point. ```js circle( - data: CircleData, - sketchSurfaceOrGroup: SketchOrSurface, + sketchOrSurface: SketchOrSurface, + center: [number], + radius: number, tag?: TagDeclarator, ) -> Sketch ``` @@ -21,9 +22,10 @@ circle( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `data` | [`CircleData`](/docs/kcl/types/CircleData) | Data for drawing an circle | Yes | -| `sketchSurfaceOrGroup` | [`SketchOrSurface`](/docs/kcl/types/SketchOrSurface) | A sketch surface or a sketch. | Yes | -| `tag` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | | No | +| `sketchOrSurface` | [`SketchOrSurface`](/docs/kcl/types/SketchOrSurface) | Plane or surface to sketch on. | Yes | +| `center` | `[number]` | The center of the circle. | Yes | +| `radius` | `number` | The radius of the circle. | Yes | +| `tag` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | Create a new tag which refers to this circle | No | ### Returns @@ -34,7 +36,7 @@ circle( ```js exampleSketch = startSketchOn("-XZ") - |> circle({ center = [0, 0], radius = 10 }, %) + |> circle(center = [0, 0], radius = 10) example = extrude(exampleSketch, length = 5) ``` @@ -48,7 +50,7 @@ exampleSketch = startSketchOn("XZ") |> line(end = [0, 30]) |> line(end = [-30, 0]) |> close() - |> hole(circle({ center = [0, 15], radius = 5 }, %), %) + |> hole(circle(center = [0, 15], radius = 5), %) example = extrude(exampleSketch, length = 5) ``` diff --git a/docs/kcl/const_std-math-PI.md b/docs/kcl/const_std-math-PI.md index c92a9192a4..c0bd40e144 100644 --- a/docs/kcl/const_std-math-PI.md +++ b/docs/kcl/const_std-math-PI.md @@ -18,7 +18,7 @@ std::math::PI: number = 3.14159265358979323846264338327950288_ circumference = 70 exampleSketch = startSketchOn("XZ") - |> circle({ center = [0, 0], radius = circumference/ (2 * PI) }, %) + |> circle(center = [0, 0], radius = circumference/ (2 * PI)) example = extrude(exampleSketch, length = 5) ``` diff --git a/docs/kcl/helix.md b/docs/kcl/helix.md index f03e0c0580..512259e388 100644 --- a/docs/kcl/helix.md +++ b/docs/kcl/helix.md @@ -51,7 +51,7 @@ helixPath = helix( // Create a spring by sweeping around the helix path. springSketch = startSketchOn('YZ') - |> circle({ center = [0, 0], radius = 0.5 }, %) + |> circle(center = [0, 0], radius = 0.5) |> sweep(path = helixPath) ``` @@ -74,7 +74,7 @@ helixPath = helix( // Create a spring by sweeping around the helix path. springSketch = startSketchOn('XY') - |> circle({ center = [0, 0], radius = 0.5 }, %) + |> circle(center = [0, 0], radius = 0.5) |> sweep(path = helixPath) ``` @@ -98,7 +98,7 @@ helixPath = helix( // Create a spring by sweeping around the helix path. springSketch = startSketchOn('XY') - |> circle({ center = [0, 0], radius = 1 }, %) + |> circle(center = [0, 0], radius = 1) |> sweep(path = helixPath) ``` diff --git a/docs/kcl/helixRevolutions.md b/docs/kcl/helixRevolutions.md index fb08a5b41c..30c37d5897 100644 --- a/docs/kcl/helixRevolutions.md +++ b/docs/kcl/helixRevolutions.md @@ -32,7 +32,7 @@ helixRevolutions( ```js part001 = startSketchOn('XY') - |> circle({ center = [5, 5], radius = 10 }, %) + |> circle(center = [5, 5], radius = 10) |> extrude(length = 10) |> helixRevolutions({ angleStart = 0, diff --git a/docs/kcl/hole.md b/docs/kcl/hole.md index 4b4433360c..cedffd189a 100644 --- a/docs/kcl/hole.md +++ b/docs/kcl/hole.md @@ -37,8 +37,8 @@ exampleSketch = startSketchOn(XY) |> line(end = [5, 0]) |> line(end = [0, -5]) |> close() - |> hole(circle({ center = [1, 1], radius = .25 }, %), %) - |> hole(circle({ center = [1, 4], radius = .25 }, %), %) + |> hole(circle(center = [1, 1], radius = .25), %) + |> hole(circle(center = [1, 4], radius = .25), %) example = extrude(exampleSketch, length = 1) ``` @@ -57,7 +57,7 @@ fn squareHoleSketch() { } exampleSketch = startSketchOn(-XZ) - |> circle({ center = [0, 0], radius = 3 }, %) + |> circle(center = [0, 0], radius = 3) |> hole(squareHoleSketch(), %) example = extrude(exampleSketch, length = 1) ``` diff --git a/docs/kcl/hollow.md b/docs/kcl/hollow.md index bd80540809..6420efba2c 100644 --- a/docs/kcl/hollow.md +++ b/docs/kcl/hollow.md @@ -70,17 +70,11 @@ case = startSketchOn('-XZ') |> extrude(length = 65) thing1 = startSketchOn(case, 'end') - |> circle({ - center = [-size / 2, -size / 2], - radius = 25 - }, %) + |> circle(center = [-size / 2, -size / 2], radius = 25) |> extrude(length = 50) thing2 = startSketchOn(case, 'end') - |> circle({ - center = [size / 2, -size / 2], - radius = 25 - }, %) + |> circle(center = [size / 2, -size / 2], radius = 25) |> extrude(length = 50) hollow(0.5, case) diff --git a/docs/kcl/int.md b/docs/kcl/int.md index da4cb337dc..d5097fcefd 100644 --- a/docs/kcl/int.md +++ b/docs/kcl/int.md @@ -37,7 +37,7 @@ n = int(ceil(5 / 2)) assertEqual(n, 3, 0.0001, "5/2 = 2.5, rounded up makes 3") // Draw n cylinders. startSketchOn('XZ') - |> circle({ center = [0, 0], radius = 2 }, %) + |> circle(center = [0, 0], radius = 2) |> extrude(length = 5) |> patternTransform( instances = n, diff --git a/docs/kcl/loft.md b/docs/kcl/loft.md index d62e3c9ca8..99e8619508 100644 --- a/docs/kcl/loft.md +++ b/docs/kcl/loft.md @@ -69,10 +69,10 @@ squareSketch = startSketchOn('XY') |> close() circleSketch0 = startSketchOn(offsetPlane('XY', offset = 75)) - |> circle({ center = [0, 100], radius = 50 }, %) + |> circle(center = [0, 100], radius = 50) circleSketch1 = startSketchOn(offsetPlane('XY', offset = 150)) - |> circle({ center = [0, 100], radius = 20 }, %) + |> circle(center = [0, 100], radius = 20) loft([ squareSketch, @@ -94,10 +94,10 @@ squareSketch = startSketchOn('XY') |> close() circleSketch0 = startSketchOn(offsetPlane('XY', offset = 75)) - |> circle({ center = [0, 100], radius = 50 }, %) + |> circle(center = [0, 100], radius = 50) circleSketch1 = startSketchOn(offsetPlane('XY', offset = 150)) - |> circle({ center = [0, 100], radius = 20 }, %) + |> circle(center = [0, 100], radius = 20) loft( [ diff --git a/docs/kcl/map.md b/docs/kcl/map.md index f68d552949..d248ef2258 100644 --- a/docs/kcl/map.md +++ b/docs/kcl/map.md @@ -34,7 +34,7 @@ map( r = 10 // radius fn drawCircle(id) { return startSketchOn("XY") - |> circle({ center = [id * 2 * r, 0], radius = r }, %) + |> circle(center = [id * 2 * r, 0], radius = r) } // Call `drawCircle`, passing in each element of the array. @@ -50,7 +50,7 @@ r = 10 // radius // Call `map`, using an anonymous function instead of a named one. circles = map([1..3], fn(id) { return startSketchOn("XY") - |> circle({ center = [id * 2 * r, 0], radius = r }, %) + |> circle(center = [id * 2 * r, 0], radius = r) }) ``` diff --git a/docs/kcl/offsetPlane.md b/docs/kcl/offsetPlane.md index e19ff13f4b..7ae6d8f2f4 100644 --- a/docs/kcl/offsetPlane.md +++ b/docs/kcl/offsetPlane.md @@ -41,7 +41,7 @@ squareSketch = startSketchOn('XY') |> close() circleSketch = startSketchOn(offsetPlane('XY', offset = 150)) - |> circle({ center = [0, 100], radius = 50 }, %) + |> circle(center = [0, 100], radius = 50) loft([squareSketch, circleSketch]) ``` @@ -59,7 +59,7 @@ squareSketch = startSketchOn('XZ') |> close() circleSketch = startSketchOn(offsetPlane('XZ', offset = 150)) - |> circle({ center = [0, 100], radius = 50 }, %) + |> circle(center = [0, 100], radius = 50) loft([squareSketch, circleSketch]) ``` @@ -77,7 +77,7 @@ squareSketch = startSketchOn('YZ') |> close() circleSketch = startSketchOn(offsetPlane('YZ', offset = 150)) - |> circle({ center = [0, 100], radius = 50 }, %) + |> circle(center = [0, 100], radius = 50) loft([squareSketch, circleSketch]) ``` @@ -95,7 +95,7 @@ squareSketch = startSketchOn('-XZ') |> close() circleSketch = startSketchOn(offsetPlane('-XZ', offset = -150)) - |> circle({ center = [0, 100], radius = 50 }, %) + |> circle(center = [0, 100], radius = 50) loft([squareSketch, circleSketch]) ``` @@ -106,7 +106,7 @@ loft([squareSketch, circleSketch]) // A circle on the XY plane startSketchOn("XY") |> startProfileAt([0, 0], %) - |> circle({ radius = 10, center = [0, 0] }, %) + |> circle(radius = 10, center = [0, 0]) // Triangle on the plane 4 units above startSketchOn(offsetPlane("XY", offset = 4)) diff --git a/docs/kcl/patternCircular3d.md b/docs/kcl/patternCircular3d.md index 0680cefa53..d8fb03251d 100644 --- a/docs/kcl/patternCircular3d.md +++ b/docs/kcl/patternCircular3d.md @@ -42,7 +42,7 @@ patternCircular3d( ```js exampleSketch = startSketchOn('XZ') - |> circle({ center = [0, 0], radius = 1 }, %) + |> circle(center = [0, 0], radius = 1) example = extrude(exampleSketch, length = -5) |> patternCircular3d( diff --git a/docs/kcl/patternLinear2d.md b/docs/kcl/patternLinear2d.md index 657e7c7cb6..71c10df092 100644 --- a/docs/kcl/patternLinear2d.md +++ b/docs/kcl/patternLinear2d.md @@ -38,7 +38,7 @@ patternLinear2d( ```js exampleSketch = startSketchOn('XZ') - |> circle({ center = [0, 0], radius = 1 }, %) + |> circle(center = [0, 0], radius = 1) |> patternLinear2d(axis = [1, 0], instances = 7, distance = 4) example = extrude(exampleSketch, length = 1) diff --git a/docs/kcl/patternLinear3d.md b/docs/kcl/patternLinear3d.md index b41dc1b615..adb7a0cf9a 100644 --- a/docs/kcl/patternLinear3d.md +++ b/docs/kcl/patternLinear3d.md @@ -64,17 +64,11 @@ case = startSketchOn('XY') |> extrude(length = 65) thing1 = startSketchOn(case, 'end') - |> circle({ - center = [-size / 2, -size / 2], - radius = 25 - }, %) + |> circle(center = [-size / 2, -size / 2], radius = 25) |> extrude(length = 50) thing2 = startSketchOn(case, 'end') - |> circle({ - center = [size / 2, -size / 2], - radius = 25 - }, %) + |> circle(center = [size / 2, -size / 2], radius = 25) |> extrude(length = 50) // We pass in the "case" here since we want to pattern the whole sketch. @@ -101,10 +95,7 @@ case = startSketchOn('XY') |> extrude(length = 65) thing1 = startSketchOn(case, 'end') - |> circle({ - center = [-size / 2, -size / 2], - radius = 25 - }, %) + |> circle(center = [-size / 2, -size / 2], radius = 25) |> extrude(length = 50) // We pass in `thing1` here with `useOriginal` since we want to pattern just this object on the face. diff --git a/docs/kcl/patternTransform.md b/docs/kcl/patternTransform.md index 6647e09830..3c43e029d2 100644 --- a/docs/kcl/patternTransform.md +++ b/docs/kcl/patternTransform.md @@ -68,7 +68,7 @@ fn transform(id) { // Sketch 4 cylinders. sketch001 = startSketchOn('XZ') - |> circle({ center = [0, 0], radius = 2 }, %) + |> circle(center = [0, 0], radius = 2) |> extrude(length = 5) |> patternTransform(instances = 4, transform = transform) ``` @@ -84,7 +84,7 @@ fn transform(id) { } sketch001 = startSketchOn('XZ') - |> circle({ center = [0, 0], radius = 2 }, %) + |> circle(center = [0, 0], radius = 2) |> extrude(length = 5) |> patternTransform(instances = 4, transform = transform) ``` @@ -184,7 +184,7 @@ fn transform(replicaId) { fn layer() { return startSketchOn("XY") // or some other plane idk - |> circle({ center = [0, 0], radius = 1 }, %, $tag1) + |> circle(center = [0, 0], radius = 1, tag = $tag1) |> extrude(length = h) } // The vase is 100 layers tall. diff --git a/docs/kcl/patternTransform2d.md b/docs/kcl/patternTransform2d.md index 273bb83b49..6dbff0ced0 100644 --- a/docs/kcl/patternTransform2d.md +++ b/docs/kcl/patternTransform2d.md @@ -42,7 +42,7 @@ fn transform(id) { // Sketch 4 circles. sketch001 = startSketchOn('XZ') - |> circle({ center = [0, 0], radius = 2 }, %) + |> circle(center = [0, 0], radius = 2) |> patternTransform2d(instances = 4, transform = transform) ``` diff --git a/docs/kcl/pi.md b/docs/kcl/pi.md index 2c6e9ea647..0a24075f50 100644 --- a/docs/kcl/pi.md +++ b/docs/kcl/pi.md @@ -31,10 +31,7 @@ pi() -> number circumference = 70 exampleSketch = startSketchOn("XZ") - |> circle({ - center = [0, 0], - radius = circumference / (2 * pi()) - }, %) + |> circle(center = [0, 0], radius = circumference / (2 * pi())) example = extrude(exampleSketch, length = 5) ``` diff --git a/docs/kcl/revolve.md b/docs/kcl/revolve.md index 5c5ff59ffd..f0b407ce84 100644 --- a/docs/kcl/revolve.md +++ b/docs/kcl/revolve.md @@ -51,7 +51,7 @@ part001 = startSketchOn('XY') ```js // A donut shape. sketch001 = startSketchOn('XY') - |> circle({ center = [15, 0], radius = 5 }, %) + |> circle(center = [15, 0], radius = 5) |> revolve({ angle = 360, axis = 'y' }, %) ``` @@ -106,7 +106,7 @@ box = startSketchOn('XY') |> extrude(length = 20) sketch001 = startSketchOn(box, "END") - |> circle({ center = [10, 10], radius = 4 }, %) + |> circle(center = [10, 10], radius = 4) |> revolve({ angle = -90, axis = 'y' }, %) ``` @@ -122,7 +122,7 @@ box = startSketchOn('XY') |> extrude(length = 20) sketch001 = startSketchOn(box, "END") - |> circle({ center = [10, 10], radius = 4 }, %) + |> circle(center = [10, 10], radius = 4) |> revolve({ angle = 90, axis = getOppositeEdge(revolveAxis) @@ -141,7 +141,7 @@ box = startSketchOn('XY') |> extrude(length = 20) sketch001 = startSketchOn(box, "END") - |> circle({ center = [10, 10], radius = 4 }, %) + |> circle(center = [10, 10], radius = 4) |> revolve({ angle = 90, axis = getOppositeEdge(revolveAxis), diff --git a/docs/kcl/rotate.md b/docs/kcl/rotate.md index a75783be0a..cd53e77262 100644 --- a/docs/kcl/rotate.md +++ b/docs/kcl/rotate.md @@ -69,10 +69,10 @@ sweepPath = startSketchOn('XZ') // Create a hole for the pipe. pipeHole = startSketchOn('XY') - |> circle({ center = [0, 0], radius = 1.5 }, %) + |> circle(center = [0, 0], radius = 1.5) sweepSketch = startSketchOn('XY') - |> circle({ center = [0, 0], radius = 2 }, %) + |> circle(center = [0, 0], radius = 2) |> hole(pipeHole, %) |> sweep(path = sweepPath) |> rotate(roll = 10, pitch = 10, yaw = 90) @@ -95,10 +95,10 @@ sweepPath = startSketchOn('XZ') // Create a hole for the pipe. pipeHole = startSketchOn('XY') - |> circle({ center = [0, 0], radius = 1.5 }, %) + |> circle(center = [0, 0], radius = 1.5) sweepSketch = startSketchOn('XY') - |> circle({ center = [0, 0], radius = 2 }, %) + |> circle(center = [0, 0], radius = 2) |> hole(pipeHole, %) |> sweep(path = sweepPath) |> rotate(axis = [0, 0, 1.0], angle = 90) diff --git a/docs/kcl/scale.md b/docs/kcl/scale.md index 8ff1d0b045..c9aa91d55e 100644 --- a/docs/kcl/scale.md +++ b/docs/kcl/scale.md @@ -49,10 +49,10 @@ sweepPath = startSketchOn('XZ') // Create a hole for the pipe. pipeHole = startSketchOn('XY') - |> circle({ center = [0, 0], radius = 1.5 }, %) + |> circle(center = [0, 0], radius = 1.5) sweepSketch = startSketchOn('XY') - |> circle({ center = [0, 0], radius = 2 }, %) + |> circle(center = [0, 0], radius = 2) |> hole(pipeHole, %) |> sweep(path = sweepPath) |> scale(scale = [1.0, 1.0, 2.5]) diff --git a/docs/kcl/segEnd.md b/docs/kcl/segEnd.md index d88ba7df56..2d765aa251 100644 --- a/docs/kcl/segEnd.md +++ b/docs/kcl/segEnd.md @@ -40,10 +40,7 @@ cube = startSketchOn('XY') fn cylinder(radius, tag) { return startSketchOn('XY') |> startProfileAt([0, 0], %) - |> circle({ - radius = radius, - center = segEnd(tag) - }, %) + |> circle(radius = radius, center = segEnd(tag)) |> extrude(length = radius) } diff --git a/docs/kcl/segStart.md b/docs/kcl/segStart.md index 3a279b3841..21004abcd9 100644 --- a/docs/kcl/segStart.md +++ b/docs/kcl/segStart.md @@ -40,10 +40,7 @@ cube = startSketchOn('XY') fn cylinder(radius, tag) { return startSketchOn('XY') |> startProfileAt([0, 0], %) - |> circle({ - radius = radius, - center = segStart(tag) - }, %) + |> circle(radius = radius, center = segStart(tag)) |> extrude(length = radius) } diff --git a/docs/kcl/shell.md b/docs/kcl/shell.md index 9aa7ee2feb..863a0e645c 100644 --- a/docs/kcl/shell.md +++ b/docs/kcl/shell.md @@ -108,17 +108,11 @@ case = startSketchOn('-XZ') |> extrude(length = 65) thing1 = startSketchOn(case, 'end') - |> circle({ - center = [-size / 2, -size / 2], - radius = 25 - }, %) + |> circle(center = [-size / 2, -size / 2], radius = 25) |> extrude(length = 50) thing2 = startSketchOn(case, 'end') - |> circle({ - center = [size / 2, -size / 2], - radius = 25 - }, %) + |> circle(center = [size / 2, -size / 2], radius = 25) |> extrude(length = 50) // We put "case" in the shell function to shell the entire object. @@ -139,17 +133,11 @@ case = startSketchOn('XY') |> extrude(length = 65) thing1 = startSketchOn(case, 'end') - |> circle({ - center = [-size / 2, -size / 2], - radius = 25 - }, %) + |> circle(center = [-size / 2, -size / 2], radius = 25) |> extrude(length = 50) thing2 = startSketchOn(case, 'end') - |> circle({ - center = [size / 2, -size / 2], - radius = 25 - }, %) + |> circle(center = [size / 2, -size / 2], radius = 25) |> extrude(length = 50) // We put "thing1" in the shell function to shell the end face of the object. @@ -173,17 +161,11 @@ case = startSketchOn('XY') |> extrude(length = 65) thing1 = startSketchOn(case, 'end') - |> circle({ - center = [-size / 2, -size / 2], - radius = 25 - }, %) + |> circle(center = [-size / 2, -size / 2], radius = 25) |> extrude(length = 50) thing2 = startSketchOn(case, 'end') - |> circle({ - center = [size / 2, -size / 2], - radius = 25 - }, %) + |> circle(center = [size / 2, -size / 2], radius = 25) |> extrude(length = 50) // We put "thing1" and "thing2" in the shell function to shell the end face of the object. diff --git a/docs/kcl/std.json b/docs/kcl/std.json index 59afcb5600..27e956bdcc 100644 --- a/docs/kcl/std.json +++ b/docs/kcl/std.json @@ -47255,14 +47255,14 @@ "deprecated": false, "examples": [ "// Add color to an extruded solid.\nexampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([0, 0], %)\n |> line(endAbsolute = [10, 0])\n |> line(endAbsolute = [0, 10])\n |> line(endAbsolute = [-10, 0])\n |> close()\n\nexample = extrude(exampleSketch, length = 5)\n // There are other options besides 'color', but they're optional.\n |> appearance(color = '#ff0000')", - "// Add color to a revolved solid.\nsketch001 = startSketchOn('XY')\n |> circle({ center = [15, 0], radius = 5 }, %)\n |> revolve({ angle = 360, axis = 'y' }, %)\n |> appearance(color = '#ff0000', metalness = 90, roughness = 90)", + "// Add color to a revolved solid.\nsketch001 = startSketchOn('XY')\n |> circle(center = [15, 0], radius = 5)\n |> revolve({ angle = 360, axis = 'y' }, %)\n |> appearance(color = '#ff0000', metalness = 90, roughness = 90)", "// Add color to different solids.\nfn cube(center) {\n return startSketchOn('XY')\n |> startProfileAt([center[0] - 10, center[1] - 10], %)\n |> line(endAbsolute = [center[0] + 10, center[1] - 10])\n |> line(endAbsolute = [center[0] + 10, center[1] + 10])\n |> line(endAbsolute = [center[0] - 10, center[1] + 10])\n |> close()\n |> extrude(length = 10)\n}\n\nexample0 = cube([0, 0])\nexample1 = cube([20, 0])\nexample2 = cube([40, 0])\n\nappearance(\n [example0, example1],\n color = '#ff0000',\n metalness = 50,\n roughness = 50,\n)\nappearance(\n example2,\n color = '#00ff00',\n metalness = 50,\n roughness = 50,\n)", "// You can set the appearance before or after you shell it will yield the same result.\n// This example shows setting the appearance _after_ the shell.\nfirstSketch = startSketchOn('XY')\n |> startProfileAt([-12, 12], %)\n |> line(end = [24, 0])\n |> line(end = [0, -24])\n |> line(end = [-24, 0])\n |> close()\n |> extrude(length = 6)\n\nshell(firstSketch, faces = ['end'], thickness = 0.25)\n |> appearance(color = '#ff0000', metalness = 90, roughness = 90)", "// You can set the appearance before or after you shell it will yield the same result.\n// This example shows setting the appearance _before_ the shell.\nfirstSketch = startSketchOn('XY')\n |> startProfileAt([-12, 12], %)\n |> line(end = [24, 0])\n |> line(end = [0, -24])\n |> line(end = [-24, 0])\n |> close()\n |> extrude(length = 6)\n |> appearance(color = '#ff0000', metalness = 90, roughness = 90)\n\nshell(firstSketch, faces = ['end'], thickness = 0.25)", "// Setting the appearance of a 3D pattern can be done _before_ or _after_ the pattern.\n// This example shows _before_ the pattern.\nexampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line(end = [0, 2])\n |> line(end = [3, 1])\n |> line(end = [0, -4])\n |> close()\n\nexample = extrude(exampleSketch, length = 1)\n |> appearance(color = '#ff0000', metalness = 90, roughness = 90)\n |> patternLinear3d(axis = [1, 0, 1], instances = 7, distance = 6)", "// Setting the appearance of a 3D pattern can be done _before_ or _after_ the pattern.\n// This example shows _after_ the pattern.\nexampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line(end = [0, 2])\n |> line(end = [3, 1])\n |> line(end = [0, -4])\n |> close()\n\nexample = extrude(exampleSketch, length = 1)\n |> patternLinear3d(axis = [1, 0, 1], instances = 7, distance = 6)\n |> appearance(color = '#ff0000', metalness = 90, roughness = 90)", "// Color the result of a 2D pattern that was extruded.\nexampleSketch = startSketchOn('XZ')\n |> startProfileAt([.5, 25], %)\n |> line(end = [0, 5])\n |> line(end = [-1, 0])\n |> line(end = [0, -5])\n |> close()\n |> patternCircular2d(\n center = [0, 0],\n instances = 13,\n arcDegrees = 360,\n rotateDuplicates = true,\n )\n\nexample = extrude(exampleSketch, length = 1)\n |> appearance(color = '#ff0000', metalness = 90, roughness = 90)", - "// Color the result of a sweep.\n\n\n// Create a path for the sweep.\nsweepPath = startSketchOn('XZ')\n |> startProfileAt([0.05, 0.05], %)\n |> line(end = [0, 7])\n |> tangentialArc({ offset = 90, radius = 5 }, %)\n |> line(end = [-3, 0])\n |> tangentialArc({ offset = -90, radius = 5 }, %)\n |> line(end = [0, 7])\n\npipeHole = startSketchOn('XY')\n |> circle({ center = [0, 0], radius = 1.5 }, %)\n\nsweepSketch = startSketchOn('XY')\n |> circle({ center = [0, 0], radius = 2 }, %)\n |> hole(pipeHole, %)\n |> sweep(path = sweepPath)\n |> appearance(color = \"#ff0000\", metalness = 50, roughness = 50)" + "// Color the result of a sweep.\n\n\n// Create a path for the sweep.\nsweepPath = startSketchOn('XZ')\n |> startProfileAt([0.05, 0.05], %)\n |> line(end = [0, 7])\n |> tangentialArc({ offset = 90, radius = 5 }, %)\n |> line(end = [-3, 0])\n |> tangentialArc({ offset = -90, radius = 5 }, %)\n |> line(end = [0, 7])\n\npipeHole = startSketchOn('XY')\n |> circle(center = [0, 0], radius = 1.5)\n\nsweepSketch = startSketchOn('XY')\n |> circle(center = [0, 0], radius = 2)\n |> hole(pipeHole, %)\n |> sweep(path = sweepPath)\n |> appearance(color = \"#ff0000\", metalness = 50, roughness = 50)" ] }, { @@ -71172,44 +71172,10 @@ "summary": "Construct a 2-dimensional circle, of the specified radius, centered at", "description": "the provided (x, y) origin point.", "tags": [], - "keywordArguments": false, + "keywordArguments": true, "args": [ { - "name": "data", - "type": "CircleData", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "CircleData", - "description": "Data for drawing an circle", - "type": "object", - "required": [ - "center", - "radius" - ], - "properties": { - "center": { - "description": "The center of the circle.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "The circle radius", - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - { - "name": "sketchSurfaceOrGroup", + "name": "sketchOrSurface", "type": "SketchOrSurface", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", @@ -72820,6 +72786,3228 @@ }, "required": true, "includeInSnippet": true, + "description": "Plane or surface to sketch on.", + "labelRequired": false + }, + { + "name": "center", + "type": "[number]", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Array_size_2_of_double", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2, + "definitions": { + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "artifactId", + "id", + "origin", + "type", + "units", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "artifactId": { + "description": "The artifact ID.", + "allOf": [ + { + "$ref": "#/components/schemas/ArtifactId" + } + ] + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane's X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane's Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "artifactId", + "id", + "solid", + "type", + "units", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "artifactId": { + "description": "The artifact ID.", + "allOf": [ + { + "$ref": "#/components/schemas/ArtifactId" + } + ] + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face's X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face's Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "ArtifactId": { + "type": "string", + "format": "uuid" + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + }, + { + "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", + "type": "string", + "enum": [ + "Uninit" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "UnitLen": { + "description": "A unit of length.", + "oneOf": [ + { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Mm" + ] + } + } + }, + { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Cm" + ] + } + } + }, + { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "M" + ] + } + } + }, + { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Inches" + ] + } + } + }, + { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Feet" + ] + } + } + }, + { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Yards" + ] + } + } + } + ] + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "Solid": { + "description": "A solid is a collection of extrude surfaces.\n\nWhen you define a solid to a variable like:\n\n```kcl myPart = startSketchOn('XY') |> startProfileAt([-12, 12], %) |> line(end = [24, 0]) |> line(end = [0, -24]) |> line(end = [-24, 0]) |> close() |> extrude(length = 6) ```\n\nThe `myPart` variable will be an executed `Solid` object. Executed being past tense, because the engine has already executed the commands to create the solid.\n\nThe previous solid commands will never be executed again, in this case.\n\nIf you would like to encapsulate the commands to create the solid any time you call it, you can use a function.\n\n```kcl fn createPart() { return startSketchOn('XY') |> startProfileAt([-12, 12], %) |> line(end = [24, 0]) |> line(end = [0, -24]) |> line(end = [-24, 0]) |> close() |> extrude(length = 6) } ```\n\nNow, every time you call `createPart()`, the commands will be executed and a new solid will be created.\n\nWhen you assign the result of `createPart()` to a variable (`myPart = createPart()`), you are assigning the executed solid to that variable. Meaning that the solid `myPart` will not be executed again.\n\nYou can still execute _new_ commands on the solid like `shell`, `fillet`, `chamfer`, etc. and the solid will be updated.", + "type": "object", + "required": [ + "__meta", + "artifactId", + "height", + "id", + "sketch", + "units", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "artifactId": { + "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", + "allOf": [ + { + "$ref": "#/components/schemas/ArtifactId" + } + ] + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "Sketch": { + "description": "A sketch is a collection of paths.\n\nWhen you define a sketch to a variable like:\n\n```kcl mySketch = startSketchOn('XY') |> startProfileAt([-12, 12], %) |> line(end = [24, 0]) |> line(end = [0, -24]) |> line(end = [-24, 0]) |> close() ```\n\nThe `mySketch` variable will be an executed `Sketch` object. Executed being past tense, because the engine has already executed the commands to create the sketch.\n\nThe previous sketch commands will never be executed again, in this case.\n\nIf you would like to encapsulate the commands to create the sketch any time you call it, you can use a function.\n\n```kcl fn createSketch() { return startSketchOn('XY') |> startProfileAt([-12, 12], %) |> line(end = [24, 0]) |> line(end = [0, -24]) |> line(end = [-24, 0]) |> close() } ```\n\nNow, every time you call `createSketch()`, the commands will be executed and a new sketch will be created.\n\nWhen you assign the result of `createSketch()` to a variable (`mySketch = createSketch()`), you are assigning the executed sketch to that variable. Meaning that the sketch `mySketch` will not be executed again.\n\nYou can still execute _new_ commands on the sketch like `extrude`, `revolve`, `loft`, etc. and the sketch will be updated.", + "type": "object", + "required": [ + "__meta", + "artifactId", + "id", + "on", + "originalId", + "paths", + "start", + "units" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "artifactId": { + "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", + "allOf": [ + { + "$ref": "#/components/schemas/ArtifactId" + } + ] + }, + "originalId": { + "type": "string", + "format": "uuid" + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "units" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type", + "units" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type", + "units" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type", + "units" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "p1", + "p2", + "p3", + "to", + "type", + "units" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "CircleThreePoint" + ] + }, + "p1": { + "description": "Point 1 of the circle", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "p2": { + "description": "Point 2 of the circle", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "p3": { + "description": "Point 3 of the circle", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "units", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "units" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "units" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type", + "units" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "units" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + } + } + }, + "required": true, + "includeInSnippet": true, + "description": "The center of the circle.", + "labelRequired": true + }, + { + "name": "radius", + "type": "number", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "double", + "type": "number", + "format": "double", + "definitions": { + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "artifactId", + "id", + "origin", + "type", + "units", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "artifactId": { + "description": "The artifact ID.", + "allOf": [ + { + "$ref": "#/components/schemas/ArtifactId" + } + ] + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane's X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane's Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "artifactId", + "id", + "solid", + "type", + "units", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "artifactId": { + "description": "The artifact ID.", + "allOf": [ + { + "$ref": "#/components/schemas/ArtifactId" + } + ] + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face's X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face's Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "ArtifactId": { + "type": "string", + "format": "uuid" + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + }, + { + "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", + "type": "string", + "enum": [ + "Uninit" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "UnitLen": { + "description": "A unit of length.", + "oneOf": [ + { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Mm" + ] + } + } + }, + { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Cm" + ] + } + } + }, + { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "M" + ] + } + } + }, + { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Inches" + ] + } + } + }, + { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Feet" + ] + } + } + }, + { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Yards" + ] + } + } + } + ] + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, + "Solid": { + "description": "A solid is a collection of extrude surfaces.\n\nWhen you define a solid to a variable like:\n\n```kcl myPart = startSketchOn('XY') |> startProfileAt([-12, 12], %) |> line(end = [24, 0]) |> line(end = [0, -24]) |> line(end = [-24, 0]) |> close() |> extrude(length = 6) ```\n\nThe `myPart` variable will be an executed `Solid` object. Executed being past tense, because the engine has already executed the commands to create the solid.\n\nThe previous solid commands will never be executed again, in this case.\n\nIf you would like to encapsulate the commands to create the solid any time you call it, you can use a function.\n\n```kcl fn createPart() { return startSketchOn('XY') |> startProfileAt([-12, 12], %) |> line(end = [24, 0]) |> line(end = [0, -24]) |> line(end = [-24, 0]) |> close() |> extrude(length = 6) } ```\n\nNow, every time you call `createPart()`, the commands will be executed and a new solid will be created.\n\nWhen you assign the result of `createPart()` to a variable (`myPart = createPart()`), you are assigning the executed solid to that variable. Meaning that the solid `myPart` will not be executed again.\n\nYou can still execute _new_ commands on the solid like `shell`, `fillet`, `chamfer`, etc. and the solid will be updated.", + "type": "object", + "required": [ + "__meta", + "artifactId", + "height", + "id", + "sketch", + "units", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "artifactId": { + "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", + "allOf": [ + { + "$ref": "#/components/schemas/ArtifactId" + } + ] + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "Sketch": { + "description": "A sketch is a collection of paths.\n\nWhen you define a sketch to a variable like:\n\n```kcl mySketch = startSketchOn('XY') |> startProfileAt([-12, 12], %) |> line(end = [24, 0]) |> line(end = [0, -24]) |> line(end = [-24, 0]) |> close() ```\n\nThe `mySketch` variable will be an executed `Sketch` object. Executed being past tense, because the engine has already executed the commands to create the sketch.\n\nThe previous sketch commands will never be executed again, in this case.\n\nIf you would like to encapsulate the commands to create the sketch any time you call it, you can use a function.\n\n```kcl fn createSketch() { return startSketchOn('XY') |> startProfileAt([-12, 12], %) |> line(end = [24, 0]) |> line(end = [0, -24]) |> line(end = [-24, 0]) |> close() } ```\n\nNow, every time you call `createSketch()`, the commands will be executed and a new sketch will be created.\n\nWhen you assign the result of `createSketch()` to a variable (`mySketch = createSketch()`), you are assigning the executed sketch to that variable. Meaning that the sketch `mySketch` will not be executed again.\n\nYou can still execute _new_ commands on the sketch like `extrude`, `revolve`, `loft`, etc. and the sketch will be updated.", + "type": "object", + "required": [ + "__meta", + "artifactId", + "id", + "on", + "originalId", + "paths", + "start", + "units" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes).", + "type": "string", + "format": "uuid" + }, + "paths": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "artifactId": { + "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", + "allOf": [ + { + "$ref": "#/components/schemas/ArtifactId" + } + ] + }, + "originalId": { + "type": "string", + "format": "uuid" + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "units" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type", + "units" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type", + "units" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type", + "units" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction This is used to compute the tangential angle.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "p1", + "p2", + "p3", + "to", + "type", + "units" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "CircleThreePoint" + ] + }, + "p1": { + "description": "Point 1 of the circle", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "p2": { + "description": "Point 2 of the circle", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "p3": { + "description": "Point 3 of the circle", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "units", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "units" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "units" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A circular arc, not necessarily tangential to the current point.", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type", + "units" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Arc" + ] + }, + "center": { + "description": "Center of the circle that this arc is drawn on.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "Radius of the circle that this arc is drawn on.", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "True if the arc is counterclockwise.", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "units" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Path" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + } + } + }, + "required": true, + "includeInSnippet": true, + "description": "The radius of the circle.", "labelRequired": true }, { @@ -74430,6 +77618,7 @@ } }, "required": false, + "description": "Create a new tag which refers to this circle", "labelRequired": true } ], @@ -76112,8 +79301,8 @@ "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn(\"-XZ\")\n |> circle({ center = [0, 0], radius = 10 }, %)\n\nexample = extrude(exampleSketch, length = 5)", - "exampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([-15, 0], %)\n |> line(end = [30, 0])\n |> line(end = [0, 30])\n |> line(end = [-30, 0])\n |> close()\n |> hole(circle({ center = [0, 15], radius = 5 }, %), %)\n\nexample = extrude(exampleSketch, length = 5)" + "exampleSketch = startSketchOn(\"-XZ\")\n |> circle(center = [0, 0], radius = 10)\n\nexample = extrude(exampleSketch, length = 5)", + "exampleSketch = startSketchOn(\"XZ\")\n |> startProfileAt([-15, 0], %)\n |> line(end = [30, 0])\n |> line(end = [0, 30])\n |> line(end = [-30, 0])\n |> close()\n |> hole(circle(center = [0, 15], radius = 5), %)\n\nexample = extrude(exampleSketch, length = 5)" ] }, { @@ -107144,9 +110333,9 @@ "unpublished": false, "deprecated": false, "examples": [ - "// Create a helix around the Z axis.\nhelixPath = helix(\n angleStart = 0,\n ccw = true,\n revolutions = 5,\n length = 10,\n radius = 5,\n axis = 'Z',\n)\n\n// Create a spring by sweeping around the helix path.\nspringSketch = startSketchOn('YZ')\n |> circle({ center = [0, 0], radius = 0.5 }, %)\n |> sweep(path = helixPath)", - "// Create a helix around an edge.\nhelper001 = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line(end = [0, 10], tag = $edge001)\n\nhelixPath = helix(\n angleStart = 0,\n ccw = true,\n revolutions = 5,\n length = 10,\n radius = 5,\n axis = edge001,\n)\n\n// Create a spring by sweeping around the helix path.\nspringSketch = startSketchOn('XY')\n |> circle({ center = [0, 0], radius = 0.5 }, %)\n |> sweep(path = helixPath)", - "// Create a helix around a custom axis.\nhelixPath = helix(\n angleStart = 0,\n ccw = true,\n revolutions = 5,\n length = 10,\n radius = 5,\n axis = {\n custom = {\n axis = [0, 0, 1.0],\n origin = [0, 0.25, 0]\n }\n },\n)\n\n// Create a spring by sweeping around the helix path.\nspringSketch = startSketchOn('XY')\n |> circle({ center = [0, 0], radius = 1 }, %)\n |> sweep(path = helixPath)" + "// Create a helix around the Z axis.\nhelixPath = helix(\n angleStart = 0,\n ccw = true,\n revolutions = 5,\n length = 10,\n radius = 5,\n axis = 'Z',\n)\n\n// Create a spring by sweeping around the helix path.\nspringSketch = startSketchOn('YZ')\n |> circle(center = [0, 0], radius = 0.5)\n |> sweep(path = helixPath)", + "// Create a helix around an edge.\nhelper001 = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line(end = [0, 10], tag = $edge001)\n\nhelixPath = helix(\n angleStart = 0,\n ccw = true,\n revolutions = 5,\n length = 10,\n radius = 5,\n axis = edge001,\n)\n\n// Create a spring by sweeping around the helix path.\nspringSketch = startSketchOn('XY')\n |> circle(center = [0, 0], radius = 0.5)\n |> sweep(path = helixPath)", + "// Create a helix around a custom axis.\nhelixPath = helix(\n angleStart = 0,\n ccw = true,\n revolutions = 5,\n length = 10,\n radius = 5,\n axis = {\n custom = {\n axis = [0, 0, 1.0],\n origin = [0, 0.25, 0]\n }\n },\n)\n\n// Create a spring by sweeping around the helix path.\nspringSketch = startSketchOn('XY')\n |> circle(center = [0, 0], radius = 1)\n |> sweep(path = helixPath)" ] }, { @@ -110560,7 +113749,7 @@ "unpublished": false, "deprecated": false, "examples": [ - "part001 = startSketchOn('XY')\n |> circle({ center = [5, 5], radius = 10 }, %)\n |> extrude(length = 10)\n |> helixRevolutions({\n angleStart = 0,\n ccw = true,\n revolutions = 16\n }, %)" + "part001 = startSketchOn('XY')\n |> circle(center = [5, 5], radius = 10)\n |> extrude(length = 10)\n |> helixRevolutions({\n angleStart = 0,\n ccw = true,\n revolutions = 16\n }, %)" ] }, { @@ -115634,8 +118823,8 @@ "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn(XY)\n |> startProfileAt([0, 0], %)\n |> line(end = [0, 5])\n |> line(end = [5, 0])\n |> line(end = [0, -5])\n |> close()\n |> hole(circle({ center = [1, 1], radius = .25 }, %), %)\n |> hole(circle({ center = [1, 4], radius = .25 }, %), %)\n\nexample = extrude(exampleSketch, length = 1)", - "fn squareHoleSketch() {\n squareSketch = startSketchOn(-XZ)\n |> startProfileAt([-1, -1], %)\n |> line(end = [2, 0])\n |> line(end = [0, 2])\n |> line(end = [-2, 0])\n |> close()\n return squareSketch\n}\n\nexampleSketch = startSketchOn(-XZ)\n |> circle({ center = [0, 0], radius = 3 }, %)\n |> hole(squareHoleSketch(), %)\nexample = extrude(exampleSketch, length = 1)" + "exampleSketch = startSketchOn(XY)\n |> startProfileAt([0, 0], %)\n |> line(end = [0, 5])\n |> line(end = [5, 0])\n |> line(end = [0, -5])\n |> close()\n |> hole(circle(center = [1, 1], radius = .25), %)\n |> hole(circle(center = [1, 4], radius = .25), %)\n\nexample = extrude(exampleSketch, length = 1)", + "fn squareHoleSketch() {\n squareSketch = startSketchOn(-XZ)\n |> startProfileAt([-1, -1], %)\n |> line(end = [2, 0])\n |> line(end = [0, 2])\n |> line(end = [-2, 0])\n |> close()\n return squareSketch\n}\n\nexampleSketch = startSketchOn(-XZ)\n |> circle(center = [0, 0], radius = 3)\n |> hole(squareHoleSketch(), %)\nexample = extrude(exampleSketch, length = 1)" ] }, { @@ -119024,7 +122213,7 @@ "examples": [ "// Hollow a basic sketch.\nfirstSketch = startSketchOn('XY')\n |> startProfileAt([-12, 12], %)\n |> line(end = [24, 0])\n |> line(end = [0, -24])\n |> line(end = [-24, 0])\n |> close()\n |> extrude(length = 6)\n |> hollow(0.25, %)", "// Hollow a basic sketch.\nfirstSketch = startSketchOn('-XZ')\n |> startProfileAt([-12, 12], %)\n |> line(end = [24, 0])\n |> line(end = [0, -24])\n |> line(end = [-24, 0])\n |> close()\n |> extrude(length = 6)\n |> hollow(0.5, %)", - "// Hollow a sketch on face object.\nsize = 100\ncase = startSketchOn('-XZ')\n |> startProfileAt([-size, -size], %)\n |> line(end = [2 * size, 0])\n |> line(end = [0, 2 * size])\n |> tangentialArcTo([-size, size], %)\n |> close()\n |> extrude(length = 65)\n\nthing1 = startSketchOn(case, 'end')\n |> circle({\n center = [-size / 2, -size / 2],\n radius = 25\n }, %)\n |> extrude(length = 50)\n\nthing2 = startSketchOn(case, 'end')\n |> circle({\n center = [size / 2, -size / 2],\n radius = 25\n }, %)\n |> extrude(length = 50)\n\nhollow(0.5, case)" + "// Hollow a sketch on face object.\nsize = 100\ncase = startSketchOn('-XZ')\n |> startProfileAt([-size, -size], %)\n |> line(end = [2 * size, 0])\n |> line(end = [0, 2 * size])\n |> tangentialArcTo([-size, size], %)\n |> close()\n |> extrude(length = 65)\n\nthing1 = startSketchOn(case, 'end')\n |> circle(center = [-size / 2, -size / 2], radius = 25)\n |> extrude(length = 50)\n\nthing2 = startSketchOn(case, 'end')\n |> circle(center = [size / 2, -size / 2], radius = 25)\n |> extrude(length = 50)\n\nhollow(0.5, case)" ] }, { @@ -119512,7 +122701,7 @@ "unpublished": false, "deprecated": true, "examples": [ - "n = int(ceil(5 / 2))\nassertEqual(n, 3, 0.0001, \"5/2 = 2.5, rounded up makes 3\")\n// Draw n cylinders.\nstartSketchOn('XZ')\n |> circle({ center = [0, 0], radius = 2 }, %)\n |> extrude(length = 5)\n |> patternTransform(\n instances = n,\n transform = fn(id) {\n return { translate = [4 * id, 0, 0] }\n },\n )" + "n = int(ceil(5 / 2))\nassertEqual(n, 3, 0.0001, \"5/2 = 2.5, rounded up makes 3\")\n// Draw n cylinders.\nstartSketchOn('XZ')\n |> circle(center = [0, 0], radius = 2)\n |> extrude(length = 5)\n |> patternTransform(\n instances = n,\n transform = fn(id) {\n return { translate = [4 * id, 0, 0] }\n },\n )" ] }, { @@ -141070,8 +144259,8 @@ "deprecated": false, "examples": [ "// Loft a square and a triangle.\nsquareSketch = startSketchOn('XY')\n |> startProfileAt([-100, 200], %)\n |> line(end = [200, 0])\n |> line(end = [0, -200])\n |> line(end = [-200, 0])\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\ntriangleSketch = startSketchOn(offsetPlane('XY', offset = 75))\n |> startProfileAt([0, 125], %)\n |> line(end = [-15, -30])\n |> line(end = [30, 0])\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\nloft([squareSketch, triangleSketch])", - "// Loft a square, a circle, and another circle.\nsquareSketch = startSketchOn('XY')\n |> startProfileAt([-100, 200], %)\n |> line(end = [200, 0])\n |> line(end = [0, -200])\n |> line(end = [-200, 0])\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\ncircleSketch0 = startSketchOn(offsetPlane('XY', offset = 75))\n |> circle({ center = [0, 100], radius = 50 }, %)\n\ncircleSketch1 = startSketchOn(offsetPlane('XY', offset = 150))\n |> circle({ center = [0, 100], radius = 20 }, %)\n\nloft([\n squareSketch,\n circleSketch0,\n circleSketch1\n])", - "// Loft a square, a circle, and another circle with options.\nsquareSketch = startSketchOn('XY')\n |> startProfileAt([-100, 200], %)\n |> line(end = [200, 0])\n |> line(end = [0, -200])\n |> line(end = [-200, 0])\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\ncircleSketch0 = startSketchOn(offsetPlane('XY', offset = 75))\n |> circle({ center = [0, 100], radius = 50 }, %)\n\ncircleSketch1 = startSketchOn(offsetPlane('XY', offset = 150))\n |> circle({ center = [0, 100], radius = 20 }, %)\n\nloft(\n [\n squareSketch,\n circleSketch0,\n circleSketch1\n ],\n baseCurveIndex = 0,\n bezApproximateRational = false,\n tolerance = 0.000001,\n vDegree = 2,\n)" + "// Loft a square, a circle, and another circle.\nsquareSketch = startSketchOn('XY')\n |> startProfileAt([-100, 200], %)\n |> line(end = [200, 0])\n |> line(end = [0, -200])\n |> line(end = [-200, 0])\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\ncircleSketch0 = startSketchOn(offsetPlane('XY', offset = 75))\n |> circle(center = [0, 100], radius = 50)\n\ncircleSketch1 = startSketchOn(offsetPlane('XY', offset = 150))\n |> circle(center = [0, 100], radius = 20)\n\nloft([\n squareSketch,\n circleSketch0,\n circleSketch1\n])", + "// Loft a square, a circle, and another circle with options.\nsquareSketch = startSketchOn('XY')\n |> startProfileAt([-100, 200], %)\n |> line(end = [200, 0])\n |> line(end = [0, -200])\n |> line(end = [-200, 0])\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\ncircleSketch0 = startSketchOn(offsetPlane('XY', offset = 75))\n |> circle(center = [0, 100], radius = 50)\n\ncircleSketch1 = startSketchOn(offsetPlane('XY', offset = 150))\n |> circle(center = [0, 100], radius = 20)\n\nloft(\n [\n squareSketch,\n circleSketch0,\n circleSketch1\n ],\n baseCurveIndex = 0,\n bezApproximateRational = false,\n tolerance = 0.000001,\n vDegree = 2,\n)" ] }, { @@ -149043,8 +152232,8 @@ "unpublished": false, "deprecated": false, "examples": [ - "r = 10 // radius\nfn drawCircle(id) {\n return startSketchOn(\"XY\")\n |> circle({ center = [id * 2 * r, 0], radius = r }, %)\n}\n\n// Call `drawCircle`, passing in each element of the array.\n// The outputs from each `drawCircle` form a new array,\n// which is the return value from `map`.\ncircles = map([1..3], drawCircle)", - "r = 10 // radius\n// Call `map`, using an anonymous function instead of a named one.\ncircles = map([1..3], fn(id) {\n return startSketchOn(\"XY\")\n |> circle({ center = [id * 2 * r, 0], radius = r }, %)\n})" + "r = 10 // radius\nfn drawCircle(id) {\n return startSketchOn(\"XY\")\n |> circle(center = [id * 2 * r, 0], radius = r)\n}\n\n// Call `drawCircle`, passing in each element of the array.\n// The outputs from each `drawCircle` form a new array,\n// which is the return value from `map`.\ncircles = map([1..3], drawCircle)", + "r = 10 // radius\n// Call `map`, using an anonymous function instead of a named one.\ncircles = map([1..3], fn(id) {\n return startSketchOn(\"XY\")\n |> circle(center = [id * 2 * r, 0], radius = r)\n})" ] }, { @@ -154269,11 +157458,11 @@ "unpublished": false, "deprecated": false, "examples": [ - "// Loft a square and a circle on the `XY` plane using offset.\nsquareSketch = startSketchOn('XY')\n |> startProfileAt([-100, 200], %)\n |> line(end = [200, 0])\n |> line(end = [0, -200])\n |> line(end = [-200, 0])\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\ncircleSketch = startSketchOn(offsetPlane('XY', offset = 150))\n |> circle({ center = [0, 100], radius = 50 }, %)\n\nloft([squareSketch, circleSketch])", - "// Loft a square and a circle on the `XZ` plane using offset.\nsquareSketch = startSketchOn('XZ')\n |> startProfileAt([-100, 200], %)\n |> line(end = [200, 0])\n |> line(end = [0, -200])\n |> line(end = [-200, 0])\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\ncircleSketch = startSketchOn(offsetPlane('XZ', offset = 150))\n |> circle({ center = [0, 100], radius = 50 }, %)\n\nloft([squareSketch, circleSketch])", - "// Loft a square and a circle on the `YZ` plane using offset.\nsquareSketch = startSketchOn('YZ')\n |> startProfileAt([-100, 200], %)\n |> line(end = [200, 0])\n |> line(end = [0, -200])\n |> line(end = [-200, 0])\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\ncircleSketch = startSketchOn(offsetPlane('YZ', offset = 150))\n |> circle({ center = [0, 100], radius = 50 }, %)\n\nloft([squareSketch, circleSketch])", - "// Loft a square and a circle on the `-XZ` plane using offset.\nsquareSketch = startSketchOn('-XZ')\n |> startProfileAt([-100, 200], %)\n |> line(end = [200, 0])\n |> line(end = [0, -200])\n |> line(end = [-200, 0])\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\ncircleSketch = startSketchOn(offsetPlane('-XZ', offset = -150))\n |> circle({ center = [0, 100], radius = 50 }, %)\n\nloft([squareSketch, circleSketch])", - "// A circle on the XY plane\nstartSketchOn(\"XY\")\n |> startProfileAt([0, 0], %)\n |> circle({ radius = 10, center = [0, 0] }, %)\n\n// Triangle on the plane 4 units above\nstartSketchOn(offsetPlane(\"XY\", offset = 4))\n |> startProfileAt([0, 0], %)\n |> line(end = [10, 0])\n |> line(end = [0, 10])\n |> close()" + "// Loft a square and a circle on the `XY` plane using offset.\nsquareSketch = startSketchOn('XY')\n |> startProfileAt([-100, 200], %)\n |> line(end = [200, 0])\n |> line(end = [0, -200])\n |> line(end = [-200, 0])\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\ncircleSketch = startSketchOn(offsetPlane('XY', offset = 150))\n |> circle(center = [0, 100], radius = 50)\n\nloft([squareSketch, circleSketch])", + "// Loft a square and a circle on the `XZ` plane using offset.\nsquareSketch = startSketchOn('XZ')\n |> startProfileAt([-100, 200], %)\n |> line(end = [200, 0])\n |> line(end = [0, -200])\n |> line(end = [-200, 0])\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\ncircleSketch = startSketchOn(offsetPlane('XZ', offset = 150))\n |> circle(center = [0, 100], radius = 50)\n\nloft([squareSketch, circleSketch])", + "// Loft a square and a circle on the `YZ` plane using offset.\nsquareSketch = startSketchOn('YZ')\n |> startProfileAt([-100, 200], %)\n |> line(end = [200, 0])\n |> line(end = [0, -200])\n |> line(end = [-200, 0])\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\ncircleSketch = startSketchOn(offsetPlane('YZ', offset = 150))\n |> circle(center = [0, 100], radius = 50)\n\nloft([squareSketch, circleSketch])", + "// Loft a square and a circle on the `-XZ` plane using offset.\nsquareSketch = startSketchOn('-XZ')\n |> startProfileAt([-100, 200], %)\n |> line(end = [200, 0])\n |> line(end = [0, -200])\n |> line(end = [-200, 0])\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\ncircleSketch = startSketchOn(offsetPlane('-XZ', offset = -150))\n |> circle(center = [0, 100], radius = 50)\n\nloft([squareSketch, circleSketch])", + "// A circle on the XY plane\nstartSketchOn(\"XY\")\n |> startProfileAt([0, 0], %)\n |> circle(radius = 10, center = [0, 0])\n\n// Triangle on the plane 4 units above\nstartSketchOn(offsetPlane(\"XY\", offset = 4))\n |> startProfileAt([0, 0], %)\n |> line(end = [10, 0])\n |> line(end = [0, 10])\n |> close()" ] }, { @@ -178642,7 +181831,7 @@ "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn('XZ')\n |> circle({ center = [0, 0], radius = 1 }, %)\n\nexample = extrude(exampleSketch, length = -5)\n |> patternCircular3d(\n axis = [1, -1, 0],\n center = [10, -20, 0],\n instances = 11,\n arcDegrees = 360,\n rotateDuplicates = true,\n )" + "exampleSketch = startSketchOn('XZ')\n |> circle(center = [0, 0], radius = 1)\n\nexample = extrude(exampleSketch, length = -5)\n |> patternCircular3d(\n axis = [1, -1, 0],\n center = [10, -20, 0],\n instances = 11,\n arcDegrees = 360,\n rotateDuplicates = true,\n )" ] }, { @@ -188411,7 +191600,7 @@ "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn('XZ')\n |> circle({ center = [0, 0], radius = 1 }, %)\n |> patternLinear2d(axis = [1, 0], instances = 7, distance = 4)\n\nexample = extrude(exampleSketch, length = 1)" + "exampleSketch = startSketchOn('XZ')\n |> circle(center = [0, 0], radius = 1)\n |> patternLinear2d(axis = [1, 0], instances = 7, distance = 4)\n\nexample = extrude(exampleSketch, length = 1)" ] }, { @@ -198185,8 +201374,8 @@ "deprecated": false, "examples": [ "exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line(end = [0, 2])\n |> line(end = [3, 1])\n |> line(end = [0, -4])\n |> close()\n\nexample = extrude(exampleSketch, length = 1)\n |> patternLinear3d(axis = [1, 0, 1], instances = 7, distance = 6)", - "// Pattern a whole sketch on face.\nsize = 100\ncase = startSketchOn('XY')\n |> startProfileAt([-size, -size], %)\n |> line(end = [2 * size, 0])\n |> line(end = [0, 2 * size])\n |> tangentialArcTo([-size, size], %)\n |> close(%)\n |> extrude(length = 65)\n\nthing1 = startSketchOn(case, 'end')\n |> circle({\n center = [-size / 2, -size / 2],\n radius = 25\n }, %)\n |> extrude(length = 50)\n\nthing2 = startSketchOn(case, 'end')\n |> circle({\n center = [size / 2, -size / 2],\n radius = 25\n }, %)\n |> extrude(length = 50)\n\n // We pass in the \"case\" here since we want to pattern the whole sketch.\n// And the case was the base of the sketch.\npatternLinear3d(\n case,\n axis = [1, 0, 0],\n distance = 250,\n instances = 2,\n)", - "// Pattern an object on a face.\nsize = 100\ncase = startSketchOn('XY')\n |> startProfileAt([-size, -size], %)\n |> line(end = [2 * size, 0])\n |> line(end = [0, 2 * size])\n |> tangentialArcTo([-size, size], %)\n |> close(%)\n |> extrude(length = 65)\n\nthing1 = startSketchOn(case, 'end')\n |> circle({\n center = [-size / 2, -size / 2],\n radius = 25\n }, %)\n |> extrude(length = 50)\n\n// We pass in `thing1` here with `useOriginal` since we want to pattern just this object on the face.\npatternLinear3d(\n thing1,\n axis = [1, 0, 0],\n distance = size,\n instances = 2,\n useOriginal = true,\n)" + "// Pattern a whole sketch on face.\nsize = 100\ncase = startSketchOn('XY')\n |> startProfileAt([-size, -size], %)\n |> line(end = [2 * size, 0])\n |> line(end = [0, 2 * size])\n |> tangentialArcTo([-size, size], %)\n |> close(%)\n |> extrude(length = 65)\n\nthing1 = startSketchOn(case, 'end')\n |> circle(center = [-size / 2, -size / 2], radius = 25)\n |> extrude(length = 50)\n\nthing2 = startSketchOn(case, 'end')\n |> circle(center = [size / 2, -size / 2], radius = 25)\n |> extrude(length = 50)\n\n // We pass in the \"case\" here since we want to pattern the whole sketch.\n// And the case was the base of the sketch.\npatternLinear3d(\n case,\n axis = [1, 0, 0],\n distance = 250,\n instances = 2,\n)", + "// Pattern an object on a face.\nsize = 100\ncase = startSketchOn('XY')\n |> startProfileAt([-size, -size], %)\n |> line(end = [2 * size, 0])\n |> line(end = [0, 2 * size])\n |> tangentialArcTo([-size, size], %)\n |> close(%)\n |> extrude(length = 65)\n\nthing1 = startSketchOn(case, 'end')\n |> circle(center = [-size / 2, -size / 2], radius = 25)\n |> extrude(length = 50)\n\n// We pass in `thing1` here with `useOriginal` since we want to pattern just this object on the face.\npatternLinear3d(\n thing1,\n axis = [1, 0, 0],\n distance = size,\n instances = 2,\n useOriginal = true,\n)" ] }, { @@ -206345,11 +209534,11 @@ "unpublished": false, "deprecated": false, "examples": [ - "// Each instance will be shifted along the X axis.\nfn transform(id) {\n return { translate = [4 * id, 0, 0] }\n}\n\n// Sketch 4 cylinders.\nsketch001 = startSketchOn('XZ')\n |> circle({ center = [0, 0], radius = 2 }, %)\n |> extrude(length = 5)\n |> patternTransform(instances = 4, transform = transform)", - "// Each instance will be shifted along the X axis,\n// with a gap between the original (at x = 0) and the first replica\n// (at x = 8). This is because `id` starts at 1.\nfn transform(id) {\n return { translate = [4 * (1 + id), 0, 0] }\n}\n\nsketch001 = startSketchOn('XZ')\n |> circle({ center = [0, 0], radius = 2 }, %)\n |> extrude(length = 5)\n |> patternTransform(instances = 4, transform = transform)", + "// Each instance will be shifted along the X axis.\nfn transform(id) {\n return { translate = [4 * id, 0, 0] }\n}\n\n// Sketch 4 cylinders.\nsketch001 = startSketchOn('XZ')\n |> circle(center = [0, 0], radius = 2)\n |> extrude(length = 5)\n |> patternTransform(instances = 4, transform = transform)", + "// Each instance will be shifted along the X axis,\n// with a gap between the original (at x = 0) and the first replica\n// (at x = 8). This is because `id` starts at 1.\nfn transform(id) {\n return { translate = [4 * (1 + id), 0, 0] }\n}\n\nsketch001 = startSketchOn('XZ')\n |> circle(center = [0, 0], radius = 2)\n |> extrude(length = 5)\n |> patternTransform(instances = 4, transform = transform)", "fn cube(length, center) {\n l = length / 2\n x = center[0]\n y = center[1]\n p0 = [-l + x, -l + y]\n p1 = [-l + x, l + y]\n p2 = [l + x, l + y]\n p3 = [l + x, -l + y]\n\n return startSketchOn('XY')\n |> startProfileAt(p0, %)\n |> line(endAbsolute = p1)\n |> line(endAbsolute = p2)\n |> line(endAbsolute = p3)\n |> line(endAbsolute = p0)\n |> close()\n |> extrude(length = length)\n}\n\nwidth = 20\nfn transform(i) {\n return {\n // Move down each time.\n translate = [0, 0, -i * width],\n // Make the cube longer, wider and flatter each time.\n scale = [pow(1.1, i), pow(1.1, i), pow(0.9, i)],\n // Turn by 15 degrees each time.\n rotation = { angle = 15 * i, origin = \"local\" }\n }\n}\n\nmyCubes = cube(width, [100, 0])\n |> patternTransform(instances = 25, transform = transform)", "fn cube(length, center) {\n l = length / 2\n x = center[0]\n y = center[1]\n p0 = [-l + x, -l + y]\n p1 = [-l + x, l + y]\n p2 = [l + x, l + y]\n p3 = [l + x, -l + y]\n\n return startSketchOn('XY')\n |> startProfileAt(p0, %)\n |> line(endAbsolute = p1)\n |> line(endAbsolute = p2)\n |> line(endAbsolute = p3)\n |> line(endAbsolute = p0)\n |> close()\n |> extrude(length = length)\n}\n\nwidth = 20\nfn transform(i) {\n return {\n translate = [0, 0, -i * width],\n rotation = {\n angle = 90 * i,\n // Rotate around the overall scene's origin.\n origin = \"global\"\n }\n }\n}\nmyCubes = cube(width, [100, 100])\n |> patternTransform(instances = 4, transform = transform)", - "// Parameters\nr = 50 // base radius\nh = 10 // layer height\nt = 0.005 // taper factor [0-1)\n// Defines how to modify each layer of the vase.\n// Each replica is shifted up the Z axis, and has a smoothly-varying radius\nfn transform(replicaId) {\n scale = r * abs(1 - (t * replicaId)) * (5 + cos(replicaId / 8))\n return {\n translate = [0, 0, replicaId * 10],\n scale = [scale, scale, 0]\n }\n}\n// Each layer is just a pretty thin cylinder.\nfn layer() {\n return startSketchOn(\"XY\")\n // or some other plane idk\n |> circle({ center = [0, 0], radius = 1 }, %, $tag1)\n |> extrude(length = h)\n}\n// The vase is 100 layers tall.\n// The 100 layers are replica of each other, with a slight transformation applied to each.\nvase = layer()\n |> patternTransform(instances = 100, transform = transform)", + "// Parameters\nr = 50 // base radius\nh = 10 // layer height\nt = 0.005 // taper factor [0-1)\n// Defines how to modify each layer of the vase.\n// Each replica is shifted up the Z axis, and has a smoothly-varying radius\nfn transform(replicaId) {\n scale = r * abs(1 - (t * replicaId)) * (5 + cos(replicaId / 8))\n return {\n translate = [0, 0, replicaId * 10],\n scale = [scale, scale, 0]\n }\n}\n// Each layer is just a pretty thin cylinder.\nfn layer() {\n return startSketchOn(\"XY\")\n // or some other plane idk\n |> circle(center = [0, 0], radius = 1, tag = $tag1)\n |> extrude(length = h)\n}\n// The vase is 100 layers tall.\n// The 100 layers are replica of each other, with a slight transformation applied to each.\nvase = layer()\n |> patternTransform(instances = 100, transform = transform)", "fn transform(i) {\n // Transform functions can return multiple transforms. They'll be applied in order.\n return [\n { translate = [30 * i, 0, 0] },\n { rotation = { angle = 45 * i } }\n ]\n}\nstartSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> polygon({\n radius = 10,\n numSides = 4,\n center = [0, 0],\n inscribed = false\n }, %)\n |> extrude(length = 4)\n |> patternTransform(instances = 3, transform = transform)" ] }, @@ -214505,7 +217694,7 @@ "unpublished": false, "deprecated": false, "examples": [ - "// Each instance will be shifted along the X axis.\nfn transform(id) {\n return { translate = [4 * id, 0] }\n}\n\n// Sketch 4 circles.\nsketch001 = startSketchOn('XZ')\n |> circle({ center = [0, 0], radius = 2 }, %)\n |> patternTransform2d(instances = 4, transform = transform)" + "// Each instance will be shifted along the X axis.\nfn transform(id) {\n return { translate = [4 * id, 0] }\n}\n\n// Sketch 4 circles.\nsketch001 = startSketchOn('XZ')\n |> circle(center = [0, 0], radius = 2)\n |> patternTransform2d(instances = 4, transform = transform)" ] }, { @@ -214533,7 +217722,7 @@ "unpublished": false, "deprecated": true, "examples": [ - "circumference = 70\n\nexampleSketch = startSketchOn(\"XZ\")\n |> circle({\n center = [0, 0],\n radius = circumference / (2 * pi())\n }, %)\n\nexample = extrude(exampleSketch, length = 5)" + "circumference = 70\n\nexampleSketch = startSketchOn(\"XZ\")\n |> circle(center = [0, 0], radius = circumference / (2 * pi()))\n\nexample = extrude(exampleSketch, length = 5)" ] }, { @@ -255782,12 +258971,12 @@ "deprecated": false, "examples": [ "part001 = startSketchOn('XY')\n |> startProfileAt([4, 12], %)\n |> line(end = [2, 0])\n |> line(end = [0, -6])\n |> line(end = [4, -6])\n |> line(end = [0, -6])\n |> line(end = [-3.75, -4.5])\n |> line(end = [0, -5.5])\n |> line(end = [-2, 0])\n |> close()\n |> revolve({ axis = 'y' }, %) // default angle is 360", - "// A donut shape.\nsketch001 = startSketchOn('XY')\n |> circle({ center = [15, 0], radius = 5 }, %)\n |> revolve({ angle = 360, axis = 'y' }, %)", + "// A donut shape.\nsketch001 = startSketchOn('XY')\n |> circle(center = [15, 0], radius = 5)\n |> revolve({ angle = 360, axis = 'y' }, %)", "part001 = startSketchOn('XY')\n |> startProfileAt([4, 12], %)\n |> line(end = [2, 0])\n |> line(end = [0, -6])\n |> line(end = [4, -6])\n |> line(end = [0, -6])\n |> line(end = [-3.75, -4.5])\n |> line(end = [0, -5.5])\n |> line(end = [-2, 0])\n |> close()\n |> revolve({ axis = 'y', angle = 180 }, %)", "part001 = startSketchOn('XY')\n |> startProfileAt([4, 12], %)\n |> line(end = [2, 0])\n |> line(end = [0, -6])\n |> line(end = [4, -6])\n |> line(end = [0, -6])\n |> line(end = [-3.75, -4.5])\n |> line(end = [0, -5.5])\n |> line(end = [-2, 0])\n |> close()\n |> revolve({ axis = 'y', angle = 180 }, %)\npart002 = startSketchOn(part001, 'end')\n |> startProfileAt([4.5, -5], %)\n |> line(end = [0, 5])\n |> line(end = [5, 0])\n |> line(end = [0, -5])\n |> close()\n |> extrude(length = 5)", - "box = startSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> line(end = [0, 20])\n |> line(end = [20, 0])\n |> line(end = [0, -20])\n |> close()\n |> extrude(length = 20)\n\nsketch001 = startSketchOn(box, \"END\")\n |> circle({ center = [10, 10], radius = 4 }, %)\n |> revolve({ angle = -90, axis = 'y' }, %)", - "box = startSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> line(end = [0, 20])\n |> line(end = [20, 0])\n |> line(end = [0, -20], tag = $revolveAxis)\n |> close()\n |> extrude(length = 20)\n\nsketch001 = startSketchOn(box, \"END\")\n |> circle({ center = [10, 10], radius = 4 }, %)\n |> revolve({\n angle = 90,\n axis = getOppositeEdge(revolveAxis)\n }, %)", - "box = startSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> line(end = [0, 20])\n |> line(end = [20, 0])\n |> line(end = [0, -20], tag = $revolveAxis)\n |> close()\n |> extrude(length = 20)\n\nsketch001 = startSketchOn(box, \"END\")\n |> circle({ center = [10, 10], radius = 4 }, %)\n |> revolve({\n angle = 90,\n axis = getOppositeEdge(revolveAxis),\n tolerance = 0.0001\n }, %)", + "box = startSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> line(end = [0, 20])\n |> line(end = [20, 0])\n |> line(end = [0, -20])\n |> close()\n |> extrude(length = 20)\n\nsketch001 = startSketchOn(box, \"END\")\n |> circle(center = [10, 10], radius = 4)\n |> revolve({ angle = -90, axis = 'y' }, %)", + "box = startSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> line(end = [0, 20])\n |> line(end = [20, 0])\n |> line(end = [0, -20], tag = $revolveAxis)\n |> close()\n |> extrude(length = 20)\n\nsketch001 = startSketchOn(box, \"END\")\n |> circle(center = [10, 10], radius = 4)\n |> revolve({\n angle = 90,\n axis = getOppositeEdge(revolveAxis)\n }, %)", + "box = startSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> line(end = [0, 20])\n |> line(end = [20, 0])\n |> line(end = [0, -20], tag = $revolveAxis)\n |> close()\n |> extrude(length = 20)\n\nsketch001 = startSketchOn(box, \"END\")\n |> circle(center = [10, 10], radius = 4)\n |> revolve({\n angle = 90,\n axis = getOppositeEdge(revolveAxis),\n tolerance = 0.0001\n }, %)", "sketch001 = startSketchOn('XY')\n |> startProfileAt([10, 0], %)\n |> line(end = [5, -5])\n |> line(end = [5, 5])\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\npart001 = revolve({\n axis = {\n custom = {\n axis = [0.0, 1.0],\n origin = [0.0, 0.0]\n }\n }\n}, sketch001)" ] }, @@ -268818,8 +272007,8 @@ "unpublished": false, "deprecated": false, "examples": [ - "// Rotate a pipe with roll, pitch, and yaw.\n\n\n// Create a path for the sweep.\nsweepPath = startSketchOn('XZ')\n |> startProfileAt([0.05, 0.05], %)\n |> line(end = [0, 7])\n |> tangentialArc({ offset = 90, radius = 5 }, %)\n |> line(end = [-3, 0])\n |> tangentialArc({ offset = -90, radius = 5 }, %)\n |> line(end = [0, 7])\n\n// Create a hole for the pipe.\npipeHole = startSketchOn('XY')\n |> circle({ center = [0, 0], radius = 1.5 }, %)\n\nsweepSketch = startSketchOn('XY')\n |> circle({ center = [0, 0], radius = 2 }, %)\n |> hole(pipeHole, %)\n |> sweep(path = sweepPath)\n |> rotate(roll = 10, pitch = 10, yaw = 90)", - "// Rotate a pipe about an axis with an angle.\n\n\n// Create a path for the sweep.\nsweepPath = startSketchOn('XZ')\n |> startProfileAt([0.05, 0.05], %)\n |> line(end = [0, 7])\n |> tangentialArc({ offset = 90, radius = 5 }, %)\n |> line(end = [-3, 0])\n |> tangentialArc({ offset = -90, radius = 5 }, %)\n |> line(end = [0, 7])\n\n// Create a hole for the pipe.\npipeHole = startSketchOn('XY')\n |> circle({ center = [0, 0], radius = 1.5 }, %)\n\nsweepSketch = startSketchOn('XY')\n |> circle({ center = [0, 0], radius = 2 }, %)\n |> hole(pipeHole, %)\n |> sweep(path = sweepPath)\n |> rotate(axis = [0, 0, 1.0], angle = 90)" + "// Rotate a pipe with roll, pitch, and yaw.\n\n\n// Create a path for the sweep.\nsweepPath = startSketchOn('XZ')\n |> startProfileAt([0.05, 0.05], %)\n |> line(end = [0, 7])\n |> tangentialArc({ offset = 90, radius = 5 }, %)\n |> line(end = [-3, 0])\n |> tangentialArc({ offset = -90, radius = 5 }, %)\n |> line(end = [0, 7])\n\n// Create a hole for the pipe.\npipeHole = startSketchOn('XY')\n |> circle(center = [0, 0], radius = 1.5)\n\nsweepSketch = startSketchOn('XY')\n |> circle(center = [0, 0], radius = 2)\n |> hole(pipeHole, %)\n |> sweep(path = sweepPath)\n |> rotate(roll = 10, pitch = 10, yaw = 90)", + "// Rotate a pipe about an axis with an angle.\n\n\n// Create a path for the sweep.\nsweepPath = startSketchOn('XZ')\n |> startProfileAt([0.05, 0.05], %)\n |> line(end = [0, 7])\n |> tangentialArc({ offset = 90, radius = 5 }, %)\n |> line(end = [-3, 0])\n |> tangentialArc({ offset = -90, radius = 5 }, %)\n |> line(end = [0, 7])\n\n// Create a hole for the pipe.\npipeHole = startSketchOn('XY')\n |> circle(center = [0, 0], radius = 1.5)\n\nsweepSketch = startSketchOn('XY')\n |> circle(center = [0, 0], radius = 2)\n |> hole(pipeHole, %)\n |> sweep(path = sweepPath)\n |> rotate(axis = [0, 0, 1.0], angle = 90)" ] }, { @@ -275456,7 +278645,7 @@ "unpublished": false, "deprecated": false, "examples": [ - "// Scale a pipe.\n\n\n// Create a path for the sweep.\nsweepPath = startSketchOn('XZ')\n |> startProfileAt([0.05, 0.05], %)\n |> line(end = [0, 7])\n |> tangentialArc({ offset = 90, radius = 5 }, %)\n |> line(end = [-3, 0])\n |> tangentialArc({ offset = -90, radius = 5 }, %)\n |> line(end = [0, 7])\n\n// Create a hole for the pipe.\npipeHole = startSketchOn('XY')\n |> circle({ center = [0, 0], radius = 1.5 }, %)\n\nsweepSketch = startSketchOn('XY')\n |> circle({ center = [0, 0], radius = 2 }, %)\n |> hole(pipeHole, %)\n |> sweep(path = sweepPath)\n |> scale(scale = [1.0, 1.0, 2.5])" + "// Scale a pipe.\n\n\n// Create a path for the sweep.\nsweepPath = startSketchOn('XZ')\n |> startProfileAt([0.05, 0.05], %)\n |> line(end = [0, 7])\n |> tangentialArc({ offset = 90, radius = 5 }, %)\n |> line(end = [-3, 0])\n |> tangentialArc({ offset = -90, radius = 5 }, %)\n |> line(end = [0, 7])\n\n// Create a hole for the pipe.\npipeHole = startSketchOn('XY')\n |> circle(center = [0, 0], radius = 1.5)\n\nsweepSketch = startSketchOn('XY')\n |> circle(center = [0, 0], radius = 2)\n |> hole(pipeHole, %)\n |> sweep(path = sweepPath)\n |> scale(scale = [1.0, 1.0, 2.5])" ] }, { @@ -277707,7 +280896,7 @@ "unpublished": false, "deprecated": false, "examples": [ - "w = 15\ncube = startSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> line(end = [w, 0], tag = $line1)\n |> line(end = [0, w], tag = $line2)\n |> line(end = [-w, 0], tag = $line3)\n |> line(end = [0, -w], tag = $line4)\n |> close()\n |> extrude(length = 5)\n\nfn cylinder(radius, tag) {\n return startSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> circle({\n radius = radius,\n center = segEnd(tag)\n }, %)\n |> extrude(length = radius)\n}\n\ncylinder(1, line1)\ncylinder(2, line2)\ncylinder(3, line3)\ncylinder(4, line4)" + "w = 15\ncube = startSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> line(end = [w, 0], tag = $line1)\n |> line(end = [0, w], tag = $line2)\n |> line(end = [-w, 0], tag = $line3)\n |> line(end = [0, -w], tag = $line4)\n |> close()\n |> extrude(length = 5)\n\nfn cylinder(radius, tag) {\n return startSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> circle(radius = radius, center = segEnd(tag))\n |> extrude(length = radius)\n}\n\ncylinder(1, line1)\ncylinder(2, line2)\ncylinder(3, line3)\ncylinder(4, line4)" ] }, { @@ -282204,7 +285393,7 @@ "unpublished": false, "deprecated": false, "examples": [ - "w = 15\ncube = startSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> line(end = [w, 0], tag = $line1)\n |> line(end = [0, w], tag = $line2)\n |> line(end = [-w, 0], tag = $line3)\n |> line(end = [0, -w], tag = $line4)\n |> close()\n |> extrude(length = 5)\n\nfn cylinder(radius, tag) {\n return startSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> circle({\n radius = radius,\n center = segStart(tag)\n }, %)\n |> extrude(length = radius)\n}\n\ncylinder(1, line1)\ncylinder(2, line2)\ncylinder(3, line3)\ncylinder(4, line4)" + "w = 15\ncube = startSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> line(end = [w, 0], tag = $line1)\n |> line(end = [0, w], tag = $line2)\n |> line(end = [-w, 0], tag = $line3)\n |> line(end = [0, -w], tag = $line4)\n |> close()\n |> extrude(length = 5)\n\nfn cylinder(radius, tag) {\n return startSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> circle(radius = radius, center = segStart(tag))\n |> extrude(length = radius)\n}\n\ncylinder(1, line1)\ncylinder(2, line2)\ncylinder(3, line3)\ncylinder(4, line4)" ] }, { @@ -291145,9 +294334,9 @@ "// Remove the start face for the extrusion.\nfirstSketch = startSketchOn('-XZ')\n |> startProfileAt([-12, 12], %)\n |> line(end = [24, 0])\n |> line(end = [0, -24])\n |> line(end = [-24, 0])\n |> close()\n |> extrude(length = 6)\n\n// Remove the start face for the extrusion.\nshell(firstSketch, faces = ['start'], thickness = 0.25)", "// Remove a tagged face and the end face for the extrusion.\nfirstSketch = startSketchOn('XY')\n |> startProfileAt([-12, 12], %)\n |> line(end = [24, 0])\n |> line(end = [0, -24])\n |> line(end = [-24, 0], tag = $myTag)\n |> close()\n |> extrude(length = 6)\n\n// Remove a tagged face for the extrusion.\nshell(firstSketch, faces = [myTag], thickness = 0.25)", "// Remove multiple faces at once.\nfirstSketch = startSketchOn('XY')\n |> startProfileAt([-12, 12], %)\n |> line(end = [24, 0])\n |> line(end = [0, -24])\n |> line(end = [-24, 0], tag = $myTag)\n |> close()\n |> extrude(length = 6)\n\n// Remove a tagged face and the end face for the extrusion.\nshell(firstSketch, faces = [myTag, 'end'], thickness = 0.25)", - "// Shell a sketch on face.\nsize = 100\ncase = startSketchOn('-XZ')\n |> startProfileAt([-size, -size], %)\n |> line(end = [2 * size, 0])\n |> line(end = [0, 2 * size])\n |> tangentialArcTo([-size, size], %)\n |> close()\n |> extrude(length = 65)\n\nthing1 = startSketchOn(case, 'end')\n |> circle({\n center = [-size / 2, -size / 2],\n radius = 25\n }, %)\n |> extrude(length = 50)\n\nthing2 = startSketchOn(case, 'end')\n |> circle({\n center = [size / 2, -size / 2],\n radius = 25\n }, %)\n |> extrude(length = 50)\n\n// We put \"case\" in the shell function to shell the entire object.\nshell(case, faces = ['start'], thickness = 5)", - "// Shell a sketch on face object on the end face.\nsize = 100\ncase = startSketchOn('XY')\n |> startProfileAt([-size, -size], %)\n |> line(end = [2 * size, 0])\n |> line(end = [0, 2 * size])\n |> tangentialArcTo([-size, size], %)\n |> close()\n |> extrude(length = 65)\n\nthing1 = startSketchOn(case, 'end')\n |> circle({\n center = [-size / 2, -size / 2],\n radius = 25\n }, %)\n |> extrude(length = 50)\n\nthing2 = startSketchOn(case, 'end')\n |> circle({\n center = [size / 2, -size / 2],\n radius = 25\n }, %)\n |> extrude(length = 50)\n\n// We put \"thing1\" in the shell function to shell the end face of the object.\nshell(thing1, faces = ['end'], thickness = 5)", - "// Shell sketched on face objects on the end face, include all sketches to shell\n// the entire object.\n\n\nsize = 100\ncase = startSketchOn('XY')\n |> startProfileAt([-size, -size], %)\n |> line(end = [2 * size, 0])\n |> line(end = [0, 2 * size])\n |> tangentialArcTo([-size, size], %)\n |> close()\n |> extrude(length = 65)\n\nthing1 = startSketchOn(case, 'end')\n |> circle({\n center = [-size / 2, -size / 2],\n radius = 25\n }, %)\n |> extrude(length = 50)\n\nthing2 = startSketchOn(case, 'end')\n |> circle({\n center = [size / 2, -size / 2],\n radius = 25\n }, %)\n |> extrude(length = 50)\n\n// We put \"thing1\" and \"thing2\" in the shell function to shell the end face of the object.\nshell([thing1, thing2], faces = ['end'], thickness = 5)" + "// Shell a sketch on face.\nsize = 100\ncase = startSketchOn('-XZ')\n |> startProfileAt([-size, -size], %)\n |> line(end = [2 * size, 0])\n |> line(end = [0, 2 * size])\n |> tangentialArcTo([-size, size], %)\n |> close()\n |> extrude(length = 65)\n\nthing1 = startSketchOn(case, 'end')\n |> circle(center = [-size / 2, -size / 2], radius = 25)\n |> extrude(length = 50)\n\nthing2 = startSketchOn(case, 'end')\n |> circle(center = [size / 2, -size / 2], radius = 25)\n |> extrude(length = 50)\n\n// We put \"case\" in the shell function to shell the entire object.\nshell(case, faces = ['start'], thickness = 5)", + "// Shell a sketch on face object on the end face.\nsize = 100\ncase = startSketchOn('XY')\n |> startProfileAt([-size, -size], %)\n |> line(end = [2 * size, 0])\n |> line(end = [0, 2 * size])\n |> tangentialArcTo([-size, size], %)\n |> close()\n |> extrude(length = 65)\n\nthing1 = startSketchOn(case, 'end')\n |> circle(center = [-size / 2, -size / 2], radius = 25)\n |> extrude(length = 50)\n\nthing2 = startSketchOn(case, 'end')\n |> circle(center = [size / 2, -size / 2], radius = 25)\n |> extrude(length = 50)\n\n// We put \"thing1\" in the shell function to shell the end face of the object.\nshell(thing1, faces = ['end'], thickness = 5)", + "// Shell sketched on face objects on the end face, include all sketches to shell\n// the entire object.\n\n\nsize = 100\ncase = startSketchOn('XY')\n |> startProfileAt([-size, -size], %)\n |> line(end = [2 * size, 0])\n |> line(end = [0, 2 * size])\n |> tangentialArcTo([-size, size], %)\n |> close()\n |> extrude(length = 65)\n\nthing1 = startSketchOn(case, 'end')\n |> circle(center = [-size / 2, -size / 2], radius = 25)\n |> extrude(length = 50)\n\nthing2 = startSketchOn(case, 'end')\n |> circle(center = [size / 2, -size / 2], radius = 25)\n |> extrude(length = 50)\n\n// We put \"thing1\" and \"thing2\" in the shell function to shell the end face of the object.\nshell([thing1, thing2], faces = ['end'], thickness = 5)" ] }, { @@ -311741,8 +314930,8 @@ "unpublished": false, "deprecated": false, "examples": [ - "// Create a pipe using a sweep.\n\n\n// Create a path for the sweep.\nsweepPath = startSketchOn('XZ')\n |> startProfileAt([0.05, 0.05], %)\n |> line(end = [0, 7])\n |> tangentialArc({ offset = 90, radius = 5 }, %)\n |> line(end = [-3, 0])\n |> tangentialArc({ offset = -90, radius = 5 }, %)\n |> line(end = [0, 7])\n\n// Create a hole for the pipe.\npipeHole = startSketchOn('XY')\n |> circle({ center = [0, 0], radius = 1.5 }, %)\n\nsweepSketch = startSketchOn('XY')\n |> circle({ center = [0, 0], radius = 2 }, %)\n |> hole(pipeHole, %)\n |> sweep(path = sweepPath)", - "// Create a spring by sweeping around a helix path.\n\n\n// Create a helix around the Z axis.\nhelixPath = helix(\n angleStart = 0,\n ccw = true,\n revolutions = 4,\n length = 10,\n radius = 5,\n axis = 'Z',\n)\n\n// Create a spring by sweeping around the helix path.\nspringSketch = startSketchOn('YZ')\n |> circle({ center = [0, 0], radius = 1 }, %)\n |> sweep(path = helixPath)" + "// Create a pipe using a sweep.\n\n\n// Create a path for the sweep.\nsweepPath = startSketchOn('XZ')\n |> startProfileAt([0.05, 0.05], %)\n |> line(end = [0, 7])\n |> tangentialArc({ offset = 90, radius = 5 }, %)\n |> line(end = [-3, 0])\n |> tangentialArc({ offset = -90, radius = 5 }, %)\n |> line(end = [0, 7])\n\n// Create a hole for the pipe.\npipeHole = startSketchOn('XY')\n |> circle(center = [0, 0], radius = 1.5)\n\nsweepSketch = startSketchOn('XY')\n |> circle(center = [0, 0], radius = 2)\n |> hole(pipeHole, %)\n |> sweep(path = sweepPath)", + "// Create a spring by sweeping around a helix path.\n\n\n// Create a helix around the Z axis.\nhelixPath = helix(\n angleStart = 0,\n ccw = true,\n revolutions = 4,\n length = 10,\n radius = 5,\n axis = 'Z',\n)\n\n// Create a spring by sweeping around the helix path.\nspringSketch = startSketchOn('YZ')\n |> circle(center = [0, 0], radius = 1)\n |> sweep(path = helixPath)" ] }, { @@ -312869,7 +316058,7 @@ "// Vertical pill. Use absolute coordinate for arc.\npillSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line(end = [0, 20])\n |> tangentialArcTo([10, 20], %, $arc1)\n |> angledLine({\n angle = tangentToEnd(arc1),\n length = 20\n }, %)\n |> tangentialArcToRelative([-10, 0], %)\n |> close()\n\npillExtrude = extrude(pillSketch, length = 10)", "rectangleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line(end = [10, 0], tag = $seg1)\n |> angledLine({\n angle = tangentToEnd(seg1),\n length = 10\n }, %)\n |> line(end = [0, 10])\n |> line(end = [-20, 0])\n |> close()\n\nrectangleExtrude = extrude(rectangleSketch, length = 10)", "bottom = startSketchOn(\"XY\")\n |> startProfileAt([0, 0], %)\n |> arcTo({ end = [10, 10], interior = [5, 1] }, %, $arc1)\n |> angledLine([tangentToEnd(arc1), 20], %)\n |> close()", - "circSketch = startSketchOn(\"XY\")\n |> circle({ center = [0, 0], radius = 3 }, %, $circ)\n\ntriangleSketch = startSketchOn(\"XY\")\n |> startProfileAt([-5, 0], %)\n |> angledLine([tangentToEnd(circ), 10], %)\n |> line(end = [-15, 0])\n |> close()" + "circSketch = startSketchOn(\"XY\")\n |> circle(center = [0, 0], radius = 3, tag = $circ)\n\ntriangleSketch = startSketchOn(\"XY\")\n |> startProfileAt([-5, 0], %)\n |> angledLine([tangentToEnd(circ), 10], %)\n |> line(end = [-15, 0])\n |> close()" ] }, { @@ -334573,7 +337762,7 @@ "unpublished": false, "deprecated": false, "examples": [ - "// Move a pipe.\n\n\n// Create a path for the sweep.\nsweepPath = startSketchOn('XZ')\n |> startProfileAt([0.05, 0.05], %)\n |> line(end = [0, 7])\n |> tangentialArc({ offset = 90, radius = 5 }, %)\n |> line(end = [-3, 0])\n |> tangentialArc({ offset = -90, radius = 5 }, %)\n |> line(end = [0, 7])\n\n// Create a hole for the pipe.\npipeHole = startSketchOn('XY')\n |> circle({ center = [0, 0], radius = 1.5 }, %)\n\nsweepSketch = startSketchOn('XY')\n |> circle({ center = [0, 0], radius = 2 }, %)\n |> hole(pipeHole, %)\n |> sweep(path = sweepPath)\n |> translate(translate = [1.0, 1.0, 2.5])" + "// Move a pipe.\n\n\n// Create a path for the sweep.\nsweepPath = startSketchOn('XZ')\n |> startProfileAt([0.05, 0.05], %)\n |> line(end = [0, 7])\n |> tangentialArc({ offset = 90, radius = 5 }, %)\n |> line(end = [-3, 0])\n |> tangentialArc({ offset = -90, radius = 5 }, %)\n |> line(end = [0, 7])\n\n// Create a hole for the pipe.\npipeHole = startSketchOn('XY')\n |> circle(center = [0, 0], radius = 1.5)\n\nsweepSketch = startSketchOn('XY')\n |> circle(center = [0, 0], radius = 2)\n |> hole(pipeHole, %)\n |> sweep(path = sweepPath)\n |> translate(translate = [1.0, 1.0, 2.5])" ] }, { diff --git a/docs/kcl/sweep.md b/docs/kcl/sweep.md index 8c3a0a7c67..9657613af9 100644 --- a/docs/kcl/sweep.md +++ b/docs/kcl/sweep.md @@ -49,10 +49,10 @@ sweepPath = startSketchOn('XZ') // Create a hole for the pipe. pipeHole = startSketchOn('XY') - |> circle({ center = [0, 0], radius = 1.5 }, %) + |> circle(center = [0, 0], radius = 1.5) sweepSketch = startSketchOn('XY') - |> circle({ center = [0, 0], radius = 2 }, %) + |> circle(center = [0, 0], radius = 2) |> hole(pipeHole, %) |> sweep(path = sweepPath) ``` @@ -75,7 +75,7 @@ helixPath = helix( // Create a spring by sweeping around the helix path. springSketch = startSketchOn('YZ') - |> circle({ center = [0, 0], radius = 1 }, %) + |> circle(center = [0, 0], radius = 1) |> sweep(path = helixPath) ``` diff --git a/docs/kcl/tangentToEnd.md b/docs/kcl/tangentToEnd.md index f32c8944eb..cc3f9adc23 100644 --- a/docs/kcl/tangentToEnd.md +++ b/docs/kcl/tangentToEnd.md @@ -91,7 +91,7 @@ bottom = startSketchOn("XY") ```js circSketch = startSketchOn("XY") - |> circle({ center = [0, 0], radius = 3 }, %, $circ) + |> circle(center = [0, 0], radius = 3, tag = $circ) triangleSketch = startSketchOn("XY") |> startProfileAt([-5, 0], %) diff --git a/docs/kcl/translate.md b/docs/kcl/translate.md index ddccec6f6e..9f0d05a9d9 100644 --- a/docs/kcl/translate.md +++ b/docs/kcl/translate.md @@ -47,10 +47,10 @@ sweepPath = startSketchOn('XZ') // Create a hole for the pipe. pipeHole = startSketchOn('XY') - |> circle({ center = [0, 0], radius = 1.5 }, %) + |> circle(center = [0, 0], radius = 1.5) sweepSketch = startSketchOn('XY') - |> circle({ center = [0, 0], radius = 2 }, %) + |> circle(center = [0, 0], radius = 2) |> hole(pipeHole, %) |> sweep(path = sweepPath) |> translate(translate = [1.0, 1.0, 2.5]) diff --git a/src/wasm-lib/kcl/src/docs/mod.rs b/src/wasm-lib/kcl/src/docs/mod.rs index 6cf06b0f2a..1d47daa255 100644 --- a/src/wasm-lib/kcl/src/docs/mod.rs +++ b/src/wasm-lib/kcl/src/docs/mod.rs @@ -1014,10 +1014,7 @@ mod tests { let snippet = circle_fn.to_autocomplete_snippet().unwrap(); assert_eq!( snippet, - r#"circle({ - center = [${0:3.14}, ${1:3.14}], - radius = ${2:3.14}, -}, ${3:%})${}"# + r#"circle(${0:%}, center = [${1:3.14}, ${2:3.14}], radius = ${3:3.14})${}"# ); } diff --git a/src/wasm-lib/kcl/src/execution/mod.rs b/src/wasm-lib/kcl/src/execution/mod.rs index 8d77e1682f..c5f768b911 100644 --- a/src/wasm-lib/kcl/src/execution/mod.rs +++ b/src/wasm-lib/kcl/src/execution/mod.rs @@ -872,11 +872,20 @@ impl ExecutorContext { } #[cfg(test)] -pub(crate) async fn parse_execute(code: &str) -> Result<(crate::Program, EnvironmentRef, ExecutorContext, ExecState)> { +pub(crate) async fn parse_execute( + code: &str, +) -> Result<(crate::Program, EnvironmentRef, ExecutorContext, ExecState), KclError> { let program = crate::Program::parse_no_errs(code)?; let ctx = ExecutorContext { - engine: Arc::new(Box::new(crate::engine::conn_mock::EngineConnection::new().await?)), + engine: Arc::new(Box::new( + crate::engine::conn_mock::EngineConnection::new().await.map_err(|err| { + KclError::Internal(crate::errors::KclErrorDetails { + message: format!("Failed to create mock engine connection: {}", err), + source_ranges: vec![SourceRange::default()], + }) + })?, + )), fs: Arc::new(crate::fs::FileManager::new()), stdlib: Arc::new(crate::std::StdLib::new()), settings: Default::default(), @@ -1279,7 +1288,7 @@ const x = 5 const answer = returnX()"#; let result = parse_execute(ast).await; - let err = result.unwrap_err().downcast::().unwrap(); + let err = result.unwrap_err(); assert_eq!( err, KclError::UndefinedValue(KclErrorDetails { @@ -1312,7 +1321,7 @@ foo "#; let result = parse_execute(ast).await; - let err = result.unwrap_err().downcast::().unwrap(); + let err = result.unwrap_err(); assert_eq!( err, KclError::Syntax(KclErrorDetails { @@ -1336,7 +1345,7 @@ fn transform = (replicaId) => { fn layer = () => { return startSketchOn(XY) - |> circle({ center: [0, 0], radius: 1 }, %, $tag1) + |> circle( center= [0, 0], radius= 1 , tag =$tag1) |> extrude(length = 10) } @@ -1347,7 +1356,7 @@ let shape = layer() |> patternTransform(instances = 10, transform = transform) "#; let result = parse_execute(ast).await; - let err = result.unwrap_err().downcast::().unwrap(); + let err = result.unwrap_err(); assert_eq!( err, KclError::UndefinedValue(KclErrorDetails { @@ -1498,7 +1507,7 @@ let myNull = 0 / 0 let notNull = !myNull "#; assert_eq!( - parse_execute(code1).await.unwrap_err().downcast::().unwrap(), + parse_execute(code1).await.unwrap_err(), KclError::Semantic(KclErrorDetails { message: "Cannot apply unary operator ! to non-boolean value: number".to_owned(), source_ranges: vec![SourceRange::new(56, 63, ModuleId::default())], @@ -1507,7 +1516,7 @@ let notNull = !myNull let code2 = "let notZero = !0"; assert_eq!( - parse_execute(code2).await.unwrap_err().downcast::().unwrap(), + parse_execute(code2).await.unwrap_err(), KclError::Semantic(KclErrorDetails { message: "Cannot apply unary operator ! to non-boolean value: number".to_owned(), source_ranges: vec![SourceRange::new(14, 16, ModuleId::default())], @@ -1518,7 +1527,7 @@ let notNull = !myNull let notEmptyString = !"" "#; assert_eq!( - parse_execute(code3).await.unwrap_err().downcast::().unwrap(), + parse_execute(code3).await.unwrap_err(), KclError::Semantic(KclErrorDetails { message: "Cannot apply unary operator ! to non-boolean value: string (text)".to_owned(), source_ranges: vec![SourceRange::new(22, 25, ModuleId::default())], @@ -1530,7 +1539,7 @@ let obj = { a: 1 } let notMember = !obj.a "#; assert_eq!( - parse_execute(code4).await.unwrap_err().downcast::().unwrap(), + parse_execute(code4).await.unwrap_err(), KclError::Semantic(KclErrorDetails { message: "Cannot apply unary operator ! to non-boolean value: number".to_owned(), source_ranges: vec![SourceRange::new(36, 42, ModuleId::default())], @@ -1541,7 +1550,7 @@ let notMember = !obj.a let a = [] let notArray = !a"; assert_eq!( - parse_execute(code5).await.unwrap_err().downcast::().unwrap(), + parse_execute(code5).await.unwrap_err(), KclError::Semantic(KclErrorDetails { message: "Cannot apply unary operator ! to non-boolean value: array (list)".to_owned(), source_ranges: vec![SourceRange::new(27, 29, ModuleId::default())], @@ -1552,7 +1561,7 @@ let notArray = !a"; let x = {} let notObject = !x"; assert_eq!( - parse_execute(code6).await.unwrap_err().downcast::().unwrap(), + parse_execute(code6).await.unwrap_err(), KclError::Semantic(KclErrorDetails { message: "Cannot apply unary operator ! to non-boolean value: object".to_owned(), source_ranges: vec![SourceRange::new(28, 30, ModuleId::default())], @@ -1562,7 +1571,7 @@ let notObject = !x"; let code7 = " fn x = () => { return 1 } let notFunction = !x"; - let fn_err = parse_execute(code7).await.unwrap_err().downcast::().unwrap(); + let fn_err = parse_execute(code7).await.unwrap_err(); // These are currently printed out as JSON objects, so we don't want to // check the full error. assert!( @@ -1576,7 +1585,7 @@ let notFunction = !x"; let code8 = " let myTagDeclarator = $myTag let notTagDeclarator = !myTagDeclarator"; - let tag_declarator_err = parse_execute(code8).await.unwrap_err().downcast::().unwrap(); + let tag_declarator_err = parse_execute(code8).await.unwrap_err(); // These are currently printed out as JSON objects, so we don't want to // check the full error. assert!( @@ -1590,7 +1599,7 @@ let notTagDeclarator = !myTagDeclarator"; let code9 = " let myTagDeclarator = $myTag let notTagIdentifier = !myTag"; - let tag_identifier_err = parse_execute(code9).await.unwrap_err().downcast::().unwrap(); + let tag_identifier_err = parse_execute(code9).await.unwrap_err(); // These are currently printed out as JSON objects, so we don't want to // check the full error. assert!( @@ -1605,7 +1614,7 @@ let notTagIdentifier = !myTag"; assert_eq!( // TODO: We don't currently parse this, but we should. It should be // a runtime error instead. - parse_execute(code10).await.unwrap_err().downcast::().unwrap(), + parse_execute(code10).await.unwrap_err(), KclError::Syntax(KclErrorDetails { message: "Unexpected token: !".to_owned(), source_ranges: vec![SourceRange::new(14, 15, ModuleId::default())], @@ -1618,7 +1627,7 @@ let notPipeSub = 1 |> identity(!%))"; assert_eq!( // TODO: We don't currently parse this, but we should. It should be // a runtime error instead. - parse_execute(code11).await.unwrap_err().downcast::().unwrap(), + parse_execute(code11).await.unwrap_err(), KclError::Syntax(KclErrorDetails { message: "Unexpected token: |>".to_owned(), source_ranges: vec![SourceRange::new(54, 56, ModuleId::default())], diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__au.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__au.snap index b164328d8e..507b5e9c95 100644 --- a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__au.snap +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__au.snap @@ -6,7 +6,7 @@ expression: actual "body": [ { "declaration": { - "end": 113, + "end": 106, "id": { "end": 14, "name": "cylinder", @@ -40,81 +40,59 @@ expression: actual { "arguments": [ { - "end": 81, - "properties": [ - { - "end": 67, - "key": { - "end": 59, - "name": "center", - "start": 53, - "type": "Identifier" - }, - "start": 53, - "type": "ObjectProperty", - "value": { - "elements": [ - { - "end": 63, - "raw": "0", - "start": 62, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - { - "end": 66, - "raw": "0", - "start": 65, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - } - ], - "end": 67, - "start": 61, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "end": 79, - "key": { - "end": 75, - "name": "radius", - "start": 69, - "type": "Identifier" + "type": "LabeledArg", + "label": { + "type": "Identifier", + "name": "center" + }, + "arg": { + "elements": [ + { + "end": 61, + "raw": "0", + "start": 60, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } }, - "start": 69, - "type": "ObjectProperty", - "value": { - "end": 79, - "raw": "22", - "start": 77, + { + "end": 64, + "raw": "0", + "start": 63, "type": "Literal", "type": "Literal", "value": { - "value": 22.0, + "value": 0.0, "suffix": "None" } } - } - ], - "start": 51, - "type": "ObjectExpression", - "type": "ObjectExpression" + ], + "end": 65, + "start": 59, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, { - "end": 84, - "start": 83, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "type": "Identifier", + "name": "radius" + }, + "arg": { + "end": 77, + "raw": "22", + "start": 75, + "type": "Literal", + "type": "Literal", + "value": { + "value": 22.0, + "suffix": "None" + } + } } ], "callee": { @@ -123,10 +101,11 @@ expression: actual "start": 44, "type": "Identifier" }, - "end": 85, + "end": 78, "start": 44, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -137,9 +116,9 @@ expression: actual "name": "length" }, "arg": { - "end": 112, + "end": 105, "raw": "14", - "start": 110, + "start": 103, "type": "Literal", "type": "Literal", "value": { @@ -150,19 +129,19 @@ expression: actual } ], "callee": { - "end": 100, + "end": 93, "name": "extrude", - "start": 93, + "start": 86, "type": "Identifier" }, - "end": 113, - "start": 93, + "end": 106, + "start": 86, "type": "CallExpressionKw", "type": "CallExpressionKw", "unlabeled": null } ], - "end": 113, + "end": 106, "start": 17, "type": "PipeExpression", "type": "PipeExpression" @@ -170,13 +149,13 @@ expression: actual "start": 6, "type": "VariableDeclarator" }, - "end": 113, + "end": 106, "kind": "const", "start": 0, "type": "VariableDeclaration", "type": "VariableDeclaration" } ], - "end": 114, + "end": 107, "start": 0 } diff --git a/src/wasm-lib/kcl/src/std/appearance.rs b/src/wasm-lib/kcl/src/std/appearance.rs index 971305aa36..7f37e6b6cd 100644 --- a/src/wasm-lib/kcl/src/std/appearance.rs +++ b/src/wasm-lib/kcl/src/std/appearance.rs @@ -90,7 +90,7 @@ pub async fn appearance(_exec_state: &mut ExecState, args: Args) -> Result circle({ center = [15, 0], radius = 5 }, %) +/// |> circle( center = [15, 0], radius = 5 ) /// |> revolve({ angle = 360, axis = 'y' }, %) /// |> appearance( /// color = '#ff0000', @@ -253,16 +253,16 @@ pub async fn appearance(_exec_state: &mut ExecState, args: Args) -> Result line(end = [0, 7]) /// /// pipeHole = startSketchOn('XY') -/// |> circle({ +/// |> circle( /// center = [0, 0], /// radius = 1.5, -/// }, %) +/// ) /// /// sweepSketch = startSketchOn('XY') -/// |> circle({ +/// |> circle( /// center = [0, 0], /// radius = 2, -/// }, %) +/// ) /// |> hole(pipeHole, %) /// |> sweep(path = sweepPath) /// |> appearance( diff --git a/src/wasm-lib/kcl/src/std/args.rs b/src/wasm-lib/kcl/src/std/args.rs index bacac2f24b..e5088d6046 100644 --- a/src/wasm-lib/kcl/src/std/args.rs +++ b/src/wasm-lib/kcl/src/std/args.rs @@ -444,19 +444,6 @@ impl Args { Ok((a.n, b.n, ty)) } - pub(crate) fn get_circle_args( - &self, - ) -> Result< - ( - crate::std::shapes::CircleData, - crate::std::shapes::SketchOrSurface, - Option, - ), - KclError, - > { - FromArgs::from_args(self, 0) - } - pub(crate) fn get_sketches(&self) -> Result<(SketchSet, Sketch), KclError> { FromArgs::from_args(self, 0) } @@ -1080,15 +1067,6 @@ impl<'a> FromKclValue<'a> for super::revolve::RevolveData { } } -impl<'a> FromKclValue<'a> for super::shapes::CircleData { - fn from_kcl_val(arg: &'a KclValue) -> Option { - let obj = arg.as_object()?; - let_field_of!(obj, center); - let_field_of!(obj, radius); - Some(Self { center, radius }) - } -} - impl<'a> FromKclValue<'a> for super::sketch::TangentialArcData { fn from_kcl_val(arg: &'a KclValue) -> Option { let obj = arg.as_object()?; diff --git a/src/wasm-lib/kcl/src/std/array.rs b/src/wasm-lib/kcl/src/std/array.rs index e35f22b67b..ecc5c772fe 100644 --- a/src/wasm-lib/kcl/src/std/array.rs +++ b/src/wasm-lib/kcl/src/std/array.rs @@ -30,7 +30,7 @@ pub async fn map(exec_state: &mut ExecState, args: Args) -> Result circle({ center: [id * 2 * r, 0], radius: r}, %) +/// |> circle( center= [id * 2 * r, 0], radius= r) /// } /// /// // Call `drawCircle`, passing in each element of the array. @@ -48,7 +48,7 @@ pub async fn map(exec_state: &mut ExecState, args: Args) -> Result circle({ center: [id * 2 * r, 0], radius: r}, %) +/// |> circle( center= [id * 2 * r, 0], radius= r) /// } /// ) /// ``` diff --git a/src/wasm-lib/kcl/src/std/convert.rs b/src/wasm-lib/kcl/src/std/convert.rs index b9917fb385..061e28fd41 100644 --- a/src/wasm-lib/kcl/src/std/convert.rs +++ b/src/wasm-lib/kcl/src/std/convert.rs @@ -25,7 +25,7 @@ pub async fn int(_exec_state: &mut ExecState, args: Args) -> Result circle({ center = [0, 0], radius = 2 }, %) +/// |> circle(center = [0, 0], radius = 2 ) /// |> extrude(length = 5) /// |> patternTransform(instances = n, transform = fn(id) { /// return { translate = [4 * id, 0, 0] } diff --git a/src/wasm-lib/kcl/src/std/helix.rs b/src/wasm-lib/kcl/src/std/helix.rs index 6a0bc72e01..485f8fe5db 100644 --- a/src/wasm-lib/kcl/src/std/helix.rs +++ b/src/wasm-lib/kcl/src/std/helix.rs @@ -42,7 +42,7 @@ pub async fn helix(exec_state: &mut ExecState, args: Args) -> Result circle({ center = [0, 0], radius = 0.5 }, %) +/// |> circle( center = [0, 0], radius = 0.5) /// |> sweep(path = helixPath) /// ``` /// @@ -63,7 +63,7 @@ pub async fn helix(exec_state: &mut ExecState, args: Args) -> Result circle({ center = [0, 0], radius = 0.5 }, %) +/// |> circle( center = [0, 0], radius = 0.5 ) /// |> sweep(path = helixPath) /// ``` /// @@ -85,7 +85,7 @@ pub async fn helix(exec_state: &mut ExecState, args: Args) -> Result circle({ center = [0, 0], radius = 1 }, %) +/// |> circle( center = [0, 0], radius = 1 ) /// |> sweep(path = helixPath) /// ``` #[stdlib { @@ -206,7 +206,7 @@ pub async fn helix_revolutions(exec_state: &mut ExecState, args: Args) -> Result /// /// ```no_run /// part001 = startSketchOn('XY') -/// |> circle({ center: [5, 5], radius: 10 }, %) +/// |> circle( center= [5, 5], radius= 10 ) /// |> extrude(length = 10) /// |> helixRevolutions({ /// angleStart = 0, diff --git a/src/wasm-lib/kcl/src/std/loft.rs b/src/wasm-lib/kcl/src/std/loft.rs index 187cc51b20..15e98eedc7 100644 --- a/src/wasm-lib/kcl/src/std/loft.rs +++ b/src/wasm-lib/kcl/src/std/loft.rs @@ -78,10 +78,10 @@ pub async fn loft(exec_state: &mut ExecState, args: Args) -> Result close() /// /// circleSketch0 = startSketchOn(offsetPlane('XY', offset = 75)) -/// |> circle({ center = [0, 100], radius = 50 }, %) +/// |> circle( center = [0, 100], radius = 50 ) /// /// circleSketch1 = startSketchOn(offsetPlane('XY', offset = 150)) -/// |> circle({ center = [0, 100], radius = 20 }, %) +/// |> circle( center = [0, 100], radius = 20 ) /// /// loft([squareSketch, circleSketch0, circleSketch1]) /// ``` @@ -97,10 +97,10 @@ pub async fn loft(exec_state: &mut ExecState, args: Args) -> Result close() /// /// circleSketch0 = startSketchOn(offsetPlane('XY', offset = 75)) -/// |> circle({ center = [0, 100], radius = 50 }, %) +/// |> circle( center = [0, 100], radius = 50 ) /// /// circleSketch1 = startSketchOn(offsetPlane('XY', offset = 150)) -/// |> circle({ center = [0, 100], radius = 20 }, %) +/// |> circle( center = [0, 100], radius = 20 ) /// /// loft([squareSketch, circleSketch0, circleSketch1], /// baseCurveIndex = 0, diff --git a/src/wasm-lib/kcl/src/std/math.rs b/src/wasm-lib/kcl/src/std/math.rs index b25c19f91c..8328642684 100644 --- a/src/wasm-lib/kcl/src/std/math.rs +++ b/src/wasm-lib/kcl/src/std/math.rs @@ -78,7 +78,7 @@ pub async fn pi(_exec_state: &mut ExecState, args: Args) -> Result circle({ center = [0, 0], radius = circumference/ (2 * pi()) }, %) +/// |> circle( center = [0, 0], radius = circumference/ (2 * pi()) ) /// /// example = extrude(exampleSketch, length = 5) /// ``` diff --git a/src/wasm-lib/kcl/src/std/patterns.rs b/src/wasm-lib/kcl/src/std/patterns.rs index 89f8092be3..0fb195937b 100644 --- a/src/wasm-lib/kcl/src/std/patterns.rs +++ b/src/wasm-lib/kcl/src/std/patterns.rs @@ -117,7 +117,7 @@ pub async fn pattern_transform_2d(exec_state: &mut ExecState, args: Args) -> Res /// /// // Sketch 4 cylinders. /// sketch001 = startSketchOn('XZ') -/// |> circle({ center = [0, 0], radius = 2 }, %) +/// |> circle(center = [0, 0], radius = 2) /// |> extrude(length = 5) /// |> patternTransform(instances = 4, transform = transform) /// ``` @@ -130,7 +130,7 @@ pub async fn pattern_transform_2d(exec_state: &mut ExecState, args: Args) -> Res /// } /// /// sketch001 = startSketchOn('XZ') -/// |> circle({ center = [0, 0], radius = 2 }, %) +/// |> circle(center = [0, 0], radius = 2) /// |> extrude(length = 5) /// |> patternTransform(instances = 4, transform = transform) /// ``` @@ -226,7 +226,7 @@ pub async fn pattern_transform_2d(exec_state: &mut ExecState, args: Args) -> Res /// // Each layer is just a pretty thin cylinder. /// fn layer() { /// return startSketchOn("XY") // or some other plane idk -/// |> circle({ center = [0, 0], radius = 1 }, %, $tag1) +/// |> circle(center = [0, 0], radius = 1, tag = $tag1) /// |> extrude(length = h) /// } /// // The vase is 100 layers tall. @@ -303,7 +303,7 @@ async fn inner_pattern_transform<'a>( /// /// // Sketch 4 circles. /// sketch001 = startSketchOn('XZ') -/// |> circle({ center: [0, 0], radius: 2 }, %) +/// |> circle(center= [0, 0], radius= 2) /// |> patternTransform2d(instances = 4, transform = transform) /// ``` #[stdlib { @@ -715,7 +715,7 @@ pub async fn pattern_linear_2d(exec_state: &mut ExecState, args: Args) -> Result /// /// ```no_run /// exampleSketch = startSketchOn('XZ') -/// |> circle({ center = [0, 0], radius = 1 }, %) +/// |> circle(center = [0, 0], radius = 1) /// |> patternLinear2d( /// axis = [1, 0], /// instances = 7, @@ -821,11 +821,11 @@ pub async fn pattern_linear_3d(exec_state: &mut ExecState, args: Args) -> Result /// |> extrude(length = 65) /// /// const thing1 = startSketchOn(case, 'end') -/// |> circle({center = [-size / 2, -size / 2], radius = 25}, %) +/// |> circle(center = [-size / 2, -size / 2], radius = 25) /// |> extrude(length = 50) /// /// const thing2 = startSketchOn(case, 'end') -/// |> circle({center = [size / 2, -size / 2], radius = 25}, %) +/// |> circle(center = [size / 2, -size / 2], radius = 25) /// |> extrude(length = 50) /// /// // We pass in the "case" here since we want to pattern the whole sketch. @@ -849,7 +849,7 @@ pub async fn pattern_linear_3d(exec_state: &mut ExecState, args: Args) -> Result /// |> extrude(length = 65) /// /// const thing1 = startSketchOn(case, 'end') -/// |> circle({ center =[-size / 2, -size / 2], radius = 25}, %) +/// |> circle(center =[-size / 2, -size / 2], radius = 25) /// |> extrude(length = 50) /// /// // We pass in `thing1` here with `useOriginal` since we want to pattern just this object on the face. @@ -1166,7 +1166,7 @@ pub async fn pattern_circular_3d(exec_state: &mut ExecState, args: Args) -> Resu /// /// ```no_run /// exampleSketch = startSketchOn('XZ') -/// |> circle({ center = [0, 0], radius = 1 }, %) +/// |> circle(center = [0, 0], radius = 1) /// /// example = extrude(exampleSketch, length = -5) /// |> patternCircular3d( diff --git a/src/wasm-lib/kcl/src/std/planes.rs b/src/wasm-lib/kcl/src/std/planes.rs index a4c3573862..915130d0a3 100644 --- a/src/wasm-lib/kcl/src/std/planes.rs +++ b/src/wasm-lib/kcl/src/std/planes.rs @@ -36,7 +36,7 @@ pub async fn offset_plane(exec_state: &mut ExecState, args: Args) -> Result close() /// /// circleSketch = startSketchOn(offsetPlane('XY', offset = 150)) -/// |> circle({ center = [0, 100], radius = 50 }, %) +/// |> circle( center = [0, 100], radius = 50 ) /// /// loft([squareSketch, circleSketch]) /// ``` @@ -52,7 +52,7 @@ pub async fn offset_plane(exec_state: &mut ExecState, args: Args) -> Result close() /// /// circleSketch = startSketchOn(offsetPlane('XZ', offset = 150)) -/// |> circle({ center = [0, 100], radius = 50 }, %) +/// |> circle( center = [0, 100], radius = 50 ) /// /// loft([squareSketch, circleSketch]) /// ``` @@ -68,7 +68,7 @@ pub async fn offset_plane(exec_state: &mut ExecState, args: Args) -> Result close() /// /// circleSketch = startSketchOn(offsetPlane('YZ', offset = 150)) -/// |> circle({ center = [0, 100], radius = 50 }, %) +/// |> circle( center = [0, 100], radius = 50 ) /// /// loft([squareSketch, circleSketch]) /// ``` @@ -84,7 +84,7 @@ pub async fn offset_plane(exec_state: &mut ExecState, args: Args) -> Result close() /// /// circleSketch = startSketchOn(offsetPlane('-XZ', offset = -150)) -/// |> circle({ center = [0, 100], radius = 50 }, %) +/// |> circle( center = [0, 100], radius = 50 ) /// /// loft([squareSketch, circleSketch]) /// ``` @@ -92,7 +92,7 @@ pub async fn offset_plane(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) -/// |> circle({ radius = 10, center = [0, 0] }, %) +/// |> circle( radius = 10, center = [0, 0] ) /// /// // Triangle on the plane 4 units above /// startSketchOn(offsetPlane("XY", offset = 4)) diff --git a/src/wasm-lib/kcl/src/std/revolve.rs b/src/wasm-lib/kcl/src/std/revolve.rs index 43d22b9665..09a017a8b1 100644 --- a/src/wasm-lib/kcl/src/std/revolve.rs +++ b/src/wasm-lib/kcl/src/std/revolve.rs @@ -63,7 +63,7 @@ pub async fn revolve(exec_state: &mut ExecState, args: Args) -> Result circle({ center = [15, 0], radius = 5 }, %) +/// |> circle( center = [15, 0], radius = 5 ) /// |> revolve({ /// angle = 360, /// axis = 'y' @@ -115,7 +115,7 @@ pub async fn revolve(exec_state: &mut ExecState, args: Args) -> Result extrude(length = 20) /// /// sketch001 = startSketchOn(box, "END") -/// |> circle({ center = [10,10], radius = 4 }, %) +/// |> circle( center = [10,10], radius = 4 ) /// |> revolve({ /// angle = -90, /// axis = 'y' @@ -132,7 +132,7 @@ pub async fn revolve(exec_state: &mut ExecState, args: Args) -> Result extrude(length = 20) /// /// sketch001 = startSketchOn(box, "END") -/// |> circle({ center = [10,10], radius = 4 }, %) +/// |> circle( center = [10,10], radius = 4 ) /// |> revolve({ /// angle = 90, /// axis = getOppositeEdge(revolveAxis) @@ -149,7 +149,7 @@ pub async fn revolve(exec_state: &mut ExecState, args: Args) -> Result extrude(length = 20) /// /// sketch001 = startSketchOn(box, "END") -/// |> circle({ center = [10,10], radius = 4 }, %) +/// |> circle( center = [10,10], radius = 4 ) /// |> revolve({ /// angle = 90, /// axis = getOppositeEdge(revolveAxis), diff --git a/src/wasm-lib/kcl/src/std/segment.rs b/src/wasm-lib/kcl/src/std/segment.rs index 40d0418c4f..f0c4134e24 100644 --- a/src/wasm-lib/kcl/src/std/segment.rs +++ b/src/wasm-lib/kcl/src/std/segment.rs @@ -34,7 +34,7 @@ pub async fn segment_end(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) -/// |> circle({ radius = radius, center = segEnd(tag) }, %) +/// |> circle(radius = radius, center = segEnd(tag) ) /// |> extrude(length = radius) /// } /// @@ -170,7 +170,7 @@ pub async fn segment_start(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) -/// |> circle({ radius = radius, center = segStart(tag) }, %) +/// |> circle( radius = radius, center = segStart(tag) ) /// |> extrude(length = radius) /// } /// @@ -536,7 +536,7 @@ pub async fn tangent_to_end(exec_state: &mut ExecState, args: Args) -> Result circle({ center: [0, 0], radius: 3 }, %, $circ) +/// |> circle( center= [0, 0], radius= 3 , tag= $circ) /// /// triangleSketch = startSketchOn("XY") /// |> startProfileAt([-5, 0], %) diff --git a/src/wasm-lib/kcl/src/std/shapes.rs b/src/wasm-lib/kcl/src/std/shapes.rs index eeec31e4ac..083d0b5b17 100644 --- a/src/wasm-lib/kcl/src/std/shapes.rs +++ b/src/wasm-lib/kcl/src/std/shapes.rs @@ -18,6 +18,7 @@ use crate::{ execution::{BasePath, ExecState, GeoMeta, KclValue, Path, Sketch, SketchSurface}, parsing::ast::types::TagNode, std::{ + sketch::NEW_TAG_KW, utils::{calculate_circle_center, distance}, Args, }, @@ -32,24 +33,14 @@ pub enum SketchOrSurface { Sketch(Box), } -/// Data for drawing an circle -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] -#[ts(export)] -#[serde(rename_all = "camelCase")] -// TODO: make sure the docs on the args below are correct. -pub struct CircleData { - /// The center of the circle. - pub center: [f64; 2], - /// The circle radius - pub radius: f64, -} - /// Sketch a circle. pub async fn circle(exec_state: &mut ExecState, args: Args) -> Result { - let (data, sketch_surface_or_group, tag): (CircleData, SketchOrSurface, Option) = - args.get_circle_args()?; + let sketch_or_surface = args.get_unlabeled_kw_arg("sketchOrSurface")?; + let center = args.get_kw_arg("center")?; + let radius = args.get_kw_arg("radius")?; + let tag = args.get_kw_arg_opt(NEW_TAG_KW)?; - let sketch = inner_circle(data, sketch_surface_or_group, tag, exec_state, args).await?; + let sketch = inner_circle(sketch_or_surface, center, radius, tag, exec_state, args).await?; Ok(KclValue::Sketch { value: Box::new(sketch), }) @@ -60,7 +51,7 @@ pub async fn circle(exec_state: &mut ExecState, args: Args) -> Result circle({ center = [0, 0], radius = 10 }, %) +/// |> circle( center = [0, 0], radius = 10 ) /// /// example = extrude(exampleSketch, length = 5) /// ``` @@ -72,27 +63,36 @@ pub async fn circle(exec_state: &mut ExecState, args: Args) -> Result line(end = [0, 30]) /// |> line(end = [-30, 0]) /// |> close() -/// |> hole(circle({ center = [0, 15], radius = 5 }, %), %) +/// |> hole(circle( center = [0, 15], radius = 5), %) /// /// example = extrude(exampleSketch, length = 5) /// ``` #[stdlib { name = "circle", + keywords = true, + unlabeled_first = true, + args = { + sketch_or_surface = {docs = "Plane or surface to sketch on."}, + center = {docs = "The center of the circle."}, + radius = {docs = "The radius of the circle."}, + tag = { docs = "Create a new tag which refers to this circle"}, + } }] async fn inner_circle( - data: CircleData, - sketch_surface_or_group: SketchOrSurface, + sketch_or_surface: SketchOrSurface, + center: [f64; 2], + radius: f64, tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { - let sketch_surface = match sketch_surface_or_group { + let sketch_surface = match sketch_or_surface { SketchOrSurface::SketchSurface(surface) => surface, - SketchOrSurface::Sketch(group) => group.on, + SketchOrSurface::Sketch(s) => s.on, }; let units = sketch_surface.units(); let sketch = crate::std::sketch::inner_start_profile_at( - [data.center[0] + data.radius, data.center[1]], + [center[0] + radius, center[1]], sketch_surface, None, exec_state, @@ -100,7 +100,7 @@ async fn inner_circle( ) .await?; - let from = [data.center[0] + data.radius, data.center[1]]; + let from = [center[0] + radius, center[1]]; let angle_start = Angle::zero(); let angle_end = Angle::turn(); @@ -113,8 +113,8 @@ async fn inner_circle( segment: PathSegment::Arc { start: angle_start, end: angle_end, - center: KPoint2d::from(data.center).map(LengthUnit), - radius: data.radius.into(), + center: KPoint2d::from(center).map(LengthUnit), + radius: radius.into(), relative: false, }, }), @@ -132,8 +132,8 @@ async fn inner_circle( metadata: args.source_range.into(), }, }, - radius: data.radius, - center: data.center, + radius, + center, ccw: angle_start < angle_end, }; diff --git a/src/wasm-lib/kcl/src/std/shell.rs b/src/wasm-lib/kcl/src/std/shell.rs index bc771af154..d6de44b282 100644 --- a/src/wasm-lib/kcl/src/std/shell.rs +++ b/src/wasm-lib/kcl/src/std/shell.rs @@ -109,11 +109,11 @@ pub async fn shell(exec_state: &mut ExecState, args: Args) -> Result extrude(length = 65) /// /// thing1 = startSketchOn(case, 'end') -/// |> circle({ center = [-size / 2, -size / 2], radius = 25 }, %) +/// |> circle( center = [-size / 2, -size / 2], radius = 25 ) /// |> extrude(length = 50) /// /// thing2 = startSketchOn(case, 'end') -/// |> circle({ center = [size / 2, -size / 2], radius = 25 }, %) +/// |> circle( center = [size / 2, -size / 2], radius = 25 ) /// |> extrude(length = 50) /// /// // We put "case" in the shell function to shell the entire object. @@ -132,11 +132,11 @@ pub async fn shell(exec_state: &mut ExecState, args: Args) -> Result extrude(length = 65) /// /// thing1 = startSketchOn(case, 'end') -/// |> circle({ center = [-size / 2, -size / 2], radius = 25 }, %) +/// |> circle( center = [-size / 2, -size / 2], radius = 25 ) /// |> extrude(length = 50) /// /// thing2 = startSketchOn(case, 'end') -/// |> circle({ center = [size / 2, -size / 2], radius = 25 }, %) +/// |> circle( center = [size / 2, -size / 2], radius = 25 ) /// |> extrude(length = 50) /// /// // We put "thing1" in the shell function to shell the end face of the object. @@ -157,11 +157,11 @@ pub async fn shell(exec_state: &mut ExecState, args: Args) -> Result extrude(length = 65) /// /// thing1 = startSketchOn(case, 'end') -/// |> circle({ center = [-size / 2, -size / 2], radius = 25 }, %) +/// |> circle( center = [-size / 2, -size / 2], radius = 25 ) /// |> extrude(length = 50) /// /// thing2 = startSketchOn(case, 'end') -/// |> circle({ center = [size / 2, -size / 2], radius = 25 }, %) +/// |> circle( center = [size / 2, -size / 2], radius = 25) /// |> extrude(length = 50) /// /// // We put "thing1" and "thing2" in the shell function to shell the end face of the object. @@ -293,11 +293,11 @@ pub async fn hollow(exec_state: &mut ExecState, args: Args) -> Result extrude(length = 65) /// /// thing1 = startSketchOn(case, 'end') -/// |> circle({ center = [-size / 2, -size / 2], radius = 25 }, %) +/// |> circle( center = [-size / 2, -size / 2], radius = 25 ) /// |> extrude(length = 50) /// /// thing2 = startSketchOn(case, 'end') -/// |> circle({ center = [size / 2, -size / 2], radius = 25 }, %) +/// |> circle( center = [size / 2, -size / 2], radius = 25 ) /// |> extrude(length = 50) /// /// hollow(0.5, case) diff --git a/src/wasm-lib/kcl/src/std/sketch.rs b/src/wasm-lib/kcl/src/std/sketch.rs index f12b0b49f2..d07a5f9fd7 100644 --- a/src/wasm-lib/kcl/src/std/sketch.rs +++ b/src/wasm-lib/kcl/src/std/sketch.rs @@ -2272,8 +2272,8 @@ pub async fn hole(exec_state: &mut ExecState, args: Args) -> Result line(end = [5, 0]) /// |> line(end = [0, -5]) /// |> close() -/// |> hole(circle({ center = [1, 1], radius = .25 }, %), %) -/// |> hole(circle({ center = [1, 4], radius = .25 }, %), %) +/// |> hole(circle( center = [1, 1], radius = .25 ), %) +/// |> hole(circle( center = [1, 4], radius = .25 ), %) /// /// example = extrude(exampleSketch, length = 1) /// ``` @@ -2290,7 +2290,7 @@ pub async fn hole(exec_state: &mut ExecState, args: Args) -> Result circle({ center = [0, 0], radius = 3 }, %) +/// |> circle( center = [0, 0], radius = 3 ) /// |> hole(squareHoleSketch(), %) /// example = extrude(exampleSketch, length = 1) /// ``` diff --git a/src/wasm-lib/kcl/src/std/sweep.rs b/src/wasm-lib/kcl/src/std/sweep.rs index 8ef0f976c5..c3b4a463cd 100644 --- a/src/wasm-lib/kcl/src/std/sweep.rs +++ b/src/wasm-lib/kcl/src/std/sweep.rs @@ -61,16 +61,16 @@ pub async fn sweep(exec_state: &mut ExecState, args: Args) -> Result circle({ +/// |> circle( /// center = [0, 0], /// radius = 1.5, -/// }, %) +/// ) /// /// sweepSketch = startSketchOn('XY') -/// |> circle({ +/// |> circle( /// center = [0, 0], /// radius = 2, -/// }, %) +/// ) /// |> hole(pipeHole, %) /// |> sweep(path = sweepPath) /// ``` @@ -91,7 +91,7 @@ pub async fn sweep(exec_state: &mut ExecState, args: Args) -> Result circle({ center = [0, 0], radius = 1 }, %) +/// |> circle( center = [0, 0], radius = 1) /// |> sweep(path = helixPath) /// ``` #[stdlib { diff --git a/src/wasm-lib/kcl/src/std/transform.rs b/src/wasm-lib/kcl/src/std/transform.rs index 96ee9f4506..d255e23185 100644 --- a/src/wasm-lib/kcl/src/std/transform.rs +++ b/src/wasm-lib/kcl/src/std/transform.rs @@ -57,16 +57,16 @@ pub async fn scale(exec_state: &mut ExecState, args: Args) -> Result circle({ +/// |> circle( /// center = [0, 0], /// radius = 1.5, -/// }, %) +/// ) /// /// sweepSketch = startSketchOn('XY') -/// |> circle({ +/// |> circle( /// center = [0, 0], /// radius = 2, -/// }, %) +/// ) /// |> hole(pipeHole, %) /// |> sweep(path = sweepPath) /// |> scale( @@ -150,16 +150,16 @@ pub async fn translate(exec_state: &mut ExecState, args: Args) -> Result circle({ +/// |> circle( /// center = [0, 0], /// radius = 1.5, -/// }, %) +/// ) /// /// sweepSketch = startSketchOn('XY') -/// |> circle({ +/// |> circle( /// center = [0, 0], /// radius = 2, -/// }, %) +/// ) /// |> hole(pipeHole, %) /// |> sweep(path = sweepPath) /// |> translate( @@ -369,16 +369,16 @@ pub async fn rotate(exec_state: &mut ExecState, args: Args) -> Result circle({ +/// |> circle( /// center = [0, 0], /// radius = 1.5, -/// }, %) +/// ) /// /// sweepSketch = startSketchOn('XY') -/// |> circle({ +/// |> circle( /// center = [0, 0], /// radius = 2, -/// }, %) +/// ) /// |> hole(pipeHole, %) /// |> sweep(path = sweepPath) /// |> rotate( @@ -408,16 +408,16 @@ pub async fn rotate(exec_state: &mut ExecState, args: Args) -> Result circle({ +/// |> circle( /// center = [0, 0], /// radius = 1.5, -/// }, %) +/// ) /// /// sweepSketch = startSketchOn('XY') -/// |> circle({ +/// |> circle( /// center = [0, 0], /// radius = 2, -/// }, %) +/// ) /// |> hole(pipeHole, %) /// |> sweep(path = sweepPath) /// |> rotate( @@ -527,15 +527,15 @@ mod tests { // Create a hole for the pipe. pipeHole = startSketchOn('XY') - |> circle({ + |> circle( center = [0, 0], radius = 1.5, - }, %) + ) sweepSketch = startSketchOn('XY') - |> circle({ + |> circle( center = [0, 0], radius = 2, - }, %) + ) |> hole(pipeHole, %) |> sweep( path = sweepPath, @@ -550,8 +550,8 @@ sweepSketch = startSketchOn('XY') let result = parse_execute(&ast).await; assert!(result.is_err()); assert_eq!( - result.unwrap_err().to_string(), - r#"semantic: KclErrorDetails { source_ranges: [SourceRange([630, 638, 0])], message: "Expected `roll`, `pitch`, and `yaw` or `axis` and `angle` to be provided." }"#.to_string() + result.unwrap_err().message(), + r#"Expected `roll`, `pitch`, and `yaw` or `axis` and `angle` to be provided."#.to_string() ); } @@ -566,8 +566,8 @@ sweepSketch = startSketchOn('XY') let result = parse_execute(&ast).await; assert!(result.is_err()); assert_eq!( - result.unwrap_err().to_string(), - r#"semantic: KclErrorDetails { source_ranges: [SourceRange([630, 668, 0])], message: "Expected `angle` to be provided when `axis` is provided." }"#.to_string() + result.unwrap_err().message(), + r#"Expected `angle` to be provided when `axis` is provided."#.to_string() ); } @@ -582,8 +582,8 @@ sweepSketch = startSketchOn('XY') let result = parse_execute(&ast).await; assert!(result.is_err()); assert_eq!( - result.unwrap_err().to_string(), - r#"semantic: KclErrorDetails { source_ranges: [SourceRange([630, 659, 0])], message: "Expected `axis` to be provided when `angle` is provided." }"#.to_string() + result.unwrap_err().message(), + r#"Expected `axis` to be provided when `angle` is provided."#.to_string() ); } @@ -599,8 +599,8 @@ sweepSketch = startSketchOn('XY') let result = parse_execute(&ast).await; assert!(result.is_err()); assert_eq!( - result.unwrap_err().to_string(), - r#"semantic: KclErrorDetails { source_ranges: [SourceRange([630, 685, 0])], message: "Expected angle to be between -360 and 360, found `900`" }"#.to_string() + result.unwrap_err().message(), + r#"Expected angle to be between -360 and 360, found `900`"#.to_string() ); } @@ -617,8 +617,8 @@ sweepSketch = startSketchOn('XY') let result = parse_execute(&ast).await; assert!(result.is_err()); assert_eq!( - result.unwrap_err().to_string(), - r#"semantic: KclErrorDetails { source_ranges: [SourceRange([630, 697, 0])], message: "Expected `roll` to be provided when `pitch` or `yaw` is provided." }"#.to_string() + result.unwrap_err().message(), + r#"Expected `roll` to be provided when `pitch` or `yaw` is provided."#.to_string() ); } @@ -633,8 +633,8 @@ sweepSketch = startSketchOn('XY') let result = parse_execute(&ast).await; assert!(result.is_err()); assert_eq!( - result.unwrap_err().to_string(), - r#"semantic: KclErrorDetails { source_ranges: [SourceRange([630, 657, 0])], message: "Expected `roll` to be provided when `pitch` or `yaw` is provided." }"#.to_string() + result.unwrap_err().message(), + r#"Expected `roll` to be provided when `pitch` or `yaw` is provided."#.to_string() ); } @@ -651,8 +651,8 @@ sweepSketch = startSketchOn('XY') let result = parse_execute(&ast).await; assert!(result.is_err()); assert_eq!( - result.unwrap_err().to_string(), - r#"semantic: KclErrorDetails { source_ranges: [SourceRange([630, 689, 0])], message: "Expected yaw to be between -360 and 360, found `900`" }"#.to_string() + result.unwrap_err().message(), + r#"Expected yaw to be between -360 and 360, found `900`"#.to_string() ); } @@ -669,8 +669,8 @@ sweepSketch = startSketchOn('XY') let result = parse_execute(&ast).await; assert!(result.is_err()); assert_eq!( - result.unwrap_err().to_string(), - r#"semantic: KclErrorDetails { source_ranges: [SourceRange([630, 689, 0])], message: "Expected roll to be between -360 and 360, found `900`" }"#.to_string() + result.unwrap_err().message(), + r#"Expected roll to be between -360 and 360, found `900`"#.to_string() ); } @@ -687,8 +687,8 @@ sweepSketch = startSketchOn('XY') let result = parse_execute(&ast).await; assert!(result.is_err()); assert_eq!( - result.unwrap_err().to_string(), - r#"semantic: KclErrorDetails { source_ranges: [SourceRange([630, 689, 0])], message: "Expected pitch to be between -360 and 360, found `900`" }"#.to_string() + result.unwrap_err().message(), + r#"Expected pitch to be between -360 and 360, found `900`"#.to_string() ); } @@ -706,8 +706,9 @@ sweepSketch = startSketchOn('XY') let result = parse_execute(&ast).await; assert!(result.is_err()); assert_eq!( - result.unwrap_err().to_string(), - r#"semantic: KclErrorDetails { source_ranges: [SourceRange([630, 704, 0])], message: "Expected `axis` and `angle` to not be provided when `roll`, `pitch`, and `yaw` are provided." }"#.to_string() + result.unwrap_err().message(), + r#"Expected `axis` and `angle` to not be provided when `roll`, `pitch`, and `yaw` are provided."# + .to_string() ); } } diff --git a/src/wasm-lib/kcl/src/unparser.rs b/src/wasm-lib/kcl/src/unparser.rs index 2fccff9a65..170816e83e 100644 --- a/src/wasm-lib/kcl/src/unparser.rs +++ b/src/wasm-lib/kcl/src/unparser.rs @@ -1481,13 +1481,13 @@ tabs_r = startSketchOn({ |> line([0, -10], %) |> line([-10, -5], %) |> close() - |> hole(circle({ + |> hole(circle( center = [ width / 2 + thk + hole_diam, length / 2 - hole_diam ], radius = hole_diam / 2 - }, %), %) + ), %) |> extrude(-thk, %) |> patternLinear3d( axis = [0, -1, 0], @@ -1508,13 +1508,13 @@ tabs_l = startSketchOn({ |> line([0, -10], %) |> line([10, -5], %) |> close() - |> hole(circle({ + |> hole(circle( center = [ -width / 2 - thk - hole_diam, length / 2 - hole_diam ], radius = hole_diam / 2 - }, %), %) + ), %) |> extrude(-thk, %) |> patternLinear3d(axis = [0, -1, 0], repetitions = 1, distance = length - 10) "#; @@ -1602,13 +1602,13 @@ tabs_r = startSketchOn({ |> line([0, -10], %) |> line([-10, -5], %) |> close() - |> hole(circle({ + |> hole(circle( center = [ width / 2 + thk + hole_diam, length / 2 - hole_diam ], - radius = hole_diam / 2 - }, %), %) + radius = hole_diam / 2, + ), %) |> extrude(-thk, %) |> patternLinear3d(axis = [0, -1, 0], repetitions = 1, distance = length - 10) // build the tabs of the mounting bracket (left side) @@ -1625,13 +1625,13 @@ tabs_l = startSketchOn({ |> line([0, -10], %) |> line([10, -5], %) |> close() - |> hole(circle({ + |> hole(circle( center = [ -width / 2 - thk - hole_diam, length / 2 - hole_diam ], - radius = hole_diam / 2 - }, %), %) + radius = hole_diam / 2, + ), %) |> extrude(-thk, %) |> patternLinear3d(axis = [0, -1, 0], repetitions = 1, distance = length - 10) "# diff --git a/src/wasm-lib/kcl/std/math.kcl b/src/wasm-lib/kcl/std/math.kcl index b53b28fb55..f2d4d17144 100644 --- a/src/wasm-lib/kcl/std/math.kcl +++ b/src/wasm-lib/kcl/std/math.kcl @@ -6,7 +6,7 @@ /// circumference = 70 /// /// exampleSketch = startSketchOn("XZ") -/// |> circle({ center = [0, 0], radius = circumference/ (2 * PI) }, %) +/// |> circle(center = [0, 0], radius = circumference/ (2 * PI)) /// /// example = extrude(exampleSketch, length = 5) /// ``` diff --git a/src/wasm-lib/kcl/tests/assembly_non_default_units/artifact_commands.snap b/src/wasm-lib/kcl/tests/assembly_non_default_units/artifact_commands.snap index 27c40336dd..6264127805 100644 --- a/src/wasm-lib/kcl/tests/assembly_non_default_units/artifact_commands.snap +++ b/src/wasm-lib/kcl/tests/assembly_non_default_units/artifact_commands.snap @@ -338,7 +338,7 @@ description: Artifact commands assembly_non_default_units.kcl "cmdId": "[uuid]", "range": [ 197, - 239, + 232, 3 ], "command": { @@ -358,7 +358,7 @@ description: Artifact commands assembly_non_default_units.kcl "cmdId": "[uuid]", "range": [ 197, - 239, + 232, 3 ], "command": { @@ -369,7 +369,7 @@ description: Artifact commands assembly_non_default_units.kcl "cmdId": "[uuid]", "range": [ 197, - 239, + 232, 3 ], "command": { @@ -386,7 +386,7 @@ description: Artifact commands assembly_non_default_units.kcl "cmdId": "[uuid]", "range": [ 197, - 239, + 232, 3 ], "command": { @@ -415,7 +415,7 @@ description: Artifact commands assembly_non_default_units.kcl "cmdId": "[uuid]", "range": [ 197, - 239, + 232, 3 ], "command": { @@ -468,7 +468,7 @@ description: Artifact commands assembly_non_default_units.kcl "cmdId": "[uuid]", "range": [ 114, - 156, + 149, 4 ], "command": { @@ -488,7 +488,7 @@ description: Artifact commands assembly_non_default_units.kcl "cmdId": "[uuid]", "range": [ 114, - 156, + 149, 4 ], "command": { @@ -499,7 +499,7 @@ description: Artifact commands assembly_non_default_units.kcl "cmdId": "[uuid]", "range": [ 114, - 156, + 149, 4 ], "command": { @@ -516,7 +516,7 @@ description: Artifact commands assembly_non_default_units.kcl "cmdId": "[uuid]", "range": [ 114, - 156, + 149, 4 ], "command": { @@ -545,7 +545,7 @@ description: Artifact commands assembly_non_default_units.kcl "cmdId": "[uuid]", "range": [ 114, - 156, + 149, 4 ], "command": { diff --git a/src/wasm-lib/kcl/tests/assembly_non_default_units/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/assembly_non_default_units/artifact_graph_flowchart.snap.md index 845dd5221f..dd526491aa 100644 --- a/src/wasm-lib/kcl/tests/assembly_non_default_units/artifact_graph_flowchart.snap.md +++ b/src/wasm-lib/kcl/tests/assembly_non_default_units/artifact_graph_flowchart.snap.md @@ -1,13 +1,13 @@ ```mermaid flowchart LR subgraph path2 [Path] - 2["Path
[197, 239, 3]"] - 3["Segment
[197, 239, 3]"] + 2["Path
[197, 232, 3]"] + 3["Segment
[197, 232, 3]"] 4[Solid2d] end subgraph path6 [Path] - 6["Path
[114, 156, 4]"] - 7["Segment
[114, 156, 4]"] + 6["Path
[114, 149, 4]"] + 7["Segment
[114, 149, 4]"] 8[Solid2d] end 1["Plane
[172, 191, 3]"] diff --git a/src/wasm-lib/kcl/tests/assembly_non_default_units/other1.kcl b/src/wasm-lib/kcl/tests/assembly_non_default_units/other1.kcl index d05a549654..f7949842e5 100644 --- a/src/wasm-lib/kcl/tests/assembly_non_default_units/other1.kcl +++ b/src/wasm-lib/kcl/tests/assembly_non_default_units/other1.kcl @@ -5,4 +5,4 @@ import radius from "globals.kcl" // Use the same units as in the main importing file. startSketchOn('XZ') - |> circle({ center = [0, 0], radius = 1 }, %) + |> circle(center = [0, 0], radius = 1) diff --git a/src/wasm-lib/kcl/tests/assembly_non_default_units/other2.kcl b/src/wasm-lib/kcl/tests/assembly_non_default_units/other2.kcl index 139063e028..2c2f6365be 100644 --- a/src/wasm-lib/kcl/tests/assembly_non_default_units/other2.kcl +++ b/src/wasm-lib/kcl/tests/assembly_non_default_units/other2.kcl @@ -3,4 +3,4 @@ // Use the same units as in the main importing file. startSketchOn('XZ') - |> circle({ center = [0, 2], radius = 1 }, %) + |> circle(center = [0, 2], radius = 1) diff --git a/src/wasm-lib/kcl/tests/fillet-and-shell/artifact_commands.snap b/src/wasm-lib/kcl/tests/fillet-and-shell/artifact_commands.snap index 47d9b3f91f..b482ecf5a2 100644 --- a/src/wasm-lib/kcl/tests/fillet-and-shell/artifact_commands.snap +++ b/src/wasm-lib/kcl/tests/fillet-and-shell/artifact_commands.snap @@ -1,7 +1,6 @@ --- source: kcl/src/simulation_tests.rs description: Artifact commands fillet-and-shell.kcl -snapshot_kind: text --- [ { @@ -927,7 +926,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 1370, - 1414, + 1407, 0 ], "command": { @@ -947,7 +946,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 1370, - 1414, + 1407, 0 ], "command": { @@ -958,7 +957,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 1370, - 1414, + 1407, 0 ], "command": { @@ -975,7 +974,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 1370, - 1414, + 1407, 0 ], "command": { @@ -1004,7 +1003,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 1370, - 1414, + 1407, 0 ], "command": { @@ -1015,8 +1014,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1427, - 1472, + 1420, + 1458, 0 ], "command": { @@ -1035,8 +1034,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1427, - 1472, + 1420, + 1458, 0 ], "command": { @@ -1046,8 +1045,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1427, - 1472, + 1420, + 1458, 0 ], "command": { @@ -1063,8 +1062,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1427, - 1472, + 1420, + 1458, 0 ], "command": { @@ -1092,8 +1091,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1427, - 1472, + 1420, + 1458, 0 ], "command": { @@ -1104,8 +1103,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1422, - 1476, + 1415, + 1462, 0 ], "command": { @@ -1117,8 +1116,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1422, - 1476, + 1415, + 1462, 0 ], "command": { @@ -1130,8 +1129,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -1150,8 +1149,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -1164,8 +1163,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -1175,8 +1174,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -1187,8 +1186,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -1200,8 +1199,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -1214,8 +1213,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -1228,8 +1227,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -1242,8 +1241,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -1334,7 +1333,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 1370, - 1414, + 1407, 0 ], "command": { @@ -1354,7 +1353,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 1370, - 1414, + 1407, 0 ], "command": { @@ -1365,7 +1364,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 1370, - 1414, + 1407, 0 ], "command": { @@ -1382,7 +1381,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 1370, - 1414, + 1407, 0 ], "command": { @@ -1411,7 +1410,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 1370, - 1414, + 1407, 0 ], "command": { @@ -1422,8 +1421,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1427, - 1472, + 1420, + 1458, 0 ], "command": { @@ -1442,8 +1441,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1427, - 1472, + 1420, + 1458, 0 ], "command": { @@ -1453,8 +1452,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1427, - 1472, + 1420, + 1458, 0 ], "command": { @@ -1470,8 +1469,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1427, - 1472, + 1420, + 1458, 0 ], "command": { @@ -1499,8 +1498,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1427, - 1472, + 1420, + 1458, 0 ], "command": { @@ -1511,8 +1510,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1422, - 1476, + 1415, + 1462, 0 ], "command": { @@ -1524,8 +1523,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1422, - 1476, + 1415, + 1462, 0 ], "command": { @@ -1537,8 +1536,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -1557,8 +1556,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -1571,8 +1570,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -1582,8 +1581,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -1594,8 +1593,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -1607,8 +1606,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -1621,8 +1620,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -1635,8 +1634,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -1649,8 +1648,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -1741,7 +1740,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 1370, - 1414, + 1407, 0 ], "command": { @@ -1761,7 +1760,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 1370, - 1414, + 1407, 0 ], "command": { @@ -1772,7 +1771,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 1370, - 1414, + 1407, 0 ], "command": { @@ -1789,7 +1788,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 1370, - 1414, + 1407, 0 ], "command": { @@ -1818,7 +1817,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 1370, - 1414, + 1407, 0 ], "command": { @@ -1829,8 +1828,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1427, - 1472, + 1420, + 1458, 0 ], "command": { @@ -1849,8 +1848,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1427, - 1472, + 1420, + 1458, 0 ], "command": { @@ -1860,8 +1859,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1427, - 1472, + 1420, + 1458, 0 ], "command": { @@ -1877,8 +1876,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1427, - 1472, + 1420, + 1458, 0 ], "command": { @@ -1906,8 +1905,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1427, - 1472, + 1420, + 1458, 0 ], "command": { @@ -1918,8 +1917,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1422, - 1476, + 1415, + 1462, 0 ], "command": { @@ -1931,8 +1930,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1422, - 1476, + 1415, + 1462, 0 ], "command": { @@ -1944,8 +1943,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -1964,8 +1963,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -1978,8 +1977,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -1989,8 +1988,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -2001,8 +2000,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -2014,8 +2013,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -2028,8 +2027,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -2042,8 +2041,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -2056,8 +2055,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -2148,7 +2147,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 1370, - 1414, + 1407, 0 ], "command": { @@ -2168,7 +2167,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 1370, - 1414, + 1407, 0 ], "command": { @@ -2179,7 +2178,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 1370, - 1414, + 1407, 0 ], "command": { @@ -2196,7 +2195,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 1370, - 1414, + 1407, 0 ], "command": { @@ -2225,7 +2224,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 1370, - 1414, + 1407, 0 ], "command": { @@ -2236,8 +2235,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1427, - 1472, + 1420, + 1458, 0 ], "command": { @@ -2256,8 +2255,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1427, - 1472, + 1420, + 1458, 0 ], "command": { @@ -2267,8 +2266,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1427, - 1472, + 1420, + 1458, 0 ], "command": { @@ -2284,8 +2283,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1427, - 1472, + 1420, + 1458, 0 ], "command": { @@ -2313,8 +2312,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1427, - 1472, + 1420, + 1458, 0 ], "command": { @@ -2325,8 +2324,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1422, - 1476, + 1415, + 1462, 0 ], "command": { @@ -2338,8 +2337,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1422, - 1476, + 1415, + 1462, 0 ], "command": { @@ -2351,8 +2350,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -2371,8 +2370,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -2385,8 +2384,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -2396,8 +2395,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -2408,8 +2407,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -2421,8 +2420,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -2435,8 +2434,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -2449,8 +2448,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -2463,8 +2462,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 1484, - 1508, + 1470, + 1494, 0 ], "command": { @@ -2541,8 +2540,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 2043, - 2098, + 2029, + 2084, 0 ], "command": { diff --git a/src/wasm-lib/kcl/tests/fillet-and-shell/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/fillet-and-shell/artifact_graph_flowchart.snap.md index 0d1f810da7..55afb84a77 100644 --- a/src/wasm-lib/kcl/tests/fillet-and-shell/artifact_graph_flowchart.snap.md +++ b/src/wasm-lib/kcl/tests/fillet-and-shell/artifact_graph_flowchart.snap.md @@ -20,52 +20,52 @@ flowchart LR 31["Path
[1337, 1362, 0]"] end subgraph path32 [Path] - 32["Path
[1370, 1414, 0]"] - 33["Segment
[1370, 1414, 0]"] + 32["Path
[1370, 1407, 0]"] + 33["Segment
[1370, 1407, 0]"] 34[Solid2d] end subgraph path35 [Path] - 35["Path
[1427, 1472, 0]"] - 36["Segment
[1427, 1472, 0]"] + 35["Path
[1420, 1458, 0]"] + 36["Segment
[1420, 1458, 0]"] 37[Solid2d] end subgraph path45 [Path] 45["Path
[1337, 1362, 0]"] end subgraph path46 [Path] - 46["Path
[1370, 1414, 0]"] - 47["Segment
[1370, 1414, 0]"] + 46["Path
[1370, 1407, 0]"] + 47["Segment
[1370, 1407, 0]"] 48[Solid2d] end subgraph path49 [Path] - 49["Path
[1427, 1472, 0]"] - 50["Segment
[1427, 1472, 0]"] + 49["Path
[1420, 1458, 0]"] + 50["Segment
[1420, 1458, 0]"] 51[Solid2d] end subgraph path59 [Path] 59["Path
[1337, 1362, 0]"] end subgraph path60 [Path] - 60["Path
[1370, 1414, 0]"] - 61["Segment
[1370, 1414, 0]"] + 60["Path
[1370, 1407, 0]"] + 61["Segment
[1370, 1407, 0]"] 62[Solid2d] end subgraph path63 [Path] - 63["Path
[1427, 1472, 0]"] - 64["Segment
[1427, 1472, 0]"] + 63["Path
[1420, 1458, 0]"] + 64["Segment
[1420, 1458, 0]"] 65[Solid2d] end subgraph path73 [Path] 73["Path
[1337, 1362, 0]"] end subgraph path74 [Path] - 74["Path
[1370, 1414, 0]"] - 75["Segment
[1370, 1414, 0]"] + 74["Path
[1370, 1407, 0]"] + 75["Segment
[1370, 1407, 0]"] 76[Solid2d] end subgraph path77 [Path] - 77["Path
[1427, 1472, 0]"] - 78["Segment
[1427, 1472, 0]"] + 77["Path
[1420, 1458, 0]"] + 78["Segment
[1420, 1458, 0]"] 79[Solid2d] end 1["Plane
[373, 461, 0]"] @@ -86,28 +86,28 @@ flowchart LR 28["SweepEdge Opposite"] 29["SweepEdge Adjacent"] 30["Plane
[1310, 1329, 0]"] - 38["Sweep Extrusion
[1484, 1508, 0]"] + 38["Sweep Extrusion
[1470, 1494, 0]"] 39[Wall] 40["Cap Start"] 41["Cap End"] 42["SweepEdge Opposite"] 43["SweepEdge Adjacent"] 44["Plane
[1310, 1329, 0]"] - 52["Sweep Extrusion
[1484, 1508, 0]"] + 52["Sweep Extrusion
[1470, 1494, 0]"] 53[Wall] 54["Cap Start"] 55["Cap End"] 56["SweepEdge Opposite"] 57["SweepEdge Adjacent"] 58["Plane
[1310, 1329, 0]"] - 66["Sweep Extrusion
[1484, 1508, 0]"] + 66["Sweep Extrusion
[1470, 1494, 0]"] 67[Wall] 68["Cap Start"] 69["Cap End"] 70["SweepEdge Opposite"] 71["SweepEdge Adjacent"] 72["Plane
[1310, 1329, 0]"] - 80["Sweep Extrusion
[1484, 1508, 0]"] + 80["Sweep Extrusion
[1470, 1494, 0]"] 81[Wall] 82["Cap Start"] 83["Cap End"] diff --git a/src/wasm-lib/kcl/tests/fillet-and-shell/ast.snap b/src/wasm-lib/kcl/tests/fillet-and-shell/ast.snap index a5c6352bad..4b401d0653 100644 --- a/src/wasm-lib/kcl/tests/fillet-and-shell/ast.snap +++ b/src/wasm-lib/kcl/tests/fillet-and-shell/ast.snap @@ -1,7 +1,6 @@ --- source: kcl/src/simulation_tests.rs description: Result of parsing fillet-and-shell.kcl -snapshot_kind: text --- { "Ok": { @@ -1430,7 +1429,7 @@ snapshot_kind: text }, { "declaration": { - "end": 1525, + "end": 1511, "id": { "end": 1283, "name": "m25Screw", @@ -1442,7 +1441,7 @@ snapshot_kind: text "body": [ { "declaration": { - "end": 1508, + "end": 1494, "id": { "end": 1307, "name": "screw", @@ -1526,73 +1525,51 @@ snapshot_kind: text { "arguments": [ { - "end": 1410, - "properties": [ - { - "end": 1394, - "key": { - "end": 1385, - "name": "center", - "start": 1379, + "type": "LabeledArg", + "label": { + "type": "Identifier", + "name": "center" + }, + "arg": { + "elements": [ + { + "end": 1388, + "name": "x", + "start": 1387, + "type": "Identifier", "type": "Identifier" }, - "start": 1379, - "type": "ObjectProperty", - "value": { - "elements": [ - { - "end": 1390, - "name": "x", - "start": 1389, - "type": "Identifier", - "type": "Identifier" - }, - { - "end": 1393, - "name": "y", - "start": 1392, - "type": "Identifier", - "type": "Identifier" - } - ], - "end": 1394, - "start": 1388, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "end": 1408, - "key": { - "end": 1402, - "name": "radius", - "start": 1396, + { + "end": 1391, + "name": "y", + "start": 1390, + "type": "Identifier", "type": "Identifier" - }, - "start": 1396, - "type": "ObjectProperty", - "value": { - "end": 1408, - "raw": "2.5", - "start": 1405, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.5, - "suffix": "None" - } } - } - ], - "start": 1377, - "type": "ObjectExpression", - "type": "ObjectExpression" + ], + "end": 1392, + "start": 1386, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, { - "end": 1413, - "start": 1412, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "type": "Identifier", + "name": "radius" + }, + "arg": { + "end": 1406, + "raw": "2.5", + "start": 1403, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.5, + "suffix": "None" + } + } } ], "callee": { @@ -1601,111 +1578,91 @@ snapshot_kind: text "start": 1370, "type": "Identifier" }, - "end": 1414, + "end": 1407, "start": 1370, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ { "arguments": [ { - "end": 1468, - "properties": [ - { - "end": 1451, - "key": { - "end": 1442, - "name": "center", - "start": 1436, + "type": "LabeledArg", + "label": { + "type": "Identifier", + "name": "center" + }, + "arg": { + "elements": [ + { + "end": 1438, + "name": "x", + "start": 1437, + "type": "Identifier", "type": "Identifier" }, - "start": 1436, - "type": "ObjectProperty", - "value": { - "elements": [ - { - "end": 1447, - "name": "x", - "start": 1446, - "type": "Identifier", - "type": "Identifier" - }, - { - "end": 1450, - "name": "y", - "start": 1449, - "type": "Identifier", - "type": "Identifier" - } - ], - "end": 1451, - "start": 1445, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "end": 1466, - "key": { - "end": 1459, - "name": "radius", - "start": 1453, + { + "end": 1441, + "name": "y", + "start": 1440, + "type": "Identifier", "type": "Identifier" - }, - "start": 1453, - "type": "ObjectProperty", - "value": { - "end": 1466, - "raw": "1.25", - "start": 1462, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.25, - "suffix": "None" - } } - } - ], - "start": 1434, - "type": "ObjectExpression", - "type": "ObjectExpression" + ], + "end": 1442, + "start": 1436, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, { - "end": 1471, - "start": 1470, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "type": "Identifier", + "name": "radius" + }, + "arg": { + "end": 1457, + "raw": "1.25", + "start": 1453, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.25, + "suffix": "None" + } + } } ], "callee": { - "end": 1433, + "end": 1426, "name": "circle", - "start": 1427, + "start": 1420, "type": "Identifier" }, - "end": 1472, - "start": 1427, - "type": "CallExpression", - "type": "CallExpression" + "end": 1458, + "start": 1420, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { - "end": 1475, - "start": 1474, + "end": 1461, + "start": 1460, "type": "PipeSubstitution", "type": "PipeSubstitution" } ], "callee": { - "end": 1426, + "end": 1419, "name": "hole", - "start": 1422, + "start": 1415, "type": "Identifier" }, - "end": 1476, - "start": 1422, + "end": 1462, + "start": 1415, "type": "CallExpression", "type": "CallExpression" }, @@ -1718,28 +1675,28 @@ snapshot_kind: text "name": "length" }, "arg": { - "end": 1507, + "end": 1493, "name": "height", - "start": 1501, + "start": 1487, "type": "Identifier", "type": "Identifier" } } ], "callee": { - "end": 1491, + "end": 1477, "name": "extrude", - "start": 1484, + "start": 1470, "type": "Identifier" }, - "end": 1508, - "start": 1484, + "end": 1494, + "start": 1470, "type": "CallExpressionKw", "type": "CallExpressionKw", "unlabeled": null } ], - "end": 1508, + "end": 1494, "start": 1310, "type": "PipeExpression", "type": "PipeExpression" @@ -1747,7 +1704,7 @@ snapshot_kind: text "start": 1302, "type": "VariableDeclarator" }, - "end": 1508, + "end": 1494, "kind": "const", "start": 1302, "type": "VariableDeclaration", @@ -1755,22 +1712,22 @@ snapshot_kind: text }, { "argument": { - "end": 1523, + "end": 1509, "name": "screw", - "start": 1518, + "start": 1504, "type": "Identifier", "type": "Identifier" }, - "end": 1523, - "start": 1511, + "end": 1509, + "start": 1497, "type": "ReturnStatement", "type": "ReturnStatement" } ], - "end": 1525, + "end": 1511, "start": 1298 }, - "end": 1525, + "end": 1511, "params": [ { "type": "Parameter", @@ -1807,42 +1764,42 @@ snapshot_kind: text "start": 1275, "type": "VariableDeclarator" }, - "end": 1525, + "end": 1511, "kind": "fn", "start": 1272, "type": "VariableDeclaration", "type": "VariableDeclaration" }, { - "end": 1656, + "end": 1642, "expression": { "arguments": [ { - "end": 1584, + "end": 1570, "left": { - "end": 1558, + "end": 1544, "left": { - "end": 1542, + "end": 1528, "name": "border", - "start": 1536, + "start": 1522, "type": "Identifier", "type": "Identifier" }, "operator": "+", "right": { - "end": 1558, + "end": 1544, "left": { - "end": 1554, + "end": 1540, "name": "rpizWidth", - "start": 1545, + "start": 1531, "type": "Identifier", "type": "Identifier" }, "operator": "/", "right": { - "end": 1558, + "end": 1544, "raw": "2", - "start": 1557, + "start": 1543, "type": "Literal", "type": "Literal", "value": { @@ -1850,29 +1807,29 @@ snapshot_kind: text "suffix": "None" } }, - "start": 1545, + "start": 1531, "type": "BinaryExpression", "type": "BinaryExpression" }, - "start": 1536, + "start": 1522, "type": "BinaryExpression", "type": "BinaryExpression" }, "operator": "-", "right": { - "end": 1584, + "end": 1570, "left": { - "end": 1580, + "end": 1566, "name": "widthBetweenScrews", - "start": 1562, + "start": 1548, "type": "Identifier", "type": "Identifier" }, "operator": "/", "right": { - "end": 1584, + "end": 1570, "raw": "2", - "start": 1583, + "start": 1569, "type": "Literal", "type": "Literal", "value": { @@ -1880,24 +1837,24 @@ snapshot_kind: text "suffix": "None" } }, - "start": 1562, + "start": 1548, "type": "BinaryExpression", "type": "BinaryExpression" }, - "start": 1536, + "start": 1522, "type": "BinaryExpression", "type": "BinaryExpression" }, { - "end": 1641, + "end": 1627, "left": { - "end": 1614, + "end": 1600, "left": { - "end": 1597, + "end": 1583, "left": { - "end": 1588, + "end": 1574, "raw": "0", - "start": 1587, + "start": 1573, "type": "Literal", "type": "Literal", "value": { @@ -1907,31 +1864,31 @@ snapshot_kind: text }, "operator": "+", "right": { - "end": 1597, + "end": 1583, "name": "border", - "start": 1591, + "start": 1577, "type": "Identifier", "type": "Identifier" }, - "start": 1587, + "start": 1573, "type": "BinaryExpression", "type": "BinaryExpression" }, "operator": "+", "right": { - "end": 1614, + "end": 1600, "left": { - "end": 1610, + "end": 1596, "name": "rpizLength", - "start": 1600, + "start": 1586, "type": "Identifier", "type": "Identifier" }, "operator": "/", "right": { - "end": 1614, + "end": 1600, "raw": "2", - "start": 1613, + "start": 1599, "type": "Literal", "type": "Literal", "value": { @@ -1939,29 +1896,29 @@ snapshot_kind: text "suffix": "None" } }, - "start": 1600, + "start": 1586, "type": "BinaryExpression", "type": "BinaryExpression" }, - "start": 1587, + "start": 1573, "type": "BinaryExpression", "type": "BinaryExpression" }, "operator": "-", "right": { - "end": 1641, + "end": 1627, "left": { - "end": 1637, + "end": 1623, "name": "lengthBetweenScrews", - "start": 1618, + "start": 1604, "type": "Identifier", "type": "Identifier" }, "operator": "/", "right": { - "end": 1641, + "end": 1627, "raw": "2", - "start": 1640, + "start": 1626, "type": "Literal", "type": "Literal", "value": { @@ -1969,67 +1926,67 @@ snapshot_kind: text "suffix": "None" } }, - "start": 1618, + "start": 1604, "type": "BinaryExpression", "type": "BinaryExpression" }, - "start": 1587, + "start": 1573, "type": "BinaryExpression", "type": "BinaryExpression" }, { - "end": 1655, + "end": 1641, "name": "screwHeight", - "start": 1644, + "start": 1630, "type": "Identifier", "type": "Identifier" } ], "callee": { - "end": 1535, + "end": 1521, "name": "m25Screw", - "start": 1527, + "start": 1513, "type": "Identifier" }, - "end": 1656, - "start": 1527, + "end": 1642, + "start": 1513, "type": "CallExpression", "type": "CallExpression" }, - "start": 1527, + "start": 1513, "type": "ExpressionStatement", "type": "ExpressionStatement" }, { - "end": 1785, + "end": 1771, "expression": { "arguments": [ { - "end": 1715, + "end": 1701, "left": { - "end": 1689, + "end": 1675, "left": { - "end": 1673, + "end": 1659, "name": "border", - "start": 1667, + "start": 1653, "type": "Identifier", "type": "Identifier" }, "operator": "+", "right": { - "end": 1689, + "end": 1675, "left": { - "end": 1685, + "end": 1671, "name": "rpizWidth", - "start": 1676, + "start": 1662, "type": "Identifier", "type": "Identifier" }, "operator": "/", "right": { - "end": 1689, + "end": 1675, "raw": "2", - "start": 1688, + "start": 1674, "type": "Literal", "type": "Literal", "value": { @@ -2037,29 +1994,29 @@ snapshot_kind: text "suffix": "None" } }, - "start": 1676, + "start": 1662, "type": "BinaryExpression", "type": "BinaryExpression" }, - "start": 1667, + "start": 1653, "type": "BinaryExpression", "type": "BinaryExpression" }, "operator": "-", "right": { - "end": 1715, + "end": 1701, "left": { - "end": 1711, + "end": 1697, "name": "widthBetweenScrews", - "start": 1693, + "start": 1679, "type": "Identifier", "type": "Identifier" }, "operator": "/", "right": { - "end": 1715, + "end": 1701, "raw": "2", - "start": 1714, + "start": 1700, "type": "Literal", "type": "Literal", "value": { @@ -2067,24 +2024,24 @@ snapshot_kind: text "suffix": "None" } }, - "start": 1693, + "start": 1679, "type": "BinaryExpression", "type": "BinaryExpression" }, - "start": 1667, + "start": 1653, "type": "BinaryExpression", "type": "BinaryExpression" }, { - "end": 1771, + "end": 1757, "left": { - "end": 1745, + "end": 1731, "left": { - "end": 1728, + "end": 1714, "left": { - "end": 1719, + "end": 1705, "raw": "0", - "start": 1718, + "start": 1704, "type": "Literal", "type": "Literal", "value": { @@ -2094,31 +2051,31 @@ snapshot_kind: text }, "operator": "+", "right": { - "end": 1728, + "end": 1714, "name": "border", - "start": 1722, + "start": 1708, "type": "Identifier", "type": "Identifier" }, - "start": 1718, + "start": 1704, "type": "BinaryExpression", "type": "BinaryExpression" }, "operator": "+", "right": { - "end": 1745, + "end": 1731, "left": { - "end": 1741, + "end": 1727, "name": "rpizLength", - "start": 1731, + "start": 1717, "type": "Identifier", "type": "Identifier" }, "operator": "/", "right": { - "end": 1745, + "end": 1731, "raw": "2", - "start": 1744, + "start": 1730, "type": "Literal", "type": "Literal", "value": { @@ -2126,29 +2083,29 @@ snapshot_kind: text "suffix": "None" } }, - "start": 1731, + "start": 1717, "type": "BinaryExpression", "type": "BinaryExpression" }, - "start": 1718, + "start": 1704, "type": "BinaryExpression", "type": "BinaryExpression" }, "operator": "+", "right": { - "end": 1771, + "end": 1757, "left": { - "end": 1767, + "end": 1753, "name": "lengthBetweenScrews", - "start": 1748, + "start": 1734, "type": "Identifier", "type": "Identifier" }, "operator": "/", "right": { - "end": 1771, + "end": 1757, "raw": "2", - "start": 1770, + "start": 1756, "type": "Literal", "type": "Literal", "value": { @@ -2156,67 +2113,67 @@ snapshot_kind: text "suffix": "None" } }, - "start": 1748, + "start": 1734, "type": "BinaryExpression", "type": "BinaryExpression" }, - "start": 1718, + "start": 1704, "type": "BinaryExpression", "type": "BinaryExpression" }, { - "end": 1784, + "end": 1770, "name": "screwHeight", - "start": 1773, + "start": 1759, "type": "Identifier", "type": "Identifier" } ], "callee": { - "end": 1666, + "end": 1652, "name": "m25Screw", - "start": 1658, + "start": 1644, "type": "Identifier" }, - "end": 1785, - "start": 1658, + "end": 1771, + "start": 1644, "type": "CallExpression", "type": "CallExpression" }, - "start": 1658, + "start": 1644, "type": "ExpressionStatement", "type": "ExpressionStatement" }, { - "end": 1912, + "end": 1898, "expression": { "arguments": [ { - "end": 1843, + "end": 1829, "left": { - "end": 1818, + "end": 1804, "left": { - "end": 1802, + "end": 1788, "name": "border", - "start": 1796, + "start": 1782, "type": "Identifier", "type": "Identifier" }, "operator": "+", "right": { - "end": 1818, + "end": 1804, "left": { - "end": 1814, + "end": 1800, "name": "rpizWidth", - "start": 1805, + "start": 1791, "type": "Identifier", "type": "Identifier" }, "operator": "/", "right": { - "end": 1818, + "end": 1804, "raw": "2", - "start": 1817, + "start": 1803, "type": "Literal", "type": "Literal", "value": { @@ -2224,29 +2181,29 @@ snapshot_kind: text "suffix": "None" } }, - "start": 1805, + "start": 1791, "type": "BinaryExpression", "type": "BinaryExpression" }, - "start": 1796, + "start": 1782, "type": "BinaryExpression", "type": "BinaryExpression" }, "operator": "+", "right": { - "end": 1843, + "end": 1829, "left": { - "end": 1839, + "end": 1825, "name": "widthBetweenScrews", - "start": 1821, + "start": 1807, "type": "Identifier", "type": "Identifier" }, "operator": "/", "right": { - "end": 1843, + "end": 1829, "raw": "2", - "start": 1842, + "start": 1828, "type": "Literal", "type": "Literal", "value": { @@ -2254,24 +2211,24 @@ snapshot_kind: text "suffix": "None" } }, - "start": 1821, + "start": 1807, "type": "BinaryExpression", "type": "BinaryExpression" }, - "start": 1796, + "start": 1782, "type": "BinaryExpression", "type": "BinaryExpression" }, { - "end": 1898, + "end": 1884, "left": { - "end": 1872, + "end": 1858, "left": { - "end": 1855, + "end": 1841, "left": { - "end": 1846, + "end": 1832, "raw": "0", - "start": 1845, + "start": 1831, "type": "Literal", "type": "Literal", "value": { @@ -2281,31 +2238,31 @@ snapshot_kind: text }, "operator": "+", "right": { - "end": 1855, + "end": 1841, "name": "border", - "start": 1849, + "start": 1835, "type": "Identifier", "type": "Identifier" }, - "start": 1845, + "start": 1831, "type": "BinaryExpression", "type": "BinaryExpression" }, "operator": "+", "right": { - "end": 1872, + "end": 1858, "left": { - "end": 1868, + "end": 1854, "name": "rpizLength", - "start": 1858, + "start": 1844, "type": "Identifier", "type": "Identifier" }, "operator": "/", "right": { - "end": 1872, + "end": 1858, "raw": "2", - "start": 1871, + "start": 1857, "type": "Literal", "type": "Literal", "value": { @@ -2313,29 +2270,29 @@ snapshot_kind: text "suffix": "None" } }, - "start": 1858, + "start": 1844, "type": "BinaryExpression", "type": "BinaryExpression" }, - "start": 1845, + "start": 1831, "type": "BinaryExpression", "type": "BinaryExpression" }, "operator": "+", "right": { - "end": 1898, + "end": 1884, "left": { - "end": 1894, + "end": 1880, "name": "lengthBetweenScrews", - "start": 1875, + "start": 1861, "type": "Identifier", "type": "Identifier" }, "operator": "/", "right": { - "end": 1898, + "end": 1884, "raw": "2", - "start": 1897, + "start": 1883, "type": "Literal", "type": "Literal", "value": { @@ -2343,67 +2300,67 @@ snapshot_kind: text "suffix": "None" } }, - "start": 1875, + "start": 1861, "type": "BinaryExpression", "type": "BinaryExpression" }, - "start": 1845, + "start": 1831, "type": "BinaryExpression", "type": "BinaryExpression" }, { - "end": 1911, + "end": 1897, "name": "screwHeight", - "start": 1900, + "start": 1886, "type": "Identifier", "type": "Identifier" } ], "callee": { - "end": 1795, + "end": 1781, "name": "m25Screw", - "start": 1787, + "start": 1773, "type": "Identifier" }, - "end": 1912, - "start": 1787, + "end": 1898, + "start": 1773, "type": "CallExpression", "type": "CallExpression" }, - "start": 1787, + "start": 1773, "type": "ExpressionStatement", "type": "ExpressionStatement" }, { - "end": 2041, + "end": 2027, "expression": { "arguments": [ { - "end": 1970, + "end": 1956, "left": { - "end": 1945, + "end": 1931, "left": { - "end": 1929, + "end": 1915, "name": "border", - "start": 1923, + "start": 1909, "type": "Identifier", "type": "Identifier" }, "operator": "+", "right": { - "end": 1945, + "end": 1931, "left": { - "end": 1941, + "end": 1927, "name": "rpizWidth", - "start": 1932, + "start": 1918, "type": "Identifier", "type": "Identifier" }, "operator": "/", "right": { - "end": 1945, + "end": 1931, "raw": "2", - "start": 1944, + "start": 1930, "type": "Literal", "type": "Literal", "value": { @@ -2411,29 +2368,29 @@ snapshot_kind: text "suffix": "None" } }, - "start": 1932, + "start": 1918, "type": "BinaryExpression", "type": "BinaryExpression" }, - "start": 1923, + "start": 1909, "type": "BinaryExpression", "type": "BinaryExpression" }, "operator": "+", "right": { - "end": 1970, + "end": 1956, "left": { - "end": 1966, + "end": 1952, "name": "widthBetweenScrews", - "start": 1948, + "start": 1934, "type": "Identifier", "type": "Identifier" }, "operator": "/", "right": { - "end": 1970, + "end": 1956, "raw": "2", - "start": 1969, + "start": 1955, "type": "Literal", "type": "Literal", "value": { @@ -2441,24 +2398,24 @@ snapshot_kind: text "suffix": "None" } }, - "start": 1948, + "start": 1934, "type": "BinaryExpression", "type": "BinaryExpression" }, - "start": 1923, + "start": 1909, "type": "BinaryExpression", "type": "BinaryExpression" }, { - "end": 2026, + "end": 2012, "left": { - "end": 1999, + "end": 1985, "left": { - "end": 1982, + "end": 1968, "left": { - "end": 1973, + "end": 1959, "raw": "0", - "start": 1972, + "start": 1958, "type": "Literal", "type": "Literal", "value": { @@ -2468,31 +2425,31 @@ snapshot_kind: text }, "operator": "+", "right": { - "end": 1982, + "end": 1968, "name": "border", - "start": 1976, + "start": 1962, "type": "Identifier", "type": "Identifier" }, - "start": 1972, + "start": 1958, "type": "BinaryExpression", "type": "BinaryExpression" }, "operator": "+", "right": { - "end": 1999, + "end": 1985, "left": { - "end": 1995, + "end": 1981, "name": "rpizLength", - "start": 1985, + "start": 1971, "type": "Identifier", "type": "Identifier" }, "operator": "/", "right": { - "end": 1999, + "end": 1985, "raw": "2", - "start": 1998, + "start": 1984, "type": "Literal", "type": "Literal", "value": { @@ -2500,29 +2457,29 @@ snapshot_kind: text "suffix": "None" } }, - "start": 1985, + "start": 1971, "type": "BinaryExpression", "type": "BinaryExpression" }, - "start": 1972, + "start": 1958, "type": "BinaryExpression", "type": "BinaryExpression" }, "operator": "-", "right": { - "end": 2026, + "end": 2012, "left": { - "end": 2022, + "end": 2008, "name": "lengthBetweenScrews", - "start": 2003, + "start": 1989, "type": "Identifier", "type": "Identifier" }, "operator": "/", "right": { - "end": 2026, + "end": 2012, "raw": "2", - "start": 2025, + "start": 2011, "type": "Literal", "type": "Literal", "value": { @@ -2530,39 +2487,39 @@ snapshot_kind: text "suffix": "None" } }, - "start": 2003, + "start": 1989, "type": "BinaryExpression", "type": "BinaryExpression" }, - "start": 1972, + "start": 1958, "type": "BinaryExpression", "type": "BinaryExpression" }, { - "end": 2040, + "end": 2026, "name": "screwHeight", - "start": 2029, + "start": 2015, "type": "Identifier", "type": "Identifier" } ], "callee": { - "end": 1922, + "end": 1908, "name": "m25Screw", - "start": 1914, + "start": 1900, "type": "Identifier" }, - "end": 2041, - "start": 1914, + "end": 2027, + "start": 1900, "type": "CallExpression", "type": "CallExpression" }, - "start": 1914, + "start": 1900, "type": "ExpressionStatement", "type": "ExpressionStatement" }, { - "end": 2098, + "end": 2084, "expression": { "arguments": [ { @@ -2574,16 +2531,16 @@ snapshot_kind: text "arg": { "elements": [ { - "end": 2069, + "end": 2055, "raw": "'end'", - "start": 2064, + "start": 2050, "type": "Literal", "type": "Literal", "value": "end" } ], - "end": 2070, - "start": 2063, + "end": 2056, + "start": 2049, "type": "ArrayExpression", "type": "ArrayExpression" } @@ -2595,38 +2552,38 @@ snapshot_kind: text "name": "thickness" }, "arg": { - "end": 2097, + "end": 2083, "name": "caseThickness", - "start": 2084, + "start": 2070, "type": "Identifier", "type": "Identifier" } } ], "callee": { - "end": 2048, + "end": 2034, "name": "shell", - "start": 2043, + "start": 2029, "type": "Identifier" }, - "end": 2098, - "start": 2043, + "end": 2084, + "start": 2029, "type": "CallExpressionKw", "type": "CallExpressionKw", "unlabeled": { - "end": 2053, + "end": 2039, "name": "case", - "start": 2049, + "start": 2035, "type": "Identifier", "type": "Identifier" } }, - "start": 2043, + "start": 2029, "type": "ExpressionStatement", "type": "ExpressionStatement" } ], - "end": 2099, + "end": 2085, "nonCodeMeta": { "nonCodeNodes": { "1": [ @@ -2731,8 +2688,8 @@ snapshot_kind: text ], "18": [ { - "end": 1527, - "start": 1525, + "end": 1513, + "start": 1511, "type": "NonCodeNode", "value": { "type": "newLine" @@ -2741,8 +2698,8 @@ snapshot_kind: text ], "19": [ { - "end": 1658, - "start": 1656, + "end": 1644, + "start": 1642, "type": "NonCodeNode", "value": { "type": "newLine" @@ -2751,8 +2708,8 @@ snapshot_kind: text ], "20": [ { - "end": 1787, - "start": 1785, + "end": 1773, + "start": 1771, "type": "NonCodeNode", "value": { "type": "newLine" @@ -2761,8 +2718,8 @@ snapshot_kind: text ], "21": [ { - "end": 1914, - "start": 1912, + "end": 1900, + "start": 1898, "type": "NonCodeNode", "value": { "type": "newLine" @@ -2771,8 +2728,8 @@ snapshot_kind: text ], "22": [ { - "end": 2043, - "start": 2041, + "end": 2029, + "start": 2027, "type": "NonCodeNode", "value": { "type": "newLine" diff --git a/src/wasm-lib/kcl/tests/fillet-and-shell/input.kcl b/src/wasm-lib/kcl/tests/fillet-and-shell/input.kcl index 375502cd31..d5b66fe833 100644 --- a/src/wasm-lib/kcl/tests/fillet-and-shell/input.kcl +++ b/src/wasm-lib/kcl/tests/fillet-and-shell/input.kcl @@ -60,8 +60,8 @@ case = startSketchOn('XY') fn m25Screw(x, y, height) { screw = startSketchOn("XY") |> startProfileAt([0, 0], %) - |> circle({ center = [x, y], radius = 2.5 }, %) - |> hole(circle({ center = [x, y], radius = 1.25 }, %), %) + |> circle(center = [x, y], radius = 2.5) + |> hole(circle(center = [x, y], radius = 1.25), %) |> extrude(length = height) return screw } diff --git a/src/wasm-lib/kcl/tests/fillet-and-shell/ops.snap b/src/wasm-lib/kcl/tests/fillet-and-shell/ops.snap index 35b745330e..83392a1902 100644 --- a/src/wasm-lib/kcl/tests/fillet-and-shell/ops.snap +++ b/src/wasm-lib/kcl/tests/fillet-and-shell/ops.snap @@ -147,14 +147,14 @@ description: Operations executed fillet-and-shell.kcl "name": "m25Screw", "functionSourceRange": [ 1283, - 1525, + 1511, 0 ], "unlabeledArg": null, "labeledArgs": {}, "sourceRange": [ - 1527, - 1656, + 1513, + 1642, 0 ] }, @@ -191,8 +191,8 @@ description: Operations executed fillet-and-shell.kcl } }, "sourceRange": [ - 1427, - 1472, + 1420, + 1458, 0 ] }, @@ -204,16 +204,16 @@ description: Operations executed fillet-and-shell.kcl } }, "sourceRange": [ - 1474, - 1475, + 1460, + 1461, 0 ] } }, "name": "hole", "sourceRange": [ - 1422, - 1476, + 1415, + 1462, 0 ], "type": "StdLibCall", @@ -236,16 +236,16 @@ description: Operations executed fillet-and-shell.kcl } }, "sourceRange": [ - 1501, - 1507, + 1487, + 1493, 0 ] } }, "name": "extrude", "sourceRange": [ - 1484, - 1508, + 1470, + 1494, 0 ], "type": "StdLibCall", @@ -271,14 +271,14 @@ description: Operations executed fillet-and-shell.kcl "name": "m25Screw", "functionSourceRange": [ 1283, - 1525, + 1511, 0 ], "unlabeledArg": null, "labeledArgs": {}, "sourceRange": [ - 1658, - 1785, + 1644, + 1771, 0 ] }, @@ -315,8 +315,8 @@ description: Operations executed fillet-and-shell.kcl } }, "sourceRange": [ - 1427, - 1472, + 1420, + 1458, 0 ] }, @@ -328,16 +328,16 @@ description: Operations executed fillet-and-shell.kcl } }, "sourceRange": [ - 1474, - 1475, + 1460, + 1461, 0 ] } }, "name": "hole", "sourceRange": [ - 1422, - 1476, + 1415, + 1462, 0 ], "type": "StdLibCall", @@ -360,16 +360,16 @@ description: Operations executed fillet-and-shell.kcl } }, "sourceRange": [ - 1501, - 1507, + 1487, + 1493, 0 ] } }, "name": "extrude", "sourceRange": [ - 1484, - 1508, + 1470, + 1494, 0 ], "type": "StdLibCall", @@ -395,14 +395,14 @@ description: Operations executed fillet-and-shell.kcl "name": "m25Screw", "functionSourceRange": [ 1283, - 1525, + 1511, 0 ], "unlabeledArg": null, "labeledArgs": {}, "sourceRange": [ - 1787, - 1912, + 1773, + 1898, 0 ] }, @@ -439,8 +439,8 @@ description: Operations executed fillet-and-shell.kcl } }, "sourceRange": [ - 1427, - 1472, + 1420, + 1458, 0 ] }, @@ -452,16 +452,16 @@ description: Operations executed fillet-and-shell.kcl } }, "sourceRange": [ - 1474, - 1475, + 1460, + 1461, 0 ] } }, "name": "hole", "sourceRange": [ - 1422, - 1476, + 1415, + 1462, 0 ], "type": "StdLibCall", @@ -484,16 +484,16 @@ description: Operations executed fillet-and-shell.kcl } }, "sourceRange": [ - 1501, - 1507, + 1487, + 1493, 0 ] } }, "name": "extrude", "sourceRange": [ - 1484, - 1508, + 1470, + 1494, 0 ], "type": "StdLibCall", @@ -519,14 +519,14 @@ description: Operations executed fillet-and-shell.kcl "name": "m25Screw", "functionSourceRange": [ 1283, - 1525, + 1511, 0 ], "unlabeledArg": null, "labeledArgs": {}, "sourceRange": [ - 1914, - 2041, + 1900, + 2027, 0 ] }, @@ -563,8 +563,8 @@ description: Operations executed fillet-and-shell.kcl } }, "sourceRange": [ - 1427, - 1472, + 1420, + 1458, 0 ] }, @@ -576,16 +576,16 @@ description: Operations executed fillet-and-shell.kcl } }, "sourceRange": [ - 1474, - 1475, + 1460, + 1461, 0 ] } }, "name": "hole", "sourceRange": [ - 1422, - 1476, + 1415, + 1462, 0 ], "type": "StdLibCall", @@ -608,16 +608,16 @@ description: Operations executed fillet-and-shell.kcl } }, "sourceRange": [ - 1501, - 1507, + 1487, + 1493, 0 ] } }, "name": "extrude", "sourceRange": [ - 1484, - 1508, + 1470, + 1494, 0 ], "type": "StdLibCall", @@ -651,8 +651,8 @@ description: Operations executed fillet-and-shell.kcl ] }, "sourceRange": [ - 2063, - 2070, + 2049, + 2056, 0 ] }, @@ -671,16 +671,16 @@ description: Operations executed fillet-and-shell.kcl } }, "sourceRange": [ - 2084, - 2097, + 2070, + 2083, 0 ] } }, "name": "shell", "sourceRange": [ - 2043, - 2098, + 2029, + 2084, 0 ], "type": "StdLibCall", @@ -692,8 +692,8 @@ description: Operations executed fillet-and-shell.kcl } }, "sourceRange": [ - 2049, - 2053, + 2035, + 2039, 0 ] } diff --git a/src/wasm-lib/kcl/tests/fillet-and-shell/program_memory.snap b/src/wasm-lib/kcl/tests/fillet-and-shell/program_memory.snap index 11960d80f3..c907ae671e 100644 --- a/src/wasm-lib/kcl/tests/fillet-and-shell/program_memory.snap +++ b/src/wasm-lib/kcl/tests/fillet-and-shell/program_memory.snap @@ -985,7 +985,7 @@ description: Variables in memory after executing fillet-and-shell.kcl { "sourceRange": [ 1283, - 1525, + 1511, 0 ] } diff --git a/src/wasm-lib/kcl/tests/helix_ccw/artifact_commands.snap b/src/wasm-lib/kcl/tests/helix_ccw/artifact_commands.snap index ba870c5e53..005e6199ac 100644 --- a/src/wasm-lib/kcl/tests/helix_ccw/artifact_commands.snap +++ b/src/wasm-lib/kcl/tests/helix_ccw/artifact_commands.snap @@ -1,7 +1,6 @@ --- source: kcl/src/simulation_tests.rs description: Artifact commands helix_ccw.kcl -snapshot_kind: text --- [ { @@ -315,7 +314,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 35, - 78, + 71, 0 ], "command": { @@ -335,7 +334,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 35, - 78, + 71, 0 ], "command": { @@ -346,7 +345,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 35, - 78, + 71, 0 ], "command": { @@ -363,7 +362,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 35, - 78, + 71, 0 ], "command": { @@ -392,7 +391,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 35, - 78, + 71, 0 ], "command": { @@ -403,8 +402,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 84, - 104, + 77, + 97, 0 ], "command": { @@ -423,8 +422,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 84, - 104, + 77, + 97, 0 ], "command": { @@ -437,8 +436,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 84, - 104, + 77, + 97, 0 ], "command": { @@ -448,8 +447,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 84, - 104, + 77, + 97, 0 ], "command": { @@ -460,8 +459,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 84, - 104, + 77, + 97, 0 ], "command": { @@ -473,8 +472,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 84, - 104, + 77, + 97, 0 ], "command": { @@ -487,8 +486,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 84, - 104, + 77, + 97, 0 ], "command": { @@ -501,8 +500,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 110, - 205, + 103, + 198, 0 ], "command": { diff --git a/src/wasm-lib/kcl/tests/helix_ccw/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/helix_ccw/artifact_graph_flowchart.snap.md index 20daff85d8..d75b605de9 100644 --- a/src/wasm-lib/kcl/tests/helix_ccw/artifact_graph_flowchart.snap.md +++ b/src/wasm-lib/kcl/tests/helix_ccw/artifact_graph_flowchart.snap.md @@ -1,12 +1,12 @@ ```mermaid flowchart LR subgraph path2 [Path] - 2["Path
[35, 78, 0]"] - 3["Segment
[35, 78, 0]"] + 2["Path
[35, 71, 0]"] + 3["Segment
[35, 71, 0]"] 4[Solid2d] end 1["Plane
[10, 29, 0]"] - 5["Sweep Extrusion
[84, 104, 0]"] + 5["Sweep Extrusion
[77, 97, 0]"] 6[Wall] 7["Cap Start"] 8["Cap End"] diff --git a/src/wasm-lib/kcl/tests/helix_ccw/ast.snap b/src/wasm-lib/kcl/tests/helix_ccw/ast.snap index da07e71340..1569d7ed48 100644 --- a/src/wasm-lib/kcl/tests/helix_ccw/ast.snap +++ b/src/wasm-lib/kcl/tests/helix_ccw/ast.snap @@ -7,7 +7,7 @@ description: Result of parsing helix_ccw.kcl "body": [ { "declaration": { - "end": 205, + "end": 198, "id": { "end": 7, "name": "part001", @@ -41,81 +41,59 @@ description: Result of parsing helix_ccw.kcl { "arguments": [ { - "end": 74, - "properties": [ - { - "end": 59, - "key": { - "end": 50, - "name": "center", - "start": 44, - "type": "Identifier" - }, - "start": 44, - "type": "ObjectProperty", - "value": { - "elements": [ - { - "end": 55, - "raw": "5", - "start": 54, - "type": "Literal", - "type": "Literal", - "value": { - "value": 5.0, - "suffix": "None" - } - }, - { - "end": 58, - "raw": "5", - "start": 57, - "type": "Literal", - "type": "Literal", - "value": { - "value": 5.0, - "suffix": "None" - } - } - ], - "end": 59, - "start": 53, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "end": 72, - "key": { - "end": 67, - "name": "radius", - "start": 61, - "type": "Identifier" + "type": "LabeledArg", + "label": { + "type": "Identifier", + "name": "center" + }, + "arg": { + "elements": [ + { + "end": 53, + "raw": "5", + "start": 52, + "type": "Literal", + "type": "Literal", + "value": { + "value": 5.0, + "suffix": "None" + } }, - "start": 61, - "type": "ObjectProperty", - "value": { - "end": 72, - "raw": "10", - "start": 70, + { + "end": 56, + "raw": "5", + "start": 55, "type": "Literal", "type": "Literal", "value": { - "value": 10.0, + "value": 5.0, "suffix": "None" } } - } - ], - "start": 42, - "type": "ObjectExpression", - "type": "ObjectExpression" + ], + "end": 57, + "start": 51, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, { - "end": 77, - "start": 76, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "type": "Identifier", + "name": "radius" + }, + "arg": { + "end": 70, + "raw": "10", + "start": 68, + "type": "Literal", + "type": "Literal", + "value": { + "value": 10.0, + "suffix": "None" + } + } } ], "callee": { @@ -124,10 +102,11 @@ description: Result of parsing helix_ccw.kcl "start": 35, "type": "Identifier" }, - "end": 78, + "end": 71, "start": 35, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -138,9 +117,9 @@ description: Result of parsing helix_ccw.kcl "name": "length" }, "arg": { - "end": 103, + "end": 96, "raw": "10", - "start": 101, + "start": 94, "type": "Literal", "type": "Literal", "value": { @@ -151,13 +130,13 @@ description: Result of parsing helix_ccw.kcl } ], "callee": { - "end": 91, + "end": 84, "name": "extrude", - "start": 84, + "start": 77, "type": "Identifier" }, - "end": 104, - "start": 84, + "end": 97, + "start": 77, "type": "CallExpressionKw", "type": "CallExpressionKw", "unlabeled": null @@ -165,22 +144,22 @@ description: Result of parsing helix_ccw.kcl { "arguments": [ { - "end": 201, + "end": 194, "properties": [ { - "end": 152, + "end": 145, "key": { - "end": 147, + "end": 140, "name": "revolutions", - "start": 136, + "start": 129, "type": "Identifier" }, - "start": 136, + "start": 129, "type": "ObjectProperty", "value": { - "end": 152, + "end": 145, "raw": "16", - "start": 150, + "start": 143, "type": "Literal", "type": "Literal", "value": { @@ -190,19 +169,19 @@ description: Result of parsing helix_ccw.kcl } }, { - "end": 175, + "end": 168, "key": { - "end": 171, + "end": 164, "name": "angleStart", - "start": 161, + "start": 154, "type": "Identifier" }, - "start": 161, + "start": 154, "type": "ObjectProperty", "value": { - "end": 175, + "end": 168, "raw": "0", - "start": 174, + "start": 167, "type": "Literal", "type": "Literal", "value": { @@ -212,49 +191,49 @@ description: Result of parsing helix_ccw.kcl } }, { - "end": 194, + "end": 187, "key": { - "end": 187, + "end": 180, "name": "ccw", - "start": 184, + "start": 177, "type": "Identifier" }, - "start": 184, + "start": 177, "type": "ObjectProperty", "value": { - "end": 194, + "end": 187, "raw": "true", - "start": 190, + "start": 183, "type": "Literal", "type": "Literal", "value": true } } ], - "start": 127, + "start": 120, "type": "ObjectExpression", "type": "ObjectExpression" }, { - "end": 204, - "start": 203, + "end": 197, + "start": 196, "type": "PipeSubstitution", "type": "PipeSubstitution" } ], "callee": { - "end": 126, + "end": 119, "name": "helixRevolutions", - "start": 110, + "start": 103, "type": "Identifier" }, - "end": 205, - "start": 110, + "end": 198, + "start": 103, "type": "CallExpression", "type": "CallExpression" } ], - "end": 205, + "end": 198, "start": 10, "type": "PipeExpression", "type": "PipeExpression" @@ -262,14 +241,14 @@ description: Result of parsing helix_ccw.kcl "start": 0, "type": "VariableDeclarator" }, - "end": 205, + "end": 198, "kind": "const", "start": 0, "type": "VariableDeclaration", "type": "VariableDeclaration" } ], - "end": 206, + "end": 199, "start": 0 } } diff --git a/src/wasm-lib/kcl/tests/helix_ccw/input.kcl b/src/wasm-lib/kcl/tests/helix_ccw/input.kcl index bd19490297..240df6ef1b 100644 --- a/src/wasm-lib/kcl/tests/helix_ccw/input.kcl +++ b/src/wasm-lib/kcl/tests/helix_ccw/input.kcl @@ -1,5 +1,5 @@ part001 = startSketchOn('XY') - |> circle({ center = [5, 5], radius = 10 }, %) + |> circle(center = [5, 5], radius = 10) |> extrude(length = 10) |> helixRevolutions({ revolutions = 16, diff --git a/src/wasm-lib/kcl/tests/helix_ccw/ops.snap b/src/wasm-lib/kcl/tests/helix_ccw/ops.snap index 1b94eb615b..9d1885031b 100644 --- a/src/wasm-lib/kcl/tests/helix_ccw/ops.snap +++ b/src/wasm-lib/kcl/tests/helix_ccw/ops.snap @@ -43,16 +43,16 @@ description: Operations executed helix_ccw.kcl } }, "sourceRange": [ - 101, - 103, + 94, + 96, 0 ] } }, "name": "extrude", "sourceRange": [ - 84, - 104, + 77, + 97, 0 ], "type": "StdLibCall", @@ -109,8 +109,8 @@ description: Operations executed helix_ccw.kcl } }, "sourceRange": [ - 127, - 201, + 120, + 194, 0 ] }, @@ -122,16 +122,16 @@ description: Operations executed helix_ccw.kcl } }, "sourceRange": [ - 203, - 204, + 196, + 197, 0 ] } }, "name": "helixRevolutions", "sourceRange": [ - 110, - 205, + 103, + 198, 0 ], "type": "StdLibCall", diff --git a/src/wasm-lib/kcl/tests/helix_ccw/program_memory.snap b/src/wasm-lib/kcl/tests/helix_ccw/program_memory.snap index e3f28fae81..912b898492 100644 --- a/src/wasm-lib/kcl/tests/helix_ccw/program_memory.snap +++ b/src/wasm-lib/kcl/tests/helix_ccw/program_memory.snap @@ -15,7 +15,7 @@ description: Variables in memory after executing helix_ccw.kcl "id": "[uuid]", "sourceRange": [ 35, - 78, + 71, 0 ], "tag": null, @@ -31,7 +31,7 @@ description: Variables in memory after executing helix_ccw.kcl "id": "[uuid]", "sourceRange": [ 35, - 78, + 71, 0 ] }, @@ -103,7 +103,7 @@ description: Variables in memory after executing helix_ccw.kcl "id": "[uuid]", "sourceRange": [ 35, - 78, + 71, 0 ] } @@ -117,7 +117,7 @@ description: Variables in memory after executing helix_ccw.kcl { "sourceRange": [ 35, - 78, + 71, 0 ] } @@ -133,7 +133,7 @@ description: Variables in memory after executing helix_ccw.kcl { "sourceRange": [ 35, - 78, + 71, 0 ] } diff --git a/src/wasm-lib/kcl/tests/import_side_effect/export_side_effect.kcl b/src/wasm-lib/kcl/tests/import_side_effect/export_side_effect.kcl index 1b3319e261..890fc7b63b 100644 --- a/src/wasm-lib/kcl/tests/import_side_effect/export_side_effect.kcl +++ b/src/wasm-lib/kcl/tests/import_side_effect/export_side_effect.kcl @@ -2,4 +2,4 @@ export fn foo = () => { return 0 } // This interacts with the engine. part001 = startSketchOn('XY') - |> circle({ center = [0, 0], radius = 10 }, %) + |> circle(center = [0, 0], radius = 10) diff --git a/src/wasm-lib/kcl/tests/import_whole/artifact_commands.snap b/src/wasm-lib/kcl/tests/import_whole/artifact_commands.snap index 91c588fc65..46bbbd8c97 100644 --- a/src/wasm-lib/kcl/tests/import_whole/artifact_commands.snap +++ b/src/wasm-lib/kcl/tests/import_whole/artifact_commands.snap @@ -1,7 +1,6 @@ --- source: kcl/src/simulation_tests.rs description: Artifact commands import_whole.kcl -snapshot_kind: text --- [ { @@ -327,7 +326,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 61, - 104, + 97, 3 ], "command": { @@ -347,7 +346,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 61, - 104, + 97, 3 ], "command": { @@ -358,7 +357,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 61, - 104, + 97, 3 ], "command": { @@ -375,7 +374,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 61, - 104, + 97, 3 ], "command": { @@ -404,7 +403,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 61, - 104, + 97, 3 ], "command": { @@ -415,8 +414,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 110, - 130, + 103, + 123, 3 ], "command": { @@ -435,8 +434,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 110, - 130, + 103, + 123, 3 ], "command": { @@ -449,8 +448,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 110, - 130, + 103, + 123, 3 ], "command": { @@ -460,8 +459,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 110, - 130, + 103, + 123, 3 ], "command": { @@ -472,8 +471,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 110, - 130, + 103, + 123, 3 ], "command": { @@ -485,8 +484,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 110, - 130, + 103, + 123, 3 ], "command": { @@ -499,8 +498,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 110, - 130, + 103, + 123, 3 ], "command": { diff --git a/src/wasm-lib/kcl/tests/import_whole/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/import_whole/artifact_graph_flowchart.snap index 2773b9f690..8822fcd31d 100644 --- a/src/wasm-lib/kcl/tests/import_whole/artifact_graph_flowchart.snap +++ b/src/wasm-lib/kcl/tests/import_whole/artifact_graph_flowchart.snap @@ -1,6 +1,5 @@ --- source: kcl/src/simulation_tests.rs -assertion_line: 188 description: Artifact graph flowchart import_whole.kcl extension: md snapshot_kind: binary diff --git a/src/wasm-lib/kcl/tests/import_whole/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/import_whole/artifact_graph_flowchart.snap.md index dbc7ca13c1..822c27b166 100644 --- a/src/wasm-lib/kcl/tests/import_whole/artifact_graph_flowchart.snap.md +++ b/src/wasm-lib/kcl/tests/import_whole/artifact_graph_flowchart.snap.md @@ -1,12 +1,12 @@ ```mermaid flowchart LR subgraph path2 [Path] - 2["Path
[61, 104, 3]"] - 3["Segment
[61, 104, 3]"] + 2["Path
[61, 97, 3]"] + 3["Segment
[61, 97, 3]"] 4[Solid2d] end 1["Plane
[36, 55, 3]"] - 5["Sweep Extrusion
[110, 130, 3]"] + 5["Sweep Extrusion
[103, 123, 3]"] 6[Wall] 7["Cap Start"] 8["Cap End"] diff --git a/src/wasm-lib/kcl/tests/import_whole/exported_mod.kcl b/src/wasm-lib/kcl/tests/import_whole/exported_mod.kcl index 30f5d782b6..765515480e 100644 --- a/src/wasm-lib/kcl/tests/import_whole/exported_mod.kcl +++ b/src/wasm-lib/kcl/tests/import_whole/exported_mod.kcl @@ -1,4 +1,4 @@ @settings(defaultLengthUnit = inch) startSketchOn('XY') - |> circle({ center = [5, 5], radius = 10 }, %) + |> circle(center = [5, 5], radius = 10) |> extrude(length = 10) diff --git a/src/wasm-lib/kcl/tests/import_whole/ops.snap b/src/wasm-lib/kcl/tests/import_whole/ops.snap index 85053a7707..9488a96d24 100644 --- a/src/wasm-lib/kcl/tests/import_whole/ops.snap +++ b/src/wasm-lib/kcl/tests/import_whole/ops.snap @@ -43,16 +43,16 @@ description: Operations executed import_whole.kcl } }, "sourceRange": [ - 127, - 129, + 120, + 122, 3 ] } }, "name": "extrude", "sourceRange": [ - 110, - 130, + 103, + 123, 3 ], "type": "StdLibCall", diff --git a/src/wasm-lib/kcl/tests/import_whole/program_memory.snap b/src/wasm-lib/kcl/tests/import_whole/program_memory.snap index 4e538762ed..f5cad70e2f 100644 --- a/src/wasm-lib/kcl/tests/import_whole/program_memory.snap +++ b/src/wasm-lib/kcl/tests/import_whole/program_memory.snap @@ -15,7 +15,7 @@ description: Variables in memory after executing import_whole.kcl "id": "[uuid]", "sourceRange": [ 61, - 104, + 97, 3 ], "tag": null, @@ -31,7 +31,7 @@ description: Variables in memory after executing import_whole.kcl "id": "[uuid]", "sourceRange": [ 61, - 104, + 97, 3 ] }, @@ -103,7 +103,7 @@ description: Variables in memory after executing import_whole.kcl "id": "[uuid]", "sourceRange": [ 61, - 104, + 97, 3 ] } @@ -117,7 +117,7 @@ description: Variables in memory after executing import_whole.kcl { "sourceRange": [ 61, - 104, + 97, 3 ] } @@ -133,7 +133,7 @@ description: Variables in memory after executing import_whole.kcl { "sourceRange": [ 61, - 104, + 97, 3 ] } diff --git a/src/wasm-lib/kcl/tests/revolve_about_edge/artifact_commands.snap b/src/wasm-lib/kcl/tests/revolve_about_edge/artifact_commands.snap index 89e5552163..bc2d69e7a4 100644 --- a/src/wasm-lib/kcl/tests/revolve_about_edge/artifact_commands.snap +++ b/src/wasm-lib/kcl/tests/revolve_about_edge/artifact_commands.snap @@ -412,7 +412,7 @@ description: Artifact commands revolve_about_edge.kcl "cmdId": "[uuid]", "range": [ 145, - 190, + 183, 0 ], "command": { @@ -432,7 +432,7 @@ description: Artifact commands revolve_about_edge.kcl "cmdId": "[uuid]", "range": [ 145, - 190, + 183, 0 ], "command": { @@ -443,7 +443,7 @@ description: Artifact commands revolve_about_edge.kcl "cmdId": "[uuid]", "range": [ 145, - 190, + 183, 0 ], "command": { @@ -460,7 +460,7 @@ description: Artifact commands revolve_about_edge.kcl "cmdId": "[uuid]", "range": [ 145, - 190, + 183, 0 ], "command": { @@ -489,7 +489,7 @@ description: Artifact commands revolve_about_edge.kcl "cmdId": "[uuid]", "range": [ 145, - 190, + 183, 0 ], "command": { @@ -500,8 +500,8 @@ description: Artifact commands revolve_about_edge.kcl { "cmdId": "[uuid]", "range": [ - 196, - 270, + 189, + 263, 0 ], "command": { @@ -518,8 +518,8 @@ description: Artifact commands revolve_about_edge.kcl { "cmdId": "[uuid]", "range": [ - 196, - 270, + 189, + 263, 0 ], "command": { @@ -530,8 +530,8 @@ description: Artifact commands revolve_about_edge.kcl { "cmdId": "[uuid]", "range": [ - 196, - 270, + 189, + 263, 0 ], "command": { @@ -543,8 +543,8 @@ description: Artifact commands revolve_about_edge.kcl { "cmdId": "[uuid]", "range": [ - 196, - 270, + 189, + 263, 0 ], "command": { @@ -557,8 +557,8 @@ description: Artifact commands revolve_about_edge.kcl { "cmdId": "[uuid]", "range": [ - 196, - 270, + 189, + 263, 0 ], "command": { diff --git a/src/wasm-lib/kcl/tests/revolve_about_edge/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/revolve_about_edge/artifact_graph_flowchart.snap.md index f4a58e3729..7197150d56 100644 --- a/src/wasm-lib/kcl/tests/revolve_about_edge/artifact_graph_flowchart.snap.md +++ b/src/wasm-lib/kcl/tests/revolve_about_edge/artifact_graph_flowchart.snap.md @@ -5,13 +5,13 @@ flowchart LR 3["Segment
[71, 107, 0]"] end subgraph path5 [Path] - 5["Path
[145, 190, 0]"] - 6["Segment
[145, 190, 0]"] + 5["Path
[145, 183, 0]"] + 6["Segment
[145, 183, 0]"] 7[Solid2d] end 1["Plane
[12, 31, 0]"] 4["Plane
[120, 139, 0]"] - 8["Sweep RevolveAboutEdge
[196, 270, 0]"] + 8["Sweep RevolveAboutEdge
[189, 263, 0]"] 9[Wall] 10["Cap Start"] 11["Cap End"] diff --git a/src/wasm-lib/kcl/tests/revolve_about_edge/ast.snap b/src/wasm-lib/kcl/tests/revolve_about_edge/ast.snap index 2a8c7ceca7..fde75281ad 100644 --- a/src/wasm-lib/kcl/tests/revolve_about_edge/ast.snap +++ b/src/wasm-lib/kcl/tests/revolve_about_edge/ast.snap @@ -157,7 +157,7 @@ description: Result of parsing revolve_about_edge.kcl }, { "declaration": { - "end": 270, + "end": 263, "id": { "end": 117, "name": "sketch002", @@ -191,88 +191,66 @@ description: Result of parsing revolve_about_edge.kcl { "arguments": [ { - "end": 186, - "properties": [ - { - "end": 171, - "key": { - "end": 160, - "name": "center", - "start": 154, - "type": "Identifier" - }, - "start": 154, - "type": "ObjectProperty", - "value": { - "elements": [ - { - "argument": { - "end": 167, - "raw": "50", - "start": 165, - "type": "Literal", - "type": "Literal", - "value": { - "value": 50.0, - "suffix": "None" - } - }, - "end": 167, - "operator": "-", - "start": 164, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - { - "end": 170, - "raw": "0", - "start": 169, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } + "type": "LabeledArg", + "label": { + "type": "Identifier", + "name": "center" + }, + "arg": { + "elements": [ + { + "argument": { + "end": 165, + "raw": "50", + "start": 163, + "type": "Literal", + "type": "Literal", + "value": { + "value": 50.0, + "suffix": "None" } - ], - "end": 171, - "start": 163, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "end": 184, - "key": { - "end": 179, - "name": "radius", - "start": 173, - "type": "Identifier" + }, + "end": 165, + "operator": "-", + "start": 162, + "type": "UnaryExpression", + "type": "UnaryExpression" }, - "start": 173, - "type": "ObjectProperty", - "value": { - "end": 184, - "raw": "10", - "start": 182, + { + "end": 168, + "raw": "0", + "start": 167, "type": "Literal", "type": "Literal", "value": { - "value": 10.0, + "value": 0.0, "suffix": "None" } } - } - ], - "start": 152, - "type": "ObjectExpression", - "type": "ObjectExpression" + ], + "end": 169, + "start": 161, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, { - "end": 189, - "start": 188, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "type": "Identifier", + "name": "radius" + }, + "arg": { + "end": 182, + "raw": "10", + "start": 180, + "type": "Literal", + "type": "Literal", + "value": { + "value": 10.0, + "suffix": "None" + } + } } ], "callee": { @@ -281,30 +259,31 @@ description: Result of parsing revolve_about_edge.kcl "start": 145, "type": "Identifier" }, - "end": 190, + "end": 183, "start": 145, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ { - "end": 266, + "end": 259, "properties": [ { - "end": 223, + "end": 216, "key": { - "end": 218, + "end": 211, "name": "angle", - "start": 213, + "start": 206, "type": "Identifier" }, - "start": 213, + "start": 206, "type": "ObjectProperty", "value": { - "end": 223, + "end": 216, "raw": "90", - "start": 221, + "start": 214, "type": "Literal", "type": "Literal", "value": { @@ -314,48 +293,48 @@ description: Result of parsing revolve_about_edge.kcl } }, { - "end": 259, + "end": 252, "key": { - "end": 236, + "end": 229, "name": "axis", - "start": 232, + "start": 225, "type": "Identifier" }, - "start": 232, + "start": 225, "type": "ObjectProperty", "value": { - "end": 259, + "end": 252, "name": "rectangleSegmentB001", - "start": 239, + "start": 232, "type": "Identifier", "type": "Identifier" } } ], - "start": 204, + "start": 197, "type": "ObjectExpression", "type": "ObjectExpression" }, { - "end": 269, - "start": 268, + "end": 262, + "start": 261, "type": "PipeSubstitution", "type": "PipeSubstitution" } ], "callee": { - "end": 203, + "end": 196, "name": "revolve", - "start": 196, + "start": 189, "type": "Identifier" }, - "end": 270, - "start": 196, + "end": 263, + "start": 189, "type": "CallExpression", "type": "CallExpression" } ], - "end": 270, + "end": 263, "start": 120, "type": "PipeExpression", "type": "PipeExpression" @@ -363,14 +342,14 @@ description: Result of parsing revolve_about_edge.kcl "start": 108, "type": "VariableDeclarator" }, - "end": 270, + "end": 263, "kind": "const", "start": 108, "type": "VariableDeclaration", "type": "VariableDeclaration" } ], - "end": 271, + "end": 264, "start": 0 } } diff --git a/src/wasm-lib/kcl/tests/revolve_about_edge/input.kcl b/src/wasm-lib/kcl/tests/revolve_about_edge/input.kcl index e2123e4a49..e7d6d654a3 100644 --- a/src/wasm-lib/kcl/tests/revolve_about_edge/input.kcl +++ b/src/wasm-lib/kcl/tests/revolve_about_edge/input.kcl @@ -2,7 +2,7 @@ sketch001 = startSketchOn('XY') |> startProfileAt([-25, 25], %) |> yLine(-50, %, $rectangleSegmentB001) sketch002 = startSketchOn('XY') - |> circle({ center = [-50, 0], radius = 10 }, %) + |> circle(center = [-50, 0], radius = 10) |> revolve({ angle = 90, axis = rectangleSegmentB001 diff --git a/src/wasm-lib/kcl/tests/revolve_about_edge/ops.snap b/src/wasm-lib/kcl/tests/revolve_about_edge/ops.snap index b84e3be23e..4ae7da3072 100644 --- a/src/wasm-lib/kcl/tests/revolve_about_edge/ops.snap +++ b/src/wasm-lib/kcl/tests/revolve_about_edge/ops.snap @@ -76,8 +76,8 @@ description: Operations executed revolve_about_edge.kcl } }, "sourceRange": [ - 204, - 266, + 197, + 259, 0 ] }, @@ -89,16 +89,16 @@ description: Operations executed revolve_about_edge.kcl } }, "sourceRange": [ - 268, - 269, + 261, + 262, 0 ] } }, "name": "revolve", "sourceRange": [ - 196, - 270, + 189, + 263, 0 ], "type": "StdLibCall", diff --git a/src/wasm-lib/kcl/tests/revolve_about_edge/program_memory.snap b/src/wasm-lib/kcl/tests/revolve_about_edge/program_memory.snap index ce01c834a1..73894dfe09 100644 --- a/src/wasm-lib/kcl/tests/revolve_about_edge/program_memory.snap +++ b/src/wasm-lib/kcl/tests/revolve_about_edge/program_memory.snap @@ -215,7 +215,7 @@ description: Variables in memory after executing revolve_about_edge.kcl "id": "[uuid]", "sourceRange": [ 145, - 190, + 183, 0 ], "tag": null, @@ -231,7 +231,7 @@ description: Variables in memory after executing revolve_about_edge.kcl "id": "[uuid]", "sourceRange": [ 145, - 190, + 183, 0 ] }, @@ -303,7 +303,7 @@ description: Variables in memory after executing revolve_about_edge.kcl "id": "[uuid]", "sourceRange": [ 145, - 190, + 183, 0 ] } @@ -317,7 +317,7 @@ description: Variables in memory after executing revolve_about_edge.kcl { "sourceRange": [ 145, - 190, + 183, 0 ] } @@ -333,7 +333,7 @@ description: Variables in memory after executing revolve_about_edge.kcl { "sourceRange": [ 145, - 190, + 183, 0 ] } diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/artifact_commands.snap b/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/artifact_commands.snap index 9a75ebe719..2f515ae8b6 100644 --- a/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/artifact_commands.snap +++ b/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/artifact_commands.snap @@ -1,7 +1,6 @@ --- source: kcl/src/simulation_tests.rs description: Artifact commands sketch_on_face_circle_tagged.kcl -snapshot_kind: text --- [ { @@ -631,7 +630,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 298, - 351, + 350, 0 ], "command": { @@ -647,7 +646,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 298, - 351, + 350, 0 ], "command": { @@ -658,7 +657,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 298, - 351, + 350, 0 ], "command": { @@ -675,7 +674,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 298, - 351, + 350, 0 ], "command": { @@ -704,7 +703,7 @@ snapshot_kind: text "cmdId": "[uuid]", "range": [ 298, - 351, + 350, 0 ], "command": { @@ -715,8 +714,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 357, - 376, + 356, + 375, 0 ], "command": { @@ -731,8 +730,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 357, - 376, + 356, + 375, 0 ], "command": { @@ -745,8 +744,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 357, - 376, + 356, + 375, 0 ], "command": { @@ -756,8 +755,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 357, - 376, + 356, + 375, 0 ], "command": { @@ -768,8 +767,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 357, - 376, + 356, + 375, 0 ], "command": { @@ -781,8 +780,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 357, - 376, + 356, + 375, 0 ], "command": { @@ -795,8 +794,8 @@ snapshot_kind: text { "cmdId": "[uuid]", "range": [ - 357, - 376, + 356, + 375, 0 ], "command": { diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/artifact_graph_flowchart.snap.md index 18d8c32a6c..bc365575ab 100644 --- a/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/artifact_graph_flowchart.snap.md +++ b/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/artifact_graph_flowchart.snap.md @@ -9,8 +9,8 @@ flowchart LR 7[Solid2d] end subgraph path23 [Path] - 23["Path
[298, 351, 0]"] - 24["Segment
[298, 351, 0]"] + 23["Path
[298, 350, 0]"] + 24["Segment
[298, 350, 0]"] 25[Solid2d] end 1["Plane
[29, 48, 0]"] @@ -29,7 +29,7 @@ flowchart LR 20["SweepEdge Adjacent"] 21["SweepEdge Opposite"] 22["SweepEdge Adjacent"] - 26["Sweep Extrusion
[357, 376, 0]"] + 26["Sweep Extrusion
[356, 375, 0]"] 27[Wall] 28["Cap Start"] 29["Cap End"] diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/ast.snap b/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/ast.snap index 0039091573..ed5e1e4381 100644 --- a/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/ast.snap +++ b/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/ast.snap @@ -445,7 +445,7 @@ description: Result of parsing sketch_on_face_circle_tagged.kcl }, { "declaration": { - "end": 376, + "end": 375, "id": { "end": 260, "name": "part002", @@ -486,88 +486,73 @@ description: Result of parsing sketch_on_face_circle_tagged.kcl { "arguments": [ { - "end": 336, - "properties": [ - { - "end": 322, - "key": { - "end": 313, - "name": "center", - "start": 307, - "type": "Identifier" - }, - "start": 307, - "type": "ObjectProperty", - "value": { - "elements": [ - { - "end": 318, - "raw": "0", - "start": 317, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - { - "end": 321, - "raw": "0", - "start": 320, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - } - ], - "end": 322, - "start": 316, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "end": 334, - "key": { - "end": 330, - "name": "radius", - "start": 324, - "type": "Identifier" + "type": "LabeledArg", + "label": { + "type": "Identifier", + "name": "center" + }, + "arg": { + "elements": [ + { + "end": 316, + "raw": "0", + "start": 315, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } }, - "start": 324, - "type": "ObjectProperty", - "value": { - "end": 334, - "raw": "5", - "start": 333, + { + "end": 319, + "raw": "0", + "start": 318, "type": "Literal", "type": "Literal", "value": { - "value": 5.0, + "value": 0.0, "suffix": "None" } } - } - ], - "start": 305, - "type": "ObjectExpression", - "type": "ObjectExpression" + ], + "end": 320, + "start": 314, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, { - "end": 339, - "start": 338, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "type": "Identifier", + "name": "radius" + }, + "arg": { + "end": 332, + "raw": "5", + "start": 331, + "type": "Literal", + "type": "Literal", + "value": { + "value": 5.0, + "suffix": "None" + } + } }, { - "end": 350, - "start": 341, - "type": "TagDeclarator", - "type": "TagDeclarator", - "value": "myCircle" + "type": "LabeledArg", + "label": { + "type": "Identifier", + "name": "tag" + }, + "arg": { + "end": 349, + "start": 340, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "myCircle" + } } ], "callee": { @@ -576,10 +561,11 @@ description: Result of parsing sketch_on_face_circle_tagged.kcl "start": 298, "type": "Identifier" }, - "end": 351, + "end": 350, "start": 298, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -590,9 +576,9 @@ description: Result of parsing sketch_on_face_circle_tagged.kcl "name": "length" }, "arg": { - "end": 375, + "end": 374, "raw": "5", - "start": 374, + "start": 373, "type": "Literal", "type": "Literal", "value": { @@ -603,19 +589,19 @@ description: Result of parsing sketch_on_face_circle_tagged.kcl } ], "callee": { - "end": 364, + "end": 363, "name": "extrude", - "start": 357, + "start": 356, "type": "Identifier" }, - "end": 376, - "start": 357, + "end": 375, + "start": 356, "type": "CallExpressionKw", "type": "CallExpressionKw", "unlabeled": null } ], - "end": 376, + "end": 375, "start": 263, "type": "PipeExpression", "type": "PipeExpression" @@ -623,14 +609,14 @@ description: Result of parsing sketch_on_face_circle_tagged.kcl "start": 253, "type": "VariableDeclarator" }, - "end": 376, + "end": 375, "kind": "const", "start": 253, "type": "VariableDeclaration", "type": "VariableDeclaration" } ], - "end": 377, + "end": 376, "nonCodeMeta": { "nonCodeNodes": { "1": [ diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/input.kcl b/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/input.kcl index aad0913d97..dd7e1427db 100644 --- a/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/input.kcl +++ b/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/input.kcl @@ -12,5 +12,5 @@ part001 = cube([0, 0], 20) |> extrude(length = 20) part002 = startSketchOn(part001, "end") - |> circle({ center = [0, 0], radius = 5 }, %, $myCircle) + |> circle(center = [0, 0], radius = 5, tag = $myCircle) |> extrude(length = 5) diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/ops.snap b/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/ops.snap index 04ea741a05..d6cf33271b 100644 --- a/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/ops.snap +++ b/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/ops.snap @@ -142,16 +142,16 @@ description: Operations executed sketch_on_face_circle_tagged.kcl } }, "sourceRange": [ + 373, 374, - 375, 0 ] } }, "name": "extrude", "sourceRange": [ - 357, - 376, + 356, + 375, 0 ], "type": "StdLibCall", diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/program_memory.snap b/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/program_memory.snap index 5a1c755a1f..c877513abc 100644 --- a/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/program_memory.snap +++ b/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/program_memory.snap @@ -28,7 +28,7 @@ description: Variables in memory after executing sketch_on_face_circle_tagged.kc "id": "[uuid]", "sourceRange": [ 298, - 351, + 350, 0 ] }, @@ -43,8 +43,8 @@ description: Variables in memory after executing sketch_on_face_circle_tagged.kc ], "radius": 5.0, "tag": { - "end": 350, - "start": 341, + "end": 349, + "start": 340, "type": "TagDeclarator", "value": "myCircle" }, @@ -62,12 +62,12 @@ description: Variables in memory after executing sketch_on_face_circle_tagged.kc "id": "[uuid]", "sourceRange": [ 298, - 351, + 350, 0 ], "tag": { - "end": 350, - "start": 341, + "end": 349, + "start": 340, "type": "TagDeclarator", "value": "myCircle" }, @@ -77,8 +77,8 @@ description: Variables in memory after executing sketch_on_face_circle_tagged.kc "__meta": [ { "sourceRange": [ - 341, - 350, + 340, + 349, 0 ] } @@ -329,12 +329,12 @@ description: Variables in memory after executing sketch_on_face_circle_tagged.kc "id": "[uuid]", "sourceRange": [ 298, - 351, + 350, 0 ], "tag": { - "end": 350, - "start": 341, + "end": 349, + "start": 340, "type": "TagDeclarator", "value": "myCircle" }, @@ -350,7 +350,7 @@ description: Variables in memory after executing sketch_on_face_circle_tagged.kc "id": "[uuid]", "sourceRange": [ 298, - 351, + 350, 0 ] }, @@ -365,8 +365,8 @@ description: Variables in memory after executing sketch_on_face_circle_tagged.kc ], "radius": 5.0, "tag": { - "end": 350, - "start": 341, + "end": 349, + "start": 340, "type": "TagDeclarator", "value": "myCircle" }, @@ -660,7 +660,7 @@ description: Variables in memory after executing sketch_on_face_circle_tagged.kc "id": "[uuid]", "sourceRange": [ 298, - 351, + 350, 0 ] } @@ -678,7 +678,7 @@ description: Variables in memory after executing sketch_on_face_circle_tagged.kc "id": "[uuid]", "sourceRange": [ 298, - 351, + 350, 0 ] }, @@ -693,8 +693,8 @@ description: Variables in memory after executing sketch_on_face_circle_tagged.kc ], "radius": 5.0, "tag": { - "end": 350, - "start": 341, + "end": 349, + "start": 340, "type": "TagDeclarator", "value": "myCircle" }, @@ -712,12 +712,12 @@ description: Variables in memory after executing sketch_on_face_circle_tagged.kc "id": "[uuid]", "sourceRange": [ 298, - 351, + 350, 0 ], "tag": { - "end": 350, - "start": 341, + "end": 349, + "start": 340, "type": "TagDeclarator", "value": "myCircle" }, @@ -727,8 +727,8 @@ description: Variables in memory after executing sketch_on_face_circle_tagged.kc "__meta": [ { "sourceRange": [ - 341, - 350, + 340, + 349, 0 ] } @@ -744,7 +744,7 @@ description: Variables in memory after executing sketch_on_face_circle_tagged.kc { "sourceRange": [ 298, - 351, + 350, 0 ] } @@ -760,7 +760,7 @@ description: Variables in memory after executing sketch_on_face_circle_tagged.kc { "sourceRange": [ 298, - 351, + 350, 0 ] } diff --git a/src/wasm-lib/kcl/tests/ssi_pattern/artifact_commands.snap b/src/wasm-lib/kcl/tests/ssi_pattern/artifact_commands.snap index 143e2d2f98..8d9325931c 100644 --- a/src/wasm-lib/kcl/tests/ssi_pattern/artifact_commands.snap +++ b/src/wasm-lib/kcl/tests/ssi_pattern/artifact_commands.snap @@ -700,7 +700,7 @@ description: Artifact commands ssi_pattern.kcl "cmdId": "[uuid]", "range": [ 370, - 421, + 414, 0 ], "command": { @@ -716,7 +716,7 @@ description: Artifact commands ssi_pattern.kcl "cmdId": "[uuid]", "range": [ 370, - 421, + 414, 0 ], "command": { @@ -727,7 +727,7 @@ description: Artifact commands ssi_pattern.kcl "cmdId": "[uuid]", "range": [ 370, - 421, + 414, 0 ], "command": { @@ -744,7 +744,7 @@ description: Artifact commands ssi_pattern.kcl "cmdId": "[uuid]", "range": [ 370, - 421, + 414, 0 ], "command": { @@ -773,7 +773,7 @@ description: Artifact commands ssi_pattern.kcl "cmdId": "[uuid]", "range": [ 370, - 421, + 414, 0 ], "command": { @@ -784,8 +784,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 427, - 486, + 420, + 479, 0 ], "command": { @@ -915,8 +915,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 545, - 605, + 538, + 598, 0 ], "command": { @@ -1075,8 +1075,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 545, - 605, + 538, + 598, 0 ], "command": { @@ -1235,8 +1235,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 545, - 605, + 538, + 598, 0 ], "command": { @@ -1395,8 +1395,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 545, - 605, + 538, + 598, 0 ], "command": { @@ -1555,8 +1555,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 545, - 605, + 538, + 598, 0 ], "command": { @@ -1715,8 +1715,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -1731,8 +1731,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -1745,8 +1745,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -1756,8 +1756,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -1768,8 +1768,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -1781,8 +1781,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -1795,8 +1795,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -1809,8 +1809,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -1825,8 +1825,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -1839,8 +1839,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -1850,8 +1850,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -1862,8 +1862,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -1875,8 +1875,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -1889,8 +1889,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -1903,8 +1903,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -1919,8 +1919,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -1933,8 +1933,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -1944,8 +1944,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -1956,8 +1956,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -1969,8 +1969,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -1983,8 +1983,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -1997,8 +1997,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2013,8 +2013,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2027,8 +2027,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2038,8 +2038,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2050,8 +2050,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2063,8 +2063,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2077,8 +2077,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2091,8 +2091,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2107,8 +2107,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2121,8 +2121,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2132,8 +2132,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2144,8 +2144,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2157,8 +2157,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2171,8 +2171,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2185,8 +2185,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2201,8 +2201,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2215,8 +2215,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2226,8 +2226,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2238,8 +2238,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2251,8 +2251,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2265,8 +2265,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2279,8 +2279,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2295,8 +2295,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2309,8 +2309,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2320,8 +2320,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2332,8 +2332,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2345,8 +2345,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2359,8 +2359,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2373,8 +2373,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2389,8 +2389,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2403,8 +2403,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2414,8 +2414,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2426,8 +2426,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2439,8 +2439,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2453,8 +2453,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2467,8 +2467,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2483,8 +2483,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2497,8 +2497,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2508,8 +2508,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2520,8 +2520,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2533,8 +2533,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2547,8 +2547,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2561,8 +2561,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2577,8 +2577,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2591,8 +2591,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2602,8 +2602,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2614,8 +2614,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2627,8 +2627,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2641,8 +2641,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2655,8 +2655,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2671,8 +2671,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2685,8 +2685,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2696,8 +2696,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2708,8 +2708,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2721,8 +2721,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2735,8 +2735,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2749,8 +2749,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2765,8 +2765,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2779,8 +2779,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2790,8 +2790,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2802,8 +2802,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2815,8 +2815,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2829,8 +2829,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2843,8 +2843,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2859,8 +2859,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2873,8 +2873,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2884,8 +2884,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2896,8 +2896,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2909,8 +2909,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2923,8 +2923,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2937,8 +2937,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2953,8 +2953,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2967,8 +2967,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2978,8 +2978,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -2990,8 +2990,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3003,8 +3003,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3017,8 +3017,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3031,8 +3031,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3047,8 +3047,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3061,8 +3061,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3072,8 +3072,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3084,8 +3084,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3097,8 +3097,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3111,8 +3111,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3125,8 +3125,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3141,8 +3141,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3155,8 +3155,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3166,8 +3166,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3178,8 +3178,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3191,8 +3191,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3205,8 +3205,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3219,8 +3219,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3235,8 +3235,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3249,8 +3249,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3260,8 +3260,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3272,8 +3272,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3285,8 +3285,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3299,8 +3299,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3313,8 +3313,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3329,8 +3329,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3343,8 +3343,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3354,8 +3354,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3366,8 +3366,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3379,8 +3379,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3393,8 +3393,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3407,8 +3407,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3423,8 +3423,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3437,8 +3437,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3448,8 +3448,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3460,8 +3460,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3473,8 +3473,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3487,8 +3487,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3501,8 +3501,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3517,8 +3517,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3531,8 +3531,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3542,8 +3542,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3554,8 +3554,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3567,8 +3567,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3581,8 +3581,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3595,8 +3595,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3611,8 +3611,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3625,8 +3625,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3636,8 +3636,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3648,8 +3648,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3661,8 +3661,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3675,8 +3675,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3689,8 +3689,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3705,8 +3705,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3719,8 +3719,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3730,8 +3730,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3742,8 +3742,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3755,8 +3755,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3769,8 +3769,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3783,8 +3783,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3799,8 +3799,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3813,8 +3813,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3824,8 +3824,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3836,8 +3836,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3849,8 +3849,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3863,8 +3863,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3877,8 +3877,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3893,8 +3893,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3907,8 +3907,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3918,8 +3918,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3930,8 +3930,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3943,8 +3943,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3957,8 +3957,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3971,8 +3971,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -3987,8 +3987,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4001,8 +4001,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4012,8 +4012,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4024,8 +4024,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4037,8 +4037,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4051,8 +4051,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4065,8 +4065,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4081,8 +4081,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4095,8 +4095,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4106,8 +4106,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4118,8 +4118,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4131,8 +4131,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4145,8 +4145,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4159,8 +4159,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4175,8 +4175,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4189,8 +4189,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4200,8 +4200,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4212,8 +4212,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4225,8 +4225,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4239,8 +4239,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4253,8 +4253,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4269,8 +4269,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4283,8 +4283,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4294,8 +4294,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4306,8 +4306,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4319,8 +4319,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4333,8 +4333,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4347,8 +4347,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4363,8 +4363,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4377,8 +4377,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4388,8 +4388,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4400,8 +4400,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4413,8 +4413,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4427,8 +4427,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4441,8 +4441,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4457,8 +4457,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4471,8 +4471,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4482,8 +4482,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4494,8 +4494,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4507,8 +4507,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { @@ -4521,8 +4521,8 @@ description: Artifact commands ssi_pattern.kcl { "cmdId": "[uuid]", "range": [ - 611, - 632, + 604, + 625, 0 ], "command": { diff --git a/src/wasm-lib/kcl/tests/ssi_pattern/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/ssi_pattern/artifact_graph_flowchart.snap.md index 88c048b744..a919af2d65 100644 --- a/src/wasm-lib/kcl/tests/ssi_pattern/artifact_graph_flowchart.snap.md +++ b/src/wasm-lib/kcl/tests/ssi_pattern/artifact_graph_flowchart.snap.md @@ -11,8 +11,8 @@ flowchart LR 9[Solid2d] end subgraph path28 [Path] - 28["Path
[370, 421, 0]"] - 29["Segment
[370, 421, 0]"] + 28["Path
[370, 414, 0]"] + 29["Segment
[370, 414, 0]"] 30[Solid2d] end 1["Plane
[12, 31, 0]"] @@ -34,7 +34,7 @@ flowchart LR 25["SweepEdge Adjacent"] 26["SweepEdge Opposite"] 27["SweepEdge Adjacent"] - 31["Sweep Extrusion
[611, 632, 0]"] + 31["Sweep Extrusion
[604, 625, 0]"] 32[Wall] 33["SweepEdge Opposite"] 34["SweepEdge Adjacent"] diff --git a/src/wasm-lib/kcl/tests/ssi_pattern/ast.snap b/src/wasm-lib/kcl/tests/ssi_pattern/ast.snap index 73147c779f..43e2e8b74a 100644 --- a/src/wasm-lib/kcl/tests/ssi_pattern/ast.snap +++ b/src/wasm-lib/kcl/tests/ssi_pattern/ast.snap @@ -451,7 +451,7 @@ description: Result of parsing ssi_pattern.kcl }, { "declaration": { - "end": 632, + "end": 625, "id": { "end": 329, "name": "sketch002", @@ -491,88 +491,66 @@ description: Result of parsing ssi_pattern.kcl { "arguments": [ { - "end": 417, - "properties": [ - { - "end": 401, - "key": { - "end": 385, - "name": "center", - "start": 379, - "type": "Identifier" - }, - "start": 379, - "type": "ObjectProperty", - "value": { - "elements": [ - { - "argument": { - "end": 394, - "raw": "2.08", - "start": 390, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.08, - "suffix": "None" - } - }, - "end": 394, - "operator": "-", - "start": 389, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - { - "end": 400, - "raw": "47.7", - "start": 396, - "type": "Literal", - "type": "Literal", - "value": { - "value": 47.7, - "suffix": "None" - } + "type": "LabeledArg", + "label": { + "type": "Identifier", + "name": "center" + }, + "arg": { + "elements": [ + { + "argument": { + "end": 392, + "raw": "2.08", + "start": 388, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.08, + "suffix": "None" } - ], - "end": 401, - "start": 388, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "end": 415, - "key": { - "end": 409, - "name": "radius", - "start": 403, - "type": "Identifier" + }, + "end": 392, + "operator": "-", + "start": 387, + "type": "UnaryExpression", + "type": "UnaryExpression" }, - "start": 403, - "type": "ObjectProperty", - "value": { - "end": 415, - "raw": "1.4", - "start": 412, + { + "end": 398, + "raw": "47.7", + "start": 394, "type": "Literal", "type": "Literal", "value": { - "value": 1.4, + "value": 47.7, "suffix": "None" } } - } - ], - "start": 377, - "type": "ObjectExpression", - "type": "ObjectExpression" + ], + "end": 399, + "start": 386, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, { - "end": 420, - "start": 419, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "type": "Identifier", + "name": "radius" + }, + "arg": { + "end": 413, + "raw": "1.4", + "start": 410, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.4, + "suffix": "None" + } + } } ], "callee": { @@ -581,10 +559,11 @@ description: Result of parsing ssi_pattern.kcl "start": 370, "type": "Identifier" }, - "end": 421, + "end": 414, "start": 370, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -595,9 +574,9 @@ description: Result of parsing ssi_pattern.kcl "name": "instances" }, "arg": { - "end": 456, + "end": 449, "raw": "5", - "start": 455, + "start": 448, "type": "Literal", "type": "Literal", "value": { @@ -613,9 +592,9 @@ description: Result of parsing ssi_pattern.kcl "name": "distance" }, "arg": { - "end": 470, + "end": 463, "raw": "5", - "start": 469, + "start": 462, "type": "Literal", "type": "Literal", "value": { @@ -633,9 +612,9 @@ description: Result of parsing ssi_pattern.kcl "arg": { "elements": [ { - "end": 481, + "end": 474, "raw": "1", - "start": 480, + "start": 473, "type": "Literal", "type": "Literal", "value": { @@ -644,9 +623,9 @@ description: Result of parsing ssi_pattern.kcl } }, { - "end": 484, + "end": 477, "raw": "0", - "start": 483, + "start": 476, "type": "Literal", "type": "Literal", "value": { @@ -655,21 +634,21 @@ description: Result of parsing ssi_pattern.kcl } } ], - "end": 485, - "start": 479, + "end": 478, + "start": 472, "type": "ArrayExpression", "type": "ArrayExpression" } } ], "callee": { - "end": 442, + "end": 435, "name": "patternLinear2d", - "start": 427, + "start": 420, "type": "Identifier" }, - "end": 486, - "start": 427, + "end": 479, + "start": 420, "type": "CallExpressionKw", "type": "CallExpressionKw", "unlabeled": null @@ -683,9 +662,9 @@ description: Result of parsing ssi_pattern.kcl "name": "instances" }, "arg": { - "end": 574, + "end": 567, "raw": "6", - "start": 573, + "start": 566, "type": "Literal", "type": "Literal", "value": { @@ -701,9 +680,9 @@ description: Result of parsing ssi_pattern.kcl "name": "distance" }, "arg": { - "end": 588, + "end": 581, "raw": "4", - "start": 587, + "start": 580, "type": "Literal", "type": "Literal", "value": { @@ -721,9 +700,9 @@ description: Result of parsing ssi_pattern.kcl "arg": { "elements": [ { - "end": 599, + "end": 592, "raw": "0", - "start": 598, + "start": 591, "type": "Literal", "type": "Literal", "value": { @@ -733,9 +712,9 @@ description: Result of parsing ssi_pattern.kcl }, { "argument": { - "end": 603, + "end": 596, "raw": "1", - "start": 602, + "start": 595, "type": "Literal", "type": "Literal", "value": { @@ -743,28 +722,28 @@ description: Result of parsing ssi_pattern.kcl "suffix": "None" } }, - "end": 603, + "end": 596, "operator": "-", - "start": 601, + "start": 594, "type": "UnaryExpression", "type": "UnaryExpression" } ], - "end": 604, - "start": 597, + "end": 597, + "start": 590, "type": "ArrayExpression", "type": "ArrayExpression" } } ], "callee": { - "end": 560, + "end": 553, "name": "patternLinear2d", - "start": 545, + "start": 538, "type": "Identifier" }, - "end": 605, - "start": 545, + "end": 598, + "start": 538, "type": "CallExpressionKw", "type": "CallExpressionKw", "unlabeled": null @@ -779,9 +758,9 @@ description: Result of parsing ssi_pattern.kcl }, "arg": { "argument": { - "end": 631, + "end": 624, "raw": "40", - "start": 629, + "start": 622, "type": "Literal", "type": "Literal", "value": { @@ -789,34 +768,34 @@ description: Result of parsing ssi_pattern.kcl "suffix": "None" } }, - "end": 631, + "end": 624, "operator": "-", - "start": 628, + "start": 621, "type": "UnaryExpression", "type": "UnaryExpression" } } ], "callee": { - "end": 618, + "end": 611, "name": "extrude", - "start": 611, + "start": 604, "type": "Identifier" }, - "end": 632, - "start": 611, + "end": 625, + "start": 604, "type": "CallExpressionKw", "type": "CallExpressionKw", "unlabeled": null } ], - "end": 632, + "end": 625, "nonCodeMeta": { "nonCodeNodes": { "2": [ { - "end": 539, - "start": 488, + "end": 532, + "start": 481, "type": "NonCodeNode", "value": { "type": "blockComment", @@ -835,14 +814,14 @@ description: Result of parsing ssi_pattern.kcl "start": 320, "type": "VariableDeclarator" }, - "end": 632, + "end": 625, "kind": "const", "start": 320, "type": "VariableDeclaration", "type": "VariableDeclaration" } ], - "end": 633, + "end": 626, "nonCodeMeta": { "nonCodeNodes": { "0": [ diff --git a/src/wasm-lib/kcl/tests/ssi_pattern/input.kcl b/src/wasm-lib/kcl/tests/ssi_pattern/input.kcl index fd7b10e98d..d980bacdba 100644 --- a/src/wasm-lib/kcl/tests/ssi_pattern/input.kcl +++ b/src/wasm-lib/kcl/tests/ssi_pattern/input.kcl @@ -10,7 +10,7 @@ sketch001 = startSketchOn('XZ') extrude001 = extrude(sketch001, length = 50) sketch002 = startSketchOn(extrude001, seg01) - |> circle({ center = [-2.08, 47.7], radius = 1.4 }, %) + |> circle(center = [-2.08, 47.7], radius = 1.4) |> patternLinear2d(instances = 5, distance = 5, axis = [1, 0]) // Instances was reduced from 12 to speed this up. |> patternLinear2d(instances = 6, distance = 4, axis = [0, -1]) diff --git a/src/wasm-lib/kcl/tests/ssi_pattern/ops.snap b/src/wasm-lib/kcl/tests/ssi_pattern/ops.snap index 02c29fe2a0..b4590c97f8 100644 --- a/src/wasm-lib/kcl/tests/ssi_pattern/ops.snap +++ b/src/wasm-lib/kcl/tests/ssi_pattern/ops.snap @@ -124,16 +124,16 @@ description: Operations executed ssi_pattern.kcl } }, "sourceRange": [ - 628, - 631, + 621, + 624, 0 ] } }, "name": "extrude", "sourceRange": [ - 611, - 632, + 604, + 625, 0 ], "type": "StdLibCall", diff --git a/src/wasm-lib/kcl/tests/ssi_pattern/program_memory.snap b/src/wasm-lib/kcl/tests/ssi_pattern/program_memory.snap index c8b35f51f0..39ec9958ae 100644 --- a/src/wasm-lib/kcl/tests/ssi_pattern/program_memory.snap +++ b/src/wasm-lib/kcl/tests/ssi_pattern/program_memory.snap @@ -735,7 +735,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ], "tag": null, @@ -751,7 +751,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] }, @@ -1192,7 +1192,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -1206,7 +1206,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -1222,7 +1222,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -1238,7 +1238,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ], "tag": null, @@ -1254,7 +1254,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] }, @@ -1695,7 +1695,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -1709,7 +1709,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -1725,7 +1725,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -1741,7 +1741,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ], "tag": null, @@ -1757,7 +1757,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] }, @@ -2198,7 +2198,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -2212,7 +2212,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -2228,7 +2228,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -2244,7 +2244,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ], "tag": null, @@ -2260,7 +2260,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] }, @@ -2701,7 +2701,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -2715,7 +2715,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -2731,7 +2731,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -2747,7 +2747,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ], "tag": null, @@ -2763,7 +2763,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] }, @@ -3204,7 +3204,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -3218,7 +3218,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -3234,7 +3234,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -3250,7 +3250,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ], "tag": null, @@ -3266,7 +3266,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] }, @@ -3707,7 +3707,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -3721,7 +3721,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -3737,7 +3737,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -3753,7 +3753,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ], "tag": null, @@ -3769,7 +3769,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] }, @@ -4210,7 +4210,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -4224,7 +4224,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -4240,7 +4240,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -4256,7 +4256,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ], "tag": null, @@ -4272,7 +4272,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] }, @@ -4713,7 +4713,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -4727,7 +4727,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -4743,7 +4743,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -4759,7 +4759,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ], "tag": null, @@ -4775,7 +4775,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] }, @@ -5216,7 +5216,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -5230,7 +5230,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -5246,7 +5246,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -5262,7 +5262,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ], "tag": null, @@ -5278,7 +5278,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] }, @@ -5719,7 +5719,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -5733,7 +5733,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -5749,7 +5749,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -5765,7 +5765,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ], "tag": null, @@ -5781,7 +5781,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] }, @@ -6222,7 +6222,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -6236,7 +6236,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -6252,7 +6252,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -6268,7 +6268,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ], "tag": null, @@ -6284,7 +6284,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] }, @@ -6725,7 +6725,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -6739,7 +6739,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -6755,7 +6755,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -6771,7 +6771,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ], "tag": null, @@ -6787,7 +6787,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] }, @@ -7228,7 +7228,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -7242,7 +7242,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -7258,7 +7258,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -7274,7 +7274,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ], "tag": null, @@ -7290,7 +7290,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] }, @@ -7731,7 +7731,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -7745,7 +7745,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -7761,7 +7761,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -7777,7 +7777,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ], "tag": null, @@ -7793,7 +7793,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] }, @@ -8234,7 +8234,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -8248,7 +8248,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -8264,7 +8264,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -8280,7 +8280,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ], "tag": null, @@ -8296,7 +8296,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] }, @@ -8737,7 +8737,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -8751,7 +8751,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -8767,7 +8767,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -8783,7 +8783,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ], "tag": null, @@ -8799,7 +8799,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] }, @@ -9240,7 +9240,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -9254,7 +9254,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -9270,7 +9270,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -9286,7 +9286,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ], "tag": null, @@ -9302,7 +9302,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] }, @@ -9743,7 +9743,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -9757,7 +9757,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -9773,7 +9773,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -9789,7 +9789,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ], "tag": null, @@ -9805,7 +9805,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] }, @@ -10246,7 +10246,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -10260,7 +10260,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -10276,7 +10276,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -10292,7 +10292,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ], "tag": null, @@ -10308,7 +10308,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] }, @@ -10749,7 +10749,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -10763,7 +10763,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -10779,7 +10779,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -10795,7 +10795,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ], "tag": null, @@ -10811,7 +10811,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] }, @@ -11252,7 +11252,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -11266,7 +11266,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -11282,7 +11282,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -11298,7 +11298,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ], "tag": null, @@ -11314,7 +11314,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] }, @@ -11755,7 +11755,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -11769,7 +11769,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -11785,7 +11785,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -11801,7 +11801,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ], "tag": null, @@ -11817,7 +11817,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] }, @@ -12258,7 +12258,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -12272,7 +12272,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -12288,7 +12288,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -12304,7 +12304,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ], "tag": null, @@ -12320,7 +12320,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] }, @@ -12761,7 +12761,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -12775,7 +12775,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -12791,7 +12791,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -12807,7 +12807,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ], "tag": null, @@ -12823,7 +12823,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] }, @@ -13264,7 +13264,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -13278,7 +13278,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -13294,7 +13294,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -13310,7 +13310,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ], "tag": null, @@ -13326,7 +13326,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] }, @@ -13767,7 +13767,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -13781,7 +13781,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -13797,7 +13797,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -13813,7 +13813,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ], "tag": null, @@ -13829,7 +13829,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] }, @@ -14270,7 +14270,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -14284,7 +14284,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -14300,7 +14300,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -14316,7 +14316,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ], "tag": null, @@ -14332,7 +14332,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] }, @@ -14773,7 +14773,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -14787,7 +14787,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -14803,7 +14803,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -14819,7 +14819,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ], "tag": null, @@ -14835,7 +14835,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] }, @@ -15276,7 +15276,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -15290,7 +15290,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -15306,7 +15306,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -15322,7 +15322,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ], "tag": null, @@ -15338,7 +15338,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] }, @@ -15779,7 +15779,7 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -15793,7 +15793,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } @@ -15809,7 +15809,7 @@ description: Variables in memory after executing ssi_pattern.kcl { "sourceRange": [ 370, - 421, + 414, 0 ] } diff --git a/src/wasm-lib/tests/executor/inputs/cylinder.kcl b/src/wasm-lib/tests/executor/inputs/cylinder.kcl index c299946198..94a7b4372b 100644 --- a/src/wasm-lib/tests/executor/inputs/cylinder.kcl +++ b/src/wasm-lib/tests/executor/inputs/cylinder.kcl @@ -1,3 +1,3 @@ const cylinder = startSketchOn('XY') - |> circle({ center: [0, 0], radius: 22 }, %) + |> circle(center= [0, 0], radius= 22) |> extrude(length = 14) diff --git a/src/wasm-lib/tests/executor/inputs/fillet-and-shell.kcl b/src/wasm-lib/tests/executor/inputs/fillet-and-shell.kcl index b2fe8bb468..3520889feb 100644 --- a/src/wasm-lib/tests/executor/inputs/fillet-and-shell.kcl +++ b/src/wasm-lib/tests/executor/inputs/fillet-and-shell.kcl @@ -61,8 +61,8 @@ const case = startSketchOn('XY') fn m25Screw = (x, y, height) => { const screw = startSketchOn("XY") |> startProfileAt([0, 0], %) - |> circle({ center: [x, y], radius: 2.5 }, %) - |> hole(circle({ center: [x, y], radius: 1.25 }, %), %) + |> circle(center= [x, y], radius=2.5) + |> hole(circle(center= [x, y], radius = 1.25), %) |> extrude(length = height) return screw } diff --git a/src/wasm-lib/tests/executor/inputs/focusrite_scarlett_mounting_braket.kcl b/src/wasm-lib/tests/executor/inputs/focusrite_scarlett_mounting_braket.kcl index f09be072d9..feffe98843 100644 --- a/src/wasm-lib/tests/executor/inputs/focusrite_scarlett_mounting_braket.kcl +++ b/src/wasm-lib/tests/executor/inputs/focusrite_scarlett_mounting_braket.kcl @@ -80,13 +80,13 @@ const tabsR = startSketchOn(tabPlane) |> line(end = [0, -tabLength / 3 * 2], tag = $edge12) |> line(end = [-tabWidth, -tabLength / 3], tag = $edge13) |> close(tag = $edge14) - |> hole(circle({ - center: [ + |> hole(circle( + center = [ width / 2 + thk + tabWidth / 2, length / 2 + thk - (tabLength / (3 / 2)) ], - radius: holeDiam / 2 - }, %), %) + radius = holeDiam / 2 + ), %) |> extrude(length = -tabThk) |> fillet( radius = holeDiam / 2, @@ -108,13 +108,13 @@ const tabsL = startSketchOn(tabPlane) |> line(end = [0, -tabLength / 3 * 2], tag = $edge22) |> line(end = [tabWidth, -tabLength / 3], tag = $edge23) |> close(tag = $edge24) - |> hole(circle({ - center: [ + |> hole(circle( + center= [ -width / 2 - thk - (tabWidth / 2), length / 2 + thk - (tabLength / (3 / 2)) ], - radius: holeDiam / 2 - }, %), %) + radius= holeDiam / 2 + ), %) |> extrude(length = -tabThk) |> fillet( radius = holeDiam / 2, diff --git a/src/wasm-lib/tests/executor/inputs/global-tags.kcl b/src/wasm-lib/tests/executor/inputs/global-tags.kcl index cdb491d776..01930cb1c2 100644 --- a/src/wasm-lib/tests/executor/inputs/global-tags.kcl +++ b/src/wasm-lib/tests/executor/inputs/global-tags.kcl @@ -80,13 +80,13 @@ const tabsR = startSketchOn(tabPlane) |> line(end = [0, -tabLength / 3 * 2], tag = $edge12) |> line(end = [-tabWidth, -tabLength / 3], tag = $edge13) |> close(tag = $edge14) - |> hole(circle({ - center: [ + |> hole(circle( + center= [ width / 2 + thk + tabWidth / 2, length / 2 + thk - (tabLength / (3 / 2)) ], - radius: holeDiam / 2 - }, %), %) + radius= holeDiam / 2 + ), %) |> extrude(length = -tabThk) |> fillet( radius = holeDiam / 2, @@ -108,13 +108,13 @@ const tabsL = startSketchOn(tabPlane) |> line(end = [0, -tabLength / 3 * 2], tag = $edge22) |> line(end = [tabWidth, -tabLength / 3], tag = $edge23) |> close(tag = $edge24) - |> hole(circle({ - center: [ + |> hole(circle( + center= [ -width / 2 - thk - (tabWidth / 2), length / 2 + thk - (tabLength / (3 / 2)) ], - radius: holeDiam / 2 - }, %), %) + radius= holeDiam / 2 + ), %) |> extrude(length = -tabThk) |> fillet( radius = holeDiam / 2, diff --git a/src/wasm-lib/tests/executor/inputs/helix_defaults.kcl b/src/wasm-lib/tests/executor/inputs/helix_defaults.kcl index b948307dcb..68ddef5c88 100644 --- a/src/wasm-lib/tests/executor/inputs/helix_defaults.kcl +++ b/src/wasm-lib/tests/executor/inputs/helix_defaults.kcl @@ -1,4 +1,4 @@ const part001 = startSketchOn('XY') - |> circle({ center: [5, 5], radius: 10 }, %) + |> circle(center= [5, 5], radius= 10) |> extrude(length = 10) |> helixRevolutions({revolutions = 16, angleStart = 0}, %) diff --git a/src/wasm-lib/tests/executor/inputs/helix_defaults_negative_extrude.kcl b/src/wasm-lib/tests/executor/inputs/helix_defaults_negative_extrude.kcl index 8086e5c72a..23a8170e07 100644 --- a/src/wasm-lib/tests/executor/inputs/helix_defaults_negative_extrude.kcl +++ b/src/wasm-lib/tests/executor/inputs/helix_defaults_negative_extrude.kcl @@ -1,4 +1,4 @@ const part001 = startSketchOn('XY') - |> circle({ center: [5, 5], radius: 10 }, %) + |> circle(center = [5, 5], radius = 10) |> extrude(length = -10) |> helixRevolutions({revolutions = 16, angleStart = 0}, %) diff --git a/src/wasm-lib/tests/executor/inputs/helix_with_length.kcl b/src/wasm-lib/tests/executor/inputs/helix_with_length.kcl index 00bc773220..9cca910d26 100644 --- a/src/wasm-lib/tests/executor/inputs/helix_with_length.kcl +++ b/src/wasm-lib/tests/executor/inputs/helix_with_length.kcl @@ -1,4 +1,4 @@ const part001 = startSketchOn('XY') - |> circle({ center: [5, 5], radius: 10 }, %) + |> circle(center= [5, 5], radius= 10) |> extrude(length = 10) |> helixRevolutions({revolutions = 16, angleStart = 0, length = 3}, %) diff --git a/src/wasm-lib/tests/executor/inputs/lego.kcl b/src/wasm-lib/tests/executor/inputs/lego.kcl index 684e6bcbbe..b131b07b09 100644 --- a/src/wasm-lib/tests/executor/inputs/lego.kcl +++ b/src/wasm-lib/tests/executor/inputs/lego.kcl @@ -39,10 +39,10 @@ const shellExtrude = startSketchOn(s, "start") |> extrude(length = -(height - t)) const peg = startSketchOn(s, "end") - |> circle({ center: [ + |> circle( center= [ -(total_width / 2 - wSegments), -(total_length / 2 - lSegments) - ], radius: bumpDiam / 2 }, %) + ], radius= bumpDiam / 2) |> patternLinear2d( axis = [1, 0], instances = 6, diff --git a/src/wasm-lib/tests/executor/inputs/pattern_vase.kcl b/src/wasm-lib/tests/executor/inputs/pattern_vase.kcl index 6e3bdaa706..1549a98eef 100644 --- a/src/wasm-lib/tests/executor/inputs/pattern_vase.kcl +++ b/src/wasm-lib/tests/executor/inputs/pattern_vase.kcl @@ -14,7 +14,7 @@ fn transform = (replicaId) => { // Each layer is just a pretty thin cylinder with a fillet. fn layer = () => { return startSketchOn("XY") // or some other plane idk - |> circle({ center: [0, 0], radius: 1 }, %, $tag1) + |> circle(center = [0, 0], radius = 1, tag = $tag1) |> extrude(length = h) // |> fillet( // radius = h / 2.01, diff --git a/src/wasm-lib/tests/executor/inputs/server-rack-heavy.kcl b/src/wasm-lib/tests/executor/inputs/server-rack-heavy.kcl index 1633986314..ca751b6736 100644 --- a/src/wasm-lib/tests/executor/inputs/server-rack-heavy.kcl +++ b/src/wasm-lib/tests/executor/inputs/server-rack-heavy.kcl @@ -30,22 +30,22 @@ fn caster = (originStart) => { |> xLine(-3.543, %) |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() - |> hole(circle({ center: [ + |> hole(circle(center = [ (3.543 - 2.756) / 2, (3.543 - 2.756) / 2 - ], radius: 8.8 / 2 / 25.4}, %), %) - |> hole(circle({ center: [ + ], radius = 8.8 / 2 / 25.4), %) + |> hole(circle(center = [ (3.543 - 2.756) / 2 + 2.756, (3.543 - 2.756) / 2 - ], radius: 8.8 / 2 / 25.4 }, %), %) - |> hole(circle({ center: [ + ], radius = 8.8 / 2 / 25.4 ), %) + |> hole(circle(center = [ (3.543 - 2.756) / 2, (3.543 - 2.756) / 2 + 2.756 - ], radius: 8.8 / 2 / 25.4 }, %), %) - |> hole(circle({ center: [ + ], radius = 8.8 / 2 / 25.4 ), %) + |> hole(circle(center = [ (3.543 - 2.756) / 2 + 2.756, (3.543 - 2.756) / 2 + 2.756 - ], radius: 8.8 / 2 / 25.4 }, %), %) + ], radius = 8.8 / 2 / 25.4 ), %) |> extrude(length = -.25) const sketch002c = startSketchOn(sketch001c, 'START') @@ -71,7 +71,7 @@ fn caster = (originStart) => { } } const sketch003c = startSketchOn(plane002c) - |> circle({ center: [0, 1.2], radius 2.48 / 2 }, %) + |> circle(center = [0, 1.2], radius = 2.48 / 2) const examplec = extrude(sketch003c, length = -1 - (3 / 16)) return examplec } diff --git a/src/wasm-lib/tests/executor/inputs/server-rack-lite.kcl b/src/wasm-lib/tests/executor/inputs/server-rack-lite.kcl index 10fb913631..213bbf636d 100644 --- a/src/wasm-lib/tests/executor/inputs/server-rack-lite.kcl +++ b/src/wasm-lib/tests/executor/inputs/server-rack-lite.kcl @@ -28,22 +28,22 @@ fn caster = (originStart) => { |> xLine(-3.543, %) |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() - |> hole(circle({ center: [ + |> hole(circle(center = [ (3.543 - 2.756) / 2, (3.543 - 2.756) / 2 - ], radius: 8.8 / 2 / 25.4 }, %), %) - |> hole(circle({ center: [ + ], radius= 8.8 / 2 / 25.4), %) + |> hole(circle(center = [ (3.543 - 2.756) / 2 + 2.756, (3.543 - 2.756) / 2 - ], radius: 8.8 / 2 / 25.4 }, %), %) - |> hole(circle({ center: [ + ], radius= 8.8 / 2 / 25.4), %) + |> hole(circle(center = [ (3.543 - 2.756) / 2, (3.543 - 2.756) / 2 + 2.756 - ], radius: 8.8 / 2 / 25.4 }, %), %) - |> hole(circle({ center: [ + ], radius= 8.8 / 2 / 25.4), %) + |> hole(circle(center = [ (3.543 - 2.756) / 2 + 2.756, (3.543 - 2.756) / 2 + 2.756 - ], radius: 8.8 / 2 / 25.4 }, %), %) + ], radius= 8.8 / 2 / 25.4), %) |> extrude(length = -.25) const sketch002c = startSketchOn(sketch001c, 'START') @@ -69,7 +69,7 @@ fn caster = (originStart) => { } } const sketch003c = startSketchOn(plane002c) - |> circle({ center: [0, 1.2], radisu: 2.48 / 2 }, %) + |> circle(center = [0, 1.2], radius = 2.48 / 2) const examplec = extrude(sketch003c, length = -1 - (3 / 16)) return examplec } diff --git a/src/wasm-lib/tests/executor/inputs/sketch_on_face_circle_tagged.kcl b/src/wasm-lib/tests/executor/inputs/sketch_on_face_circle_tagged.kcl index 8d756a9a6f..e11b6405ff 100644 --- a/src/wasm-lib/tests/executor/inputs/sketch_on_face_circle_tagged.kcl +++ b/src/wasm-lib/tests/executor/inputs/sketch_on_face_circle_tagged.kcl @@ -12,5 +12,5 @@ const part001 = cube([0,0], 20) |> extrude(length = 20) const part002 = startSketchOn(part001, "end") - |> circle({ center: [0, 0], radius: 5 }, %, $myCircle) + |> circle(center: [0, 0], radius: 5, tag =$myCircle) |> extrude(length = 5) diff --git a/src/wasm-lib/tests/executor/inputs/slow_lego.kcl.tmpl b/src/wasm-lib/tests/executor/inputs/slow_lego.kcl.tmpl index 52d3c47003..41f5f22eec 100644 --- a/src/wasm-lib/tests/executor/inputs/slow_lego.kcl.tmpl +++ b/src/wasm-lib/tests/executor/inputs/slow_lego.kcl.tmpl @@ -62,10 +62,10 @@ fn tr = (i) => { // Create the pegs on the top of the base const totalBumps = (wbumps * lbumps)-1 const peg = startSketchOn(s, 'end') - |> circle({ center: [ + |> circle( center = [ -(pitch*(wbumps-1)/2), -(pitch*(lbumps-1)/2) - ], radius: bumpDiam / 2 }, %) + ], radius = bumpDiam / 2) |> patternLinear2d( axis = [1, 0], instances = wbumps, diff --git a/src/wasm-lib/tests/executor/inputs/test-circle-extrude.kcl b/src/wasm-lib/tests/executor/inputs/test-circle-extrude.kcl index dad7fa1df1..dcfc2dcdde 100644 --- a/src/wasm-lib/tests/executor/inputs/test-circle-extrude.kcl +++ b/src/wasm-lib/tests/executor/inputs/test-circle-extrude.kcl @@ -11,7 +11,7 @@ const sketch002 = startSketchOn('XZ') ], %) |> close() const sketch001 = startSketchOn('XZ') - |> circle({ + |> circle( center = [318.33, 168.1], radius = 182.8 - }, %) + ) diff --git a/src/wasm-lib/tests/executor/main.rs b/src/wasm-lib/tests/executor/main.rs index 54b2acbf2f..a87dab8e68 100644 --- a/src/wasm-lib/tests/executor/main.rs +++ b/src/wasm-lib/tests/executor/main.rs @@ -219,12 +219,12 @@ wallMountL = 8 bracket = startSketchOn('XY') |> startProfileAt([0, 0], %) |> line(end = [0, wallMountL]) - |> tangentialArc({ radius: filletR, offset: 90 }, %) + |> tangentialArc({ radius= filletR, offset: 90 }, %) |> line(end = [-shelfMountL, 0]) |> line(end = [0, -thickness]) |> line(end = [shelfMountL, 0]) |> tangentialArc({ - radius: filletR - thickness, + radius= filletR - thickness, offset: -90 }, %) |> line(end = [0, -wallMountL]) @@ -270,8 +270,8 @@ async fn kcl_test_holes() { |> line(end = [10, 0]) |> line(end = [0, -10]) |> close() - |> hole(circle({ center: [2, 2], radius: .5 }, %), %) - |> hole(circle({ center: [2, 8], radius: .5 }, %), %) + |> hole(circle(center = [2, 2], radius= .5), %) + |> hole(circle(center = [2, 8], radius= .5), %) |> extrude(length = 2) "#; @@ -323,10 +323,10 @@ holeRadius = 1 holeIndex = 6 part = roundedRectangle([0, 0], 20, 20, 4) - |> hole(circle({ center: [-holeIndex, holeIndex], radius: holeRadius }, %), %) - |> hole(circle({ center: [holeIndex, holeIndex], radius: holeRadius }, %), %) - |> hole(circle({ center: [-holeIndex, -holeIndex], radius: holeRadius }, %), %) - |> hole(circle({ center: [holeIndex, -holeIndex], radius: holeRadius }, %), %) + |> hole(circle(center = [-holeIndex, holeIndex], radius= holeRadius), %) + |> hole(circle(center = [holeIndex, holeIndex], radius= holeRadius), %) + |> hole(circle(center = [-holeIndex, -holeIndex], radius= holeRadius), %) + |> hole(circle(center = [holeIndex, -holeIndex], radius= holeRadius), %) |> extrude(length = 2) "#; @@ -336,7 +336,7 @@ part = roundedRectangle([0, 0], 20, 20, 4) #[tokio::test(flavor = "multi_thread")] async fn kcl_test_top_level_expression() { - let code = r#"startSketchOn('XY') |> circle({ center: [0,0], radius: 22 }, %) |> extrude(length = 14)"#; + let code = r#"startSketchOn('XY') |> circle(center = [0,0], radius= 22) |> extrude(length = 14)"#; let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); assert_out("top_level_expression", &result); @@ -347,7 +347,7 @@ async fn kcl_test_patterns_linear_basic_with_math() { let code = r#"num = 12 distance = 5 part = startSketchOn('XY') - |> circle({ center: [0,0], radius: 2 }, %) + |> circle(center = [0,0], radius= 2) |> patternLinear2d(axis = [0,1], instances = num, distance = distance - 1) |> extrude(length = 1) "#; @@ -359,7 +359,7 @@ part = startSketchOn('XY') #[tokio::test(flavor = "multi_thread")] async fn kcl_test_patterns_linear_basic() { let code = r#"part = startSketchOn('XY') - |> circle({ center: [0,0], radius: 2 }, %) + |> circle(center = [0,0], radius= 2) |> patternLinear2d(axis = [0,1], instances = 13, distance = 4) |> extrude(length = 1) "#; @@ -387,7 +387,7 @@ async fn kcl_test_patterns_linear_basic_3d() { #[tokio::test(flavor = "multi_thread")] async fn kcl_test_patterns_linear_basic_negative_distance() { let code = r#"part = startSketchOn('XY') - |> circle({ center: [0,0], radius: 2 }, %) + |> circle(center = [0,0], radius= 2) |> patternLinear2d(axis = [0,1], instances = 13, distance = -2) |> extrude(length = 1) "#; @@ -399,7 +399,7 @@ async fn kcl_test_patterns_linear_basic_negative_distance() { #[tokio::test(flavor = "multi_thread")] async fn kcl_test_patterns_linear_basic_negative_axis() { let code = r#"part = startSketchOn('XY') - |> circle({ center: [0,0], radius: 2 }, %) + |> circle(center = [0,0], radius= 2) |> patternLinear2d(axis = [0,-1], instances = 13, distance = 2) |> extrude(length = 1) "#; @@ -411,7 +411,7 @@ async fn kcl_test_patterns_linear_basic_negative_axis() { #[tokio::test(flavor = "multi_thread")] async fn kcl_test_patterns_linear_basic_holes() { let code = r#"circles = startSketchOn('XY') - |> circle({ center: [5, 5], radius: 1 }, %) + |> circle(center = [5, 5], radius= 1) |> patternLinear2d(axis = [1,1], instances = 13, distance = 3) rectangle = startSketchOn('XY') @@ -432,7 +432,7 @@ rectangle = startSketchOn('XY') #[tokio::test(flavor = "multi_thread")] async fn kcl_test_patterns_circular_basic_2d() { let code = r#"part = startSketchOn('XY') - |> circle({ center: [0,0], radius: 2 }, %) + |> circle(center = [0,0], radius= 2) |> patternCircular2d(center = [20, 20], instances = 13, arcDegrees = 210, rotateDuplicates = true) |> extrude(length = 1) "#; @@ -770,8 +770,8 @@ async fn kcl_test_stdlib_kcl_error_right_code_path() { |> line(end = [10, 0]) |> line(end = [0, -10]) |> close() - |> hole(circle({ center: [2, 2], radius: .5 }), %) - |> hole(circle({ center: [2, 8], radius: .5 }, %), %) + |> hole(circle(), %) + |> hole(circle(center = [2, 8], radius= .5), %) |> extrude(length = 2) "#; @@ -780,7 +780,10 @@ async fn kcl_test_stdlib_kcl_error_right_code_path() { let ExecError::Kcl(err) = err else { panic!("Expected KCL error, found {err}"); }; - assert_eq!(err.error.message(), "Expected an argument at index 1"); + assert_eq!( + err.error.message(), + "This function requires a keyword argument 'center'" + ); } #[tokio::test(flavor = "multi_thread")] @@ -799,7 +802,7 @@ part001 = cube([0,0], 20) |> extrude(length = 20) part002 = startSketchOn(part001, "end") - |> circle({ center: [0, 0], radius: 5 }, %) + |> circle(center = [0, 0], radius= 5) |> extrude(length = 5) "#; @@ -852,7 +855,7 @@ part = rectShape([0, 0], 20, 20) }; assert_eq!( err.error.message(), - "Argument at index 0 was supposed to be type kcl_lib::std::shapes::CircleData but found string (text)" + "Expected a kcl_lib::std::shapes::SketchOrSurface but found string (text)" ); } @@ -1073,7 +1076,7 @@ async fn kcl_test_revolve_on_face_circle_edge() { |> extrude(length = 20) sketch001 = startSketchOn(box, "END") - |> circle({ center: [10,10], radius: 4 }, %) + |> circle(center = [10,10], radius= 4) |> revolve({ angle: 90, axis: getOppositeEdge(revolveAxis) @@ -1095,7 +1098,7 @@ async fn kcl_test_revolve_on_face_circle() { |> extrude(length = 20) sketch001 = startSketchOn(box, "END") - |> circle({ center: [10,10], radius: 4 }, %) + |> circle(center = [10,10], radius= 4 ) |> revolve({ angle: -90, axis: 'y' @@ -1135,7 +1138,7 @@ sketch001 = startSketchOn(box, "end") #[tokio::test(flavor = "multi_thread")] async fn kcl_test_basic_revolve_circle() { let code = r#"sketch001 = startSketchOn('XY') - |> circle({ center: [15, 0], radius: 5 }, %) + |> circle(center = [15, 0], radius= 5) |> revolve({ angle: 360, axis: 'y' @@ -1181,7 +1184,7 @@ async fn kcl_test_plumbus_fillets() { |> arc({ angleEnd: 360, angleStart: 0, - radius: radius + radius= radius }, %, $arc1) |> close() @@ -1259,10 +1262,10 @@ async fn kcl_test_member_expression_in_params() { zAxis: { x: 0, y: 1, z: 0 } } }) - |> circle({ center: [0, 0], radius: capDia / 2 }, %) + |> circle(center = [0, 0], radius= capDia / 2) |> extrude(length = capHeadLength) screw = startSketchOn(screwHead, "start") - |> circle({ center: [0, 0], radius: dia / 2 }, %) + |> circle(center = [0, 0], radius= dia / 2) |> extrude(length = length) return screw } @@ -1331,7 +1334,7 @@ async fn kcl_test_error_empty_start_sketch_on_string() { |> extrude(length = 100) secondSketch = startSketchOn(part001, '') - |> circle({ center: [-20, 50], radius: 40 }, %) + |> circle(center = [-20, 50], radius= 40) |> extrude(length = 20) "#; @@ -1361,7 +1364,7 @@ fn squareHole = (l, w) => { } extrusion = startSketchOn('XY') - |> circle({ center: [0, 0], radius: dia/2 }, %) + |> circle(center = [0, 0], radius= dia/2 ) |> hole(squareHole(length, width, height), %) |> extrude(length = height) "#; @@ -1370,7 +1373,7 @@ extrusion = startSketchOn('XY') assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - r#"semantic: KclErrorDetails { source_ranges: [SourceRange([68, 360, 0]), SourceRange([454, 487, 0])], message: "Expected 2 arguments, got 3" }"# + r#"semantic: KclErrorDetails { source_ranges: [SourceRange([68, 360, 0]), SourceRange([449, 482, 0])], message: "Expected 2 arguments, got 3" }"# ); } @@ -1757,7 +1760,7 @@ async fn kcl_test_arc_error_same_start_end() { |> arc({ angleStart: 180, angleEnd: 180, - radius: 1.5 + radius= 1.5 }, %) |> close() |> patternCircular2d( From 8e60b555f77609dd2db3c784a1c5082879f732f9 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Thu, 27 Feb 2025 11:56:45 -0800 Subject: [PATCH 02/14] change circle in all test js files Signed-off-by: Jess Frazelle --- e2e/playwright/editor-tests.spec.ts | 2 +- e2e/playwright/feature-tree-pane.spec.ts | 10 ++-- e2e/playwright/point-click.spec.ts | 57 ++++++++++--------- e2e/playwright/sketch-tests.spec.ts | 37 ++++++------ e2e/playwright/snapshot-tests.spec.ts | 2 +- e2e/playwright/testing-gizmo.spec.ts | 6 +- .../testing-segment-overlays.spec.ts | 22 +++---- e2e/playwright/testing-selections.spec.ts | 5 +- src/lang/queryAst.test.ts | 10 ++-- src/lib/exampleKcl.ts | 8 +-- src/lib/selections.test.ts | 8 +-- 11 files changed, 86 insertions(+), 81 deletions(-) diff --git a/e2e/playwright/editor-tests.spec.ts b/e2e/playwright/editor-tests.spec.ts index 351a2218bf..1eab130d2c 100644 --- a/e2e/playwright/editor-tests.spec.ts +++ b/e2e/playwright/editor-tests.spec.ts @@ -689,7 +689,7 @@ test.describe('Editor tests', { tag: ['@skipWin'] }, () => { await page.keyboard.press('ArrowDown') await page.keyboard.press('Enter') await page.keyboard.type(`extrusion = startSketchOn('XY') - |> circle({ center: [0, 0], radius: dia/2 }, %) + |> circle(center: [0, 0], radius: dia/2) |> hole(squareHole(length, width, height), %) |> extrude(length = height)`) diff --git a/e2e/playwright/feature-tree-pane.spec.ts b/e2e/playwright/feature-tree-pane.spec.ts index 9efdb4c844..27ee73cf57 100644 --- a/e2e/playwright/feature-tree-pane.spec.ts +++ b/e2e/playwright/feature-tree-pane.spec.ts @@ -50,13 +50,13 @@ const FEATURE_TREE_SKETCH_CODE = `sketch001 = startSketchOn('XZ') |> close(%) extrude001 = extrude(sketch001, length = 10) sketch002 = startSketchOn(extrude001, rectangleSegmentB001) - |> circle({ + |> circle( center = [-1, 2], radius = .5 - }, %) + ) plane001 = offsetPlane('XZ', offset = -5) sketch003 = startSketchOn(plane001) - |> circle({ center = [0, 0], radius = 5 }, %) + |> circle(center = [0, 0], radius = 5) ` test.describe('Feature Tree pane', () => { @@ -234,11 +234,11 @@ test.describe('Feature Tree pane', () => { }) => { const initialInput = '23' const initialCode = `sketch001 = startSketchOn('XZ') - |> circle({ center = [0, 0], radius = 5 }, %) + |> circle(center = [0, 0], radius = 5) renamedExtrude = extrude(sketch001, length = ${initialInput})` const newConstantName = 'distance001' const expectedCode = `sketch001 = startSketchOn('XZ') - |> circle({ center = [0, 0], radius = 5 }, %) + |> circle(center = [0, 0], radius = 5) ${newConstantName} = 23 renamedExtrude = extrude(sketch001, length = ${newConstantName})` diff --git a/e2e/playwright/point-click.spec.ts b/e2e/playwright/point-click.spec.ts index 4fe637ad54..eb5b140964 100644 --- a/e2e/playwright/point-click.spec.ts +++ b/e2e/playwright/point-click.spec.ts @@ -43,7 +43,7 @@ test.describe('Point-and-click tests', () => { await test.step('check code model connection works and that button is still enable once circle is selected ', async () => { await moveToCircle() const circleSnippet = - 'circle({ center = [318.33, 168.1], radius = 182.8 }, %)' + 'circle(center = [318.33, 168.1], radius = 182.8)' await editor.expectState({ activeLines: ["constsketch002=startSketchOn('XZ')"], highlightedCode: circleSnippet, @@ -53,7 +53,7 @@ test.describe('Point-and-click tests', () => { await test.step('check code model connection works and that button is still enable once circle is selected ', async () => { await moveToCircle() const circleSnippet = - 'circle({ center = [318.33, 168.1], radius = 182.8 }, %)' + 'circle(center = [318.33, 168.1], radius = 182.8)' await editor.expectState({ activeLines: ["constsketch002=startSketchOn('XZ')"], highlightedCode: circleSnippet, @@ -581,7 +581,7 @@ profile001 = startProfileAt([205.96, 254.59], sketch002) const u = await getUtils(page) const initialCode = `closedSketch = startSketchOn('XZ') - |> circle({ center = [8, 5], radius = 2 }, %) + |> circle(center = [8, 5], radius = 2) openSketch = startSketchOn('XY') |> startProfileAt([-5, 0], %) |> line(endAbsolute = [0, 5]) @@ -633,8 +633,8 @@ openSketch = startSketchOn('XY') await expect(toolbar.startSketchBtn).not.toBeVisible() await expect(toolbar.exitSketchBtn).toBeVisible() await editor.expectState({ - activeLines: [`|>circle({center=[8,5],radius=2},%)`], - highlightedCode: 'circle({center=[8,5],radius=2},%)', + activeLines: [`|>circle(center=[8,5],radius=2)`], + highlightedCode: 'circle(center=[8,5],radius=2)', diagnostics: [], }) }) @@ -1192,10 +1192,10 @@ openSketch = startSketchOn('XY') cmdBar, }) => { const initialCode = `sketch001 = startSketchOn('XZ') - |> circle({ center = [0, 0], radius = 30 }, %) + |> circle(center = [0, 0], radius = 30) plane001 = offsetPlane('XZ', offset = 50) sketch002 = startSketchOn(plane001) - |> circle({ center = [0, 0], radius = 20 }, %) + |> circle(center = [0, 0], radius = 20) ` await context.addInitScript((initialCode) => { localStorage.setItem('persistCode', initialCode) @@ -1278,10 +1278,10 @@ openSketch = startSketchOn('XY') scene, }) => { const initialCode = `sketch001 = startSketchOn('XZ') - |> circle({ center = [0, 0], radius = 30 }, %) + |> circle(center = [0, 0], radius = 30) plane001 = offsetPlane('XZ', offset = 50) sketch002 = startSketchOn(plane001) - |> circle({ center = [0, 0], radius = 20 }, %) + |> circle(center = [0, 0], radius = 20) loft001 = loft([sketch001, sketch002]) ` await context.addInitScript((initialCode) => { @@ -1304,7 +1304,7 @@ loft001 = loft([sketch001, sketch002]) await scene.expectPixelColor([89, 89, 89], testPoint, 15) await clickOnSketch1() await expect(page.locator('.cm-activeLine')).toHaveText(` - |> circle({ center = [0, 0], radius = 30 }, %) + |> circle(center = [0, 0], radius = 30) `) await page.keyboard.press('Delete') // Check for sketch 1 @@ -1315,7 +1315,7 @@ loft001 = loft([sketch001, sketch002]) await page.waitForTimeout(1000) await clickOnSketch2() await expect(page.locator('.cm-activeLine')).toHaveText(` - |> circle({ center = [0, 0], radius = 20 }, %) + |> circle(center = [0, 0], radius = 20) `) await page.keyboard.press('Delete') // Check for plane001 @@ -1344,10 +1344,10 @@ loft001 = loft([sketch001, sketch002]) cmdBar, }) => { const initialCode = `sketch001 = startSketchOn('YZ') - |> circle({ + |> circle( center = [0, 0], radius = 500 - }, %) + ) sketch002 = startSketchOn('XZ') |> startProfileAt([0, 0], %) |> xLine(-500, %) @@ -1438,10 +1438,10 @@ sketch002 = startSketchOn('XZ') cmdBar, }) => { const initialCode = `sketch001 = startSketchOn('YZ') - |> circle({ + |> circle( center = [0, 0], radius = 500 - }, %) + ) sketch002 = startSketchOn('XZ') |> startProfileAt([0, 0], %) |> xLine(-500, %) @@ -2270,7 +2270,7 @@ chamfer04 = chamfer(extrude001, length = 5, tags = [getOppositeEdge(seg02)]) cmdBar, }) => { const initialCode = `sketch001 = startSketchOn('XZ') - |> circle({ center = [0, 0], radius = 30 }, %) + |> circle(center = [0, 0], radius = 30) extrude001 = extrude(sketch001, length = 30) ` await context.addInitScript((initialCode) => { @@ -2445,19 +2445,19 @@ extrude001 = extrude(sketch001, length = 40) const shellSketchOnFacesCases = [ `sketch001 = startSketchOn('XZ') - |> circle({ center = [0, 0], radius = 100 }, %) + |> circle(center = [0, 0], radius = 100) |> extrude(length = 100) sketch002 = startSketchOn(sketch001, 'END') - |> circle({ center = [0, 0], radius = 50 }, %) + |> circle(center = [0, 0], radius = 50) |> extrude(length = 50) `, `sketch001 = startSketchOn('XZ') - |> circle({ center = [0, 0], radius = 100 }, %) + |> circle(center = [0, 0], radius = 100) extrude001 = extrude(sketch001, length = 100) sketch002 = startSketchOn(extrude001, 'END') - |> circle({ center = [0, 0], radius = 50 }, %) + |> circle(center = [0, 0], radius = 50) extrude002 = extrude(sketch002, length = 50) `, ] @@ -2631,10 +2631,10 @@ profile001 = startProfileAt([-20, 20], sketch001) cmdBar, }) => { const initialCode = `sketch001 = startSketchOn('YZ') - |> circle({ + |> circle( center = [0, 0], radius = 500 - }, %) + ) sketch002 = startSketchOn('XZ') |> startProfileAt([0, 0], %) |> xLine(-2000, %) @@ -2761,10 +2761,10 @@ segAng(rectangleSegmentA001), |> close() extrude001 = extrude(sketch001, length = 50) sketch002 = startSketchOn(extrude001, rectangleSegmentA001) -|> circle({ +|> circle( center = [-11.34, 10.0], radius = 8.69 -}, %) +) ` await context.addInitScript((initialCode) => { localStorage.setItem('persistCode', initialCode) @@ -2811,10 +2811,10 @@ radius = 8.69 |> close() extrude001 = extrude(sketch001, length = 5) sketch003 = startSketchOn(extrude001, 'START') - |> circle({ + |> circle( center = [-0.69, 0.56], radius = 0.28 - }, %) + ) ` await context.addInitScript((initialCode) => { @@ -2849,10 +2849,11 @@ radius = 8.69 cmdBar, }) => { const initialCode = `sketch001 = startSketchOn('XZ') -profile001 = circle({ +profile001 = circle( + sketch001, center = [0, 0], radius = 100 -}, sketch001) +) extrude001 = extrude(profile001, length = 100) ` await context.addInitScript((initialCode) => { diff --git a/e2e/playwright/sketch-tests.spec.ts b/e2e/playwright/sketch-tests.spec.ts index 49639080a6..35c1610a46 100644 --- a/e2e/playwright/sketch-tests.spec.ts +++ b/e2e/playwright/sketch-tests.spec.ts @@ -367,7 +367,7 @@ sketch001 = startProfileAt([12.34, -12.34], sketch002) localStorage.setItem( 'persistCode', `sketch001 = startSketchOn('XZ') - |> circle({ center = [4.61, -5.01], radius = 8 }, %)` + |> circle(center = [4.61, -5.01], radius = 8 )` ) }) @@ -404,7 +404,7 @@ sketch001 = startProfileAt([12.34, -12.34], sketch002) const dragPX = 40 await page - .getByText('circle({ center = [4.61, -5.01], radius = 8 }, %)') + .getByText('circle(center = [4.61, -5.01], radius = 8)') .click() await expect( page.getByRole('button', { name: 'Edit Sketch' }) @@ -444,7 +444,7 @@ sketch001 = startProfileAt([12.34, -12.34], sketch002) // expect the code to have changed await editor.expectEditor.toContain( `sketch001 = startSketchOn('XZ') - |> circle({ center = [7.26, -2.37], radius = 11.44 }, %)`, + |> circle(center = [7.26, -2.37], radius = 11.44)`, { shouldNormalise: true } ) }) @@ -1390,12 +1390,12 @@ profile002 = startProfileAt([117.2, 56.08], sketch001) await toolbar.circleBtn.click() await page.waitForTimeout(100) await circlePoint1() - await editor.expectEditor.toContain('profile003 = circle({ center = [') + await editor.expectEditor.toContain('profile003 = circle(center = [') }) await test.step('equip line tool and verify circle code is removed', async () => { await toolbar.lineBtn.click() - await editor.expectEditor.not.toContain('profile003 = circle({') + await editor.expectEditor.not.toContain('profile003 = circle(') }) const [circle3Point1] = scene.makeMouseHelpers(650, 200) @@ -1649,7 +1649,7 @@ profile003 = startProfileAt([206.63, -56.73], sketch001) await circle1Radius({ delay: 500 }) await page.waitForTimeout(300) await editor.expectEditor.toContain( - `profile003 = circle({ center = [23.19, 6.98], radius = 2.5 }, sketch001)` + `profile003 = circle(sketch001, center = [23.19, 6.98], radius = 2.5)` ) await test.step('hover in empty space to wait for overlays to get out of the way', async () => { @@ -1661,7 +1661,7 @@ profile003 = startProfileAt([206.63, -56.73], sketch001) await page.waitForTimeout(300) await circle2Radius() await editor.expectEditor.toContain( - `profile004 = circle({ center = [23.74, 1.9], radius = 0.72 }, sketch001)` + `profile004 = circle(sketch001, center = [23.74, 1.9], radius = 0.72)` ) }) await test.step('create two corner rectangles in a row without unequip', async () => { @@ -1855,7 +1855,7 @@ profile002 = startProfileAt([11.19, 5.02], sketch001) ], %) |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() -profile003 = circle({ center = [6.92, -4.2], radius = 3.16 }, sketch001) +profile003 = circle(sketch001, center = [6.92, -4.2], radius = 3.16) profile004 = circleThreePoint(sketch001, p1 = [13.44, -6.8], p2 = [13.39, -2.07], p3 = [18.75, -4.41]) ` ) @@ -1931,7 +1931,7 @@ profile004 = circleThreePoint(sketch001, p1 = [13.44, -6.8], p2 = [13.39, -2.07] await dragCircleTo() await page.mouse.up() await editor.expectEditor.toContain( - `profile003 = circle({ center = [6.92, -4.2], radius = 4.81 }, sketch001)` + `profile003 = circle(sketch001, center = [6.92, -4.2], radius = 4.81)` ) }) @@ -2000,7 +2000,7 @@ profile002 = startProfileAt([11.19, 5.02], sketch001) ], %) |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() -profile003 = circle({ center = [6.92, -4.2], radius = 3.16 }, sketch001) +profile003 = circle(sketch001, center = [6.92, -4.2], radius = 3.16) ` ) }) @@ -2108,10 +2108,11 @@ profile003 = startProfileAt([16.79, 38.24], sketch001) ], %) |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() -profile004 = circle({ +profile004 = circle( + sketch001, center = [280.45, 47.57], radius = 55.26 -}, sketch001) +) extrude002 = extrude(profile001, length = 50) extrude001 = extrude(profile003, length = 5) ` @@ -2173,10 +2174,11 @@ extrude001 = extrude(profile003, length = 5) 'myVar = 5', `myVar = 5 sketch001 = startSketchOn('XZ') - profile001 = circle({ + profile001 = circle( + sketch001, center = [12.41, 3.87], radius = myVar - }, sketch001)` + )` ) await scene.expectPixelColor([255, 255, 255], { x: 633, y: 211 }, 15) @@ -2320,7 +2322,7 @@ profile004 = startProfileAt([3.15, 9.39], sketch002) |> line(end = [-7.41, -2.85]) |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() -profile005 = circle({ center = [5.15, 4.34], radius = 1.66 }, sketch002) +profile005 = circle(sketch002, center = [5.15, 4.34], radius = 1.66) profile006 = startProfileAt([9.65, 3.82], sketch002) |> line(end = [2.38, 5.62]) |> line(end = [2.13, -5.57]) @@ -2345,10 +2347,11 @@ profile009 = startProfileAt([5.23, 1.95], sketch003) |> line(end = [7.34, -2.75]) |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() -profile010 = circle({ +profile010 = circle( + sketch003, center = [7.18, -2.11], radius = 2.67 -}, sketch003) +) profile011 = startProfileAt([5.07, -6.39], sketch003) |> angledLine([0, 4.54], %, $rectangleSegmentA002) |> angledLine([ diff --git a/e2e/playwright/snapshot-tests.spec.ts b/e2e/playwright/snapshot-tests.spec.ts index aed88c3963..afcaff9de5 100644 --- a/e2e/playwright/snapshot-tests.spec.ts +++ b/e2e/playwright/snapshot-tests.spec.ts @@ -599,7 +599,7 @@ test( mask: [page.getByTestId('model-state-indicator')], }) await expect(page.locator('.cm-content')).toHaveText( - `sketch001 = startSketchOn('XZ')profile001 = circle({ center = [14.44, -2.44], radius = 1 }, sketch001)` + `sketch001 = startSketchOn('XZ')profile001 = circle(sketch001, center = [14.44, -2.44], radius = 1)` ) } ) diff --git a/e2e/playwright/testing-gizmo.spec.ts b/e2e/playwright/testing-gizmo.spec.ts index 49f06a84b9..44d285c43b 100644 --- a/e2e/playwright/testing-gizmo.spec.ts +++ b/e2e/playwright/testing-gizmo.spec.ts @@ -269,10 +269,10 @@ test.describe(`Testing gizmo, fixture-based`, () => { ], %) |> close() const sketch001 = startSketchOn('XZ') - |> circle({ + |> circle( center: [818.33, 168.1], radius: 182.8 - }, %) + ) |> extrude(length = 50) ` ) @@ -296,7 +296,7 @@ test.describe(`Testing gizmo, fixture-based`, () => { await test.step(`Select an edge of this circle`, async () => { const circleSnippet = - 'circle({ center: [818.33, 168.1], radius: 182.8 }, %)' + 'circle(center: [818.33, 168.1], radius: 182.8)' await moveToCircle() await clickCircle() await editor.expectState({ diff --git a/e2e/playwright/testing-segment-overlays.spec.ts b/e2e/playwright/testing-segment-overlays.spec.ts index 1662e801dc..7f9c986536 100644 --- a/e2e/playwright/testing-segment-overlays.spec.ts +++ b/e2e/playwright/testing-segment-overlays.spec.ts @@ -825,7 +825,7 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => { localStorage.setItem( 'persistCode', `part001 = startSketchOn('XZ') - |> circle({ center = [1 + 0, 0], radius = 8 }, %) + |> circle(center = [1 + 0, 0], radius = 8) ` ) localStorage.setItem('disableAxis', 'true') @@ -841,7 +841,7 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => { await u.closeDebugPanel() await page - .getByText('circle({ center = [1 + 0, 0], radius = 8 }, %)') + .getByText('circle(center = [1 + 0, 0], radius = 8)') .click() await page.waitForTimeout(100) await page.getByRole('button', { name: 'Edit Sketch' }).click() @@ -860,10 +860,10 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => { hoverPos, constraintType: 'xAbsolute', expectBeforeUnconstrained: - 'circle({ center = [1 + 0, 0], radius = 8 }, %)', + 'circle(center = [1 + 0, 0], radius = 8)', expectAfterUnconstrained: - 'circle({ center = [1, 0], radius = 8 }, %)', - expectFinal: 'circle({ center = [xAbs001, 0], radius = 8 }, %)', + 'circle(center = [1, 0], radius = 8)', + expectFinal: 'circle(center = [xAbs001, 0], radius = 8)', ang: ang + 105, steps: 6, locator: '[data-overlay-toolbar-index="0"]', @@ -873,10 +873,10 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => { hoverPos, constraintType: 'yAbsolute', expectBeforeUnconstrained: - 'circle({ center = [xAbs001, 0], radius = 8 }, %)', + 'circle(center = [xAbs001, 0], radius = 8)', expectAfterUnconstrained: - 'circle({ center = [xAbs001, yAbs001], radius = 8 }, %)', - expectFinal: 'circle({ center = [xAbs001, 0], radius = 8 }, %)', + 'circle(center = [xAbs001, yAbs001], radius = 8)', + expectFinal: 'circle(center = [xAbs001, 0], radius = 8)', ang: ang + 180, steps: 30, locator: '[data-overlay-toolbar-index="0"]', @@ -886,10 +886,10 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => { hoverPos, constraintType: 'radius', expectBeforeUnconstrained: - 'circle({ center = [xAbs001, 0], radius = 8 }, %)', + 'circle(center = [xAbs001, 0], radius = 8)', expectAfterUnconstrained: - 'circle({ center = [xAbs001, 0], radius = radius001 }, %)', - expectFinal: 'circle({ center = [xAbs001, 0], radius = 8 }, %)', + 'circle(center = [xAbs001, 0], radius = radius001)', + expectFinal: 'circle(center = [xAbs001, 0], radius = 8)', ang: ang + 105, steps: 10, locator: '[data-overlay-toolbar-index="0"]', diff --git a/e2e/playwright/testing-selections.spec.ts b/e2e/playwright/testing-selections.spec.ts index fe68c264e5..4e69c23ace 100644 --- a/e2e/playwright/testing-selections.spec.ts +++ b/e2e/playwright/testing-selections.spec.ts @@ -320,10 +320,11 @@ part009 = startSketchOn('XY') |> close() rev = revolve({ axis = 'y' }, part009) sketch006 = startSketchOn('XY') -profile001 = circle({ +profile001 = circle( + sketch006, center = [42.91, -70.42], radius = 17.96 -}, sketch006) +) profile002 = startProfileAt([86.92, -63.81], sketch006) |> angledLine([0, 63.81], %, $rectangleSegmentA001) |> angledLine([ diff --git a/src/lang/queryAst.test.ts b/src/lang/queryAst.test.ts index 6ff2ac21e9..ad11423171 100644 --- a/src/lang/queryAst.test.ts +++ b/src/lang/queryAst.test.ts @@ -581,10 +581,10 @@ sketch002 = startSketchOn(extrude001, $seg01) }) it('finds sketch001 and sketch002 pipes to be lofted', async () => { const exampleCode = `sketch001 = startSketchOn('XZ') - |> circle({ center = [0, 0], radius = 1 }, %) + |> circle(center = [0, 0], radius = 1) plane001 = offsetPlane('XZ', offset = 2) sketch002 = startSketchOn(plane001) - |> circle({ center = [0, 0], radius = 3 }, %) + |> circle(center = [0, 0], radius = 3) ` const ast = assertParse(exampleCode) const extrudable = doesSceneHaveSweepableSketch(ast, 2) @@ -608,7 +608,7 @@ extrude001 = extrude(sketch001, length = 10) describe('Testing doesSceneHaveExtrudedSketch', () => { it('finds extruded sketch as variable', async () => { const exampleCode = `sketch001 = startSketchOn('XZ') - |> circle({ center = [0, 0], radius = 1 }, %) + |> circle(center = [0, 0], radius = 1) extrude001 = extrude(sketch001, length = 1) ` const ast = assertParse(exampleCode) @@ -618,7 +618,7 @@ extrude001 = extrude(sketch001, length = 1) }) it('finds extruded sketch in pipe', async () => { const exampleCode = `extrude001 = startSketchOn('XZ') - |> circle({ center = [0, 0], radius = 1 }, %) + |> circle(center = [0, 0], radius = 1) |> extrude(length = 1) ` const ast = assertParse(exampleCode) @@ -628,7 +628,7 @@ extrude001 = extrude(sketch001, length = 1) }) it('finds no extrusion with sketch only', async () => { const exampleCode = `extrude001 = startSketchOn('XZ') - |> circle({ center = [0, 0], radius = 1 }, %) + |> circle(center = [0, 0], radius = 1) ` const ast = assertParse(exampleCode) if (err(ast)) throw ast diff --git a/src/lib/exampleKcl.ts b/src/lib/exampleKcl.ts index db7cbb4234..5e2248805d 100644 --- a/src/lib/exampleKcl.ts +++ b/src/lib/exampleKcl.ts @@ -47,10 +47,10 @@ sketch001 = startSketchOn('XZ') ) sketch002 = startSketchOn(sketch001, seg03) - |> circle({ + |> circle( center = [-1.25, 1], radius = mountingHoleDiameter / 2, - }, %) + ) |> patternLinear2d( instances = 2, distance = 2.5, @@ -64,10 +64,10 @@ sketch002 = startSketchOn(sketch001, seg03) |> extrude(%, length = -thickness-.01) sketch003 = startSketchOn(sketch001, seg04) - |> circle({ + |> circle( center = [1, -1], radius = mountingHoleDiameter / 2, - }, %) + ) |> patternLinear2d( instances = 2, distance = 4, diff --git a/src/lib/selections.test.ts b/src/lib/selections.test.ts index 391e05a28a..c83ff00621 100644 --- a/src/lib/selections.test.ts +++ b/src/lib/selections.test.ts @@ -31,10 +31,10 @@ profile002 = startProfileAt([-321.34, 361.76], sketch002) |> close() extrude002 = extrude(profile002, length = 500) sketch005 = startSketchOn(extrude002, 'END') -profile006 = circle({ +profile006 = circle(sketch005, center = [-292.57, 302.55], radius = 25.89 -}, sketch005) +) sketch004 = startSketchOn(extrude001, seg02) profile005 = startProfileAt([36.1, 174.49], sketch004) |> angledLine([0, 22.33], %, $rectangleSegmentA003) @@ -61,10 +61,10 @@ profile003 = startProfileAt([-115.59, 439.4], sketch003) ], %) |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() -profile004 = circle({ +profile004 = circle(sketch003, center = [-88.54, 209.41], radius = 42.72 -}, sketch003) +) ` const ___artifactGraph = new Map([ [ From b93962dfec8634f8cee4a87ecac7acc26a85f831 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Thu, 27 Feb 2025 12:03:35 -0800 Subject: [PATCH 03/14] more js side Signed-off-by: Jess Frazelle --- e2e/playwright/point-click.spec.ts | 6 ++--- e2e/playwright/sketch-tests.spec.ts | 4 +--- e2e/playwright/testing-gizmo.spec.ts | 3 +-- .../testing-segment-overlays.spec.ts | 10 +++------ src/clientSideScene/sceneEntities.ts | 22 +++++++++++-------- 5 files changed, 20 insertions(+), 25 deletions(-) diff --git a/e2e/playwright/point-click.spec.ts b/e2e/playwright/point-click.spec.ts index eb5b140964..119bad4c81 100644 --- a/e2e/playwright/point-click.spec.ts +++ b/e2e/playwright/point-click.spec.ts @@ -42,8 +42,7 @@ test.describe('Point-and-click tests', () => { await test.step('check code model connection works and that button is still enable once circle is selected ', async () => { await moveToCircle() - const circleSnippet = - 'circle(center = [318.33, 168.1], radius = 182.8)' + const circleSnippet = 'circle(center = [318.33, 168.1], radius = 182.8)' await editor.expectState({ activeLines: ["constsketch002=startSketchOn('XZ')"], highlightedCode: circleSnippet, @@ -52,8 +51,7 @@ test.describe('Point-and-click tests', () => { await test.step('check code model connection works and that button is still enable once circle is selected ', async () => { await moveToCircle() - const circleSnippet = - 'circle(center = [318.33, 168.1], radius = 182.8)' + const circleSnippet = 'circle(center = [318.33, 168.1], radius = 182.8)' await editor.expectState({ activeLines: ["constsketch002=startSketchOn('XZ')"], highlightedCode: circleSnippet, diff --git a/e2e/playwright/sketch-tests.spec.ts b/e2e/playwright/sketch-tests.spec.ts index 35c1610a46..99da1f69a4 100644 --- a/e2e/playwright/sketch-tests.spec.ts +++ b/e2e/playwright/sketch-tests.spec.ts @@ -403,9 +403,7 @@ sketch001 = startProfileAt([12.34, -12.34], sketch002) const dragPX = 40 - await page - .getByText('circle(center = [4.61, -5.01], radius = 8)') - .click() + await page.getByText('circle(center = [4.61, -5.01], radius = 8)').click() await expect( page.getByRole('button', { name: 'Edit Sketch' }) ).toBeVisible() diff --git a/e2e/playwright/testing-gizmo.spec.ts b/e2e/playwright/testing-gizmo.spec.ts index 44d285c43b..6db8405d58 100644 --- a/e2e/playwright/testing-gizmo.spec.ts +++ b/e2e/playwright/testing-gizmo.spec.ts @@ -295,8 +295,7 @@ test.describe(`Testing gizmo, fixture-based`, () => { const [clickCircle, moveToCircle] = scene.makeMouseHelpers(582, 217) await test.step(`Select an edge of this circle`, async () => { - const circleSnippet = - 'circle(center: [818.33, 168.1], radius: 182.8)' + const circleSnippet = 'circle(center: [818.33, 168.1], radius: 182.8)' await moveToCircle() await clickCircle() await editor.expectState({ diff --git a/e2e/playwright/testing-segment-overlays.spec.ts b/e2e/playwright/testing-segment-overlays.spec.ts index 7f9c986536..7cc5e05f5b 100644 --- a/e2e/playwright/testing-segment-overlays.spec.ts +++ b/e2e/playwright/testing-segment-overlays.spec.ts @@ -840,9 +840,7 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => { await u.expectCmdLog('[data-message-type="execution-done"]') await u.closeDebugPanel() - await page - .getByText('circle(center = [1 + 0, 0], radius = 8)') - .click() + await page.getByText('circle(center = [1 + 0, 0], radius = 8)').click() await page.waitForTimeout(100) await page.getByRole('button', { name: 'Edit Sketch' }).click() await page.waitForTimeout(500) @@ -859,10 +857,8 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => { await clickConstrained({ hoverPos, constraintType: 'xAbsolute', - expectBeforeUnconstrained: - 'circle(center = [1 + 0, 0], radius = 8)', - expectAfterUnconstrained: - 'circle(center = [1, 0], radius = 8)', + expectBeforeUnconstrained: 'circle(center = [1 + 0, 0], radius = 8)', + expectAfterUnconstrained: 'circle(center = [1, 0], radius = 8)', expectFinal: 'circle(center = [xAbs001, 0], radius = 8)', ang: ang + 105, steps: 6, diff --git a/src/clientSideScene/sceneEntities.ts b/src/clientSideScene/sceneEntities.ts index 94bd0b966e..ae6e9627a7 100644 --- a/src/clientSideScene/sceneEntities.ts +++ b/src/clientSideScene/sceneEntities.ts @@ -1606,15 +1606,19 @@ export class SceneEntities { const varName = findUniqueName(_ast, 'profile') const newExpression = createVariableDeclaration( varName, - createCallExpressionStdLib('circle', [ - createObjectExpression({ - center: createArrayExpression([ - createLiteral(roundOff(circleCenter[0])), - createLiteral(roundOff(circleCenter[1])), - ]), - radius: createLiteral(1), - }), - createIdentifier(varDec.node.id.name), + createCallExpressionStdLibKw('circle', [ + varDec.node.id.name, + null, + [ + createLabeledArg( + 'center', + createArrayExpression([ + createLiteral(roundOff(circleCenter[0])), + createLiteral(roundOff(circleCenter[1])), + ]) + ), + createLabeledArg('radius', createLiteral(1)), + ], ]) ) From 5b4e75c8ba8d338425607191fc8d094955a24904 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Thu, 27 Feb 2025 12:05:46 -0800 Subject: [PATCH 04/14] fix Signed-off-by: Jess Frazelle --- src/clientSideScene/sceneEntities.ts | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/clientSideScene/sceneEntities.ts b/src/clientSideScene/sceneEntities.ts index ae6e9627a7..443283709b 100644 --- a/src/clientSideScene/sceneEntities.ts +++ b/src/clientSideScene/sceneEntities.ts @@ -1606,19 +1606,15 @@ export class SceneEntities { const varName = findUniqueName(_ast, 'profile') const newExpression = createVariableDeclaration( varName, - createCallExpressionStdLibKw('circle', [ - varDec.node.id.name, - null, - [ - createLabeledArg( - 'center', - createArrayExpression([ - createLiteral(roundOff(circleCenter[0])), - createLiteral(roundOff(circleCenter[1])), - ]) - ), - createLabeledArg('radius', createLiteral(1)), - ], + createCallExpressionStdLibKw('circle', varDec.node.id, [ + createLabeledArg( + 'center', + createArrayExpression([ + createLiteral(roundOff(circleCenter[0])), + createLiteral(roundOff(circleCenter[1])), + ]) + ), + createLabeledArg('radius', createLiteral(1)), ]) ) From 9725eee7ad11fb5ab90911ca5e3bacb9a7cd8974 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 27 Feb 2025 20:17:33 +0000 Subject: [PATCH 05/14] =?UTF-8?q?A=20snapshot=20a=20day=20keeps=20the=20bu?= =?UTF-8?q?gs=20away!=20=F0=9F=93=B7=F0=9F=90=9B=20(OS:=20namespace-profil?= =?UTF-8?q?e-ubuntu-8-cores)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...hould-look-right-1-Google-Chrome-linux.png | Bin 50407 -> 45182 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-circle-should-look-right-1-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-circle-should-look-right-1-Google-Chrome-linux.png index dbe9a64f71ef3db3de316d54f32f53a954480289..10e2bc36fcaba3eeaca77667f458337a411af3c4 100644 GIT binary patch literal 45182 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 ZPBbk>2&$=McJc42qM#vPfHZsb{{UNJ!IuC4 literal 50407 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 vQ2xdhve%dz_Bu From 894d0187ce82d3f696da2d0ae2fa879673da3d4a Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Thu, 27 Feb 2025 12:22:52 -0800 Subject: [PATCH 06/14] updates Signed-off-by: Jess Frazelle --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bd16916c66..f0b338d172 100644 --- a/package.json +++ b/package.json @@ -91,7 +91,7 @@ "fmt-check": "prettier --check ./src *.ts *.json *.js ./e2e ./packages", "fetch:wasm": "./scripts/get-latest-wasm-bundle.sh", "fetch:wasm:windows": "./scripts/get-latest-wasm-bundle.ps1", - "fetch:samples": "echo \"Fetching latest KCL samples...\" && curl -o public/kcl-samples-manifest-fallback.json https://raw.githubusercontent.com/KittyCAD/kcl-samples/next/manifest.json", + "fetch:samples": "echo \"Fetching latest KCL samples...\" && curl -o public/kcl-samples-manifest-fallback.json https://raw.githubusercontent.com/KittyCAD/kcl-samples/circle-kw-args/manifest.json", "build:wasm-dev": "yarn wasm-prep && (cd src/wasm-lib && wasm-pack build --dev --target web --out-dir pkg && cargo test -p kcl-lib export_bindings) && yarn isomorphic-copy-wasm && yarn fmt", "build:wasm:nocopy": "yarn wasm-prep && cd src/wasm-lib && wasm-pack build --release --target web --out-dir pkg && cargo test -p kcl-lib export_bindings", "build:wasm": "yarn build:wasm:nocopy && cp src/wasm-lib/pkg/wasm_lib_bg.wasm public && yarn fmt", From dad8c47bec67d64b792241c6f205a1a23e24cde2 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Thu, 27 Feb 2025 13:03:39 -0800 Subject: [PATCH 07/14] updates Signed-off-by: Jess Frazelle --- src/lang/kclSamples.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lang/kclSamples.test.ts b/src/lang/kclSamples.test.ts index 1e9d21d65f..3e20f9f5ab 100644 --- a/src/lang/kclSamples.test.ts +++ b/src/lang/kclSamples.test.ts @@ -32,7 +32,7 @@ child_process.spawnSync('git', [ 'clone', '--single-branch', '--branch', - 'next', + 'circle-kw-args', URL_GIT_KCL_SAMPLES, DIR_KCL_SAMPLES, ]) From 573fc05a0e7b6f22ae7edb895f140c85b9b2cba7 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Thu, 27 Feb 2025 13:41:23 -0800 Subject: [PATCH 08/14] fixes Signed-off-by: Jess Frazelle --- ...__parsing__parser__snapshot_tests__au.snap | 137 ++++++++++-------- .../executor/inputs/test-circle-extrude.kcl | 9 +- 2 files changed, 82 insertions(+), 64 deletions(-) diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__au.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__au.snap index 507b5e9c95..b164328d8e 100644 --- a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__au.snap +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__au.snap @@ -6,7 +6,7 @@ expression: actual "body": [ { "declaration": { - "end": 106, + "end": 113, "id": { "end": 14, "name": "cylinder", @@ -40,59 +40,81 @@ expression: actual { "arguments": [ { - "type": "LabeledArg", - "label": { - "type": "Identifier", - "name": "center" - }, - "arg": { - "elements": [ - { - "end": 61, - "raw": "0", - "start": 60, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } + "end": 81, + "properties": [ + { + "end": 67, + "key": { + "end": 59, + "name": "center", + "start": 53, + "type": "Identifier" + }, + "start": 53, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 63, + "raw": "0", + "start": 62, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "end": 66, + "raw": "0", + "start": 65, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + ], + "end": 67, + "start": 61, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "end": 79, + "key": { + "end": 75, + "name": "radius", + "start": 69, + "type": "Identifier" }, - { - "end": 64, - "raw": "0", - "start": 63, + "start": 69, + "type": "ObjectProperty", + "value": { + "end": 79, + "raw": "22", + "start": 77, "type": "Literal", "type": "Literal", "value": { - "value": 0.0, + "value": 22.0, "suffix": "None" } } - ], - "end": 65, - "start": 59, - "type": "ArrayExpression", - "type": "ArrayExpression" - } + } + ], + "start": 51, + "type": "ObjectExpression", + "type": "ObjectExpression" }, { - "type": "LabeledArg", - "label": { - "type": "Identifier", - "name": "radius" - }, - "arg": { - "end": 77, - "raw": "22", - "start": 75, - "type": "Literal", - "type": "Literal", - "value": { - "value": 22.0, - "suffix": "None" - } - } + "end": 84, + "start": 83, + "type": "PipeSubstitution", + "type": "PipeSubstitution" } ], "callee": { @@ -101,11 +123,10 @@ expression: actual "start": 44, "type": "Identifier" }, - "end": 78, + "end": 85, "start": 44, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null + "type": "CallExpression", + "type": "CallExpression" }, { "arguments": [ @@ -116,9 +137,9 @@ expression: actual "name": "length" }, "arg": { - "end": 105, + "end": 112, "raw": "14", - "start": 103, + "start": 110, "type": "Literal", "type": "Literal", "value": { @@ -129,19 +150,19 @@ expression: actual } ], "callee": { - "end": 93, + "end": 100, "name": "extrude", - "start": 86, + "start": 93, "type": "Identifier" }, - "end": 106, - "start": 86, + "end": 113, + "start": 93, "type": "CallExpressionKw", "type": "CallExpressionKw", "unlabeled": null } ], - "end": 106, + "end": 113, "start": 17, "type": "PipeExpression", "type": "PipeExpression" @@ -149,13 +170,13 @@ expression: actual "start": 6, "type": "VariableDeclarator" }, - "end": 106, + "end": 113, "kind": "const", "start": 0, "type": "VariableDeclaration", "type": "VariableDeclaration" } ], - "end": 107, + "end": 114, "start": 0 } diff --git a/src/wasm-lib/tests/executor/inputs/test-circle-extrude.kcl b/src/wasm-lib/tests/executor/inputs/test-circle-extrude.kcl index dcfc2dcdde..cd31727bae 100644 --- a/src/wasm-lib/tests/executor/inputs/test-circle-extrude.kcl +++ b/src/wasm-lib/tests/executor/inputs/test-circle-extrude.kcl @@ -1,4 +1,4 @@ -const sketch002 = startSketchOn('XZ') +sketch002 = startSketchOn('XZ') |> startProfileAt([-108.83, -57.48], %) |> angledLine([0, 105.13], %, $rectangleSegmentA001) |> angledLine([ @@ -10,8 +10,5 @@ const sketch002 = startSketchOn('XZ') -segLen(rectangleSegmentA001) ], %) |> close() -const sketch001 = startSketchOn('XZ') - |> circle( - center = [318.33, 168.1], - radius = 182.8 - ) +sketch001 = startSketchOn('XZ') + |> circle(center = [318.33, 168.1], radius = 182.8) From d7be142e8c8b6debd5912f3dc0eae2e2e871dd78 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Thu, 27 Feb 2025 14:25:19 -0800 Subject: [PATCH 09/14] updates Signed-off-by: Jess Frazelle --- ...__parsing__parser__snapshot_tests__au.snap | 137 ++++++++---------- 1 file changed, 58 insertions(+), 79 deletions(-) diff --git a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__au.snap b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__au.snap index b164328d8e..507b5e9c95 100644 --- a/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__au.snap +++ b/src/wasm-lib/kcl/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__au.snap @@ -6,7 +6,7 @@ expression: actual "body": [ { "declaration": { - "end": 113, + "end": 106, "id": { "end": 14, "name": "cylinder", @@ -40,81 +40,59 @@ expression: actual { "arguments": [ { - "end": 81, - "properties": [ - { - "end": 67, - "key": { - "end": 59, - "name": "center", - "start": 53, - "type": "Identifier" - }, - "start": 53, - "type": "ObjectProperty", - "value": { - "elements": [ - { - "end": 63, - "raw": "0", - "start": 62, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - { - "end": 66, - "raw": "0", - "start": 65, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - } - ], - "end": 67, - "start": 61, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "end": 79, - "key": { - "end": 75, - "name": "radius", - "start": 69, - "type": "Identifier" + "type": "LabeledArg", + "label": { + "type": "Identifier", + "name": "center" + }, + "arg": { + "elements": [ + { + "end": 61, + "raw": "0", + "start": 60, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } }, - "start": 69, - "type": "ObjectProperty", - "value": { - "end": 79, - "raw": "22", - "start": 77, + { + "end": 64, + "raw": "0", + "start": 63, "type": "Literal", "type": "Literal", "value": { - "value": 22.0, + "value": 0.0, "suffix": "None" } } - } - ], - "start": 51, - "type": "ObjectExpression", - "type": "ObjectExpression" + ], + "end": 65, + "start": 59, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, { - "end": 84, - "start": 83, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "type": "Identifier", + "name": "radius" + }, + "arg": { + "end": 77, + "raw": "22", + "start": 75, + "type": "Literal", + "type": "Literal", + "value": { + "value": 22.0, + "suffix": "None" + } + } } ], "callee": { @@ -123,10 +101,11 @@ expression: actual "start": 44, "type": "Identifier" }, - "end": 85, + "end": 78, "start": 44, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -137,9 +116,9 @@ expression: actual "name": "length" }, "arg": { - "end": 112, + "end": 105, "raw": "14", - "start": 110, + "start": 103, "type": "Literal", "type": "Literal", "value": { @@ -150,19 +129,19 @@ expression: actual } ], "callee": { - "end": 100, + "end": 93, "name": "extrude", - "start": 93, + "start": 86, "type": "Identifier" }, - "end": 113, - "start": 93, + "end": 106, + "start": 86, "type": "CallExpressionKw", "type": "CallExpressionKw", "unlabeled": null } ], - "end": 113, + "end": 106, "start": 17, "type": "PipeExpression", "type": "PipeExpression" @@ -170,13 +149,13 @@ expression: actual "start": 6, "type": "VariableDeclarator" }, - "end": 113, + "end": 106, "kind": "const", "start": 0, "type": "VariableDeclaration", "type": "VariableDeclaration" } ], - "end": 114, + "end": 107, "start": 0 } From be36b4ab3e7375bf8d097f22fb21d3949c17efd8 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Thu, 27 Feb 2025 15:09:45 -0800 Subject: [PATCH 10/14] updates Signed-off-by: Jess Frazelle --- e2e/playwright/point-click.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/e2e/playwright/point-click.spec.ts b/e2e/playwright/point-click.spec.ts index 119bad4c81..f69d893181 100644 --- a/e2e/playwright/point-click.spec.ts +++ b/e2e/playwright/point-click.spec.ts @@ -44,7 +44,7 @@ test.describe('Point-and-click tests', () => { await moveToCircle() const circleSnippet = 'circle(center = [318.33, 168.1], radius = 182.8)' await editor.expectState({ - activeLines: ["constsketch002=startSketchOn('XZ')"], + activeLines: ["sketch002=startSketchOn('XZ')"], highlightedCode: circleSnippet, diagnostics: [], }) @@ -53,7 +53,7 @@ test.describe('Point-and-click tests', () => { await moveToCircle() const circleSnippet = 'circle(center = [318.33, 168.1], radius = 182.8)' await editor.expectState({ - activeLines: ["constsketch002=startSketchOn('XZ')"], + activeLines: ["sketch002=startSketchOn('XZ')"], highlightedCode: circleSnippet, diagnostics: [], }) From 3227ab4bf209623587f9caa6c0a0471d65ad9214 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Thu, 27 Feb 2025 15:52:40 -0800 Subject: [PATCH 11/14] fix Signed-off-by: Jess Frazelle --- e2e/playwright/point-click.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/playwright/point-click.spec.ts b/e2e/playwright/point-click.spec.ts index f69d893181..f65be953f0 100644 --- a/e2e/playwright/point-click.spec.ts +++ b/e2e/playwright/point-click.spec.ts @@ -60,7 +60,7 @@ test.describe('Point-and-click tests', () => { await clickCircle() await editor.expectState({ - activeLines: [circleSnippet.slice(-5)], + activeLines: ["|>"+circleSnippet], highlightedCode: circleSnippet, diagnostics: [], }) From affe79f1d843ccd803e5efca17a5281bb9d1494f Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Thu, 27 Feb 2025 15:53:06 -0800 Subject: [PATCH 12/14] ud[ates Signed-off-by: Jess Frazelle --- e2e/playwright/point-click.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/playwright/point-click.spec.ts b/e2e/playwright/point-click.spec.ts index f65be953f0..6832482fb4 100644 --- a/e2e/playwright/point-click.spec.ts +++ b/e2e/playwright/point-click.spec.ts @@ -60,7 +60,7 @@ test.describe('Point-and-click tests', () => { await clickCircle() await editor.expectState({ - activeLines: ["|>"+circleSnippet], + activeLines: ['|>' + circleSnippet], highlightedCode: circleSnippet, diagnostics: [], }) From c782a1ce7be4156abca88ba86daf2838cf130864 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Thu, 27 Feb 2025 17:03:15 -0800 Subject: [PATCH 13/14] ud[ates Signed-off-by: Jess Frazelle --- src/clientSideScene/sceneEntities.ts | 4 +- src/lang/std/sketch.ts | 104 +++++++++++++++------------ 2 files changed, 61 insertions(+), 47 deletions(-) diff --git a/src/clientSideScene/sceneEntities.ts b/src/clientSideScene/sceneEntities.ts index 443283709b..d60d9cbb82 100644 --- a/src/clientSideScene/sceneEntities.ts +++ b/src/clientSideScene/sceneEntities.ts @@ -1665,7 +1665,7 @@ export class SceneEntities { const x = (args.intersectionPoint.twoD.x || 0) - circleCenter[0] const y = (args.intersectionPoint.twoD.y || 0) - circleCenter[1] - if (sketchInit.type === 'CallExpression') { + if (sketchInit.type === 'CallExpressionKw') { const moddedResult = changeSketchArguments( modded, kclManager.variables, @@ -1730,7 +1730,7 @@ export class SceneEntities { const sketchInit = _node.node?.declaration.init let modded = structuredClone(_ast) - if (sketchInit.type === 'CallExpression') { + if (sketchInit.type === 'CallExpressionKw') { const moddedResult = changeSketchArguments( modded, kclManager.variables, diff --git a/src/lang/std/sketch.ts b/src/lang/std/sketch.ts index 84fb41a397..bcd2d85d21 100644 --- a/src/lang/std/sketch.ts +++ b/src/lang/std/sketch.ts @@ -77,6 +77,8 @@ import { export const ARG_TAG = 'tag' export const ARG_END = 'end' export const ARG_END_ABSOLUTE = 'endAbsolute' +export const ARG_CIRCLE_CENTER = 'center' +export const ARG_CIRCLE_RADIUS = 'radius' const STRAIGHT_SEGMENT_ERR = new Error( 'Invalid input, expected "straight-segment"' @@ -1077,7 +1079,7 @@ export const tangentialArcTo: SketchLineHelper = { ] }, } -export const circle: SketchLineHelper = { +export const circle: SketchLineHelperKw = { add: ({ node, pathToNode, segmentInput, replaceExistingCallback }) => { if (segmentInput.type !== 'arc-segment') return ARC_SEGMENT_ERR @@ -1138,51 +1140,67 @@ export const circle: SketchLineHelper = { if (input.type !== 'arc-segment') return ARC_SEGMENT_ERR const { center, radius } = input const _node = { ...node } - const nodeMeta = getNodeFromPath(_node, pathToNode) + const nodeMeta = getNodeFromPath(_node, pathToNode) if (err(nodeMeta)) return nodeMeta - const { node: callExpression, shallowPath } = nodeMeta + const { node: callExpression } = nodeMeta - const firstArg = callExpression.arguments?.[0] const newCenter = createArrayExpression([ createLiteral(roundOff(center[0])), createLiteral(roundOff(center[1])), ]) - mutateObjExpProp(firstArg, newCenter, 'center') + mutateKwArg(ARG_CIRCLE_CENTER, callExpression, newCenter) const newRadius = createLiteral(roundOff(radius)) - mutateObjExpProp(firstArg, newRadius, 'radius') + mutateKwArg(ARG_CIRCLE_RADIUS, callExpression, newRadius) return { modifiedAst: _node, - pathToNode: shallowPath, + pathToNode, } }, - getTag: getTag(), - addTag: addTag(), - getConstraintInfo: (callExp: CallExpression, code, pathToNode) => { - if (callExp.type !== 'CallExpression') return [] + getTag: getTagKwArg(), + addTag: addTagKw(), + getConstraintInfo: (callExp: CallExpressionKw, code, pathToNode) => { + if (callExp.type !== 'CallExpressionKw') return [] const firstArg = callExp.arguments?.[0] - if (firstArg.type !== 'ObjectExpression') return [] - const centerDetails = getObjExprProperty(firstArg, 'center') - const radiusDetails = getObjExprProperty(firstArg, 'radius') - if (!centerDetails || !radiusDetails) return [] - if (centerDetails.expr.type !== 'ArrayExpression') return [] + if (firstArg.type !== 'LabeledArg') return [] + let centerDetails = null + let radiusDetails = null + let centerIndex = 0 + let radiusIndex = 0 + let index = 0 + for (const prop of callExp.arguments) { + if ( + prop.label?.name === 'center' && + 'arg' in prop && + prop.type === 'LabeledArg' + ) { + centerIndex = index + centerDetails = prop.arg + } + if ( + prop.label?.name === 'radius' && + 'arg' in prop && + prop.type === 'LabeledArg' + ) { + radiusIndex = index + radiusDetails = prop.arg + } + index++ + } + if (centerDetails === null || radiusDetails === null) return [] + if (centerDetails.type !== 'ArrayExpression') return [] const pathToCenterArrayExpression: PathToNode = [ ...pathToNode, - ['arguments', 'CallExpression'], - [0, 'index'], - ['properties', 'ObjectExpression'], - [centerDetails.index, 'index'], - ['value', 'Property'], - ['elements', 'ArrayExpression'], + ['arguments', 'CallExpressionKw'], + [centerIndex, 'index'], + ['arg', 'ArrayExpression'], ] const pathToRadiusLiteral: PathToNode = [ ...pathToNode, - ['arguments', 'CallExpression'], - [0, 'index'], - ['properties', 'ObjectExpression'], - [radiusDetails.index, 'index'], - ['value', 'Property'], + ['arguments', 'CallExpressionKw'], + [radiusIndex, 'index'], + ['arg', 'Literal'], ] const pathToXArg: PathToNode = [ ...pathToCenterArrayExpression, @@ -1196,27 +1214,25 @@ export const circle: SketchLineHelper = { return [ constrainInfo( 'radius', - isNotLiteralArrayOrStatic(radiusDetails.expr), - code.slice(radiusDetails.expr.start, radiusDetails.expr.end), + isNotLiteralArrayOrStatic(radiusDetails), + code.slice(radiusDetails.start, radiusDetails.end), 'circle', 'radius', - topLevelRange(radiusDetails.expr.start, radiusDetails.expr.end), + topLevelRange(radiusDetails.start, radiusDetails.end), pathToRadiusLiteral ), { stdLibFnName: 'circle', type: 'xAbsolute', - isConstrained: isNotLiteralArrayOrStatic( - centerDetails.expr.elements[0] - ), + isConstrained: isNotLiteralArrayOrStatic(centerDetails.elements[0]), sourceRange: topLevelRange( - centerDetails.expr.elements[0].start, - centerDetails.expr.elements[0].end + centerDetails.elements[0].start, + centerDetails.elements[0].end ), pathToNode: pathToXArg, value: code.slice( - centerDetails.expr.elements[0].start, - centerDetails.expr.elements[0].end + centerDetails.elements[0].start, + centerDetails.elements[0].end ), argPosition: { type: 'arrayInObject', @@ -1227,17 +1243,15 @@ export const circle: SketchLineHelper = { { stdLibFnName: 'circle', type: 'yAbsolute', - isConstrained: isNotLiteralArrayOrStatic( - centerDetails.expr.elements[1] - ), + isConstrained: isNotLiteralArrayOrStatic(centerDetails.elements[1]), sourceRange: topLevelRange( - centerDetails.expr.elements[1].start, - centerDetails.expr.elements[1].end + centerDetails.elements[1].start, + centerDetails.elements[1].end ), pathToNode: pathToYArg, value: code.slice( - centerDetails.expr.elements[1].start, - centerDetails.expr.elements[1].end + centerDetails.elements[1].start, + centerDetails.elements[1].end ), argPosition: { type: 'arrayInObject', @@ -2295,13 +2309,13 @@ export const sketchLineHelperMap: { [key: string]: SketchLineHelper } = { angledLineToY, angledLineThatIntersects, tangentialArcTo, - circle, } as const export const sketchLineHelperMapKw: { [key: string]: SketchLineHelperKw } = { line, lineTo, circleThreePoint, + circle, } as const export function changeSketchArguments( From 1925bc68042fe0342d3b10ee257d3d03ca643e54 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 28 Feb 2025 01:14:53 +0000 Subject: [PATCH 14/14] =?UTF-8?q?A=20snapshot=20a=20day=20keeps=20the=20bu?= =?UTF-8?q?gs=20away!=20=F0=9F=93=B7=F0=9F=90=9B=20(OS:=20namespace-profil?= =?UTF-8?q?e-ubuntu-8-cores)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...hould-look-right-1-Google-Chrome-linux.png | Bin 45182 -> 50157 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-circle-should-look-right-1-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-circle-should-look-right-1-Google-Chrome-linux.png index 10e2bc36fcaba3eeaca77667f458337a411af3c4..db0d55a704eeffd20a7538d9156198d48f0cf7dc 100644 GIT binary patch delta 31614 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 delta 26600 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%0DDuh9>F3|BT=nam?&1-+hTO6l%(h#s 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 jzE6(TolyTTImhmylHuT~GIFu4qsz)lDN1Ie^