diff --git a/docs/kcl/appearance.md b/docs/kcl/appearance.md index fd47b5f5e..a3a8b1497 100644 --- a/docs/kcl/appearance.md +++ b/docs/kcl/appearance.md @@ -188,9 +188,9 @@ example = extrude(exampleSketch, length = 1) sweepPath = startSketchOn(XZ) |> startProfileAt([0.05, 0.05], %) |> line(end = [0, 7]) - |> tangentialArc({ offset = 90, radius = 5 }, %) + |> tangentialArc(angle = 90, radius = 5) |> line(end = [-3, 0]) - |> tangentialArc({ offset = -90, radius = 5 }, %) + |> tangentialArc(angle = -90, radius = 5) |> line(end = [0, 7]) pipeHole = startSketchOn(XY) diff --git a/docs/kcl/hollow.md b/docs/kcl/hollow.md index 69b960e10..096354b53 100644 --- a/docs/kcl/hollow.md +++ b/docs/kcl/hollow.md @@ -65,7 +65,7 @@ case = startSketchOn(-XZ) |> startProfileAt([-size, -size], %) |> line(end = [2 * size, 0]) |> line(end = [0, 2 * size]) - |> tangentialArcTo([-size, size], %) + |> tangentialArc(endAbsolute = [-size, size]) |> close() |> extrude(length = 65) diff --git a/docs/kcl/index.md b/docs/kcl/index.md index 2edc91006..7b121c8f8 100644 --- a/docs/kcl/index.md +++ b/docs/kcl/index.md @@ -128,8 +128,6 @@ layout: manual * [`sweep`](kcl/sweep) * [`tangentToEnd`](kcl/tangentToEnd) * [`tangentialArc`](kcl/tangentialArc) - * [`tangentialArcTo`](kcl/tangentialArcTo) - * [`tangentialArcToRelative`](kcl/tangentialArcToRelative) * [`toDegrees`](kcl/toDegrees) * [`toRadians`](kcl/toRadians) * [`translate`](kcl/translate) diff --git a/docs/kcl/patternLinear3d.md b/docs/kcl/patternLinear3d.md index 20616cd9a..512111476 100644 --- a/docs/kcl/patternLinear3d.md +++ b/docs/kcl/patternLinear3d.md @@ -57,7 +57,7 @@ case = startSketchOn(XY) |> startProfileAt([-size, -size], %) |> line(end = [2 * size, 0]) |> line(end = [0, 2 * size]) - |> tangentialArcTo([-size, size], %) + |> tangentialArc(endAbsolute = [-size, size]) |> close(%) |> extrude(length = 65) @@ -88,7 +88,7 @@ case = startSketchOn(XY) |> startProfileAt([-size, -size], %) |> line(end = [2 * size, 0]) |> line(end = [0, 2 * size]) - |> tangentialArcTo([-size, size], %) + |> tangentialArc(endAbsolute = [-size, size]) |> close(%) |> extrude(length = 65) diff --git a/docs/kcl/rotate.md b/docs/kcl/rotate.md index 865c68c94..251ade308 100644 --- a/docs/kcl/rotate.md +++ b/docs/kcl/rotate.md @@ -65,9 +65,9 @@ rotate( sweepPath = startSketchOn(XZ) |> startProfileAt([0.05, 0.05], %) |> line(end = [0, 7]) - |> tangentialArc({ offset = 90, radius = 5 }, %) + |> tangentialArc(angle = 90, radius = 5) |> line(end = [-3, 0]) - |> tangentialArc({ offset = -90, radius = 5 }, %) + |> tangentialArc(angle = -90, radius = 5) |> line(end = [0, 7]) // Create a hole for the pipe. @@ -90,9 +90,9 @@ sweepSketch = startSketchOn(XY) sweepPath = startSketchOn(XZ) |> startProfileAt([0.05, 0.05], %) |> line(end = [0, 7]) - |> tangentialArc({ offset = 90, radius = 5 }, %) + |> tangentialArc(angle = 90, radius = 5) |> line(end = [-3, 0]) - |> tangentialArc({ offset = -90, radius = 5 }, %) + |> tangentialArc(angle = -90, radius = 5) |> line(end = [0, 7]) // Create a hole for the pipe. @@ -115,9 +115,9 @@ sweepSketch = startSketchOn(XY) sweepPath = startSketchOn(XZ) |> startProfileAt([0.05, 0.05], %) |> line(end = [0, 7]) - |> tangentialArc({ offset = 90, radius = 5 }, %) + |> tangentialArc(angle = 90, radius = 5) |> line(end = [-3, 0]) - |> tangentialArc({ offset = -90, radius = 5 }, %) + |> tangentialArc(angle = -90, radius = 5) |> line(end = [0, 7]) // Create a hole for the pipe. @@ -162,7 +162,7 @@ circleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63) sketch002 = startSketchOn(YZ) sweepPath = startProfileAt([0, 0], sketch002) |> yLine(length = 231.81) - |> tangentialArc({ radius = 80, offset = -90 }, %) + |> tangentialArc(radius = 80, angle = -90) |> xLine(length = 384.93) parts = sweep([rectangleSketch, circleSketch], path = sweepPath) diff --git a/docs/kcl/scale.md b/docs/kcl/scale.md index e8bdbe71a..7d6438081 100644 --- a/docs/kcl/scale.md +++ b/docs/kcl/scale.md @@ -49,9 +49,9 @@ scale( sweepPath = startSketchOn(XZ) |> startProfileAt([0.05, 0.05], %) |> line(end = [0, 7]) - |> tangentialArc({ offset = 90, radius = 5 }, %) + |> tangentialArc(angle = 90, radius = 5) |> line(end = [-3, 0]) - |> tangentialArc({ offset = -90, radius = 5 }, %) + |> tangentialArc(angle = -90, radius = 5) |> line(end = [0, 7]) // Create a hole for the pipe. @@ -96,7 +96,7 @@ circleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63) sketch002 = startSketchOn(YZ) sweepPath = startProfileAt([0, 0], sketch002) |> yLine(length = 231.81) - |> tangentialArc({ radius = 80, offset = -90 }, %) + |> tangentialArc(radius = 80, angle = -90) |> xLine(length = 384.93) parts = sweep([rectangleSketch, circleSketch], path = sweepPath) diff --git a/docs/kcl/segLen.md b/docs/kcl/segLen.md index ab15e14bd..8387ad564 100644 --- a/docs/kcl/segLen.md +++ b/docs/kcl/segLen.md @@ -30,7 +30,7 @@ segLen(tag: TagIdentifier): number exampleSketch = startSketchOn(XZ) |> startProfileAt([0, 0], %) |> angledLine(angle = 60, length = 10, tag = $thing) - |> tangentialArc({ offset = -120, radius = 5 }, %) + |> tangentialArc(angle = -120, radius = 5) |> angledLine(angle = -60, length = segLen(thing)) |> close() diff --git a/docs/kcl/shell.md b/docs/kcl/shell.md index bac00e26b..9b5ddc2ff 100644 --- a/docs/kcl/shell.md +++ b/docs/kcl/shell.md @@ -103,7 +103,7 @@ case = startSketchOn(-XZ) |> startProfileAt([-size, -size], %) |> line(end = [2 * size, 0]) |> line(end = [0, 2 * size]) - |> tangentialArcTo([-size, size], %) + |> tangentialArc(endAbsolute = [-size, size]) |> close() |> extrude(length = 65) @@ -128,7 +128,7 @@ case = startSketchOn(XY) |> startProfileAt([-size, -size], %) |> line(end = [2 * size, 0]) |> line(end = [0, 2 * size]) - |> tangentialArcTo([-size, size], %) + |> tangentialArc(endAbsolute = [-size, size]) |> close() |> extrude(length = 65) @@ -156,7 +156,7 @@ case = startSketchOn(XY) |> startProfileAt([-size, -size], %) |> line(end = [2 * size, 0]) |> line(end = [0, 2 * size]) - |> tangentialArcTo([-size, size], %) + |> tangentialArc(endAbsolute = [-size, size]) |> close() |> extrude(length = 65) diff --git a/docs/kcl/std-sketch-mirror2d.md b/docs/kcl/std-sketch-mirror2d.md index 435ecf868..3e3c92afe 100644 --- a/docs/kcl/std-sketch-mirror2d.md +++ b/docs/kcl/std-sketch-mirror2d.md @@ -103,9 +103,9 @@ example = extrude(sketch001, length = 10) sketch0011 = startSketchOn(XY) |> startProfileAt([6.77, 0], %) |> yLine(length = 1.27) - |> tangentialArcTo([5.96, 2.37], %) - |> tangentialArcTo([-6.2, 2.44], %) - |> tangentialArcTo([-6.6, 1.82], %) + |> tangentialArc(endAbsolute = [5.96, 2.37]) + |> tangentialArc(endAbsolute = [-6.2, 2.44]) + |> tangentialArc(endAbsolute = [-6.6, 1.82]) |> yLine(length = -1.82) |> mirror2d( axis = X ) |> extrude(length = 10) diff --git a/docs/kcl/std.json b/docs/kcl/std.json index b2d3dfb03..3b4ec22a6 100644 --- a/docs/kcl/std.json +++ b/docs/kcl/std.json @@ -31006,7 +31006,7 @@ "// 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// 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// Create a path for the sweep.\nsweepPath = startSketchOn(XZ)\n |> startProfileAt([0.05, 0.05], %)\n |> line(end = [0, 7])\n |> tangentialArc(angle = 90, radius = 5)\n |> line(end = [-3, 0])\n |> tangentialArc(angle = -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)" ] }, { @@ -99070,7 +99070,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(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)" + "// 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 |> tangentialArc(endAbsolute = [-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)" ] }, { @@ -179715,8 +179715,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(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)" + "// 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 |> tangentialArc(endAbsolute = [-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 |> tangentialArc(endAbsolute = [-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)" ] }, { @@ -242800,11 +242800,11 @@ "unpublished": false, "deprecated": false, "examples": [ - "// Rotate a pipe with roll, pitch, and yaw.\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 with just roll.\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)", - "// Rotate a pipe about an axis with an angle.\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// Create a path for the sweep.\nsweepPath = startSketchOn(XZ)\n |> startProfileAt([0.05, 0.05], %)\n |> line(end = [0, 7])\n |> tangentialArc(angle = 90, radius = 5)\n |> line(end = [-3, 0])\n |> tangentialArc(angle = -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 with just roll.\n\n// Create a path for the sweep.\nsweepPath = startSketchOn(XZ)\n |> startProfileAt([0.05, 0.05], %)\n |> line(end = [0, 7])\n |> tangentialArc(angle = 90, radius = 5)\n |> line(end = [-3, 0])\n |> tangentialArc(angle = -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)", + "// Rotate a pipe about an axis with an angle.\n\n// Create a path for the sweep.\nsweepPath = startSketchOn(XZ)\n |> startProfileAt([0.05, 0.05], %)\n |> line(end = [0, 7])\n |> tangentialArc(angle = 90, radius = 5)\n |> line(end = [-3, 0])\n |> tangentialArc(angle = -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 an imported model.\n\n\nimport \"tests/inputs/cube.sldprt\" as cube\n\ncube\n |> rotate(axis = [0, 0, 1.0], angle = 9)", - "// Sweep two sketches along the same path.\n\n\nsketch001 = startSketchOn(XY)\nrectangleSketch = startProfileAt([-200, 23.86], sketch001)\n |> angledLine(angle = 0, length = 73.47, tag = $rectangleSegmentA001)\n |> angledLine(angle = segAng(rectangleSegmentA001) - 90, length = 50.61)\n |> angledLine(angle = segAng(rectangleSegmentA001), length = -segLen(rectangleSegmentA001))\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\ncircleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63)\n\nsketch002 = startSketchOn(YZ)\nsweepPath = startProfileAt([0, 0], sketch002)\n |> yLine(length = 231.81)\n |> tangentialArc({ radius = 80, offset = -90 }, %)\n |> xLine(length = 384.93)\n\nparts = sweep([rectangleSketch, circleSketch], path = sweepPath)\n\n// Rotate the sweeps.\nrotate(parts, axis = [0, 0, 1.0], angle = 90)", + "// Sweep two sketches along the same path.\n\n\nsketch001 = startSketchOn(XY)\nrectangleSketch = startProfileAt([-200, 23.86], sketch001)\n |> angledLine(angle = 0, length = 73.47, tag = $rectangleSegmentA001)\n |> angledLine(angle = segAng(rectangleSegmentA001) - 90, length = 50.61)\n |> angledLine(angle = segAng(rectangleSegmentA001), length = -segLen(rectangleSegmentA001))\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\ncircleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63)\n\nsketch002 = startSketchOn(YZ)\nsweepPath = startProfileAt([0, 0], sketch002)\n |> yLine(length = 231.81)\n |> tangentialArc(radius = 80, angle = -90)\n |> xLine(length = 384.93)\n\nparts = sweep([rectangleSketch, circleSketch], path = sweepPath)\n\n// Rotate the sweeps.\nrotate(parts, axis = [0, 0, 1.0], angle = 90)", "// Translate and rotate a sketch to create a loft.\nsketch001 = startSketchOn(XY)\n\nfn square() {\n return startProfileAt([-10, 10], sketch001)\n |> xLine(length = 20)\n |> yLine(length = -20)\n |> xLine(length = -20)\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n}\n\nprofile001 = square()\n\nprofile002 = square()\n |> translate(x = 0, y = 0, z = 20)\n |> rotate(axis = [0, 0, 1.0], angle = 45)\n\nloft([profile001, profile002])" ] }, @@ -252584,9 +252584,9 @@ "unpublished": false, "deprecated": false, "examples": [ - "// Scale a pipe.\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(z = 2.5)", + "// Scale a pipe.\n\n// Create a path for the sweep.\nsweepPath = startSketchOn(XZ)\n |> startProfileAt([0.05, 0.05], %)\n |> line(end = [0, 7])\n |> tangentialArc(angle = 90, radius = 5)\n |> line(end = [-3, 0])\n |> tangentialArc(angle = -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(z = 2.5)", "// Scale an imported model.\n\n\nimport \"tests/inputs/cube.sldprt\" as cube\n\ncube\n |> scale(y = 2.5)", - "// Sweep two sketches along the same path.\n\n\nsketch001 = startSketchOn(XY)\nrectangleSketch = startProfileAt([-200, 23.86], sketch001)\n |> angledLine(angle = 0, length = 73.47, tag = $rectangleSegmentA001)\n |> angledLine(angle = segAng(rectangleSegmentA001) - 90, length = 50.61)\n |> angledLine(angle = segAng(rectangleSegmentA001), length = -segLen(rectangleSegmentA001))\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\ncircleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63)\n\nsketch002 = startSketchOn(YZ)\nsweepPath = startProfileAt([0, 0], sketch002)\n |> yLine(length = 231.81)\n |> tangentialArc({ radius = 80, offset = -90 }, %)\n |> xLine(length = 384.93)\n\nparts = sweep([rectangleSketch, circleSketch], path = sweepPath)\n\n// Scale the sweep.\nscale(parts, z = 0.5)" + "// Sweep two sketches along the same path.\n\n\nsketch001 = startSketchOn(XY)\nrectangleSketch = startProfileAt([-200, 23.86], sketch001)\n |> angledLine(angle = 0, length = 73.47, tag = $rectangleSegmentA001)\n |> angledLine(angle = segAng(rectangleSegmentA001) - 90, length = 50.61)\n |> angledLine(angle = segAng(rectangleSegmentA001), length = -segLen(rectangleSegmentA001))\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\ncircleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63)\n\nsketch002 = startSketchOn(YZ)\nsweepPath = startProfileAt([0, 0], sketch002)\n |> yLine(length = 231.81)\n |> tangentialArc(radius = 80, angle = -90)\n |> xLine(length = 384.93)\n\nparts = sweep([rectangleSketch, circleSketch], path = sweepPath)\n\n// Scale the sweep.\nscale(parts, z = 0.5)" ] }, { @@ -252836,7 +252836,7 @@ "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn(XZ)\n |> startProfileAt([0, 0], %)\n |> angledLine(angle = 60, length = 10, tag = $thing)\n |> tangentialArc({ offset = -120, radius = 5 }, %)\n |> angledLine(angle = -60, length = segLen(thing))\n |> close()\n\nexample = extrude(exampleSketch, length = 5)" + "exampleSketch = startSketchOn(XZ)\n |> startProfileAt([0, 0], %)\n |> angledLine(angle = 60, length = 10, tag = $thing)\n |> tangentialArc(angle = -120, radius = 5)\n |> angledLine(angle = -60, length = segLen(thing))\n |> close()\n\nexample = extrude(exampleSketch, length = 5)" ] }, { @@ -259435,9 +259435,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(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)" + "// 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 |> tangentialArc(endAbsolute = [-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 |> tangentialArc(endAbsolute = [-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 |> tangentialArc(endAbsolute = [-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)" ] }, { @@ -287714,10 +287714,10 @@ "unpublished": false, "deprecated": false, "examples": [ - "// Create a pipe using a sweep.\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 pipe using a sweep.\n\n// Create a path for the sweep.\nsweepPath = startSketchOn(XZ)\n |> startProfileAt([0.05, 0.05], %)\n |> line(end = [0, 7])\n |> tangentialArc(angle = 90, radius = 5)\n |> line(end = [-3, 0])\n |> tangentialArc(angle = -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// 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)", - "// Sweep two sketches along the same path.\n\n\nsketch001 = startSketchOn(XY)\nrectangleSketch = startProfileAt([-200, 23.86], sketch001)\n |> angledLine(angle = 0, length = 73.47, tag = $rectangleSegmentA001)\n |> angledLine(angle = segAng(rectangleSegmentA001) - 90, length = 50.61)\n |> angledLine(angle = segAng(rectangleSegmentA001), length = -segLen(rectangleSegmentA001))\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\ncircleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63)\n\nsketch002 = startSketchOn(YZ)\nsweepPath = startProfileAt([0, 0], sketch002)\n |> yLine(length = 231.81)\n |> tangentialArc({ radius = 80, offset = -90 }, %)\n |> xLine(length = 384.93)\n\nsweep([rectangleSketch, circleSketch], path = sweepPath)", - "// Sectionally sweep one sketch along the path\n\n\nsketch001 = startSketchOn(XY)\ncircleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63)\n\nsketch002 = startSketchOn(YZ)\nsweepPath = startProfileAt([0, 0], sketch002)\n |> yLine(length = 231.81)\n |> tangentialArc({ radius = 80, offset = -90 }, %)\n |> xLine(length = 384.93)\n\nsweep(circleSketch, path = sweepPath, sectional = true)" + "// Sweep two sketches along the same path.\n\n\nsketch001 = startSketchOn(XY)\nrectangleSketch = startProfileAt([-200, 23.86], sketch001)\n |> angledLine(angle = 0, length = 73.47, tag = $rectangleSegmentA001)\n |> angledLine(angle = segAng(rectangleSegmentA001) - 90, length = 50.61)\n |> angledLine(angle = segAng(rectangleSegmentA001), length = -segLen(rectangleSegmentA001))\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\ncircleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63)\n\nsketch002 = startSketchOn(YZ)\nsweepPath = startProfileAt([0, 0], sketch002)\n |> yLine(length = 231.81)\n |> tangentialArc(radius = 80, angle = -90)\n |> xLine(length = 384.93)\n\nsweep([rectangleSketch, circleSketch], path = sweepPath)", + "// Sectionally sweep one sketch along the path\n\n\nsketch001 = startSketchOn(XY)\ncircleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63)\n\nsketch002 = startSketchOn(YZ)\nsweepPath = startProfileAt([0, 0], sketch002)\n |> yLine(length = 231.81)\n |> tangentialArc(radius = 80, angle = -90)\n |> xLine(length = 384.93)\n\nsweep(circleSketch, path = sweepPath, sectional = true)" ] }, { @@ -287765,8 +287765,8 @@ "unpublished": false, "deprecated": false, "examples": [ - "// Horizontal pill.\npillSketch = startSketchOn(XZ)\n |> startProfileAt([0, 0], %)\n |> line(end = [20, 0])\n |> tangentialArcToRelative([0, 10], %, $arc1)\n |> angledLine(angle = tangentToEnd(arc1), length = 20)\n |> tangentialArcToRelative([0, -10], %)\n |> close()\n\npillExtrude = extrude(pillSketch, length = 10)", - "// 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(angle = tangentToEnd(arc1), length = 20)\n |> tangentialArcToRelative([-10, 0], %)\n |> close()\n\npillExtrude = extrude(pillSketch, length = 10)", + "// Horizontal pill.\npillSketch = startSketchOn(XZ)\n |> startProfileAt([0, 0], %)\n |> line(end = [20, 0])\n |> tangentialArc(end = [0, 10], tag = $arc1)\n |> angledLine(angle = tangentToEnd(arc1), length = 20)\n |> tangentialArc(end = [0, -10])\n |> close()\n\npillExtrude = extrude(pillSketch, length = 10)", + "// Vertical pill. Use absolute coordinate for arc.\npillSketch = startSketchOn(XZ)\n |> startProfileAt([0, 0], %)\n |> line(end = [0, 20])\n |> tangentialArc(endAbsolute = [10, 20], tag = $arc1)\n |> angledLine(angle = tangentToEnd(arc1), length = 20)\n |> tangentialArc(end = [-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(angle = tangentToEnd(seg1), length = 10)\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(angle = tangentToEnd(arc1), length = 20)\n |> close()", "circSketch = startSketchOn(XY)\n |> circle(center = [0, 0], radius = 3, tag = $circ)\n\ntriangleSketch = startSketchOn(XY)\n |> startProfileAt([-5, 0], %)\n |> angledLine(angle = tangentToEnd(circ), length = 10)\n |> line(end = [-15, 0])\n |> close()" @@ -287774,4987 +287774,11 @@ }, { "name": "tangentialArc", - "summary": "Draw a curved line segment along part of an imaginary circle.", - "description": "The arc is constructed such that the last line segment is placed tangent to the imaginary circle of the specified radius. The resulting arc is the segment of the imaginary circle from that tangent point for 'offset' degrees along the imaginary circle.", - "tags": [], - "keywordArguments": false, - "args": [ - { - "name": "data", - "type": "TangentialArcData", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "TangentialArcData", - "description": "Data to draw a tangential arc.", - "anyOf": [ - { - "type": "object", - "required": [ - "offset", - "radius" - ], - "properties": { - "radius": { - "description": "Radius of the arc. Not to be confused with Raiders of the Lost Ark.", - "type": "number", - "format": "double" - }, - "offset": { - "description": "Offset of the arc, in degrees.", - "type": "number", - "format": "double" - } - } - } - ] - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - { - "name": "sketch", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "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" - } - }, - "definitions": { - "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 base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interior kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (end kwarg)", - "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" - } - ] - } - } - } - ] - }, - "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" - ] - } - } - } - ] - }, - "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 - } - } - }, - "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" - } - ] - } - } - }, - "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 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "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" - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "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" - } - } - } - ] - }, - "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" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "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" - } - } - }, - "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" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "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" - } - } - }, - "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": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "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, - "labelRequired": true - }, - { - "name": "tag", - "type": "TagNode", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TagDeclarator", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true, - "definitions": { - "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 base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interior kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (end kwarg)", - "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" - } - ] - } - } - } - ] - }, - "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" - ] - } - } - } - ] - }, - "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 - } - } - }, - "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" - } - ] - } - } - }, - "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 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "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" - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "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" - } - } - } - ] - }, - "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" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "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" - } - } - }, - "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" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "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" - } - } - }, - "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": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "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": false, - "labelRequired": true - } - ], - "returnValue": { - "name": "", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "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" - } - }, - "definitions": { - "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 base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interior kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (end kwarg)", - "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" - } - ] - } - } - } - ] - }, - "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" - ] - } - } - } - ] - }, - "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 - } - } - }, - "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" - } - ] - } - } - }, - "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 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "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" - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "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" - } - } - } - ] - }, - "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" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "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" - } - } - }, - "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" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "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" - } - } - }, - "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": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "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, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - "exampleSketch = startSketchOn(XZ)\n |> startProfileAt([0, 0], %)\n |> angledLine(angle = 60, length = 10)\n |> tangentialArc({ radius = 10, offset = -120 }, %)\n |> angledLine(angle = -60, length = 10)\n |> close()\n\nexample = extrude(exampleSketch, length = 10)" - ] - }, - { - "name": "tangentialArcTo", "summary": "Starting at the current sketch's origin, draw a curved line segment along some part of an imaginary circle until it reaches the desired (x, y) coordinates.", - "description": "", + "description": "When using radius and angle, draw a curved line segment along part of an imaginary circle. The arc is constructed such that the last line segment is placed tangent to the imaginary circle of the specified radius. The resulting arc is the segment of the imaginary circle from that tangent point for 'angle' degrees along the imaginary circle.", "tags": [], - "keywordArguments": false, + "keywordArguments": true, "args": [ - { - "name": "to", - "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 - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, { "name": "sketch", "type": "Sketch", @@ -294409,6 +289433,6406 @@ }, "required": true, "includeInSnippet": true, + "description": "Which sketch should this path be added to?", + "labelRequired": false + }, + { + "name": "endAbsolute", + "type": "[number]", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Nullable_Array_size_2_of_double", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2, + "nullable": true, + "definitions": { + "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 base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "p1", + "p2", + "p3", + "to", + "type", + "units" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ArcThreePoint" + ] + }, + "p1": { + "description": "Point 1 of the arc (base on the end of previous segment)", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "p2": { + "description": "Point 2 of the arc (interior kwarg)", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "p3": { + "description": "Point 3 of the arc (end kwarg)", + "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" + } + ] + } + } + } + ] + }, + "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" + ] + } + } + } + ] + }, + "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 + } + } + }, + "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" + } + ] + } + } + }, + "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 + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "type": "object", + "required": [ + "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" + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "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" + } + } + } + ] + }, + "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" + } + } + }, + "Solid": { + "type": "object", + "required": [ + "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" + } + } + }, + "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" + } + ] + } + } + } + ] + }, + "Sketch": { + "type": "object", + "required": [ + "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" + } + } + }, + "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": [ + "value" + ], + "properties": { + "value": { + "type": "string" + } + } + }, + "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": false, + "description": "Which absolute point should this arc go to? Incompatible with `end`, `radius`, and `offset`.", + "labelRequired": true + }, + { + "name": "end", + "type": "[number]", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Nullable_Array_size_2_of_double", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2, + "nullable": true, + "definitions": { + "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 base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "p1", + "p2", + "p3", + "to", + "type", + "units" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ArcThreePoint" + ] + }, + "p1": { + "description": "Point 1 of the arc (base on the end of previous segment)", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "p2": { + "description": "Point 2 of the arc (interior kwarg)", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "p3": { + "description": "Point 3 of the arc (end kwarg)", + "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" + } + ] + } + } + } + ] + }, + "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" + ] + } + } + } + ] + }, + "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 + } + } + }, + "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" + } + ] + } + } + }, + "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 + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "type": "object", + "required": [ + "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" + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "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" + } + } + } + ] + }, + "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" + } + } + }, + "Solid": { + "type": "object", + "required": [ + "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" + } + } + }, + "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" + } + ] + } + } + } + ] + }, + "Sketch": { + "type": "object", + "required": [ + "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" + } + } + }, + "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": [ + "value" + ], + "properties": { + "value": { + "type": "string" + } + } + }, + "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": false, + "includeInSnippet": true, + "description": "How far away (along the X and Y axes) should this arc go? Incompatible with `endAbsolute`, `radius`, and `offset`.", + "labelRequired": true + }, + { + "name": "radius", + "type": "number", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Nullable_double", + "type": "number", + "format": "double", + "nullable": true, + "definitions": { + "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 base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "p1", + "p2", + "p3", + "to", + "type", + "units" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ArcThreePoint" + ] + }, + "p1": { + "description": "Point 1 of the arc (base on the end of previous segment)", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "p2": { + "description": "Point 2 of the arc (interior kwarg)", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "p3": { + "description": "Point 3 of the arc (end kwarg)", + "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" + } + ] + } + } + } + ] + }, + "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" + ] + } + } + } + ] + }, + "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 + } + } + }, + "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" + } + ] + } + } + }, + "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 + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "type": "object", + "required": [ + "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" + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "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" + } + } + } + ] + }, + "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" + } + } + }, + "Solid": { + "type": "object", + "required": [ + "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" + } + } + }, + "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" + } + ] + } + } + } + ] + }, + "Sketch": { + "type": "object", + "required": [ + "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" + } + } + }, + "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": [ + "value" + ], + "properties": { + "value": { + "type": "string" + } + } + }, + "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": false, + "description": "Radius of the imaginary circle. `angle` must be given. Incompatible with `end` and `endAbsolute`.", + "labelRequired": true + }, + { + "name": "angle", + "type": "number", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Nullable_double", + "type": "number", + "format": "double", + "nullable": true, + "definitions": { + "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 base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "p1", + "p2", + "p3", + "to", + "type", + "units" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ArcThreePoint" + ] + }, + "p1": { + "description": "Point 1 of the arc (base on the end of previous segment)", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "p2": { + "description": "Point 2 of the arc (interior kwarg)", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "p3": { + "description": "Point 3 of the arc (end kwarg)", + "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" + } + ] + } + } + } + ] + }, + "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" + ] + } + } + } + ] + }, + "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 + } + } + }, + "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" + } + ] + } + } + }, + "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 + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "type": "object", + "required": [ + "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" + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "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" + } + } + } + ] + }, + "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" + } + } + }, + "Solid": { + "type": "object", + "required": [ + "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" + } + } + }, + "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" + } + ] + } + } + } + ] + }, + "Sketch": { + "type": "object", + "required": [ + "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" + } + } + }, + "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": [ + "value" + ], + "properties": { + "value": { + "type": "string" + } + } + }, + "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": false, + "description": "Offset of the arc in degrees. `radius` must be given. Incompatible with `end` and `endAbsolute`.", "labelRequired": true }, { @@ -296008,6 +297432,7 @@ } }, "required": false, + "description": "Create a new tag which refers to this arc", "labelRequired": true } ], @@ -297670,4950 +299095,9 @@ "unpublished": false, "deprecated": false, "examples": [ - "exampleSketch = startSketchOn(XZ)\n |> startProfileAt([0, 0], %)\n |> angledLine(angle = 60, length = 10)\n |> tangentialArcTo([15, 15], %)\n |> line(end = [10, -15])\n |> close()\n\nexample = extrude(exampleSketch, length = 10)" - ] - }, - { - "name": "tangentialArcToRelative", - "summary": "Starting at the current sketch's origin, draw a curved line segment along some part of an imaginary circle until it reaches a point the given (x, y) distance away.", - "description": "", - "tags": [], - "keywordArguments": false, - "args": [ - { - "name": "delta", - "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 - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - { - "name": "sketch", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "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" - } - }, - "definitions": { - "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 base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interior kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (end kwarg)", - "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" - } - ] - } - } - } - ] - }, - "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" - ] - } - } - } - ] - }, - "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 - } - } - }, - "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" - } - ] - } - } - }, - "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 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "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" - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "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" - } - } - } - ] - }, - "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" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "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" - } - } - }, - "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" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "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" - } - } - }, - "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": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "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, - "labelRequired": true - }, - { - "name": "tag", - "type": "TagNode", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TagDeclarator", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true, - "definitions": { - "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 base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interior kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (end kwarg)", - "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" - } - ] - } - } - } - ] - }, - "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" - ] - } - } - } - ] - }, - "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 - } - } - }, - "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" - } - ] - } - } - }, - "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 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "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" - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "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" - } - } - } - ] - }, - "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" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "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" - } - } - }, - "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" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "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" - } - } - }, - "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": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "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": false, - "labelRequired": true - } - ], - "returnValue": { - "name": "", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "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" - } - }, - "definitions": { - "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 base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interior kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (end kwarg)", - "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" - } - ] - } - } - } - ] - }, - "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" - ] - } - } - } - ] - }, - "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 - } - } - }, - "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" - } - ] - } - } - }, - "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 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "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" - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "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" - } - } - } - ] - }, - "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" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "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" - } - } - }, - "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" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "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" - } - } - }, - "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": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "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, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - "exampleSketch = startSketchOn(XZ)\n |> startProfileAt([0, 0], %)\n |> angledLine(angle = 45, length = 10)\n |> tangentialArcToRelative([0, -10], %)\n |> line(end = [-10, 0])\n |> close()\n\nexample = extrude(exampleSketch, length = 10)" + "exampleSketch = startSketchOn(XZ)\n |> startProfileAt([0, 0], %)\n |> angledLine(angle = 45, length = 10)\n |> tangentialArc(end = [0, -10])\n |> line(end = [-10, 0])\n |> close()\n\nexample = extrude(exampleSketch, length = 10)", + "exampleSketch = startSketchOn(XZ)\n |> startProfileAt([0, 0], %)\n |> angledLine(angle = 60, length = 10)\n |> tangentialArc(endAbsolute = [15, 15])\n |> line(end = [10, -15])\n |> close()\n\nexample = extrude(exampleSketch, length = 10)", + "exampleSketch = startSketchOn(XZ)\n |> startProfileAt([0, 0], %)\n |> angledLine(angle = 60, length = 10)\n |> tangentialArc(radius = 10, angle = -120)\n |> angledLine(angle = -60, length = 10)\n |> close()\n\nexample = extrude(exampleSketch, length = 10)" ] }, { @@ -312462,9 +308946,9 @@ "unpublished": false, "deprecated": false, "examples": [ - "// Move a pipe.\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(x = 1.0, y = 1.0, z = 2.5)", + "// Move a pipe.\n\n// Create a path for the sweep.\nsweepPath = startSketchOn(XZ)\n |> startProfileAt([0.05, 0.05], %)\n |> line(end = [0, 7])\n |> tangentialArc(angle = 90, radius = 5)\n |> line(end = [-3, 0])\n |> tangentialArc(angle = -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(x = 1.0, y = 1.0, z = 2.5)", "// Move an imported model.\n\n\nimport \"tests/inputs/cube.sldprt\" as cube\n\n// Circle so you actually see the move.\nstartSketchOn(XY)\n |> circle(center = [-10, -10], radius = 10)\n |> extrude(length = 10)\n\ncube\n |> translate(x = 10.0, y = 10.0, z = 2.5)", - "// Sweep two sketches along the same path.\n\n\nsketch001 = startSketchOn(XY)\nrectangleSketch = startProfileAt([-200, 23.86], sketch001)\n |> angledLine(angle = 0, length = 73.47, tag = $rectangleSegmentA001)\n |> angledLine(angle = segAng(rectangleSegmentA001) - 90, length = 50.61)\n |> angledLine(angle = segAng(rectangleSegmentA001), length = -segLen(rectangleSegmentA001))\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\ncircleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63)\n\nsketch002 = startSketchOn(YZ)\nsweepPath = startProfileAt([0, 0], sketch002)\n |> yLine(length = 231.81)\n |> tangentialArc({ radius = 80, offset = -90 }, %)\n |> xLine(length = 384.93)\n\nparts = sweep([rectangleSketch, circleSketch], path = sweepPath)\n\n// Move the sweeps.\ntranslate(\n parts,\n x = 1.0,\n y = 1.0,\n z = 2.5,\n)", + "// Sweep two sketches along the same path.\n\n\nsketch001 = startSketchOn(XY)\nrectangleSketch = startProfileAt([-200, 23.86], sketch001)\n |> angledLine(angle = 0, length = 73.47, tag = $rectangleSegmentA001)\n |> angledLine(angle = segAng(rectangleSegmentA001) - 90, length = 50.61)\n |> angledLine(angle = segAng(rectangleSegmentA001), length = -segLen(rectangleSegmentA001))\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\ncircleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63)\n\nsketch002 = startSketchOn(YZ)\nsweepPath = startProfileAt([0, 0], sketch002)\n |> yLine(length = 231.81)\n |> tangentialArc(radius = 80, angle = -90)\n |> xLine(length = 384.93)\n\nparts = sweep([rectangleSketch, circleSketch], path = sweepPath)\n\n// Move the sweeps.\ntranslate(\n parts,\n x = 1.0,\n y = 1.0,\n z = 2.5,\n)", "// Move a sketch.\n\n\nfn square(length) {\n l = length / 2\n p0 = [-l, -l]\n p1 = [-l, l]\n p2 = [l, l]\n p3 = [l, -l]\n\n return startSketchOn(XY)\n |> startProfileAt(p0, %)\n |> line(endAbsolute = p1)\n |> line(endAbsolute = p2)\n |> line(endAbsolute = p3)\n |> close()\n}\n\nsquare(10)\n |> translate(x = 5, y = 5)\n |> extrude(length = 10)", "// Translate and rotate a sketch to create a loft.\nsketch001 = startSketchOn(XY)\n\nfn square() {\n return startProfileAt([-10, 10], sketch001)\n |> xLine(length = 20)\n |> yLine(length = -20)\n |> xLine(length = -20)\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n}\n\nprofile001 = square()\n\nprofile002 = square()\n |> translate(z = 20)\n |> rotate(axis = [0, 0, 1.0], angle = 45)\n\nloft([profile001, profile002])" ] diff --git a/docs/kcl/sweep.md b/docs/kcl/sweep.md index fe6756f92..3735c1939 100644 --- a/docs/kcl/sweep.md +++ b/docs/kcl/sweep.md @@ -47,9 +47,9 @@ sweep( sweepPath = startSketchOn(XZ) |> startProfileAt([0.05, 0.05], %) |> line(end = [0, 7]) - |> tangentialArc({ offset = 90, radius = 5 }, %) + |> tangentialArc(angle = 90, radius = 5) |> line(end = [-3, 0]) - |> tangentialArc({ offset = -90, radius = 5 }, %) + |> tangentialArc(angle = -90, radius = 5) |> line(end = [0, 7]) // Create a hole for the pipe. @@ -102,7 +102,7 @@ circleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63) sketch002 = startSketchOn(YZ) sweepPath = startProfileAt([0, 0], sketch002) |> yLine(length = 231.81) - |> tangentialArc({ radius = 80, offset = -90 }, %) + |> tangentialArc(radius = 80, angle = -90) |> xLine(length = 384.93) sweep([rectangleSketch, circleSketch], path = sweepPath) @@ -120,7 +120,7 @@ circleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63) sketch002 = startSketchOn(YZ) sweepPath = startProfileAt([0, 0], sketch002) |> yLine(length = 231.81) - |> tangentialArc({ radius = 80, offset = -90 }, %) + |> tangentialArc(radius = 80, angle = -90) |> xLine(length = 384.93) sweep(circleSketch, path = sweepPath, sectional = true) diff --git a/docs/kcl/tangentToEnd.md b/docs/kcl/tangentToEnd.md index d8cbb494b..8ddb00c21 100644 --- a/docs/kcl/tangentToEnd.md +++ b/docs/kcl/tangentToEnd.md @@ -31,9 +31,9 @@ tangentToEnd(tag: TagIdentifier): number pillSketch = startSketchOn(XZ) |> startProfileAt([0, 0], %) |> line(end = [20, 0]) - |> tangentialArcToRelative([0, 10], %, $arc1) + |> tangentialArc(end = [0, 10], tag = $arc1) |> angledLine(angle = tangentToEnd(arc1), length = 20) - |> tangentialArcToRelative([0, -10], %) + |> tangentialArc(end = [0, -10]) |> close() pillExtrude = extrude(pillSketch, length = 10) @@ -46,9 +46,9 @@ pillExtrude = extrude(pillSketch, length = 10) pillSketch = startSketchOn(XZ) |> startProfileAt([0, 0], %) |> line(end = [0, 20]) - |> tangentialArcTo([10, 20], %, $arc1) + |> tangentialArc(endAbsolute = [10, 20], tag = $arc1) |> angledLine(angle = tangentToEnd(arc1), length = 20) - |> tangentialArcToRelative([-10, 0], %) + |> tangentialArc(end = [-10, 0]) |> close() pillExtrude = extrude(pillSketch, length = 10) diff --git a/docs/kcl/tangentialArc.md b/docs/kcl/tangentialArc.md index 7b2df8c56..148187c13 100644 --- a/docs/kcl/tangentialArc.md +++ b/docs/kcl/tangentialArc.md @@ -1,17 +1,20 @@ --- title: "tangentialArc" -excerpt: "Draw a curved line segment along part of an imaginary circle." +excerpt: "Starting at the current sketch's origin, draw a curved line segment along some part of an imaginary circle until it reaches the desired (x, y) coordinates." layout: manual --- -Draw a curved line segment along part of an imaginary circle. +Starting at the current sketch's origin, draw a curved line segment along some part of an imaginary circle until it reaches the desired (x, y) coordinates. -The arc is constructed such that the last line segment is placed tangent to the imaginary circle of the specified radius. The resulting arc is the segment of the imaginary circle from that tangent point for 'offset' degrees along the imaginary circle. +When using radius and angle, draw a curved line segment along part of an imaginary circle. The arc is constructed such that the last line segment is placed tangent to the imaginary circle of the specified radius. The resulting arc is the segment of the imaginary circle from that tangent point for 'angle' degrees along the imaginary circle. ```js tangentialArc( - data: TangentialArcData, sketch: Sketch, + endAbsolute?: [number], + end?: [number], + radius?: number, + angle?: number, tag?: TagDeclarator, ): Sketch ``` @@ -21,9 +24,12 @@ tangentialArc( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `data` | [`TangentialArcData`](/docs/kcl/types/TangentialArcData) | Data to draw a tangential arc. | Yes | -| `sketch` | [`Sketch`](/docs/kcl/types/Sketch) | | Yes | -| [`tag`](/docs/kcl/types/tag) | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | | No | +| `sketch` | [`Sketch`](/docs/kcl/types/Sketch) | Which sketch should this path be added to? | Yes | +| `endAbsolute` | [`[number]`](/docs/kcl/types/number) | Which absolute point should this arc go to? Incompatible with `end`, `radius`, and `offset`. | No | +| `end` | [`[number]`](/docs/kcl/types/number) | How far away (along the X and Y axes) should this arc go? Incompatible with `endAbsolute`, `radius`, and `offset`. | No | +| `radius` | [`number`](/docs/kcl/types/number) | Radius of the imaginary circle. `angle` must be given. Incompatible with `end` and `endAbsolute`. | No | +| `angle` | [`number`](/docs/kcl/types/number) | Offset of the arc in degrees. `radius` must be given. Incompatible with `end` and `endAbsolute`. | No | +| [`tag`](/docs/kcl/types/tag) | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | Create a new tag which refers to this arc | No | ### Returns @@ -32,17 +38,43 @@ tangentialArc( ### Examples +```js +exampleSketch = startSketchOn(XZ) + |> startProfileAt([0, 0], %) + |> angledLine(angle = 45, length = 10) + |> tangentialArc(end = [0, -10]) + |> line(end = [-10, 0]) + |> close() + +example = extrude(exampleSketch, length = 10) +``` + +![Rendered example of tangentialArc 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAADyC0lEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV131f9w111zzYIAzZ848GOCaa655MMCZM2cexIvg7Nmzz+CZ7rvvvlsBzp49e+t99913K1ddddVVV1111VX/s1G56qqrrrrqqquuuuqq/8WuueaaBwO82Iu92GufOXPmQQAv/uIv/toAL/ZiL/baPMB999136zXXXPNg/oPdd999t549e/bW++6771aA3/qt3/oenukf/uEffpurrrrqqquuuuqq/z7oQQ96EFddddVVV1111VVXXfW/wTXXXPPgF3uxF3vtM2fOPOjFX/zFX/vFXuzFXhvgvvvuu/Waa655MM+0u7sLwNOf/nQuXrwIwO7uLrbZ3d0F4OLFi9xvd3eX5+f48eM80PHjx7nf8ePHOXHiBCdOnADg+PHjADz0oQ/lgf7hH/7ht8+cOfPgf/iHf/htgH/4h3/4nX/4h3/47fvuu+9Wrrrqqquuuuqqq/7zoQc96EFcddVVV1111VVXXXXV/zTXXHPNg1/7tV/7vc6ePfuM13md13mvF3uxF3ttHmB3d5eLFy/y9Kc/HYBbb72Vixcvsru7y4vKNi8K27wgtnluJ06c4Pjx45w4cYKHPOQhAJw4cYKHPvSh3O++++679ezZs7f+/d///W//wz/8w+/8wz/8w29z1VVXXXXVVVdd9R8PPehBD+Kqq6666qqrrrrqqqv+u11zzTUPfu3Xfu33Anind3qnz+YBdnd3+cu//EsAbr31Vp7+9KfzH802/xLbvCC2eW62eaATJ05w/PhxTpw4wUMf+lBOnDjBQx/6UADuu+++WwH+4R/+4bd/67d+63v+4R/+4be56qqrrrrqqquu+vdDD3rQg7jqqquuuuqqq6666qr/atdcc82Dz5w58+AXe7EXe63XeZ3Xee9rrrnmwQC7u7tcvHiRW2+9lac//enceuut/FvY5t/KNi+MbZ4f2zw/tnkg29zvxIkTHD9+nIc+9KE87GEP46EPfSgA9913361nz5699e///u9/+x/+4R9+5x/+4R9+m6uuuuqqq6666qp/PfSgBz2Iq6666qqrrrrqqquu+q9wzTXXPPi1X/u13+vFX/zFX/vFXuzFXptn2t3d5a/+6q94+tOfzq233sp/Ftv8a9jmhbHN82Ob52abB7LNA9kG4MSJEwC83Mu9HA996EN52MMeBsB999136z/8wz/89m/91m99zz/8wz/8NlddddVVV1111VUvGvSgBz2Iq6666qqrrrrqqquu+s9yzTXXPPi1X/u13+vFX/zFX/vFXuzFXhtgd3eXv/qrv+LpT386t956K/9dbPOisM0LY5vnZpvnZpvnZpsHss39bHPixAke9rCH8dCHPpSXf/mXB+C+++679R/+4R9++7d+67e+5x/+4R9+m6uuuuqqq6666qoXDD3oQQ/iqquuuuqqq6666qqr/iNdc801D37t137t93rxF3/x1z5z5syDr7nmmgfv7u7yl3/5l9x6663ceuut/E9jm3+JbV4Q2zw/tnlutnkg2zyQbe5nm/sdP36chz3sYTzsYQ/j5V/+5QG47777bv2t3/qt7/7t3/7t77nvvvtu5aqrrrrqqquuuuo5oQc96EFcddVVV1111VVXXXXVf4Rrrrnmwa/92q/9Xu/0Tu/02QC7u7v85V/+JX/913/N7u4u/x6SeFHY5t/LNi+MbV4Q2zw32zw32zyQbR7INvezzf1sA3DixAke+tCH8rCHPYxXeIVX4L777rv1H/7hH377H/7hH37nt37rt76bq6666qqrrrrqqivQgx70IK666qqrrrrqqquuuurf6pprrnnwa7/2a7/X67zO67z3Nddc82CA3/zN32R3d5e//uu/5l9LEv9ZbPOvYZsXxjYviG2em20eyDYPZJsHss39bHM/29zPNidOnOAVXuEVeNjDHsbDHvYw7rvvvlt/67d+67t/9Ed/9HO46qqrrrrqqqv+v0MPetCDuOqqq6666qqrrrrqqn+ta6655sGv/dqv/V7v9E7v9NkAu7u7/OVf/iW/9Vu/hSReVJL472KbF5VtXhDbPD+2eW62eW62uZ9tHsg297PN/WxzP9vc78SJE7zhG74hr/AKr8B999136z/8wz/89m/91m99zz/8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/Etsc9V/Ltv8b2Sbf69jx47xmq/5mrzkS74kAPfdd9+tX//1X/8+//AP//DbXHXVVVddddVV/1kox48f56qrrrrqqquuuuqq/zuOjo4u/dmf/dnPHB4e7r74i7/4a1977bU88pGPZDabcdttt3HVfw3b/G9mm/8ox44d4xVf8RV5h3d4B6699loAfuRHfuSzv/RLv/Rtzp49eytXXXXVVVddddV/JvSgBz2Iq6666qqrrrrqqqv+b7rmmmse/I7v+I6f9Tqv8zrvDXDp0iV+7/d+j7/7u7/jqv8Ytvm/wDb/GV7jNV6D13zN1+R+v/Vbv/XdX//1X/8+XHXVVVddddVV/1XQgx70IK666qqrrrrqqquu+r/txV7sxV77wz/8w7/rmmuueTDApUuX+Pmf/3luu+02rvqX2eb/Etv8Z3uN13gNXuqlXopjx44BcN9999369V//9e/zD//wD7/NVVddddVVV131Xwk96EEP4qqrrrrqqquuuuqq//uuueaaB7/2a7/2e73TO73TZwNcunSJ2267jd/7vd/j0qVL/H9nm/+rbPNf5UEPehBv8RZvwbFjxwC47777bv3RH/3Rz/6t3/qt7+Gqq6666qqrrvrvgB70oAdx1VVXXXXVVVddddX/H9dcc82DX/u1X/u93umd3umzAS5dusTf/u3f8nd/93dcunSJ/6ts8/+Bbf47vMZrvAYv9VIvxbFjxwC47777bv2t3/qt7/7RH/3Rz+Gqq6666qqrrvrvhB70oAdx1VVXXXXVVVddddX/P2fOnHnQ67zO67z3O73TO302wKVLl/i7v/s7/vZv/5ZLly7xv4lt/j+yzX+313iN1+ClXuqlOHbsGAD33Xffrb/1W7/13T/6oz/6OVx11VVXXXXVVf8ToAc96EFcddVVV1111VVXXfX/1zXXXPPgd3zHd/ys13md13lvgEuXLnHbbbfxe7/3e1y6dIn/Lra56tls8z/FsWPHeMmXfEle8zVfk/vdd999t/7Wb/3Wd//oj/7o53DVVVddddVVV/1Pgh70oAdx1VVXXXXVVVddddVV11xzzYPf8R3f8bNe53Ve570BLl26xG233cbf/u3fctttt/HvZZurXjS2+Z/o2LFjvORLviSv+ZqvCcB99913K8Bv/dZvffeP/uiPfg5XXXXVVVddddX/ROhBD3oQV1111VVXXXXVVVdddb9rrrnmwa/92q/9Xu/0Tu/02TzTpUuX+L3f+z3+9m//lqv+49jmf4Njx47xmq/5mrzkS74k97vvvvtu/dEf/dHP/q3f+q3v4aqrrrrqqquu+p8MPehBD+Kqq6666qqrrrrqqque2zXXXPPg137t136vd3qnd/psnunSpUv87d/+LX/7t3/LpUuXuOpFY5v/bY4dO8ZLvuRL8lIv9VIcO3aM+/3Ij/zIZ//2b//299x33323ctVVV1111VVX/W+AHvSgB3HVVVddddVVV1111VUvyJkzZx704i/+4q/zOq/zOu/1Yi/2Yq8NcOnSJZ7xjGfwt3/7t9x2221cdYVt/rd70IMexEu+5Evyki/5ktzvvvvuu/W3fuu3vvtHf/RHP4errrrqqquuuup/G/SgBz2Iq6666qqrrrrqqquuelG82Iu92Gu/zuu8znu92Iu92Gtfc801Dwa4dOkSf/u3f8sznvEMbrvtNv6vs83/NceOHeMlX/Ilec3XfE0e6Ld+67e++x/+4R9+57d+67e+m6uuuuqqq6666n8r9KAHPYirrrrqqquuuuqqq6761zhz5syDXud1Xue9X+d1Xue9r7nmmgfzTJcuXeJv//Zv+b3f+z3+N7PN/2W2OX78OC/5ki/JS73US3Hs2DHud9999936W7/1W9/9oz/6o5/DVVddddVVV131fwF60IMexFVXXXXVVVddddVVV/1bXXPNNQ9+x3d8x896ndd5nffmmS5dusTu7i5/93d/x9/+7d/yP41t/r+wzf2OHz/OS77kS/KSL/mSHD9+nPvdd999t/7Wb/3Wd//2b//299x33323ctVVV1111VVX/V+CHvSgB3HVVVddddVVV1111VX/XmfOnHnQi7/4i7/Oi73Yi73W67zO67w3D3Dp0iX+9m//lmc84xncdttt/Gezzf9Htnmg48ePc+zYMR70oAfxmq/5mjzQfffdd+tv/dZvffc//MM//PY//MM//A5XXXXVVVddddX/VehBD3oQV1111VVXXXXVVVdd9R/pmmuuefCLvdiLvfaLvdiLvdbrvM7rvDcPcOnSJZ7xjGdw22238bd/+7f8a9jmqits8/wcP36cl3zJl+RBD3oQD3rQg3ig++6779bf+q3f+u5/+Id/+J1/+Id/+G2uuuqqq6666qr/D9CDHvQgrrrqqquuuuqqq6666j/LNddc8+AXe7EXe+0Xe7EXe63XeZ3XeW8e4NKlSwD87d/+Lc94xjN4xjOewVXPyzYvyPHjx3nJl3xJAF7zNV+T53bffffd+lu/9Vvf/du//dvfc999993KVVddddVVV131/w160IMexFVXXXXVVVddddVVV/1XOXPmzINe53Ve571f/MVf/LVf7MVe7LV5gEuXLgHwjGc8g2c84xk84xnP4NKlS/x/YZsX5vjx4xw7dowHPehBPOhBD+JBD3oQz+2+++679bd+67e+G+BHf/RHP4errrrqqquuuur/O/SgBz2Iq6666qqrrrrqqquu+u9wzTXXPPjFXuzFXvvFXuzFXuuaa6558Iu92Iu9Ns/l0qVLPOMZzwDgGc94Bs94xjO4dOkS/5vZ5l9y/Phxjh07xoMe9CCOHTvGS73US/H83Hfffbf+wz/8w2/fd999t/72b//299x33323ctVVV1111VVXXfVs6EEPehBXXXXVVVddddVVV131P8E111zz4DNnzjz4xV7sxV7rxV/8xV/7xV7sxV6b5+PSpUvs7u5y6dIlnvGMZwBw6dIlnvGMZ/A/iW3+JcePH+fYsWM86EEPAuBBD3oQD3rQg3hB7rvvvlt/67d+67sBfvRHf/RzuOqqq6666qqrrnrh0IMe9CCuuuqqq6666qqrrrrqf6prrrnmwS/2Yi/22i/2Yi/2Wtdcc82DX+zFXuy1eSEuXbrEpUuX2N3dBeAZz3gGAJcuXWJ3d5dLly7xH8k2z8/x48cBOHbsGMeOHeP48eMAHDt2jOPHj3Ps2DGOHz/OC3LffffdCvBbv/Vb3w3wD//wD7/zD//wD7/NVVddddVVV1111b8OetCDHsRVV1111VVXXXXVVVf9b3LNNdc8+MyZMw++5pprHvxiL/Zir3XNNdc8+MyZMw++5pprHsyL6NKlSwDs7u5yv0uXLvHcdnd3eaBjx44BIAnbHD9+nPsdP36cY8eO8a9x33333Xr27Nlb//7v//63Af7hH/7hd/7hH/7ht7nqqquuuuqqq676j4Ee9KAHcdVVV1111VVXXXXVVf9XXHPNNQ8+c+bMg6655pqHALzYi73Ya9133323vviLv/hrnzlz5sHXXHPNg/kvcN99990KcPbs2VsB/v7v//63Ac6ePfuM++677+lnz559xn333XcrV1111VVXXXXVVf+50IMe9CCuuuqqq6666qqrrrrq/5trrrnmwbZ9zTXXPIRnuuaaax4MGBDPdObMmQfxAGfPnn0GVxjQfffddyvPdN999z397Nmzz+Cqq6666qqrrrrqfw70oAc9iKuuuuqqq6666qqrrrrqqquuuuqqq6666v8kKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8V/wg9C5pLs7VQ4gAAAABJRU5ErkJggg==) + ```js exampleSketch = startSketchOn(XZ) |> startProfileAt([0, 0], %) |> angledLine(angle = 60, length = 10) - |> tangentialArc({ radius = 10, offset = -120 }, %) + |> tangentialArc(endAbsolute = [15, 15]) + |> line(end = [10, -15]) + |> close() + +example = extrude(exampleSketch, length = 10) +``` + +![Rendered example of tangentialArc 1](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAD91UlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1313+iaa655MM/0Yi/2Yq995syZBwG8+Iu/+Gvfd999t/7oj/7o59x33323ctVVV1111VVXXXXVvwV60IMexFVXXXXVVVddddVVV/1nuuaaax585syZB7/Yi73YawG8+Iu/+GufOXPmwddcc82DeT52d3cBGIbhVoCv//qvf59/+Id/+G2uuuqqq6666qqrrvrXQg960IO46qqrrrrqqquuuuqqf69rrrnmwQCv/dqv/V4AL/7iL/7aL/ZiL/baPJfd3V0uXrzI7u4uu7u7AOzu7nLx4kV2d3fZ3d0F4Pjx43zsx34sAP/wD//w25/5mZ/5Olx11VVXXXXVVVdd9a9F5aqrrrrqqquuuuqqq/6VrrnmmgefOXPmwS/2Yi/2Wi/+4i/+2i/2Yi/22jzA7u4uAH/913/NxYsX2d3dZXd3l1tvvZXnZpvnZ3d3l93dXY4fP86LvdiLvfY7vuM7ftaP/uiPfg5XXXXVVVddddVVV/1rULnqqquuuuqqq6666qoX4pprrnnwmTNnHvxiL/Zir/XiL/7ir/1iL/Zir80D7O7u8lu/9VsA3Hrrrdx66638a0jiBbl48SLHjx/nJ3/yJ3md13md9/7t3/7t77nvvvtu5aqrrrrqqquuuuqqFxWVq6666qqrrrrqqquueoBrrrnmwa/92q/9XgCv8zqv897XXHPNg3mm3d1d/vqv/5qLFy9y6623cuutt/Kf6dZbb+UhD3kIAE94whMe/OEf/uHf9Zmf+Zmvw1VXXXXVVVddddVVLyoqV1111VVXXXXVVVf9v3bNNdc8+LVf+7XfC+Cd3umdPptn2t3d5dZbb+Uf/uEfuPXWW7n11lv5r3brrbcC8JjHPIZv+ZZv4dM+7dNe+3Ve53Xe+7d+67e+m6uuuuqqq6666qqrXhRUrrrqqquuuuqqq676f+Waa6558Iu92Iu99pkzZx70Tu/0Tp/NM+3u7vLXf/3XXLx4kd/+7d8GQBL3k8R/Fts8P7u7uwCcOXOGc+fO8ZM/+ZO84zu+42f9wz/8w2/fd999t3LVVVddddVVV1111b+EylVXXXXVVVddddVV/+ddc801D37t137t93rxF3/x136xF3ux1wbY3d3l1ltv5elPfzp/8zd/w+7uLveTxH8lSTw/kgA4ffo0kvi93/s9XvM1X/PBH/7hH/5dn/mZn/k6XHXVVVddddVVV131L6Fy1VVXXXXVVVddddX/SS/2Yi/22i/2Yi/2Wu/0Tu/02TzT7u4uv/3bv82tt97Krbfeyv90u7u73HrrrTz4wQ/mMY95DI973OP4lm/5Fr76q7/6tV/ndV7nvX/rt37ru7nqqquuuuqqq6666oWhctVVV1111VVXXXXV/wnXXHPNg8+cOfPgF3uxF3utd3qnd/psgN3dXW699VZuvfVWfvu3f5v/zU6fPo0kzp07x7d8y7fwju/4jp/1D//wD79933333cpVV1111VVXXXXVVS8Ilauuuuqqq6666qqr/ld7x3d8x8+65pprHvw6r/M67w2wu7vLb//2b3Prrbdy66238m8lif9Ktnl+br31Vh784Adz+vRp7vd7v/d7vOZrvuaD3/Ed3/Gzvv7rv/59uOqqq6666qqrrrrqBaFy1VVXXXXVVVddddX/Otdcc82DX/u1X/u93umd3umzAXZ3d/nt3/5tbr31Vm699Vb+tSTx300Sz88znvEMAB7zmMfwUz/1U0jCNt/yLd/CV3/1V7/3P/zDP/zOb/3Wb303V1111VVXXXXVVVc9P1Suuuqqq6666qqrrvpf4Zprrnnwa7/2a7/XO73TO302wO7uLr/927/NX//1X7O7u8uLShL/m+zu7gJw5swZHujcuXN8y7d8C+/4ju/4Wf/wD//w2/fdd9+tXHXVVVddddVVV1313KhcddVVV1111VVXXfU/1jXXXPPg137t136v13md13nva6655sEAf/3Xf82tt97KX//1X/OikMT/Zru7uwCcPn2a06dPc+7cOSRhm9/7vd/jNV/zNR/8ju/4jp/19V//9e/DVVddddVVV1111VXPjcpVV1111VVXXXXVVf/jXHPNNQ9+x3d8x896ndd5nfcG2N3d5bd/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rrrqPx7BVVddddVVV/0neMd3fMfP4pl+7/d+j//JbGMb29jGNv+X2MY2trGNbWxjG9tcddX/B7axjW1sYxvb2OZ/O9vYxja2sc3/ZLaxjW1s89/JNraxzX812+zu7vIzP/Mz3O91Xud13ourrrrqqquu+o9HcNVVV1111VX/CV7sxV7stQF+53d+h4sXL2Kb/01sYxvb2MY2/1fZxja2sY1tbGMb21x11f8GtrGNbWxjG9vYxjb/l9jGNraxzf90trGNbWzz3802trHNfzXb2MY29/vrv/5rbr31VgBe7MVe7LW56qqrrrrqqv94VK666qqrrrrqP9iLvdiLvRbP9Fqv9Vq81mu9FlddddVVV1111b/smmuuefB99913K1ddddVVV131H4fgqquuuuqqq/6D/cM//MPv/NZv/dZ3c9VVV1111VVXvch+67d+67vvu+++W7nqqquuuuqq/1joQQ96EFddddVVV1111VVXXXXVVVddddVVV1111f9JVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+r+Ed9t1Vy9MMhLwAAAABJRU5ErkJggg==) + +```js +exampleSketch = startSketchOn(XZ) + |> startProfileAt([0, 0], %) + |> angledLine(angle = 60, length = 10) + |> tangentialArc(radius = 10, angle = -120) |> angledLine(angle = -60, length = 10) |> close() example = extrude(exampleSketch, length = 10) ``` -![Rendered example of tangentialArc 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAD+sUlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquu+l/vmmuueTDAmTNnHswzXXPNNQ/mX+G+++67lWc6e/bsrQD33XffrVx11VVXXXXVVVdd9b8Zlauuuuqqq6666qqr/ke65pprHgxw5syZB7/Yi73YawFcc801D77mmmseDHDmzJkHX3PNNQ/mv8B99913K8DZs2dvve+++24F+Id/+IffAbjvvvtu/Yd/+Iff5qqrrrrqqquuuuqq/4nQgx70IK666qqrrrrqqquu+u9xzTXXPBjgxV7sxV77zJkzD3rxF3/x1wZ4sRd7sdfm+djd3WV3dxfb7O7usru7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1b/gmmuueTDP9KAHPYgP//AP56qrrrrqqquu+u93zTXXPPi+++67lauuuuqqq656wdCDHvQgrrrqqquuuupf8mIv9mKv/eEf/uHfxVVXXXXVVVdd9T/Cj/7oj37Ob/3Wb303V1111VVXXfXCoQc96EFcddVVV1111VVXXXXVVVddddVVV1111VX/J1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fxT8CVFr/nMHIqvMAAAAASUVORK5CYII=) +![Rendered example of tangentialArc 2](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAD+sUlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquu+l/vmmuueTDAmTNnHswzXXPNNQ/mX+G+++67lWc6e/bsrQD33XffrVx11VVXXXXVVVdd9b8Zlauuuuqqq6666qqr/ke65pprHgxw5syZB7/Yi73YawFcc801D77mmmseDHDmzJkHX3PNNQ/mv8B99913K8DZs2dvve+++24F+Id/+IffAbjvvvtu/Yd/+Iff5qqrrrrqqquuuuqq/4nQgx70IK666qqrrrrqqquu+u9xzTXXPBjgxV7sxV77zJkzD3rxF3/x1wZ4sRd7sdfm+djd3WV3dxfb7O7usru7y/12d3e5ePEi99vd3eW57e7ucvz4cWzz3E6cOMH9jh8/jm1OnDjB8ePHud+JEycAeMhDHsJzu++++24F+Id/+IffBviHf/iH37nvvvtu/Yd/+Iff5qqrrrrqqquuuuqq/y7oQQ96EFddddVVV1111VVX/ee75pprHvxiL/Zir33mzJkHvfiLv/hrv9iLvdhr81x2d3e59dZbuXjxIgC7u7vs7u5y66238i+xzb+Wbf4ltnl+jh8/DsBDHvIQAB7ykIcAcOLECR7ykIdwv/vuu+9WgH/4h3/4bYB/+Id/+J377rvv1n/4h3/4ba666qqrrrrqqquu+s+GHvSgB3HVVVddddVVV1111X+sa6655sFnzpx58Iu92Iu91ou/+Iu/9ou92Iu9Ng+wu7vLrbfeysWLF7n11lvZ3d1ld3eX/0i2+dewzQtjmxfENs/txIkTPPjBDwbgoQ99KMePH+ehD30o97vvvvtuPXv27K333Xffrb/1W7/1Pf/wD//w21x11VVXXXXVVVdd9R8NPehBD+Kqq6666qqrrrrqqn+fa6655sEv9mIv9tpnzpx50Iu/+Iu/9ou92Iu9Ns+0u7vLX/3VXwFw6623cuutt/LfwTYvCtu8MLZ5QWzz/NjmfidOnOAhD3kID3nIQzhx4gQPfehDud9999136z/8wz/89j/8wz/8zm/91m99N1ddddVVV1111VVX/XuhBz3oQVx11VVXXXXVVVdd9a/3Yi/2Yq/9Yi/2Yq/14i/+4q/9Yi/2Yq8NsLu7y+7uLk9/+tO59dZbufXWWwGQxH8U2/x72eZfYpsXxjbPj22eH9s8N9ucOHGCEydOcOLECR7ykIfwci/3ctzvvvvuu/Uf/uEffvu3fuu3vucf/uEffpurrrrqqquuuuqqq/610IMe9CCuuuqqq6666qqrrvqXXXPNNQ9+sRd7sdd+ndd5nfd6sRd7sdfmmW699Vae/vSn89d//ddcunSJ/y62+deyzb/ENi+IbV4Q2zw32zw32zy348eP89CHPpSXe7mX46EPfSgA9913361nz5699bd+67e+57777rv1H/7hH36bq6666qqrrrrqqqv+JehBD3oQV1111VVXXXXVVVc9f9dcc82DX/u1X/u9Xud1Xue9r7nmmgcD7O7u8ld/9Vfceuut3HrrrUjifyLb/GvY5oWxzQtim+fHNs+PbR7INs/NNgAnTpzgxIkTPOQhD+FhD3sYD33oQwG47777bv2t3/qt7/6Hf/iH3/mHf/iH3+aqq6666qqrrrrqqucHPehBD+Kqq6666qqrrrrqqme75pprHvzar/3a7/U6r/M6733NNdc8GGB3d5e/+qu/4rd/+7eRxP82tnlR2eaFsc0LYpvnxzbPzTbPzTYPZJsHss2JEyd46EMfysu//Mvz0Ic+FID77rvv1t/6rd/67n/4h3/4nX/4h3/4ba666qqrrrrqqquuuh960IMexFVXXXXVVVddddX/d9dcc82DX/u1X/u9Xud1Xue9r7nmmgcD3HrrrTz96U/nt3/7twGQxL+VJP6j2ObfwzYvCtu8MLZ5fmzz/NjmudnmudnmgWzzQLa534kTJ3joQx/KQx/6UF7+5V8egPvuu+/W3/qt3/ru3/7t3/6e++6771auuuqqq6666qqr/n9DD3rQg7jqqquuuuqqq676/+od3/EdP+vFX/zFX/vFXuzFXhvg1ltv5elPfzq//du/DYAk/jUk8d/BNv8WtvmX2OYFsc0LYpvnZpvnZpvnZpsHss0D2eaBbHPixAke9rCH8dCHPpSXf/mXB+Af/uEffvtHfuRHPucf/uEffpurrrrqqquuuuqq/5/Qgx70IK666qqrrrrqqqv+P7nmmmse/Nqv/drv9U7v9E6fDbC7u8tf/dVf8du//dvcTxIvCkn8T2Sbfw3b/Ets84LY5vmxzfNjmweyzXOzzQPZ5oFs80C2ud/x48d52MMexsu//MvzsIc9jPvuu+/Wf/iHf/jt3/qt3/qef/iHf/htrrrqqquuuuqqq/7/QA960IO46qqrrrrqqquu+v/gHd/xHT/rdV7ndd77mmuuefDu7i5/9Vd/xV//9V+zu7vL/STxL5HE/za2eVHZ5oWxzfNjm+fHNs+PbZ6bbR7INg9kmweyzQPZ5n62AThx4gQv//Ivzxu+4RsC8A//8A+//Vu/9Vvf81u/9VvfzVVXXXXVVVddddX/fehBD3oQV1111VVXXXXVVf9XXXPNNQ9+7dd+7fd6p3d6p88G2N3d5a/+6q/47d/+bR5IEi+MJP49JPHvZZv/CLZ5UdjmBbHNC2Kb58c2z802z802D2SbB7LNA9nmgWxzP9vc7/jx4zzsYQ/jFV7hFXjYwx7Gfffdd+tv/dZvffdv//Zvf8999913K1ddddVVV1111VX/N6EHPehBXHXVVVddddVVV/1fc8011zz4tV/7td/rnd7pnT4b4Ld+67f467/+a3Z3d3kgSbwwkvjXkMR/Ndv8W9jmRWGbF8Q2z49tnh/bPDfbPDfbPJBtHsg2D2SbB7LN/WxzP9sAnDhxgpd/+Zfnjd7ojbjvvvtu/Yd/+Iff/q3f+q3v+Yd/+Iff5qqrrrrqqquuuur/FvSgBz2Iq6666qqrrrrqqv8rrrnmmge/9mu/9nu90zu902fv7u7yV3/1V/z2b/82z00SL4gkXlSS+J/INv8atnlhbPPC2Ob5sc1zs81zs81zs80D2eaBbPNAtrmfbR7INvezzf1OnDjBy7/8y/MKr/AKnDx5kt/6rd/67t/6rd/6nn/4h3/4ba666qqrrrrqqqv+b0APetCDuOqqq6666qqrrvrf7pprrnnwh3/4h3/Xi73Yi7327u4uf/VXf8Vv//Zv89wk8YJI4kUhif9NbPOiss0LY5sXxDbPj22eH9s8N9s8kG0eyDYPZJsHss39bHM/2zyQbe5nm5MnT/LQhz6UV3iFV+DhD3849913361f//Vf/z7/8A//8NtcddVVV1111VVX/e+GHvSgB3HVVVddddVVV131v9U111zz4A//8A//rhd7sRd77d3dXX7rt36Lv/7rv+b5kcTzI4l/iST+vSTxb2Gb/yi2eVHY5oWxzQtim+fHNs/NNs/NNg9kmweyzQPZ5oFscz/b3M8297PN/WxzP9u8wiu8Aq/wCq/Awx/+cO67775bv/7rv/59/uEf/uG3ueqqq6666qqrrvrfCT3oQQ/iqquuuuqqq6666n+ba6655sEf/uEf/l0v9mIv9tq7u7v81m/9Fn/1V3+FJJ6bJJ4fSbwwkvjXksR/Jdv8W9nmX2KbF8Y2z49tnh/bPDfbPDfbPJBtHsg2D2SbB7LN/WxzP9vczzb3s839bAPwCq/wCrzCK7wCD3/4w7nvvvtu/fqv//r3+Yd/+Iff5qqrrrrqqquuuup/F/SgBz2Iq6666qqrrrrqqv8trrnmmge/4zu+42e9zuu8znvv7u7yW7/1W/zVX/0VAJJ4bpJ4bpJ4YSTxopLE/zS2+dewzb/ENi+IbV4Q2zw32zw32zw32zyQbR7INg9kmweyzf1scz/b3M8297PN/WwDYJtXfMVX5BVe4RV4+MMfzm/91m9994/+6I9+zn333XcrV1111VVXXXXVVf87oAc96EFcddVVV1111VVX/U93zTXXPPi1X/u13+ud3umdPnt3d5ff+q3f4q/+6q8AkMRzk8TzI4kXRBIvCkn8b2GbF5Vt/iW2eUFs8/zY5vmxzQPZ5rnZ5oFs80C2eSDbPJBt7meb+9nmfra5n20AbHM/2wC8wiu8Am/8xm/MNE23/tZv/dZ3//Zv//b33Hfffbdy1VVXXXXVVVdd9T8betCDHsRVV1111VVXXXXV/2Tv+I7v+Fnv9E7v9Nm7u7v81V/9Fb/1W7/F/STx3CTx3CTxgkjiXyKJ/yiS+JfY5j+abV5UtnlhbPP82Ob5sc3zY5vnZpsHss0D2eaBbPNAtrmfbR7INvezzf1scz/bANjmfrYBOHHiBK/4iq/IG7/xG/MP//APv/33f//3v/2jP/qjn8NVV1111VVXXXXV/1zoQQ96EFddddVVV1111VX/E73Yi73Ya3/4h3/4d11zzTUP/s3f/E1++7d/mweSxANJ4vmRxPMjiRdGEv8WkvjPZpt/D9v8S2zzwtjmBbHN82Ob52ab52abB7LNA9nmgWzzQLa5n23uZ5sHsg2Abe5nm/vZBsA297PNyZMneYVXeAXe5E3ehPvuu+/WH/3RH/2c3/qt3/purrrqqquuuuqqq/7nQQ960IO46qqrrrrqqquu+p/kmmuuefCHf/iHf9eLvdiLvfbTn/50fvInf5JLly7xQJJ4IEk8N0k8P5J4YSTxopLE/xS2+deyzb/ENi+MbZ4f2zw/tnlutnlutnkg2zyQbR7INg9km/vZ5n62uZ9t7meb+9nmfrYBsA2Abe534sQJ3uRN3oRXfMVX5B/+4R9+++u//uvf57777ruVq6666qqrrrrqqv850IMe9CCuuuqqq6666qqr/qd4x3d8x896p3d6p8/e3d3lJ3/yJ3n605+OJB5IEg8kiecmiecmiRdGEi8KSfxvYJt/Ddu8MLZ5QWzzgtjmudnmudnmudnmgWzzQLZ5INs8kG3uZ5v72eZ+trmfbe5nGwDb3M82ALYBsA3Awx72MN793d+daZpu/a3f+q3v/tEf/dHP4aqrrrrqqquuuup/BvSgBz2Iq6666qqrrrrqqv9u11xzzYM//MM//Lte7MVe7LV/8zd/k9/6rd8CQBIPJIkHksQDSeL5kcQLIol/iST+N7PNi8o2L4xtXhDbPD+2eX5s80C2eW62eSDbPJBtHsg2D2Sb+9nmfra5n23uZ5v72QbANgC2uZ9tAGwDcOLECV7plV6JN3mTN+G+++679eu//uvf5x/+4R9+m6uuuuqqq6666qr/XpTjx49z1VVXXXXVVVdd9d/pHd/xHT/rkz7pk36667oH/9AP/RB/9Vd/BYAk7icJSdxPEpJ4IEk8N0lI4vmRhCReEElIQhL/VpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkMS/lyQkIYl/iSQk8YJIQhLPjySeH0k8P5J4IElI4oEk8UCSeCBJPJAkXhBJ3E8S95PECyMJAEk8N0kArFYrnvzkJ/Mnf/InPPKRjzz+mq/5mq+9ubl5/B/+4R9+h6uuuuqqq6666qr/PuhBD3oQV1111VVXXXXVVf8drrnmmgd/zud8zm9dc801D/7N3/xNfuu3fov7SeJ+knggSTw3STw3STw/knhhJPGvJYn/Drb5t7LNi8I2L4htXhDbPD+2eW62eW62eSDbPJBtHsg2D2Sb+9nmfrZ5INsA2OZ+trmfbQBscz/bANgGwDYAtgE4ceIEr/RKr8Sbvumbct9999369V//9e/zD//wD7/NVVddddVVV1111X89yvHjx7nqqquuuuqqq676r/aO7/iOn/VJn/RJP33fffcd/47v+A6e8IQncD9J3E8SDySJB5KEJB5IEpJ4bpKQxPMjCUlI4kUhCUlIQhL/XSQhCUlI4l9DEpKQxAsjCUk8P5KQxPMjiedHEs9NEs9NEg8kiQeSxANJ4oEkcT9J3E8Sz48k7ieJ+0kCQBL3kwSAJAAkASAJgNVqxZOf/GT+5E/+hIg4/tZv/davvbm5efwf/uEffoerrrrqqquuuuqq/1roQQ96EFddddVVV1111VX/Va655poHf/iHf/h3vdiLvdhr/+Zv/ia/+Zu/iSTuJ4n7SeKBJPFAknhuknhuknhBJPGiksT/Nrb517DNC2ObF8Q2L4htnpttnpttnpttHsg2D2SbB7LNA9nmfra5n23uZ5v72eZ+tgGwzf1sA2AbANvczzYAtrENgG3e9E3flDd90zflvvvuu/WzPuuzXue+++67lauuuuqqq6666qr/GuhBD3oQV1111VVXXXXVVf8VXud1Xue93/Ed3/Gzuq578Hd8x3ewu7uLJO4niftJ4oEk8UCSeCBJPD+SeH4k8aKQxH8ESfxr2OY/mm1eVLZ5YWzzgtjm+bHNc7PNc7PNc7PNA9nmgWzzQLZ5INvczzb3s839bHM/29zPNgC2uZ9tAGwDYBsA2wDYBsA2ALY5efIkH/VRH0Vr7dbf+q3f+u4f/dEf/Ryuuuqqq6666qqr/vNRjh8/zlVXXXXVVVddddV/pmuuuebBn/RJn/RTb/7mb/7Rf/zHf3z8B3/wB1mtVkjifpK4nyQeSBIPJIkHksRzk4Qknh9JvDCSkIQk/jUkIQlJSEISkpDEv5YkJCEJSUhCEpKQxL+FJCTxopCEJF4QSUji+ZHE8yOJ5yYJSTyQJCTxQJJ4IEk8kCQeSBIviCTuJ4n7SeJ+knhuknhukgCQBIAkACQBIAkASSyXS/72b/8WScff5m3e5rWvueaaB//pn/7pz3DVVVddddVVV131nws96EEP4qqrrrrqqquuuuo/yzXXXPPgz/mcz/mtruse/BM/8RPceuutAEjifpK4nyQeSBL3k8Rzk8Rzk8TzI4kXRhL/GpL4n8Q2/1q2eVHY5gWxzQtim+fHNs/NNs/NNg9kmweyzQPZ5oFscz/b3M82D2Sb+9kGwDb3s839bANgGwDbANjmfraxDYBtAGwDYJuTJ0/y0R/90bTWbv2sz/qs17nvvvtu5aqrrrrqqquuuuo/B+X48eNcddVVV1111VVX/Wd4ndd5nff+3M/93N+67777jn/91389ly5dAkAS95PE/STxQJK4nySemyQeSBKSeG6SkMQLIglJ/EskIQlJSOJ/GklIQhIvKklI4l8iCUk8P5KQxPMjiedHEs9NEs9NEg8kiQeSxANJ4oEkcT9J3E8S/xJJ3E8Sz00SAJIAkMQDSQJAEgCSuN9yueRv/uZviIjj7/Zu7/bWm5ubx//hH/7hd7jqqquuuuqqq676j0c5fvw4V1111VVXXXXVVf/RPvzDP/y73umd3umzf+M3foOf+ImfQBL3kwSAJO4niQeSxP0k8UCSkMQDSeL5kcQLIglJvDCSkIQk/jeRhCQk8aKQhCT+JZJ4QSTx/Eji+ZHEc5PEc5PEA0nigSTxQJJ4IEncTxL3k8T9JHE/SdxPEs9NEs9NEgCSAJAEgCQAJHE/SQAsl0ue9KQnsbGxcfxt3/ZtXxvgH/7hH36Hq6666qqrrrrqqv9Y6EEPehBXXXXVVVddddVV/1GuueaaB3/4h3/4d73Yi73Ya3/7t387T3/605HE/SQBIIn7SeKBJHE/STyQJJ6bJJ6bJF4QSfxLJPFvJYn/DLb597LNi8I2/xLbvCC2eX5s89xs89xs89xs80C2eSDbPJBtHsg297PN/WxzP9vczzb3sw2Abe5nGwDbANgGwDYAtgGwDYBtAGwDYBvbADziEY/gYz7mY7jvvvtu/azP+qzXue+++27lqquuuuqqq6666j8G5fjx41x11VVXXXXVVVf9R3ixF3ux1/6Kr/iKv+q67sHf8A3fwN133w2AJAAkcT9JAEjigSRxP0k8kCQeSBKSeG6SeH4kIYkXRBKSkMSLShKSkIQkJPGfRRKSkIQkJPGvJQlJSOKFkYQkXhhJSOL5kcTzI4nnJonnJonnJokHksQDSeKBJPGCSOJ+krifJO4niecmiecmCQBJAEgCQBIAkgCQBIAk7icJgPPnz/PHf/zHvOqrvurx13qt13rrP/uzP/uZw8PDXa666qqrrrrqqqv+/SjHjx/nqquuuuqqq6666t/rxV7sxV77cz/3c3/raU97Gl//9V/ParUCQBIAkrifJO4niftJ4n6SeCBJPJAknpskJPH8SOIFkYQkXhSSkIQkJPHfTRKSkIQk/jUkIYkXRhKSeGEk8fxIQhLPTRLPTRKSeCBJPDdJPJAkHkgSDySJ+0niBZHE/STx3CRxP0kASOK5SQJAEgCSAJDEc5PE/SRxdHTEX//1XxMRx9/93d/9rTc3N4//wz/8w+9w1VVXXXXVVVdd9e9DOX78OFddddVVV1111VX/Hu/4ju/4WR/xER/x3b/xG7/BT/zETyAJAEkASOJ+krifJO4niftJ4oEk8UCSeG6SeH4kIYnnRxKS+JdIQhKS+J9OEpKQhCReFJKQxAsjCUm8IJKQxPMjiecmCUk8N0k8kCQk8UCSeCBJPJAkHkgS95PE/STxL5HE/STx3CQBIIkXhSQAJHE/SdxvuVzypCc9iY2NjeNv+7Zv+9oA//AP//A7XHXVVVddddVVV/3bUY4fP85VV1111VVXXXXVv9WHf/iHf9ebv/mbf/S3fdu38Zd/+ZdIAkAS95MEgCTuJ4n7SeJ+knggSTyQJB5IEpJ4bpKQxPMjCUm8MJKQhCT+PSQhCUlIQhKSkIQkJCEJSUhCEpKQxH8ESUhCEv8SSUjihZGEJF4QSTw/knh+JPHcJPHcJPFAknggSTyQJB5IEveTxP0kcT9J3E8S95PEc5PE/SQBIAkASQBIAkASAJIAkMT9JHE/SdzvyU9+MufOnePd3/3dXxvgH/7hH36Hq6666qqrrrrqqn8b9KAHPYirrrrqqquuuuqqf4vP/dzP/a0Xe7EXe+1v+7Zv4+lPfzqSuJ8kACQBIIn7SeJ+krifJB5IEg8kiQeSxPMjiedHEv8SSfxbSOK/km3+rWzzorDNC2ObF8Y2z49tnpttnpttnpttHsg2D2SbB7LN/WzzQLa5n23uZ5v72eZ+tgGwzf1sA2AbANvczzYAtgGwjW0AbANgG9sA2MY2ALaxzcmTJ/miL/oi/uEf/uG3P/MzP/N1uOqqq6666qqrrvrXQw960IO46qqrrrrqqquu+te45pprHvzhH/7h33XDDTe89o//+I/z9Kc/HQBJAEgCQBIAkrifJO4niftJ4oEkcT9JPDdJPDdJvCCSeGEk8aKSxP80tvm3sM2/xDYvjG1eENs8P7Z5brZ5brZ5brZ5INs8kG0eyDb3s80D2eZ+trmfbe5nGwDb3M82ALa5n20AbANgGwDbANgGwDYAtrENgG0AbGMb2wDY5uTJk3z8x388rbVbP+uzPut17rvvvlu56qqrrrrqqquuetFRjh8/zlVXXXXVVVddddWL6pprrnnwh3/4h3/XDTfc8Npf+qVfyu7uLgCSAJAEgCTuJwkASdxPEveTxP0kIYn7SeK5SeK5SeL5kYQknh9JSEIS/xJJSEIS/xNJQhKSkMSLShKSeGEkIYkXRBIviCSeH0k8N0k8N0k8N0k8kCQeSBIPJIn7SeIFkcQLI4n7SQJAEveTBIAkACQBIAkASQBI4n6SAJDE/STxQEdHR/z1X/81r/7qr378tV7rtd76z/7sz37m8PBwl6uuuuqqq6666qoXDeX48eNcddVVV1111VVXvSiuueaaB3/4h3/4dy0Wi9f+uq/7OgAkIQkASQBI4n6SAJDE/SRxP0ncTxIPJIkHkoQknpsknpskJPH8SEIS/xJJSEIS/9tIQhKSeFFIQhIvjCQk8fxIQhLPjyQk8dwk8dwkIYkHksRzk8QDSeKBJPGCSOJ+knh+JHE/SdxPEs9NEv8WkgCQxP0k8UCSADg6OuKv/uqvePSjH338Td7kTd76z/7sz37m8PBwl6uuuuqqq6666qp/GeX48eNcddVVV1111VVX/UuuueaaB3/TN33T0w8ODh78bd/2bQBIAkASAJIAkASAJAAkcT9J3E8S95PEA0nigSTx3CQhiecmiRdEEi+MJCQhiX8LSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQk/j0kIQlJ/EskIYkXRhIviCReEEk8N0lI4rlJ4oEk8dwk8UCSeCBJ3E8SDySJ+0nifpK4nyTuJ4nnJonnJgkASQBIAkASAJIAkASAJO4niftJ4rktl0ue+MQn8uhHP/r4m7zJm7z1n/3Zn/3M4eHhLlddddVVV1111VUvHOX48eNcddVVV1111VVXvTDXXHPNg7/pm77p6U972tP41m/9ViQhCQBJAEgCQBIAkrifJAAkcT9J3E8SDySJB5LEc5PEc5OEJJ4fSUjiBZGEJP41JCEJSUhCEv9ZJCEJSUhCEv8WkpDEv0QSknhBJCGJ50cSknh+JPH8SOK5SeKBJPHcJPFAknggSdxPEg8kiftJ4n6SuJ8k7icJAEncTxIAknhukgCQBIAkACTx3CRxP0ncTxIPdHR0xBOe8AQe85jHHH+TN3mTt/6zP/uznzk8PNzlqquuuuqqq6666gWjHD9+nKuuuuqqq6666qoX5JprrnnwN33TNz39aU97Gt/6rd+KJAAkIQkASQBIAkAS95MEgCTuJ4n7SeKBJPFAknhuknhuknh+JCGJF0QSknhRSEISkpDEfzdJSEISkvjXkIQk/iWSkMQLIglJPD+SeH4k8fxI4rlJ4oEk8dwk8UCSeEEk8YJI4n6SuJ8knpsknpskACTxopAEgCTuJ4n7SeKBJAGwXC55whOegKTj7/Ee7/HWf/Znf/Yzh4eHu1x11VVXXXXVVVc9f5Tjx49z1VVXXXXVVVdd9fxcc801D/6mb/qmpz/taU/jW7/1W5EEgCQAJCEJAEncTxIAkrifJAAkcT9JPJAkHkgSDyQJSTyQJCTx3CQhiRdEEpL4l0hCEpL4n04SkpCEJF4UkpCEJF4YSUjiBZHE8yMJSTw3SUjiuUniuUnigSTx3CTxQJK4nyQeSBL3k8S/hiTuJwkASTw3SQBIAkASAJIAkASAJO4niftJ4n6SeG5HR0ecP38eScff4z3e463/7M/+7GcODw93ueqqq6666qqrrnpelOPHj3PVVVddddVVV1313K655poHf9M3fdPTn/a0p/Gt3/qtAEhCEgCSAJAEgCQAJAEgiftJ4n6SuJ8k7ieJB5LEA0niuUni+ZHECyIJSbwwkpCEJP4jSEISkpCEJCQhCUlIQhKS+I8kCUlI4kUhCUm8MJJ4QSTxgkji+ZHEc5PEc5PEA0niuUnigSRxP0k8kCTuJ4n7SeJ+krifJO4niecmCQBJPDdJAEgCQBLPTRL3k8T9JPFAkrjf0dER58+fR9LxN37jN37pf/iHf/idw8PDXa666qqrrrrqqqueE+X48eNcddVVV1111VVXPdA111zz4A//8A//roODgwd/y7d8C5KQhCQAJAEgCQBJAEgCQBL3k8T9JHE/SdxPEg8kiQeSxHOTxHOThCSeH0lI4oWRhCT+LSQhCUlIQhKSkMS/hiQkIQlJSEISkpDEv5UkJPGikIQkXhBJSOL5kYQknh9JPD+SeG6SeG6SeCBJPDdJvCCSeCBJ3E8S95PE/SRxP0k8N0k8N0kASOKFkQSAJO4nCQBJPJAknp+joyPOnTvHgx70oAe//du//Vv/2Z/92c8cHh7uctVVV1111VVXXfVsBFddddVVV1111VXP5cM//MO/az6fv/a3fMu3IAlJPDdJAEgCQBLPTRL3k8T9JHE/STyQJB5IEg8kCUk8N0k8P5KQxAsjCUm8qCQhCUlIQhL/VSQhCUlI4l9LEpKQxL9EEpJ4QSQhiedHEs+PJJ4fSTw3STw3STyQJJ6bJO4niQeSxAsiiftJ4n6SuJ8kACRxP0kASOK5SQJAEgCSAJAEgCTuJwkASdxPEpJ4IElIQhKSOH/+PD/7sz/LhQsXHvw5n/M5v8VVV1111VVXXXXVcyK46qqrrrrqqquueoDP/dzP/a0bbrjhtb/1W78VSdxPEgCSeGEkASCJ+0nifpK4nyQeSBIPJIkHksRzk4Qknh9JvCCSkIQkXhSSkIQk/ieRhCQkIYl/DUlI4l8iiRdGEs+PJCTx3CQhiecmCUk8kCSemyQeSBIvjCQeSBL3k8QDSeJ+knhhJPHcJAEgiecmiRdEEgCSuJ8kHkgSknh+zp07x3d8x3cQEQ/+pm/6pqdz1VVXXXXVVVdd9WyU48ePc9VVV1111VVXXQXwuZ/7ub91ww03vPYXfdEXIQlJSAJAEpIAkASAJAAkASAJAEncTxL3k8T9JPFAknggSTyQJJ6bJJ4fSUji+ZGEJP4lkpCEJCTxv4UkJCGJF5UkJPHCSEISL4gkJPH8SOL5kcTzI4kHkoQkHkgSDySJB5LEA0nigSRxP0n8SyRxP0ncTxIAknhukgCQxANJAkASAJJ4bpK4nySemySe29HREX/xF3/Ba7zGaxx/8IMf/OA//dM//Rmuuuqqq6666qqrgHL8+HGuuuqqq6666qqrPvzDP/y7XvEVX/Gtv+d7vofd3V0kASAJSQBIQhIAkgCQBIAk7icJAEncTxL3k8QDSeKBJPFAknhuknhukpDE8yMJSfxLJCGJfw9JSEISkpCEJCQhCUlIQhKSkIQkJCEJSUji30sSkpDEi0ISknhhJCGJF0QSz48knh9JPD+SeG6SeCBJPJAkHkgSDySJB5LE/SRxP0ncTxL3k8T9JPHcJAEgiecmCQBJAEgCQBL3kwSAJO4niftJ4l9ydHTEX/7lX/J2b/d2L72xscE//MM//A5XXXXVVVddddX/d5Tjx49z1VVXXXXVVVf9//ZiL/Zir/2+7/u+X/3N3/zNPP3pTwdAEpKQBIAkACQhCQBJ3E8SAJIAkMT9JHE/STyQJB5IEg8kiQeShCSemyReEEm8MJKQhCT+NSQhCUlIQhKS+I8iCUlIQhKSkMS/hSQkIYl/iSQk8cJI4gWRxPMjCUk8N0k8P5J4bpJ4IEk8kCQeSBIPJIkXRBL3k8T9JHE/STw3STw3SQBI4kUhCQBJ3E8S95PEc5PE83N4eMhf/MVf8LEf+7GvDfAP//APv8NVV1111VVXXfX/GZWrrrrqqquuuur/tRd7sRd77c/93M/9rW/+5m/maU97GpKQhCTuJwkASTw/kgCQxHOTxP0k8UCSuJ8knpskHkgSz48knh9JvDCS+NeQxP8Ekjh27BgAOzs72ObYsWMAHDt2jOd27Ngxnh/b3O/SpUvcb29vj/tdunQJ2wBcunSJS5cucT9JANjmuUkCwDbPTRK2eSBJANjmgSRhmweShG3uJwnb3E8StrmfJGxzP0nYBkAStrmfJGwDIAnbAEjCNg8kCdsASMI2krDNA0nCNpKwjSRsIwnbSMI2krANgCRsAyAJ2wBI4n62eX4kcf78eb7t276Nt3qrt3rvf/iHf/idf/iHf/htrrrqqquuuuqq/6/Qgx70IK666qqrrrrqqv+/fuInfsK/+qu/yq//+q8jCUkASEISAJKQBIAkACQBIAkASdxPEgCSuJ8kHkgS95PEA0niuUniuUni+ZHECyOJF5Uk/qscO3YMgJ2dHW6++WYAjh07xrFjxwDY2dnh2LFjvCCXLl3i2LFj/Ge7dOkS97t06RKXLl0C4BnPeAYAly5d4rbbbuN+tnl+bPP82Oa52ea52eaBbPNAtnkg2zyQbe5nm/vZ5n62uZ9t7meb+9kGwDb3sw2AbQBscz/bANgGwDa2AbANgG1sA2Ab2wDYxja2AbCNbWxjG9vYJjOxzVu91Vvx6q/+6rd+1md91uvcd999t3LVVVddddVVV/1/hB70oAdx1VVXXXXVVVf9//S5n/u5vzWfz1/7m7/5m5GEJCQhCQBJSAJAEpIAkASAJO4nCQBJ3E8S95PE/SRxP0k8kCSemySemySeH0m8IJJ4UUjiP8uxY8fY2dnh5ptvBuCWW24B4Oabb+Zf4+joCIDDw0MAjo6OADg8POS5HR0d8S/Z2Njgfpubm9xvY2OD+21ubrKxscGL6tKlSwBcunSJS5cu8YxnPIPd3V0uXbrEpUuXALDN82Ob52ab52abB7LNA9nmgWzzQLa5n23uZ5v72eZ+trmfbe5nGwDb3M82ALYBsA2AbQBsA2AbANsA2MY2ALaxDYBtbANgG9vYxja2sY1tbGMb22QmH/ABH8CjHvWoWz/kQz7kIVx11VVXXXXVVf8foQc96EFcddVVV1111VX//3zu537ub11//fWv/UVf9EVIQhKSkASAJCQBIAkASQBIAkASAJIAkMT9JHE/SdxPEveTxANJ4rlJ4rlJ4rlJ4gWRxL9EEv9ekrjfzs4Ox44d4+abbwbg5ptv5uabb+aFOTo6AuDw8JCzZ88CcHR0xNHREQCHh4ccHR3x321jYwPbAGxubrKxscHm5iYbGxtsbm4CcObMGV6YS5cuAfCMZzyD2267jd3dXXZ3d7l06RL3s81zs81zs80D2eaBbPNAtrmfbR7INvezzf1scz/b3M82ALa5n20AbANgm/vZBsA2ALYBsA2AbWwDYBsA29jGNgC2sY1tAGxjG9vYxjaZiW1sc/LkST7wAz+Qe+6557u//uu//n246qqrrrrqqqv+v0EPetCDuOqqq6666qqr/n95x3d8x896p3d6p8/+gi/4Ai5dugSAJCQhCUkASEISAJIAkASAJAAkASCJ+0nifpK4nyTuJ4kHksQDSeK5SeL5kcTzI4l/iST+LSRxv52dHW6++WaOHTvGzTffzM0338wLcnh4yNHREWfPngXg7NmzAJw9e5b/azY2NgA4c+YMAGfOnGFzc5ONjQ02Nzd5fi5dusTu7i6XLl3iGc94Bru7uzzjGc/ggWzz3GzzQLZ5INs8kG3uZ5v72eaBbHM/29zPNgC2uZ9tAGxzP9sA2AbANgC2AbANgG0AbANgGwDb2AbANraxDYBtbGMb29jGNraxjW0yE9ucPHmST/u0T+M3f/M3P/tHf/RHP4errrrqqquuuur/E/SgBz2Iq6666qqrrrrq/48Xe7EXe+3P/dzP/a1v+qZv4mlPexqSkIQkJAEgCUkASEISAJIAkASAJO4nCQBJ3E8S95PEA0nifpJ4IEk8N0k8N0m8IJJ4YSTxryEJgJ2dHQBe/MVfnJtvvpmbb76Z5+fw8JCjoyPOnj0LwNmzZzl79ixXXbGxscHGxgabm5ucOXOGzc1Nzpw5w/Ozu7vLM57xDC5dusQznvEMnvGMZ2Cb52abB7LNA9nmgWxzP9vczzb3s839bHM/29zPNvezDYBtAGxzP9sA2AbANgC2AbANgG1sA2AbANvYBsA2trGNbQBsYxvb2MY2mYltbJOZnDp1ik/91E+99eu//uvf5x/+4R9+m6uuuuqqq6666v8L9KAHPYirrrrqqquuuur/h2uuuebB3/RN3/T0X/3VX+XXfu3XkIQkACQhCUkASEISAJIAkIQk7icJAEkASOJ+krifJB5IEveTxANJ4rlJ4rlJ4vmRxAsjiReVJHZ2djh27Bg333wzN998Mzs7Oxw7dowHOjw85OjoiLNnz3L27FnOnj3L/3e2+bfY3NzkzJkzbGxscM0113DmzBme2+7uLgDPeMYz+Ju/+Rue8YxncD/bPJBtHsg297PNA9nmfra5n23uZ5v72eZ+tgGwzf1sA2AbANvczzYAtgGwDYBtbANgGwDb2AbANraxDYBtbGMb29jGNraxjW0yE9tkJm/zNm/Da7zGa9z6WZ/1Wa9z33333cpVV1111VVXXfX/AXrQgx7EVVddddVVV131/8Pnfu7n/tZ8Pn/tb/qmb0ISkpCEJCQhCQBJSAJAEgCSAJAEgCQAJHE/SQBI4n6SeCBJ3E8SDySJ5yaJ5yaJ50cSL4gkXhSS2NnZ4cVf/MW5+eabufnmm3luh4eH3HrrrQA87nGP499KEv8b2Oa/0+bmJqdPn+aaa65hY2ODa665hgfa3d3l0qVL3HrrrTzjGc/g1ltv5YFs80C2uZ9tHsg297PN/WxzP9vczzYAtrmfbe5nGwDbANgGwDYAtgGwDYBtAGwDYBvbANjGNgC2sY1tbANgG9vYxja2yUxsY5vMJDP5tE/7NGz/9md+5me+DlddddVVV1111f8H6EEPehBXXXXVVVddddX/fe/4ju/4WW/wBm/w2V/4hV+IJCQhCUkASEISkgCQhCQAJAEgCQBJAEjifpIAkMT9JPFAkrifJB5IEg8kiecmiedHEi+IJP4lx44d48Vf/MW5+eabufnmm3luh4eH3HrrrZw9e5azZ89y1X8e2/xLNjc32djY4JprruHMmTNcc801PNDu7i7PeMYzuPXWW9nd3eUZz3gGtrmfbR7INvezzQPZ5n62uZ9t7mcbANvczzYAtgGwzf1sA2AbANsA2AbANrYBsA2AbWwDYBvbANjGNraxjW1sYxvb2MY2mYltMpNTp07x6Z/+6fzmb/7mZ//oj/7o53DVVVddddVVV/1fhx70oAdx1VVXXXXVVVf93/ZiL/Zir/25n/u5v/WN3/iNPO1pT0MSkpCEJCQhCQBJSAJAEgCSkASAJO4nCQBJ3E8S95PE/SRxP0k8kCQeSBLPTRLPjySeH0m8MMeOHePFX/zFebEXezGOHTvGAx0eHnLrrbdy3333cfbsWe4niav+fWzzH21zc5ONjQ2uueYazpw5wzXXXMMD7e7u8jd/8zfceuut3HrrrQDY5oFscz/bPJBt7mcbANvczzb3sw2Abe5nGwDbANgGwDb3s41tAGwDYBsA29gGwDa2AbCNbWxjGwDb2MY2tslMbGObzMQ2mcmjH/1oPuiDPujWr//6r3+ff/iHf/htrrrqqquuuuqq/8vQgx70IK666qqrrrrqqv/bPvdzP/e37rjjjtf+tV/7NSQhCUlIQhIAkpAEgCQkASAJAEkASAJAEgCSuJ8k7ieJ+0nifpJ4IEk8kCSemySemyReEEk8P8eOHePFXuzFeLVXezUe6PDwkLNnz3J4eMg//MM/8O8hif+vbPNfyTbPz+bmJtdccw1nzpzhIQ95CA+0u7vLrbfeyt/8zd/w9Kc/nQeyzf1scz/b3M8297PN/WxzP9sA2AbANvezDYBtAGwDYBsA2wDYBsA2tgGwjW0AbGMbANvYxja2sY1tbGMb22QmtslMbJOZvM3bvA2v9VqvdeuHfMiHPISrrrrqqquuuur/MvSgBz2Iq6666qqrrrrq/64P//AP/66bb775vb/pm74JSUhCEpKQhCQkIQkASUgCQBIAkgCQBIAk7icJAEncTxL3k8T9JPFAknggSTw3STw3STw/knhux44d48Ve7MV4tVd7NR7o8PCQW2+9lfvuu4+zZ8/yP4Ek/iewzf8ktvm32tzcZHNzkwc/+MFsbm5yzTXXcL/d3V1uvfVW/vqv/5pbb70VANvczzb3s839bHM/29zPNgC2uZ9tAGwDYJv72QbANgC2AbANgG1sA2Ab2wDYxjYAtrGNbWwDYBvb2MY2mYltbJOZ2CYzOXnyJB/8wR/Mfffd991f//Vf/z5cddVVV1111VX/V6EHPehBXHXVVVddddVV/ze92Iu92Gt/7ud+7m99wzd8A09/+tORhCQkIQlJAEhCEpIAkASAJCQBIAkASdxPEgCSuJ8k7ieJ+0nigSTxQJJ4IEk8P5J4fiRxv2PHjvFiL/ZivNqrvRoPdHh4yNOf/nRuvfVWDg8PeX4kcdV/D9v8Z7ENwObmJg95yEO45ppruOaaa7jf7u4uf/3Xf83Tn/50br31Vu5nm/vZ5n62uZ9tAGxzP9sA2OZ+tgGwDYBtAGwDYBsA2wDYBsA2tgGwjW0AbGMbANvYxja2sY1tbGMb22QmtslMbNNa49SpU3z91389n/mZn/k6//AP//DbXHXVVVddddVV/xehBz3oQVx11VVXXXXVVf83fdM3fdPT//Iv//LBv/Zrv4YkJCEJSUhCEpKQBIAkJAEgCQBJAEgCQBIAkrifJAAkcT9J3E8SDySJB5LEA0niuUni+ZEEwLFjx3ixF3sxXvzFX5xjx45xv8PDQ57+9Kdz6623cnh4yL+XJK76t7HNfwXbvCg2Nzd5yEMewjXXXMM111zD/XZ3d/mrv/or/vqv/5qLFy/yQLa5n20AbHM/29zPNgC2AbDN/WwDYBsA2wDYBsA2ALaxDYBtAGxjG9sA2MY2trENgG1sYxvbZCa2sU1mkplkJpnJa7zGa/AO7/AOt37Ih3zIQ7jqqquuuuqqq/4vohw/fpyrrrrqqquuuur/nnd8x3f8rFOnTr31D//wDxMRSEISkpCEJCQBIAlJAEhCEgCSAJAEgCQAJHE/SQBI4n6SeCBJ3E8SDySJB5LEc5PE8yOJm2++mVd7tVfjTd7kTbjllluYz+ccHh7ypCc9iX/4h3/gr/7qrzh79izjOPJfSRL/X9jmv4Nt/j3GceS+++7j6U9/Ok9/+tMZhoFrr72W+XzOQx7yEB7zmMdw/fXXM5/Pueeee3hBJHE/STw3SQBI4rlJAkASAJJ4bpIAkMT9JPFAknhR2Oa5HR4e8tjHPvb4i73Yiz34T//0T3+Gq6666qqrrrrq/xrK8ePHueqqq6666qqr/m95sRd7sdf+iI/4iO/+oR/6IXZ3d5GEJCQhCUlIQhKSAJCEJAAkIQkASQBI4n6SAJDE/SRxP0ncTxL3k8QDSeKBJPHcJPHcjh8/zsu93MvxJm/yJrz8y78811xzDQBPf/rTedKTnsSf/MmfcN9993F4eMjzI4n/6STxX8U2/5PZ5j+Dbe43DAP33XcfT3/607l48SLjOHL99ddz3XXX8ZjHPIaXeZmXYT6fs7u7y2q1AkAS95PEc5PEc5MEgCReGEkASOK5SeJ+knh+JPFAtnlBDg8P+fu//3ve8R3f8fitt976N2fPnr2Vq6666qqrrrrq/xL0oAc9iKuuuuqqq6666v+Wz/3cz/2t22+//bV/9Vd/lYhAEpKQhCQkIQlJAEhCEgCSAJAEgCQAJAEgCQBJ3E8S95PE/SRxP0k8kCQeSBLPTRIPdOzYMV7t1V6NF3/xF+d+h4eHPP3pT+fv//7v+feSxFX/PWzzn8k2/1qbm5s85CEP4dprr+Waa64BYHd3l6c//en81V/9FU9/+tMBsM39bANgm/vZBsA2ALa5n20AbANgGwDbANjGNgC2AbCNbQBsYxvbANjGNraxjW1sYxvb2CYzsU1mkplkJq013u7t3o7XeZ3XufVDPuRDHsJVV1111VVXXfV/CXrQgx7EVVddddVVV131f8frvM7rvPe7vuu7ftfnfd7nERFIQhIRgSQAJCEJSUgCQBKSAJAEgCQAJAEgCQBJ3E8S95PE/SRxP0k8kCQeSBIPJIkHerVXezVe/MVfnGPHjnG/v/u7v+PpT386R0dH/FeSxFX/erb5r2Kb/yi2Adjc3OQlXuIleOhDH8r9dnd3+cu//Et+8zd/k/vZ5n62AbDN/WwDYBsA2wDYBsA2ALYBsA2AbQBsYxsA29gGwDa2sY1tAGxjG9vYJjOxjW0yE9tkJplJa42TJ0/yju/4jrfed9993/2jP/qjn8NVV1111VVXXfV/BeX48eNcddVVV1111VX/d3zFV3zFX33Hd3wHu7u7RASSkIQkJCEJSUgCQBKSAJCEJAAkASAJAEncTxIAkrifJO4niftJ4oEk8UCSeCBJABw7doyXf/mX513e5V245ZZbmM/nHB4e8sQnPpHf/M3f5L777mMcR54fSfx3k8T/B7b572Kb/2i2eX7GceSOO+7gaU97GuM4srW1xc7ODg95yEN42Zd9WebzORcvXmS9XnM/SQBI4rlJAkASAJIAkASAJAAkASCJ+0nifpJ4IEn8S2wDYJsHOjw8ZH9///g7vdM7PfjP/uzPfubw8HCXq6666qqrrrrq/wLK8ePHueqqq6666qqr/m/43M/93N+69dZbH/y7v/u7RASSkEREIAlJAEhCEpIAkIQkACQBIAkASQBIAkASAJK4nyTuJ4n7SeKBJPFAknggSRw7doyXf/mX523e5m245ZZbADg8POQv//Iv+ZM/+RPuu+8+/q0k8b+JJP4z2eZ/A9v8Z7DNv9Y4jtx3333ccccd7O7u0nUdp0+f5iEPeQiPecxjuP7667nnnntYrVY8kCQAJPHcJAEgCQBJAEjiuUnifpK4nySemyQeyDYvjG3uu+8+HvSgBx1/8Rd/8eN/+qd/+jNcddVVV1111VX/F1COHz/OVVddddVVV131v9+LvdiLvfY7vdM7ffZ3fMd3sF6viQgkIQlJSEISkpAEgCQkIQkASQBIAkASAJIAkMT9JAEgiftJ4oEkcT9JPJAkHuj48eO83uu9Hm/6pm/KLbfcAsDTnvY0fvd3f5e///u/Z3d3l/9Mkrjqv49t/rPZ5j+CbYZh4OLFizztaU/jaU97Gn3fc8MNN3D99dfzmMc8huuvv57VasXu7i7PTRIAknhRSAJAEveTxP0k8UCS+JfYBsA297ONbZ7+9Kfzzu/8ziee/vSn//XZs2dv5aqrrrrqqquu+t+Ocvz4ca666qqrrrrqqv/9PuIjPuK7/uIv/uLB//AP/0BEIAlJRASSkIQkACQhCUkASAJAEpIAkASAJAAkcT9J3E8S95PE/SRxP0k8kCTud+zYMV7/9V+fN33TN+Waa64B4O/+7u/44z/+Y57+9KczjiPPjyT+q0niqn8b2/xXss1/FNu8MOM4cscdd/C0pz2NYRh48IMfzPXXX8/LvuzLcuLECVarFRcvXkQSz00SAJIAkASAJAAkASCJ+0nifpK4nySemyQeyDbPzTa2ud/BwQHz+fz4673e6z34t37rt76Hq6666qqrrrrqfzvK8ePHueqqq6666qqr/nd7ndd5nfd+1Vd91Y/+zu/8TiKCiEASkpCEJCQhCUlIAkASkgCQBIAkJHE/SQBIAkAS95PE/SRxP0ncTxIPJAmAY8eO8Xqv93q82Zu9Gddccw2Hh4c88YlP5Dd+4ze47777GMeRfwtJ/HeTxP8XtvnvZJv/aLb5txjHkfvuu4+nPe1pDMPAtddey/XXX8/LvuzLcuLECZbLJbu7uwBI4t9CEveTxP0kcT9JvChs84Lcc889vPmbv/mDj46OnnHrrbf+NVddddVVV1111f9mlOPHj3PVVVddddVVV/3v9r7v+75f9fu///sPvvvuu4kIJCGJiEASkpAEgCQkIQkASUgCQBIAkgCQBIAkACRxP0ncTxL3k8T9JPFAkjh27Biv93qvx5u92Ztx7bXXAvC3f/u3/N7v/R733Xcf/1kk8b+JJP4r2OZ/A9v8Z7HNv5dt7jcMA/feey9PfepTGceRa6+9luuvv56Xe7mX48SJE9x9992sViskASAJAEkASAJAEgCSAJDE/SQBIIkHksRzk8T9bPNAtnlutjk8PGRvb493fud3fulf+IVf+Bquuuqqq6666qr/zSjHjx/nqquuuuqqq6763+t1Xud13vvN3/zNP/o7vuM7iAgkERFIQhKSkIQkJCEJAElIAkASkgCQBIAkACRxP0kASOJ+krifJO4niQc6fvw4L//yL8/bvu3bcu211wLwt3/7t/z6r/869913H8+PJP4rSOKq/362+c9mm/8otnlhxnHk3nvv5alPfSrjOHLttddy/fXX89jHPpbrr7+eu+++m+VyCYAkACQBIAkASQBI4n6SAJDE/STxQJL4l9jmBbHNwcEBL/ZiL3Zc0jNuvfXWv+aqq6666qqrrvrfCj3oQQ/iqquuuuqqq6763+snfuIn/Eu/9Ev86q/+KhGBJCQREUhCEpKQBIAkJCEJAEkASAJAEgCSAJAEgCTuJwkASdxPEveTxP2OHTvGS7zES/Dqr/7q3O9v//Zv+bu/+zv+LSTxX00SV/372ea/km3+I9nm32Nzc5OHPvShvNRLvRQAFy9e5C/+4i/49V//dQBsA2AbANsA2AbANgC2sQ2AbQBsYxvbANjGNraxjW0AMhPb2MY2tslMbJOZZCaZSWuNaZp4+7d/e17/9V//1g/5kA95CFddddVVV1111f9WlOPHj3PVVVddddVVV/3v9I7v+I6f9eIv/uKv/YM/+IOs12skERFIQhKSkIQkJCEJSQBIQhIAkgCQBIAkACQBIIn7SQJAEveTxANJAuDVX/3Vebu3eztuueUWAJ72tKfxO7/zO9xxxx38R5LE/wSS+P/KNv+dbPMfzTb/EWwDMAwD9957L0972tMYhoEHP/jBPPShD+XlXu7lWCwWPP3pTwdAEgCSAJAEgCTuJwkASdxPEg8kiX+JbQBs80C2Abjnnnt4l3d5l+PXXHPNg//0T//0Z7jqqquuuuqqq/43ohw/fpyrrrrqqquuuup/p8/93M/97T/5kz/hz/7sz5BERCCJiEASkpCEJAAkIQlJAEhCEgCSAJAEgCQAJHE/SdxPEveTxP0kccstt/Cu7/quPPKRjwTg3nvv5dd+7dd42tOexjAM3E8S/5kk8b+FJP472eZ/A9v8Z7DNfyTbvCDDMHDvvffytKc9jZMnT3L69Gke+tCH8nIv93Isl0vuvvtuXhhJAEjifpK4nyT+vWxjm4ODA17sxV6MhzzkIcf/7M/+7GcODw93ueqqq6666qqr/rehHD9+nKuuuuqqq6666n+fD//wD/+uhzzkIS/9Uz/1U+zu7hIRRASSkIQkJCEJSUhCEgCSkASAJAAkIYn7SQJAEgCSuJ8k7ieJ+x0/fpy3e7u349Vf/dWZz+ccHBzwO7/zO/zt3/4t4zjyopDEfwVJXPU/k23+s9nmP5Jt/rWGYeCpT30qh4eHnDhxgmPHjvFiL/ZiPOxhD+NpT3say+USSQBIAkASAJK4nyTuJ4kHksS/xDYAtrmfbQBsc/fdd/OWb/mWxzc3N4//6Z/+6c9w1VVXXXXVVVf9b0M5fvw4V1111VVXXXXV/y4v9mIv9trv+77v+9UAP/RDP0REEBFIIiKQhCQkIQlJAEhCEgCSkASAJAAkASAJAEncTxIAkrifJO73Gq/xGrzd270dx44d4+DggCc84Qn8zu/8DoeHh/x7SeK/miSu+s9hm/9KtvmPZpt/L9sAXLhwgdtvv51hGLjuuus4ceIEL/ZiL8ZiseBpT3sakgCQxHOTxP0kcT9J/FvYBsA297PNgx/8YB760IeeePrTn/7XZ8+evZWrrrrqqquuuup/E8rx48e56qqrrrrqqqv+d/mIj/iI77rmmmse/AM/8APcfffdRAQRgSQkIQlJSEISkpAEgCQkASAJSQBIAkASAJK4nyQAJHE/SQDccsstvNu7vRuPfOQjAXjqU5/Kr/3ar3Hffffxn0kS/90kcdVzss1/F9v8Z7HNv5dtXpBhGLj33nt56lOfyjAMPPjBD+ZhD3sYL//yL89qteKuu+7ifpIAkMT9JHE/STyQJF4Y2zyQbe5nm4ODAzKT13u91zt+zTXXPPi3fuu3voerrrrqqquuuup/E8rx48e56qqrrrrqqqv+93ixF3ux136nd3qnzwb46Z/+adbrNRGBJCICSUhCEpKQBIAkJCEJAEkASAJAEgCSAJAEgCTuJwkASRw7doxXeIVX4M3f/M2Zz+ccHBzw27/92zzhCU/gBZHEfzZJ/E8nif8NbPM/lW3+M9nmP4Jt/jWGYeDee+/lqU99KjfffDPHjh3jxV7sxZDEhQsXWK1WAEjifpK4nyTuJ4l/Dds8N9sA7O/v85Zv+ZZcc801D/6Hf/iH3zl79uytXHXVVVddddVV/1tQjh8/zlVXXXXVVVdd9b/HR3zER3xXrfXBf/u3f8uf//mfExFEBJKQhCQiAgBJSEISkgCQhCQAJAEgCQBJAEgCQBL3k8T9HvSgB/F+7/d+POhBDwLgb/7mb/id3/kdDg8P+deQxH8lSVz1v4dt/ivY5j+Kbf69bDMMA7fffjvDMHDdddfxsIc9jBd/8RdnPp/z1Kc+lftJ4n6SuJ8kHkgSL4xtXhDbHBwc8GIv9mIAvNIrvdJr/8Iv/MLXcNVVV1111VVX/W9BOX78OFddddVVV1111f8Or/M6r/Per/qqr/rRAL/yK7/C7u4uEYEkIgJJSEISkpCEJAAkIQkASUgCQBIAkgCQxP0kASAJgGPHjvEO7/AOvMZrvAYA9957L7/2a7/G7bffzn8USfx3kMRV//Vs81/NNv+RbPPvZZvnNgwD9957L0996lM5efIkZ86c4WEPexgPe9jDeOpTn8pqteJ+krifJO4niX8N2zw/trn77rt5q7d6K572tKcdl/SMW2+99a+56qqrrrrqqqv+N6AcP36cq6666qqrrrrqf4dP+qRP+qmnPvWpxx/xiEfwQz/0Q0QEEYEkJBERSEISAJKQhCQAJCEJAEkASEIS95MEgCQAJAFwyy238P7v//4cO3aMg4MDHv/4x/MHf/AHDMPA/STxn0ES/xNI4qoXnW3+u9nmP5pt/r1s86IahoGnPvWpAFx33XWcPHmSF3/xF2exWPDUpz4VSQBI4oEk8UCSeGFsA2CbB7INwL333suLvdiL8Xd/93e8xVu8xUv/wi/8wtdw1VVXXXXVVVf9b0A5fvw4V1111VVXXXXV/3yv8zqv89433XTTey8WC375l3+Zu+++m4hAEhGBJCQhCUlIQhIAkpAEgCQkASAJAEkASAJAEvc7fvw4b//2b89rvuZrAnDPPffw8z//89x77738SyTxn0kS/5NJ4v8a2/xPZJv/DLb5j2Kbf4977rmHpzzlKQzDwEMe8hAe9rCHcfLkSe666y6WyyX3k8QDSeLfwza2AWit8cqv/MocHh4el/SMW2+99a+56qqrrrrqqqv+p6McP36cq6666qqrrrrqf76v+Iqv+Ksf+IEf4E3f9E35mZ/5GdbrNRGBJCQREUhCEgCSkIQkJAEgCQBJSAJAEgCSuJ8kAB70oAfx/u///hw/fhyAv/mbv+EP//AP+beSxH8FSVz1f5Nt/jPZ5j+Kbf69bPNAwzBwzz33AHDddddx44038uIv/uJsbGzwlKc8BUncTxLPTRIviG3uZ5v72QbANvv7+7zlW74lf/zHf8xbvMVbvPQv/MIvfA1XXXXVVVddddX/dJTjx49z1VVXXXXVVVf9z/aO7/iOn3V4ePjaN910E3fddRd//ud/TkQgiYhAEpKQhCQkIQlJAEhCEgCSAJAEgCQAJAEgCYDXfM3X5C3e4i0AuOeee/jVX/1Vbr/9dv6jSeK/kiSu+p/NNv8VbPMfyTb/EWzzL7nnnnt4ylOewsmTJzlz5gwPe9jDAHjqU58KgCQeSBL/WrYBsM39Dg8PeYVXeAWe6fiLv/iLP/hP//RPf4arrrrqqquuuup/Msrx48e56qqrrrrqqqv+Z/vcz/3c3/7Jn/xJXud1Xodf/uVfZnd3F0lEBJKICCQhCUkASEISkgCQhCQAJAEgCQBJAEji2LFjvMM7vAMv+ZIvCcBf//Vf8wd/8AcMw8ADSeI/iyT+u0jiqv98tvmvZpv/aLb597LNv8UwDDzlKU/BNtdffz0Pf/jDeYVXeAX+4R/+geVyCYAknpskXhDbPJBt7mcbgLvvvpu3equ34vM///N5t3d7txN/+qd/+tOHh4e7XHXVVVddddVV/1NRjh8/zlVXXXXVVVdd9T/Xh3/4h3/Xfffd99Kr1YpHPOIR/PRP/zQRgSQiAklIQhKSkIQkJAEgCUkASEISAJIAkMT9XuqlXor3eI/34Pjx4xwcHPBbv/VbPPWpT+VFJYn/TJL4n0ASVz1/tvnvZpv/LLb5j2Cbfw/b3O+ee+7hKU95Cg960IM4duwYL/7iL85iseCpT30q95PEv4Ztnh/b3HfffbziK74iT3/609nY2Dj+Ei/xEsf/9E//9Ge46qqrrrrqqqv+p6IcP36cq6666qqrrrrqf6ZrrrnmwR/+4R/+3d/2bd/Gm7zJm/C7v/u73HPPPUgiIpBERCAJSUgCQBKSkASAJCQBIAkASQBIAuA1X/M1ecM3fEMAnvKUp/Arv/IrHBwc8O8hif9skvjfQBL/29jmfzrb/GexzX8k2/x72OYFGYaB2267jWEYeOhDH8rDH/5wJPGUpzwFSTw3SbwgtnlhbNNa463e6q34tm/7Nt71Xd/1+K233vo3Z8+evZWrrrrqqquuuup/Isrx48e56qqrrrrqqqv+Z/qkT/qkn/rzP//zB99111283du9Hd/5nd+JJCKCiEASkpCEJCQhCUkASEISAJKQBIAkACRx/Phx3uEd3oGXeqmXAuD3f//3+eu//msk8Z9BEv9VJHHV/362+a9gm/9Itvn3ss2LahgG7rnnHgCuv/56Hv7wh/OKr/iK/N3f/R3L5RJJ/GvY5rnZBuDg4ID3f//354//+I85PDw8/nqv93oP/q3f+q3v4aqrrrrqqquu+p+Icvz4ca666qqrrrrqqv95XuzFXuy13+md3umzv/Zrv5a3e7u346677uIf/uEfiAgiAklEBJKQhCQkASAJSUgCQBIAkpAEgCQe9KAH8QEf8AEcP36cg4MDfvM3f5PbbruN50cS/xkk8d9BElf9z2Gb/0q2+Y9mm/8Itvn3uPvuu3nyk5/Mgx70II4dO8ZLvMRLsLGxwVOe8hQeSBLPj23uZ5sHso1tDg4OOH36NA996EP5mZ/5Gd7yLd/ywbfeeuvvnD179lauuuqqq6666qr/aSjHjx/nqquuuuqqq676n+cjPuIjvutXf/VXH3zXXXfxdm/3dvzKr/wKu7u7RAQRgSQkIQlJSEISkpAEgCQkASAJAEkAvNZrvRZv+ZZvCcA999zDz/7sz3JwcMCLShL/mSTx300SV/3HsM1/F9v8Z7DNfxTb/HvY5oGGYeAZz3gGwzDw0Ic+lJMnT7JYLHjqU5/Kv5Zt7mcbANvs7+/zlm/5lvzgD/4gh4eHvP/7v/9r/8Iv/MLXcNVVV1111VVX/U9DOX78OFddddVVV1111f8sr/M6r/Per/Iqr/LRP/ADP8Arv/Irc+rUKX71V3+ViCAikEREIAlJSEISAJKQhCQAJCEJAEkAvOd7vicv9VIvBcBf//Vf8/u///v8e0niP5sk/ieSxP9Htvmfxjb/WWzzH8U2/162eWGGYeCee+4B4KEPfSiPeMQjOHXqFH/7t38LgCReENs8P7a537333ssrvuIrcvbsWZ72tKfxEi/xEsfPnj37O2fPnr2Vq6666qqrrrrqfxLK8ePHueqqq6666qqr/mf5pE/6pJ/6oR/6oeMXL17k7d7u7fizP/sz7r77biKCiEASkpCEJCQhCUlIAkASkgCQBMCJEyd4x3d8Rx70oAcB8Eu/9Es89alP5T+DJP6rSOL/Akn8V7DN/3a2+c9mm/9Itvn3ss2/1j333MPdd9/NIx7xCG688UZe6ZVeib/7u79juVzyL7ENgG0AbANgG4DM5C3f8i352Z/9WQDe//3f/7V/4Rd+4Wu46qqrrrrqqqv+JyG46qqrrrrqqqv+R3md13md97506dKDn/zkJ/Pwhz+chz/84fzZn/0ZkpAEgCQkIQlJSOKBJHE/SQCcOHGCj/iIj+BBD3oQBwcH/NIv/RL33HMPtrGNbWzzH8U2trGNbWzzn8U2trGNbWxjG9v8b2Ib29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb2/xvYRvb2MY2trGNbf6j2cY2trGNbf69bGMb29jm38o2trHNv4Vt7r77bn7kR36Eg4MDTp48yUd+5Edy8uRJJCEJSUhCEpK4nyQkIQkASUgiIpDEP/zDP/ASL/ESvORLviS/8Ru/wb333vvg13md13lvrrrqqquuuuqq/0kox48f56qrrrrqqquu+p/jkz7pk37qp3/6p49fvHiRN33TN+XOO+/kH/7hH4gIIgJJSEISkpCEJCQhCQBJSAJAEg9+8IP5wA/8QADuuecefuZnfoaDgwNeFJL4zySJ/06SuOq/j23+q9nmP4Nt/qPY5t/DNs9tGAae8YxncOrUKa655hpe6qVeisViwZOf/GReGNu8IIeHh5w+fZqHPvSh/PEf/zH33XcfH/ABH/AyP//zP//VXHXVVVddddVV/1MQXHXVVVddddVV/2O84zu+42ddunTpwU9+8pMBeMVXfEX+7M/+DElIAkASkpCEJCQhiftJQhIAknipl3op3vM93xOApzzlKfzSL/0S/xq2sY1tbPMfzTa2sY1tbPNfyTa2sY1tbGMb29jGNlf969nGNraxjW1sYxvb2MY2/9lsYxvb2MY2/1FsYxvb2Obfwza2sY1t/i1sYxvbvCAHBwf87u/+Ln/5l3/JyZMneeVXfmXe7M3eDElIQhKSkMT9JAEgCUlIQhKSkMQP//AP8xIv8RJI4u/+7u+45557HvThH/7h38VVV1111VVXXfU/BeX48eNcddVVV1111VX/M3zu537ub//AD/wAFy9e5JVe6ZXY2Njg137t14gIJBERSEISkpCEJCQhCUkASEISr/Var8UbvdEbAfBXf/VX/Omf/in/GSTxX0ES/xtI4v8i2/xPZpv/TLb5j2Sbfy/b/GsNw8A999wDwEMf+lAe8YhHAPDkJz+Z58c2z49tAA4PD3mFV3gFAJ72tKfxd3/3d7zru77r8T/7sz/7mcPDw12uuuqqq6666qr/bpTjx49z1VVXXXXVVVf99/vwD//w77r33ntf+rd/+7eRxNu93dvxZ3/2Z9x9991EBJKICCQhCUlIQhIAkpCEJADe+q3fmld6pVcC4Pd+7/f4h3/4B56bJP4zSOK/kiSu+v/BNv9VbPMfyTb/EWzz72Wbu+++G4Drr7+eRzziEUjiyU9+Mg9km/vZ5oFsYxuAzOT1Xu/1+M3f/E0ODw95yEMecvwlXuIljv/pn/7pz3DVVVddddVVV/13I7jqqquuuuqqq/7bXXPNNQ9+ndd5nff+pV/6JSTxiEc8goc//OH82Z/9GZIAkMQLIglJ3O+93uu9eKmXeikAfvEXf5EnP/nJPD+2sY1t/iPZxja2sY1t/jPZxja2sY1tbGObq/53so1tbGMb29jmP4ttbGMb29jmP4JtbGObfw/b2MY2/1a2sY1t7veXf/mX/MIv/AIAb/qmb8p7vMd78ECSkASAJAAkIYmIICKQxOMe9zhe4iVegpd4iZcA4Ad/8Ad5sRd7sdd+sRd7sdfmqquuuuqqq67670Y5fvw4V1111VVXXXXVf69P+qRP+qk///M/f/Df/d3fIYk3fdM35c477+Rxj3sckogIJBERSEISkpCEJAAkIYn3eq/34sEPfjAHBwf8+q//Ovfccw//FpL4zyaJ/26SuOq/nm3+u9jmP4tt/qPY5t/LNv+Sg4MDnvSkJ/GgBz2Ihz3sYbzyK78yv/VbvwWAbZ6bbe5nG4CDgwNOnz7NQx/6UP7kT/6Ew8NDNjc3j7/e673eg3/rt37re7jqqquuuuqqq/47EVx11VVXXXXVVf+tXuzFXuy1X+zFXuy1f+mXfglJSOIVX/EV+dVf/VUAJCEJSbwgkgB4r/d6Lx784AdzcHDA7/7u73LPPffwb2Ub29jGNrb5j2Yb29jGNrb5r2Yb29jGNraxjW1sYxvbXPWisY1tbGMb29jGNraxjW3+q9jGNraxjW3+I9nGNraxzb+XbWxjm38r29jGNi+qg4MDfuEXfoH9/X1OnTrF53/+5wMgCUlIAkASkpAEgCQkERH8yI/8CC/xEi/B/X7913+d06dPv/aLvdiLvTZXXXXVVVddddV/J8rx48e56qqrrrrqqqv++3zER3zEd/3qr/7qg++8804k8cqv/MosFgt+7/d+j4ggIpBERCAJSUhCEpIAkMR7v/d78+AHP5iDgwN+93d/l7vvvhsASfxnkcR/FUn8byOJ/81s87+Fbf4r2OY/km3+I9jm32u9XvOMZzyDBz3oQRw/fpxXeZVX4bd+67ewzXOzzQPZ5uDggFd4hVcA4OlPfzqHh4ccHh7y/u///q/9C7/wC1/DVVddddVVV13134Xgqquuuuqqq676b/M6r/M6733ddde99p/8yZ8gCUm84iu+In/2Z3+GJCQhCUm8IJJ47/d+bx784AdzcHDAj/zIj3D33XdzP9vYxja2+Y9kG9vYxjb/mWxjG9vYxja2sc3/VLaxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNv8T2cY2trGNbWzzn8E2trGNbWzzH8E2trHNv4dtbGObfyvb2MY2APv7+/zCL/wC+/v7nDp1is///M9HEpK4nyQkIQlJSCIiiAh+6Id+iHd913flfn/3d3/Hvffe++AXf/EXf22uuuqqq6666qr/LgRXXXXVVVddddV/m3d8x3f8rO///u/nfo94xCN4+MMfzp//+Z8jCUkASEISkpCEJCQB8N7v/d48+MEP5uDggB/5kR/hX2Ib29jGNv+RbGMb29jGNv8VbGMb29jGNraxzVX/+9jGNraxjW1sY5v/TLaxjW1s8x/FNraxjW3+PWxjG9v8W9nGNrZ5fvb39/n5n/959vf3OXXqFF/wBV8AgCQkASAJSUhCEpKICM6fP88111zDS7zESyCJ++67j1//9V/nwz/8w7+bq6666qqrrrrqvwvl+PHjXHXVVVddddVV//Ve53Ve571vuumm9/6lX/olJCGJN3mTN+HOO+/kcY97HBFBRCAJSUhCEpKQhCTe533ehwc/+MEcHBzwIz/yI/xHkMR/Nkn8TyGJq/5r2ea/m23+s9jmP5Jt/r1s868xDAPPeMYzeNCDHsTx48d51Vd9VX7zN38T27wgtjk4OCAzeYmXeAn++I//GICnP/3pvPIrv/JxSc+49dZb/5qrrrrqqquuuuq/GsFVV1111VVXXfXf4h3f8R0/6xd/8Re5nyRe8RVfkV/7tV9DEpIAkIQkJCEJSUjifd7nfXjwgx/M/v4+P/IjP8J/FNvYxja2+c9gG9vYxja2sc1/B9vYxja2sY1tbGMb29jmqn+ZbWxjG9vYxja2sY1tbPNfyTa2sY1tbGOb/0i2sY1tbPPvZRvb2MY2/1a2sY1t/i329/f5+Z//efb39zl16hRf+IVfiCQkASAJSUhCEhFBRPBbv/VbvMRLvAQAkgD4wR/8Qd7xHd/xs7jqqquuuuqqq/47UI4fP85VV1111VVXXfVf6x3f8R0/6+TJk2/9i7/4i0QEknilV3ollsslf/EXf0FEEBFIQhKSkIQkJPG+7/u+PPjBD2Z/f58f+ZEf4blJ4j+LJP6rSeJ/I0n8b2Wb/21s81/BNv/RbPMfwTb/Xra53zAMPOMZz+DBD34wx48f51Vf9VX59V//dQBs80C2ATg4OOAVXuEVAHj605+OJO69915e+ZVf+fiLv/iLP/hP//RPf4arrrrqqquuuuq/EsFVV1111VVXXfVf7p3e6Z0++xd/8ReRBIAk3viN35inPvWpSEISAJKQhCQkIYn3fd/35cEPfjD7+/v87u/+Ls+PbWxjG9v8R7KNbWxjG9v8Z7ONbWxjG9vY5n8629jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbPM/mW1sYxvb2MY2/xlsYxvb2MY2/xFsYxvb2Obfwza2sc2/h21s89z29/f5+Z//efb39zl16hTv8z7vgyQkASAJSUhCEqUUfviHf5h3fdd35YG+6qu+ihd7sRd77WuuuebBXHXVVVddddVV/5UIrrrqqquuuuqq/1If/uEf/l1//Md/zJOf/GQkIYmHP/zhnDx5kj//8z9HEgCSeG7v8z7vw4Mf/GD29/f53d/9Xe6++25eFLaxjW1s8x/NNraxjW1s81/BNraxjW1sYxvbXPW/m21sYxvb2MY2tvnPZBvb2MY2/5FsYxvb/HvZxja2+fewjW1s88Ls7+/z8z//8+zv7/Oqr/qqvM/7vA+SkIQkJCGJiEAS586dA+AlXuIlAJDEfffdx9/+7d8++B3f8R0/i6uuuuqqq6666r8SwVVXXXXVVVdd9V/mmmuuefDrvM7rvPcv/uIvIgkASbziK74if/Znf0ZEIAlJSEISkpDE677u6/KQhzwEgN/93d/l7rvv5t/KNraxjW3+M9jGNraxjW3+K9nGNraxjW1sYxvbXPXfyza2sY1tbGMb29jmv4JtbGMb29jmP5JtbGMb2/x72cY2tvn3sI1tbPOvsb+/z8///M8D8Kqv+qq85Vu+JZK4nyQkERGcP3+e3/iN3+Bd3uVdeKAf/MEf5MVe7MVe+8Ve7MVem6uuuuqqq6666r8KwVVXXXXVVVdd9V/mwz/8w7/rF37hF7hw4QKSkATAK77iK/Krv/qrSAJAEg/0Mi/zMrzO67wOAD//8z/PXXfdxX8k29jGNrb5z2Ib29jGNrb572Ib29jGNraxjW1sYxvbXPWvYxvb2MY2trGNbWxjG9v8V7ONbWxjG9v8R7ONbWxjm/8ItrGNbf49bGMb2/xb2WZvb4+f+7mfA+At3/Iteau3eiskIQlJSEISEcFv/dZvce2113I/Sdx33338+q//+oPf6Z3e6bO46qqrrrrqqqv+qxBcddVVV1111VX/JV7sxV7stV/sxV7stX/pl34JSQBI4pVe6ZX4sz/7My5evAiAJCQhCUk89KEP5W3f9m0B+Pmf/3nuvvtuAGxjG9v8R7ONbWxjm/9MtrGNbWxjG9v8T2Eb29jGNraxjW1sYxvb2MY2tvm/wja2sY1tbGMb29jGNraxjW1s89/NNraxjW1sY5v/DLaxjW1s8x/BNraxjW3+PWxjG9v8W9nGNra531133cVv//ZvA/Bqr/ZqvPqrvzqSkIQkJCGJ8+fPc++99/Ku7/quPNCv//qv82Iv9mKv/eIv/uKvzVVXXXXVVVdd9V+Bcvz4ca666qqrrrrqqv98H/ERH/Fdv/Irv/LgO++8k4hAEpJ4v/d7P371V3+V3d1dIoKIQBKSeOhDH8r7vd/7AfAXf/EXPPnJT+ZFIYn/bJL47yCJq66yzX8l2/xnsc1/FNv8R7DNC3P+/HkAHv7wh3PzzTdz++23c+7cOR7INnfffTfv8i7vws/+7M8CIInDw0Puvfde3vIt3/Ihv/Vbv/XdXHXVVVddddVV/9kIrrrqqquuuuqq/3Sv8zqv897XXXfda//Jn/wJkgCQxCu90itx8uRJnva0pyEJSQBI4sSJE7zf+70fAHfffTd/+Zd/yYvKNraxjW3+M9jGNraxjW3+K9jGNraxjW1sY5ur/m+xjW1sYxvb2MY2/9lsYxvb2OY/km1sYxvb/HvZxja2+fewjW1s86L4i7/4C/78z/+c06dP837v936cOXMGSUhCEhHB+fPnuffee3nJl3xJHujv/u7vyMzXerEXe7HX5qqrrrrqqquu+s9GcNVVV1111VVX/ad7x3d8x8/6vu/7PgAkIQmAhz3sYfzKr/wKkpCEJCQB8HZv93YA3H333fz8z/88/x62sY1tbPOfxTa2sY1tbPNfyTa2sY1tbGMb29jmqv9ZbGMb29jGNraxjW3+q9jGNraxjW3+I9nGNraxzX8E29jGNv8etrGNbf4tnvSkJ3HXXXdx+vRpPumTPglJSEISkjh37hx///d/z7u8y7twP0ncd999/Pqv/zof/uEf/l1cddVVV1111VX/2Qiuuuqqq6666qr/VK/zOq/z3pcuXXrwU57yFCQBIAlJvOIrviJ//ud/jiQkASCJ93//9+chD3kI+/v7/NzP/Rz/0WxjG9vY5j+TbWxjG9vY5r+LbWxjG9vYxja2sY1tbHPVv59tbGMb29jGNraxjW3+O9jGNraxjW3+o9nGNraxzX8E29jGNrb597CNbWzz72Gbvb09fuu3fov9/X1Onz7N+7//+yMJSUgiIvjt3/5trrnmGq699loe6Dd+4ze49957H/w6r/M6781VV1111VVXXfWfieCqq6666qqrrvpP9Y7v+I6f9Qu/8AsASEISAK/4iq/In/3Zn7G7u4skJCGJ133d1+UhD3kIAL/9278NgG1sYxvb/EezjW1sY5v/bLaxjW1sYxvb/E9hG9vYxja2sY1tbGMb29jGNv8f2MY2trGNbWxjG9vYxja2sc1/N9vYxja2sY1t/jPYxja2sc1/FNvYxjb/XraxjW3+PWxjG9vcb39/n5/92Z8F4NVf/dV5m7d5GyQREUQE586d49577+X1Xu/1uJ8kAH7wB3+Qd3zHd/wsrrrqqquuuuqq/0wEV1111VVXXXXVf5p3fMd3/KxLly49+ClPeQqSuJ8k3uiN3og/+7M/QxKSAHjoQx/K673e6wHwcz/3c9x99908P7axjW1s8x/NNraxjW1s81/BNraxjW1sY5v/6WxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbPM/lW1sYxvb2MY2/5lsYxvb2OY/im1sYxvb/HvZxja2+fewjW1s84Ls7+/zW7/1WwC8+qu/Oo95zGOQhCQigh/5kR/h9V7v9ZDEA/3d3/0d995774M//MM//Lu46qqrrrrqqqv+sxBcddVVV1111VX/ad7pnd7ps3/hF34BAElIQhKv+IqvyMmTJ3n605+OJCRx8uRJ3v/93x+Av/iLv+Duu+/mRWUb29jGNv8ZbGMb29jmv5JtbGMb29jGNra56v8H29jGNraxjW3+s9nGNraxjW3+I9nGNrb5j2Ab29jm38M2trHNi+qJT3wif/7nf87p06f5wA/8QM6cOYMkIoLHPe5x3Hvvvbz4i784kgCQBMBXfdVX8WIv9mKvfc011zyYq6666qqrrrrqPwPl+PHjXHXVVVddddVV//E+/MM//Lvuvffel/7t3/5tJCEJSUQEb/3Wb82v/uqvcs899xARSOI93uM9OHHiBHfddRe/8zu/w38USfxXkcT/JJK46n8H2/xPYJv/TLb5j2ab/yi2+fe466672Nra4pZbbuHlX/7l+ZVf+RVsA9Ba4y3f8i35zd/8TR7o8PCQhzzkIcdf4iVe4vif/umf/gxXXXXVVVddddV/NIKrrrrqqquuuuo/3DXXXPPg13md13nvX/zFXwRAEpKQBMDDH/5wnvrUpyIJgHd4h3fgIQ95CPv7+/z8z/88/5FsYxvb2MY2/1lsYxvb2MY2tvnvYhvb2MY2trGNbWxjm6v+89nGNraxjW1sYxvb2Oa/g21sYxvb2OY/mm1sYxvb/EexjW1s8+9lG9vY5t/DNrb58z//c/b39zl9+jQf9EEfREQgicc97nFce+21vPiLvziSAJAEwA/+4A/yYi/2Yq/94i/+4q/NVVddddVVV131H41y/Phxrrrqqquuuuqq/1if9Emf9FN/9md/9uC/+7u/QxKSkERE8MZv/MZcvHiRv/iLv0ASD3/4w3nzN39zAH71V3+V/f19HkgS/9kk8V9NEv/bSOKqK2zzv4Vt/qvY5j+Dbf4j2eY/gm2e2zAMPP3pT+clX/IledCDHsS5c+d4xjOeweHhIS//8i+PJP7+7/+eBzo8PGRzc/P4673e6z3kt37rt76bq6666qqrrrrqPxLBVVddddVVV131H+rFXuzFXvvFXuzFXvsXf/EXAZCEJCQB8Aqv8Ar8+Z//OZI4efIkH/ABHwDAz/3cz3HXXXfx3GxjG9vY5j+DbWxjG9v8V7CNbWxjG9vY5n8y29jGNraxjW1sYxvb2MY2trGNbWxjG9vY5r+bbWxjG9vYxja2sY1tbGMb29jGNraxjW3+J7KNbWxjG9vY5j+TbWxjG9v8R7KNbWzzH8E2trHNv4dtbGObF2R/f5/f/M3fBODt3u7tuOaaa4gIfuRHfoTXe73XA0ASAJIA+PVf/3Ve7MVe7LVe7MVe7LW56qqrrrrqqqv+IxFcddVVV1111VX/od7pnd7ps77v+74PSUjifpJ4xVd8RQCe9rSnIYl3eId3AOCuu+7irrvu4kVhG9vY5j+LbWxjG9vY5r+KbWxjG9vYxja2+b/CNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2OZ/O9vYxja2sY1t/ivYxja2sc1/JNvYxja2+Y9gG9vY5t/LNrZ5UT3xiU/kiU98IqdPn+YzP/MzkcTjH/947r33Xl78xV+c53bffffxVV/1VbzTO73TZ3HVVVddddVVV/1HIrjqqquuuuqqq/7DvM7rvM57X3fdda/9x3/8xwBIQhKSAHiFV3gFfvVXfxVJvMEbvAEPfehD2d/f5+d+7uf4t7CNbWxjm/9MtrGNbWxjm/9qtrGNbWxjG9vY5qr/W2xjG9vYxja2sc1/FdvYxja2sc1/NNvYxjb/UWxjG9v8e9nGNrb5t/izP/sz9vf3OX36NO/wDu9ARPCbv/mbvMu7vAsAkgCQBMDf/d3fcfr06dd+sRd7sdfmqquuuuqqq676j0Jw1VVXXXXVVVf9h3md13md9/rFX/xFJCGJ+0lCEg9/+MN52tOexsMe9jBe//VfH4Df/u3f5j+KbWxjG9v8Z7ONbWxjG9v8d7GNbWxjG9vYxja2uep/FtvYxja2sY1tbGOb/2q2sY1tbGOb/wy2sY1tbPMfxTa2sc2/l21sY5t/D9vs7e3xG7/xGwC81mu9Fi/+4i/O4x//eF7iJV6Cl3iJl+C53XffffzgD/4gH/7hH/5dXHXVVVddddVV/1EIrrrqqquuuuqq/xCv8zqv895d1732H//xHwMgCUlIAuBd3uVd+LM/+zN2d3d5gzd4AwD+/M//nDvvvBPb/GewjW1sY5v/CraxjW1sY5v/CWxjG9vYxja2sY1tbGObq/59bGMb29jGNraxjW1sY5v/TraxjW1sY5v/LLaxjW1s8x/FNraxjW3+vWxjG9v8e9jGNra531133cWf/dmfcebMGT70Qz+Uc+fO8fd///e83uu9HgCSAJAEwG/8xm9w7733Pvh1Xud13purrrrqqquuuuo/AsFVV1111VVXXfUf4h3f8R0/6xd/8ReRhCTuJwlJPOxhD+PP//zPeYM3eAMe+tCHsr+/z5//+Z9zP9vYxja2+c9gG9vYxja2+a9gG9vYxja2sc3/RLaxjW1sYxvb2MY2trGNbWxjm/+rbGMb29jGNraxjW1sYxvb2MY2/5PYxja2sY1tbPOfyTa2sY1t/iPZxja2+Y9gG9vY5t/LNrZ5QZ7whCdw5513cubMGT78wz+cH/mRH+HFX/zFeUF+8Ad/kHd8x3f8LK666qqrrrrqqv8IBFddddVVV1111b/bO77jO37W7u7ug5/85CcDIAlJSALgFV7hFbh48SKSeNjDHgbAb/3Wb/HC2MY2trHNfxbb2MY2tvmvZBvb2MY2trHN/za2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb2/xvYRvb2MY2trHNfzbb2MY2trHNfyTb2MY2tvmPYBvb2Obfyza2sc2/ZH9/n9/8zd8E4MVe7MWQxL333stLvMRLACAJAEkA/N3f/R333nvvgz/8wz/8u7jqqquuuuqqq/69CK666qqrrrrqqn+3d3qnd/rsX/zFX0QSkrifJCTxiq/4ivzZn/0Zb/iGb8hDH/pQ/vzP/5y77rqLfw3b2MY2/5lsYxvb2MY2/9VsYxvb2MY2trHNVf9/2cY2trGNbWzzX8U2trGNbf4z2MY2tvmPYhvb2Obfyza2sc2/1v7+Pn/2Z3/GmTNn+IiP+Ah+67d+i3d5l3fhBfmqr/oqXuzFXuy1r7nmmgdz1VVXXXXVVVf9exBcddVVV1111VX/Lh/+4R/+XX/8x3/Mk5/8ZAAkIQlJAJw8eZKHPexhnDx5koc+9KHs7+/z53/+5/x72MY2trHNfzbb2MY2trHNfxfb2MY2trGNbWxz1f9utrGNbWxjG9vYxjb/lWxjG9vYxjb/GWxjG9vY5j+KbWxjm/8ItrHNv9fjH/947rzzTs6cOcNLvMRL8OIv/uK8xEu8BACSAJAEwH333cff/u3fPvgd3/EdP4urrrrqqquuuurfg3L8+HGuuuqqq6666qp/m2uuuebBH/7hH/7d3/qt38pqtUISkpBERCCJt37rt2a1WvEKr/AKAPzKr/wK+/v7/GeSxH8HSfxPJ4mr/nvY5n8i2/xXsc1/Ftv8R7LNfwTb3G8YBu68805e6qVeiq2tLQ4PD9na2uKP//iPeSBJADztaU/j3d7t3U48/elP/+uzZ8/eylVXXXXVVVdd9W9BcNVVV1111VVX/Zt9+Id/+Hf98R//MefPnwdAEpKQxP0e9rCH8bCHPQyAJz7xidx5553Yxja2+c9gG9vYxja2+a9gG9vYxja2+Z/GNraxjW1sYxvb2MY2trHNVf8y29jGNraxjW1sYxvb2MY2/xPYxja2sY1t/jPZxja2sc1/JNvYxja2+Y9gG9vY5t/LNrZ5bvv7+/zpn/4pZ86c4ZprruHFX/zFkQSAJB7ovvvu41d/9Vcf9E7v9E6fxVVXXXXVVVdd9W9FcNVVV1111VVX/Zu82Iu92Gu/2Iu92Gt/3/d9H5KQxP0kIYlXfMVX5OTJk9zvN3/zN3lutrGNbf4z2cY2trHNfxXb2MY2trGNbf43sI1tbGMb29jGNraxjW1sYxvb2MY2tvnfwDa2sY1tbGMb29jGNraxjW1sYxvb2OZ/KtvYxja2sY1t/rPZxja2sc1/NNvYxjb/UWxjG9v8e9nGNrZ5YZ7whCewv78PwDXXXMOLv/iL89wkAfAbv/EbvNiLvdhrv9iLvdhrc9VVV1111VVX/VtQjh8/zlVXXXXVVVdd9a/3ER/xEd/1y7/8yw++8847kUREIAlJSEISb/3Wb83JkycB+Jmf+Rn29/f515DEfyVJ/E8giauuelHY5r+Tbf4z2eY/g23+o9jmX2sYBtbrNQ996EMBuPbaa/nN3/xNACTxQIeHh9x777281Vu91YN/67d+63u46qqrrrrqqqv+tQiuuuqqq6666qp/tdd5ndd57+uuu+61/+RP/gRJSOKBJPHwhz+chz3sYQDcdddd3HXXXfxr2cY2trHNfzbb2MY2tvnvYhvb2MY2trGNba76/8c2trGNbWxjG9v8V7KNbWxjG9v8Z7CNbWzzH8k2trHNfwTb2Obf6glPeAJ33nknAC/+4i/Oi7/4i/PcJAHwd3/3d5w+ffq1X+zFXuy1ueqqq6666qqr/rUIrrrqqquuuuqqf7XXeZ3Xea9f+IVf4H6SkIQkJAHwCq/wCtzvz/7sz/iPYBvb2MY2/9lsYxvb2MY2/91sYxvb2MY2trGNba7638k2trGNbWxjG9v8d7CNbWxjG9v8Z7GNbWxjm/9ItrGNbf4j2MY2tvn3ss2v//qvc7/Xe73XQxIAknig++67jx/8wR/kwz/8w7+Lq6666qqrrrrqX4vgqquuuuqqq676V3md13md9+667rX/5E/+BElI4oEkIYlXeIVXAOAJT3gCd911F/8ZbGMb29jmv4JtbGMb29jmfxLb2MY2trGNbWxjG9tc9V/LNraxjW1sYxvb2MY2/51sYxvb2MY2/5lsYxvb2OY/km1sYxvb/EewjW1s8+9lG9vYBmB/f5/HP/7xALz4i784z48kAH7jN36De++998Gv8zqv895cddVVV1111VX/GgRXXXXVVVddddW/yju+4zt+1i/8wi9wP0lIQhKSAHiFV3gF7vebv/mb2MY2tvnPZBvb2MY2/1VsYxvb2MY2tvmfyja2sY1tbGMb29jGNraxzVXPyza2sY1tbGMb29jGNraxjW3+J7GNbWxjG9v8Z7ONbWxjm/9otrGNbf6j2MY2tvmPYBvbPD9/+qd/CsA111zD673e6yEJAEk8tx/8wR/kHd/xHT+Lq6666qqrrrrqX4Pgqquuuuqqq656kb3jO77jZ+3u7j74KU95CpKQxANJQhKv8AqvAMBv/uZv8txsYxvb2OY/k21sYxvb/FezjW1sYxvb2OZ/E9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2/91sYxvb2MY2trGNbWxjG9vYxja2sY1tbGOb/w1sYxvb2MY2tvmvYBvb2MY2/xlsYxvb/EexjW1s8x/BNraxzQuzv7/Pr//6rwPwzu/8zjw/kgD4u7/7O+69994Hf/iHf/h3cdVVV1111VVXvagIrrrqqquuuuqqF9k7vdM7ffYv/MIvcD9JSEISkgB4hVd4BR72sIexv7/PE57wBP4ltrGNbWzzn8k2trGNbWzz38E2trGNbWxjm//rbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW3+L7KNbWxjG9vY5r+SbWxjG9v8Z7CNbWxjm/8otrGNbf4j2MY2tvnXuPPOO7nzzju55ppreN3XfV0kASCJ5/ZVX/VVvPiLv/jrXHPNNQ/mqquuuuqqq656URBcddVVV1111VUvkg//8A//rj/6oz/iyU9+MpKQxANJQhJv+IZvCMBv/MZv8G9hG9vY5r+CbWxjG9vY5r+LbWxjG9vYxja2sc1V/z/Zxja2sY1tbGOb/2q2sY1tbGOb/yy2sY1t/iPZxja2+Y9iG9v8W+3v7/P4xz8egHd5l3fh+ZEEwH333cff/M3fPOgd3/EdP4urrrrqqquuuupFQXDVVVddddVVV/2Lrrnmmge/zuu8znv/4i/+IpIAkIQkJCEJgDd8wzfk5MmT3Hnnndx11138e9nGNraxzX8V29jGNraxzf8EtrGNbWxjG9vYxjZX/e9kG9vYxja2sY1tbPPfxTa2sY1tbPOfyTa2sY1t/iPZxja2+Y9iG9vY5j/C4x//eO644w6uueYaPuqjPgpJAEjiuf3gD/4gL/ZiL/baL/ZiL/baXHXVVVddddVV/xKCq6666qqrrrrqX/ThH/7h3/VHf/RHnD9/HklI4oEkIYk3eqM3AuDP/uzP+M9gG9vYxja2+a9iG9vYxja2+Z/GNraxjW1sYxvb2MY2V/3Xso1tbGMb29jGNraxzf8EtrGNbWxjm/9strGNbWzzH802trHNfxTb2MY2/1FsYxuAP/3TPwXgxV/8xbnmmmt4bpIAuO+++/jbv/3bB7/O67zOe3HVVVddddVVV/1LCK666qqrrrrqqhfqxV7sxV77xV7sxV77+77v+5AEgCQkIQlJALzzO78zAE94whO48847sY1t/rPZxja2sc1/JdvYxja2sY1t/iezjW1sYxvb2MY2trGNbWxjm6uel21sYxvb2MY2trGNbWxjm/+JbGMb29jGNv8VbGMb29jmP5ptbGMb2/xHsY1tbPMfxTa2sc0D3Xnnndx5551cc801vMu7vAuSAJDEc/vBH/xBXud1Xue9X+zFXuy1ueqqq6666qqrXhiCq6666qqrrrrqhXqnd3qnz/r5n/95ACQhied26tQpXuEVXgGAJzzhCTyQbWxjG9v8Z7ONbWxjm/8OtrGNbWxjG9v8b2Qb29jGNraxjW1sYxvb2MY2trGNbWxjG9v8d7ONbWxjG9vYxja2sY1tbGMb29jGNraxjW1s87+FbWxjG9vYxjb/VWxjG9vY5j+DbWxjm/9ItrGNbf4j2cY2L8yv//qvA/DiL/7ivPiLvzj3kwSAJADuu+8+vuqrvop3eqd3+iyuuuqqq6666qoXhuCqq6666qqrrnqBXuzFXuy1r7vuutf+xV/8RSRxP0lIQhKSeOd3fmcAnvCEJ3DnnXfywtjGNraxzX8229jGNraxzX8X29jGNraxjW3+P7CNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2+b/MNraxjW1sY5v/SraxjW1sY5v/DLaxjW1s8x/JNraxzX8k29jGNi+Kvb09Hv/4x3PNNdfwLu/yLkjiBfm7v/s7Tp8+/dov9mIv9tpcddVVV1111VUvCMFVV1111VVXXfUCvdM7vdNn/cIv/AIAkpCEJB7o4Q9/OA972MMA+NM//VP+tWxjG9v8V7GNbWxjm/9utrGNbWxjG9vY5qqrAGxjG9vYxja2sc1/B9vYxja2+c9kG9vY5j+abWxjm/9ItrGNbf4t/vRP/xSAF3/xF+clXuIluJ8kACQBcN999/GDP/iDfPiHf/h3cdVVV1111VVXvSAEV1111VVXXXXV8/U6r/M679113Wv/8R//MZK4nyQkIQlJvNEbvREAf/qnf8r+/j7/HraxjW1s81/FNraxjW1s8z+FbWxjG9vYxja2sc1V/zfYxja2sY1tbGMb2/x3so1tbGMb2/xnso1tbGOb/2i2sY1t/iPZxja2+ffa29vj137t1wD4yI/8SCTxgvzd3/0d995774Nf53Ve57256qqrrrrqqqueH4Krrrrqqquuuur5esd3fMfP+oVf+AUAJCEJSTzQK77iK/Kwhz0MgD/7sz/jP5ptbGMb2/xXso1tbGMb29jmfxrb2MY2trGNbWxjG9tc9d/LNraxjW1sYxvb2MY2/1PYxja2sY1t/rPZxja2sc1/BtvYxjb/0Wxjm/8otrHNnXfeyd7eHtdccw2v+7qvy/0kASAJgPvuu48f+IEf4J3e6Z0+m6uuuuqqq6666vkhuOqqq6666qqrnsc7vuM7ftbu7u6Dn/zkJyOJ+0lCEpKQxBu+4RsC8Ou//uvY5j+bbWxjG9vY5r+abWxjG9vY5n8629jGNraxjW1sYxvb2MY2trnqX2Yb29jGNraxjW1sYxvb2OZ/KtvYxja2sc1/BdvYxja2+c9gG9vYxjb/0WxjG9v8R7CNbWxzv729Pf7kT/4EgHd5l3dBEi/I3//933P33Xc/6B3f8R0/i6uuuuqqq6666rkRXHXVVVddddVVz+Od3umdPvsXfuEXAJCEJCTxQK/wCq/AyZMnufPOO3nCE54AgG1sYxvb/FewjW1sY5v/DraxjW1sYxvb/G9lG9vYxja2sY1tbGMb29jGNraxjW1sY5v/yWxjG9vYxja2sY1tbGMb29jGNraxjW1s87+JbWxjG9vYxjb/VWxjG9vY5j+LbWxjm/8MtrGNbf4j2MY2tnlB7rzzTu644w6uueYaXvd1X5f7SQJAEvf7qq/6Kl7ndV7nva+55poHc9VVV1111VVXPRDBVVddddVVV131HD78wz/8u/7oj/6IJz/5yUjifpKQhCQk8S7v8i4A/Omf/ikviG1sYxvb/FewjW1sY5v/TraxjW1sYxvb/H9gG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW3+r7KNbWxjG9vY5r+abWxjG9v8Z7GNbWxjm/8MtrGNbf6j2MY2L4q9vT3+5E/+BIB3eZd3QRIvyNmzZ/nbv/3bB7/jO77jZ3HVVVddddVVVz0QwVVXXXXVVVdd9SzXXHPNg1/ndV7nvX/hF34BAElIQhIP9C7v8i4A3Hnnndx55528qGxjG9vY5r+CbWxjG9vY5r+bbWxjG9vYxja2ueqqF8Y2trGNbWxjG9v8d7CNbWxjG9v8Z7KNbWzzn8U2trHNfxTb2MY2/1p33nknd9xxB9dccw0f9VEfhSQAJAEgifv94A/+IC/2Yi/22i/2Yi/22lx11VVXXXXVVfcjuOqqq6666qqrnuXDP/zDv+uP/uiPuHDhApK4nyQkIYlTp07xCq/wCgD86Z/+Kf8etrGNbWzzX8U2trGNbWzzP4VtbGMb29jGNraxzVX/99nGNraxjW1sY5v/braxjW1s85/NNraxjW3+s9jGNrb5j2Ib29jm3+vXf/3XAXjxF39xrrnmGl6Q++67j7/927998Ou8zuu8F1ddddVVV1111f0Irrrqqquuuuqqy17sxV7stV/sxV7stb/3e78XAElIQhIP9M7v/M4APP7xj+fOO+/kP5JtbGMb2/xXso1tbGMb2/xPZBvb2MY2trGNbWxjm6v+57KNbWxjG9vYxja2sc3/FLaxjW1sY5v/bLaxjW1s85/JNraxzX8k29jmP4ptLl26xOMe9ziuueYa3uVd3gVJAEgCQBL3+8Ef/EFe53Ve571f7MVe7LW56qqrrrrqqqsACK666qqrrrrqqsve6Z3e6bN+/ud/HklI4n6SkIQkHv7wh/Pwhz8cgD/90z/lP5ttbGMb2/xXs41tbGMb29jmfzrb2MY2trGNbWxjG9vYxjZX/cewjW1sYxvb2MY2trGNbf6nso1tbGMb2/xXsI1tbGOb/0y2sY1tbPMfyTa2sc1/BNvYxjb3+5M/+RMAXvd1X5eXeImX4AW57777+Kqv+ire6Z3e6bO46qqrrrrqqqsACK666qqrrrrqKl7sxV7sta+77rrX/oVf+AUAJCEJSTzQG73RGwHw+Mc/nr29PWzzX8k2trGNbf672MY2trGNbf63so1tbGMb29jGNraxjW1sYxvb2Ob/ItvYxja2sY1tbGMb29jGNraxjW1s87+FbWxjG9vYxjb/VWxjG9vY5j+bbWxjm/9otrGNbf6j2MY2z8/e3h5//Md/DMA7v/M7IwkASQBI4n5/93d/x+nTp1/7xV/8xV+bq6666qqrrrqK4Kqrrrrqqquu4p3e6Z0+6xd+4ReQhCTuJwlJSOLhD384D3/4wwH49V//de5nG9vYxjb/lWxjG9vY5r+TbWxjG9vYxja2+b/INraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1s83+JbWxjG9vYxjb/1WxjG9vY5r+CbWxjm/9otrGNbf6j2MY2tvmXPP7xjwfgxV/8xXnxF39xXpD77ruPH/zBH+TDP/zDv5urrrrqqquuuorgqquuuuqqq/6fe53XeZ337rrutf/oj/4IAElIQhIP9EZv9EYA/Pqv/zovjG1sY5v/araxjW1sY5v/CWxjG9vYxja2ueqqfy/b2MY2trGNbf672MY2trHNfwXb2MY2tvmPZhvb2OY/km1s86+xt7fHr/3arwHwUR/1UUgCQBIAkrjf3/3d33H33Xc/6HVe53Xem6uuuuqqq676/43gqquuuuqqq/6fe8d3fMfP+oVf+AUkIYn7SUISknjFV3xFHv7wh7O3t8fjH/94XlS2sY1tbPPfwTa2sY1tbPM/hW1sYxvb2MY2trHNVVfZxja2sY1tbGMb2/x3so1tbGMb2/xXsY1tbPOfwTa2sc1/JNvYxjb/VnfccQd33HEH11xzDa/7uq/Lc5MEwH333ccP/uAP8o7v+I6fxVVXXXXVVVf9/0Zw1VVXXXXVVf+PveM7vuNn7e7uPvhJT3oSAJKQhCQe6I3e6I0A+PVf/3X+PWxjG9vY5r+LbWxjG9vY5n8i29jGNraxjW1sY5ur/vezjW1sYxvb2MY2tvmfwja2sY1tbPNfyTa2sY1t/jPYxja2+Y9kG9vY5j/C3t4ej3vc4wB4l3d5FyQBIInn9nd/93fce++9D37Hd3zHz+Kqq6666qqr/v8iuOqqq6666qr/x97pnd7ps3/hF34BSUjigSQhiTd+4zfm5MmT3Hnnndx55538R7KNbWxjm/9OtrGNbWxjm//pbGMb29jGNraxjW1sY5ur/nvYxja2sY1tbGMb29jmfyLb2MY2trHNfzXb2MY2tvnPYhvb2OY/km1sY5v/KLaxjW0e97jHcccdd3DNNdfwUR/1UTw3SQBI4qu+6qt4ndd5nffmqquuuuqqq/7/Irjqqquuuuqq/6c+/MM//Lv+6I/+iCc96UkASEISkpDE/d7ojd4IgD/5kz/hP5ttbGMb2/x3s41tbGMb29jmfxvb2MY2trGNbWxjG9vYxja2uer5s41tbGMb29jGNraxjW1sY5v/DWxjG9vYxjb/HWxjG9vY5j+LbWxjG9v8R7ONbf4j2cY2z+2P//iPAXjxF39xrr32WgAk8dzuvfde/vZv//bBH/7hH/5dXHXVVVddddX/TwRXXXXVVVdd9f/QNddc8+DXeZ3Xee9f+IVfQBKSeCBJSOJd3/VdAXj84x/PHXfcgW1s81/FNraxjW1s8z+BbWxjG9vYxjb/V9jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sc1/B9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trHN/2a2sY1tbGMb2/x3sY1tbGOb/0y2sY1t/jPYxja2+Y9iG9vY5gW54447uOOOO7jmmmt4l3d5F56bJAAk8YM/+IO82Iu92Gu/2Iu92Gtz1VVXXXXVVf//EFx11VVXXXXV/0Mf/uEf/l1/9Ed/xPnz5wGQhCQkIQmAkydP8gqv8AoAPO5xj+OBbGMb29jmv5JtbGMb2/xPYhvb2MY2trHN/3e2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGOb/69sYxvb2MY2tvnvZhvb2MY2/9lsYxvb/GewjW1s8x/JNrZ5Uf3qr/4qAC/+4i/OS77kSwIgied233338bd/+7cPfp3XeZ334qqrrrrqqqv+/yG46qqrrrrqqv9nXuzFXuy1X+zFXuy1v/d7vxdJSOKBJCGJd3mXdwHg8Y9/PHfeeScvjG1sYxvb/FeyjW1sYxvb/E9jG9vYxja2sY1trrrqX8s2trGNbWxjG9v8T2Ab29jGNrb5z2Yb29jGNv8ZbGMb2/xHso1tbPOvtbe3x+Me9ziuueYa3vmd35nnJon7/eAP/iCv8zqv894v/uIv/tpcddVVV1111f8vBFddddVVV131/8w7vdM7fdbP//zPcz9JSEISkgB4+MMfzsMf/nAA/uRP/oR/LdvYxja2+a9mG9vYxjb/k9nGNraxjW1sYxvbXPX/k21sYxvb2MY2tvmfxja2sY1t/ivYxja2sc1/FtvYxjb/kWxjG9v8e/3xH/8xAC/+4i/OS7zESwAgied233338VVf9VW84zu+42dz1VVXXXXVVf+/EFx11VVXXXXV/yMv9mIv9tov9mIv9tq/8Au/gCQk8UCSkMQbvdEbAfAnf/In7O3t8e9lG9vYxjb/1WxjG9vYxja2+d/ANraxjW1sYxvb2MY2V/3vYhvb2MY2trGNbWxjm/+pbGMb29jGNv9VbGMb2/xnsY1tbGOb/2i2sc1/pEuXLvErv/IrAHzUR30Uz00S9/u7v/s7Tp8+/Vov9mIv9tpcddVVV1111f8fBFddddVVV131/8g7vdM7fdb3fM/3cD9JSEISkgB4xVd8RR7+8IcD8Cd/8if8Z7CNbWxjm/8utrGNbWxjm/+NbGMb29jGNraxjW1sY5ur/nPZxja2sY1tbGMb29jGNv9b2MY2trGNbf4r2cY2trHNfxbb2MY2/xlsYxvb/EexjW1sA3DHHXewt7fHNddcw+u93usBIInndt999/GDP/iDfPiHf/h3cdVVV1111VX/fxBcddVVV1111f8Tr/M6r/PeXde99h//8R8jCUk8kCQk8UZv9EYA/Nqv/Rr/VWxjG9vY5r+TbWxjG9vY5v8K29jGNraxjW1sYxvb2MY2trGNbf6/sY1tbGMb29jGNraxjW1sYxvb2OZ/M9vYxja2sc1/NdvYxja2+c9kG9vY5j+DbWxjm/9ItrHNc9vb2+OP/uiPAHiXd3kXnpsk7ve3f/u33HvvvQ9+ndd5nffmqquuuuqqq/5/ILjqqquuuuqq/yfe8R3f8bN+/ud/nvtJQhKSkATAK77iK3Ly5EnuuOMOHve4x2Eb29jmv5JtbGMb2/x3s41tbGMb29jm/wvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2+b/MNraxjW1sY5v/DraxjW1s85/NNraxzX8G29jGNv+RbGMb27wwd9xxB3fccQfXXHMNr/d6rweAJJ7b2bNn+YEf+AHe8R3f8bO46qqrrrrqqv8fCK666qqrrrrq/4F3fMd3/Kzd3d0HP/nJT0YSknhukniXd3kXAP7kT/6E52Yb29jGNv+VbGMb29jGNv8T2MY2trGNbWxjm6uu+u9kG9vYxja2sc1/F9vYxja2sc1/NtvYxja2+c9gG9vY5j+abWzzotrb2+OP/uiPAHiXd3kXnpsk7vd3f/d33HvvvQ9+x3d8x8/iqquuuuqqq/7vI7jqqquuuuqq/wfe6Z3e6bN//ud/ngeShCQkIYk3eqM3AuCOO+7gjjvu4F9iG9vYxjb/1WxjG9vY5n8a29jGNraxjW1sc9VV/xFsYxvb2MY2trHNfzfb2MY2tvmvYhvb2OY/i21sY5v/aLaxjW3+Le644w7uuOMOrrnmGj76oz8aAEk8N0l81Vd9Fa/zOq/z3lx11VVXXXXV/30EV1111VVXXfV/3Id/+Id/1x/90R/xpCc9CUlIQhIPdOrUKd74jd8YgD/5kz/h38I2trGNbf6r2cY2trGNbf6nso1tbGMb29jGNldd9UC2sY1tbGMb29jmfwrb2MY2trHNfxXb2MY2tvnPYhvb2OY/mm1sY5v/CL/yK78CwIu/+ItzzTXXACAJAEnc79577+Vv//ZvH/zhH/7h38VVV1111VVX/d9GcNVVV1111VX/h11zzTUPfp3XeZ33/vmf/3kkcT9JSEISknijN3ojAB73uMdxxx138B/BNraxjW3+O9jGNraxjW3+p7ONbWxjG9vYxja2sc1V/zfYxja2sY1tbGMb29jmfyLb2MY2tvmvZBvb2MY2/5lsYxvb/EezjW1s8x/JNpcuXeIf/uEfuOaaa3jXd31XXhBJ/OAP/iAv9mIv9tov/uIv/tpcddVVV1111f9dBFddddVVV131f9iHf/iHf9cf/dEfcf78eSQhCUk80CMe8Qhe8RVfEYA/+ZM/4T+LbWxjG9v8d7GNbWxjG9vY5n8T29jGNraxjW1sYxvb2Oaq/z62sY1tbGMb29jGNrb5n842trGNbWxjm/9KtrGNbWzzn8k2trGNbf4z2MY2/9FsY5v7/dEf/REAr/u6r8uLv/iLAyAJAEnc79577+Vv//ZvH/zar/3a78VVV1111VVX/d9FcNVVV1111VX/R73Yi73Ya7/Yi73Ya//8z/88krifJCQhCUm80Ru9EQCPe9zj2Nvb47+KbWxjG9v8d7ONbWxjG9v8b2cb29jGNraxjW1sYxvb2MY2trnqednGNraxjW1sYxvb2MY2trGNbf63sY1tbGMb2/x3sI1tbGOb/2y2sY1t/rPYxja2+Y9kG9vY5rnt7e3xR3/0RwC867u+Ky+IJH7wB3+Q13md13nvF3uxF3ttrrrqqquuuur/JoKrrrrqqquu+j/qnd7pnT7r537u5zh//jySkIQkHujhD384D3/4wwH41V/9VWxjG9v8V7ONbWxjm/8JbGMb29jGNrb5v8w2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sY5v/CraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb2/xfYhvb2MY2trHNfxfb2MY2tvmvYBvb2OY/i21sY5v/aLaxzb/kH/7hHwB48Rd/cV78xV8cAEkASOJ+9957L1/1VV/FO73TO30WV1111VVXXfV/E8FVV1111VVX/R/0Yi/2Yq/9Yi/2Yq/9C7/wC0jifpKQhCQk8cZv/MYA/Oqv/irPzTa2sY1t/qvZxja2sY1t/qewjW1sYxvb2MY2Vz1/trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trnq2WxjG9vYxja2+e9mG9vYxjb/FWxjG9vY5j+LbWxjm/9otrGNbV5Ue3t7/Mqv/AoAH/3RH80LIom//du/5fTp06/9Yi/2Yq/NVVddddVVV/3fQ3DVVVddddVV/we90zu902d993d/NwCSkIQkHugVX/EVefjDH87e3h6Pe9zj+JfYxja2sc1/B9vYxja2+Z/INraxjW1sYxvbXHXVfyTb2MY2trGNbWzzP4FtbGMb29jmv4ptbGOb/0y2sY1t/qPZxja2+be6/fbbuf3227nmmmt4vdd7PQAkASCJ+91333384A/+IB/+4R/+XVx11VVXXXXV/z0EV1111VVXXfV/zOu8zuu893XXXffaf/zHf4wk7icJSUhCEm/8xm8MwK/+6q/yb2Eb29jGNv8dbGMb29jGNv+T2cY2trGNbWxjm6uuen5sYxvb2MY2trHN/zS2sY1tbPNfyTa2sY1t/jPZxja2+c9gG9v8R9jb2+Nxj3scAO/yLu/CCyKJv/u7v+Pee+998Ou8zuu8N1ddddVVV131fwvBVVddddVVV/0f847v+I6f9d3f/d0ASEISknigN37jN+bkyZPccccd3HHHHfxHsI1tbGOb/y62sY1tbGOb/w1sYxvb2MY2trGNbWxz1f8ttrGNbWxjG9vYxja2+Z/KNraxjW1s81/JNraxjW3+s9nGNrb5z2Ab29jmP5Jt/v7v/57bb7+da665ho/6qI8CQBIAkrjfvffeyw/8wA/wju/4jp/FVVddddVVV/3fQnDVVVddddVV/4e8zuu8znvv7u4++MlPfjKSuJ8kJCEJSbzxG78xAH/8x3/Mfxbb2MY2tvnvZBvb2MY2trHN/za2sY1tbGMb29jGNraxzVX//WxjG9vYxja2sY1tbPO/hW1sYxvb2Oa/g21sY5v/bLaxjW1s85/BNraxzX8029jmfn/0R38EwEu8xEtwzTXX8PxI4u/+7u+49957H/yO7/iOn8VVV1111VVX/d9BcNVVV1111VX/h3z4h3/4d/3cz/0cAJKQhCQe6F3f9V0BeNzjHscdd9zBfxXb2MY2tvmfwDa2sY1tbPN/gW1sYxvb2MY2trGNbWxjG9vY5qoXzDa2sY1tbGMb29jGNraxjW1s87+RbWxjG9vYxjb/XWxjG9vY5j+bbWxjm/8strGNbf6j2cY2tnlut99+O7fffjvXXHMN7/qu7wqAJAAk8UBf9VVfxeu8zuu8N1ddddVVV131fwfBVVddddVVV/0f8eEf/uHf9Ud/9Ec8+clPRhL3k4QkJHHq1Cle8RVfEYB/+Id/wDa2sc1/NdvYxja2+Z/CNraxjW1sY5v/62xjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2tvmvZBvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxzf9FtrGNbWxjm/9OtrGNbWxjm/8KtrGNbf6z2MY2tvnPYBvb/Et++Zd/GYAXf/EX58Vf/MV5fiRx7733cu+99z74wz/8w7+Lq6666qqrrvq/geCqq6666qqr/g+45pprHvw6r/M67/1zP/dzAEhCEpJ4oHd913cF4HGPexx33HEHD2Qb29jmv4NtbGMb29jmfxLb2MY2trGNbWxz1QtmG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vY5qrnZRvb2MY2trHNfzfb2MY2tvmvYhvb2MY2/1lsYxvb/GewjW1s86La29vjH/7hH7jmmmt413d9VwAkASCJB/qqr/oqXvzFX/x1rrnmmgdz1VVXXXXVVf/7EVx11VVXXXXV/wHv+I7v+Fl/9Ed/xIULF5DE/SQhCUk84hGP4OEPfzgAf/RHf8QLYxvb2MY2/11sYxvb2OZ/KtvYxja2sY1tbHPVVf/ZbGMb29jGNraxzf8UtrGNbWzzX8k2trHNfybb2MY2/xlsYxvb/Fv94R/+IQAv/uIvzou/+Ivz/Eji3nvv5W/+5m8e9I7v+I6fxVVXXXXVVVf970dw1VVXXXXVVf/LvdiLvdhrv87rvM57/9zP/RwAkpCEJB7ojd/4jQH4oz/6I/b29vjXsI1tbGOb/y62sY1tbGOb/+lsYxvb2MY2trHNVVe9qGxjG9vYxja2sc3/NLaxjW1sY5v/SraxjW1s85/JNraxzX8W29jmP8Le3h6//Mu/DMBHf/RHAyAJAEk80A/8wA/wOq/zOu/9Yi/2Yq/NVVddddVVV/3vRnDVVVddddVV/8u90zu902f93M/9HBcuXEASDyQJSbzSK70SD3/4wwH44z/+Y/69bGMb29jmv5NtbGMb29jmfwvb2MY2trGNbWxjG9tc9X+fbWxjG9vYxja2sY1t/qeyjW1sYxvb/FezjW1sY5v/bLaxjW3+s9jGNrb5j3bbbbdx6dIlrrnmGl7v9V6P50cS9913H1/1VV/FO73TO30WV1111VVXXfW/G8FVV1111VVX/S/2Yi/2Yq/9Yi/2Yq/98z//8wBIQhKSkMT93viN3xiAX/mVX+E/g21sYxvb/HezjW1sYxvb2OZ/I9vYxja2sY1tbGMb29jmqv+ZbGMb29jGNraxjW1s87+FbWxjG9vY5r+LbWxjm/8KtrGNbf6z2MY2tvmPZhvb2GZvb48//MM/BOBd3uVdAJAEgCQe6O/+7u84ffr0a7/Yi73Ya3PVVVddddVV/3sRXHXVVVddddX/Yu/0Tu/0Wd/93d+NJCTxQJKQxCu90itx8uRJ7rjjDh73uMfxX8E2trGNbf6nsI1tbGMb2/xfYRvb2MY2trGNbWxjG9vYxjZX/dvYxja2sY1tbGMb29jGNraxzf9WtrGNbWxjm/9OtrGNbWzzX8E2trHNfxbb2MY2/xlsY5vndvvtt3P77bdzzTXX8Hqv93o8kCQAJHHvvffygz/4g3z4h3/4d3HVVVddddVV/3sRXHXVVVddddX/Ui/2Yi/22hHx4D/6oz8CQBKSkIQk7veu7/quAPzhH/4htvnvYBvb2MY2tvmfwja2sY1tbGOb/+tsYxvb2MY2trGNbWxjG9vYxja2sY1tbGOb/w1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb2/xfYxvb2MY2trHNfyfb2MY2trHNfwXb2MY2tvnPYhvb2OY/g21sY5sXZG9vjz/8wz8E4F3e5V0AkMTz83d/93f83d/9HS/2Yi/22lx11VVXXXXV/04EV1111VVXXfW/1Du90zt91p/8yZ88WBKSeCBJSOJN3uRNALj99tu54447ALCNbWxjm/8utrGNbWzzP41tbGMb29jGNlc9J9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvbXAW2sY1tbGMb2/xPYBvb2MY2/5VsYxvb/GeyjW1s85/FNrZ5Ud1+++3cfvvtXHPNNXzUR30UDyQJAEnce++9/O3f/u2D3+md3umzuOqqq6666qr/nQiuuuqqq6666n+hF3uxF3vtF3uxF3vtP/qjPwJAEpKQhCQATp48yRu/8RsD8Ed/9Ee8ILaxjW1s89/FNraxjW1s8z+RbWxjG9vYxja2ueqq/262sY1tbGMb2/xPYhvb2MY2/5VsYxvb2OY/k21sY5v/LLaxjW3+LX7pl34JgJd4iZfgmmuuQRLPz9/93d/xYi/2Yq/94i/+4q/NVVddddVVV/3vQzl+/DhXXXXVVVdd9b/NO73TO33WPffc89J/8zd/gyQkIQlJRASSeNu3fVtuvPFG/uEf/oG/+qu/4t9KEv9TSOJ/M0lcddW/l23+t7DNfzfb/FexzX822/xHWa/X7Ozs8JCHPITNzU3+5E/+hPtJAkASBwcHALzES7wEf/qnf/ozXHXVVVddddX/LgRXXXXVVVdd9b/Q67zO67z3z/3czwEgCUlIQhIAD3/4w3nFV3xFAP7oj/6Ifw/b2MY2/91sYxvb2MY2/5vYxja2sY1tbGMb21x1FYBtbGMb29jGNraxzf9ktrGNbWzz38E2trGNbf6z2cY2tvnPYhvb2OY/2h/+4R8C8Hqv93q8+Iu/OJJ4bpL4jd/4DV78xV/8da655poHc9VVV1111VX/uxBcddVVV1111f8y7/iO7/hZf/RHf8SFCxeQxANJQhJv8iZvAsA//MM/sLe3x38U29jGNraxzX8329jGNraxjW3+N7KNbWxjG9vYxja2sc1V/3vZxja2sY1tbGMb29jGNv9b2MY2trGNbf472MY2trHNfwXb2MY2/5lsY5v/DLaxzaVLl/iDP/gDAN7lXd6FB5LE/e69917uvvvuB73jO77jZ3HVVVddddVV/7sQXHXVVVddddX/Mq/zOq/z3n/4h38IgCQkIQlJADz84Q/n4Q9/OAC/8iu/wn8229jGNrb5n8I2trGNbWzzf4FtbGMb29jGNraxjW1sY5ur/vPZxja2sY1tbGMb29jGNrb538o2trGNbWxjm/8utrGNbWzzX8U2trHNfybb2MY2/xlsY5sH+vu//3sAXuIlXoIXf/EXRxLPTRJf9VVfxYu92Iu9NlddddVVV131vwvBVVddddVVV/0v8jqv8zrvvbu7++AnP/nJSOK5SeJN3uRNAPiVX/kV/jvYxja2sc3/JLaxjW1sYxvb/F9lG9vYxja2sY1tbGMb29jGNraxjW3+v7GNbWxjG9vYxja2sY1tbGMb29jm/xrb2MY2trHNfzfb2MY2tvmvYhvb2MY2/5lsYxvb/GewjW1s8/zs7e3xS7/0SwB89Ed/NA8kifvdd9993HvvvQ9+ndd5nffmqquuuuqqq/73ILjqqquuuuqq/0Xe8R3f8bP+8A//EABJSEISkpDEK77iK/Lwhz+cvb09/v7v/x7b2MY2/11sYxvb2OZ/ItvYxja2sY1t/j+zjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjm/9vbGMb29jGNrb5n8A2trGNbf4r2cY2tvnPZhvb2OY/i21s86K4/fbbuf3227nmmmt4vdd7PSTx3CTxAz/wA7zjO77jZ3HVVVddddVV/3sQXHXVVVddddX/Eq/zOq/z3tdcc82D//iP/xhJPDdJvMmbvAkAv/zLv8xzs41tbGOb/y62sY1tbGOb/6lsYxvb2MY2trHNVVf9b2Ab29jGNraxzf8ktrGNbWzzX802trHNfzbb2MY2/1lsYxvb/GtcunSJv//7vwfgXd7lXXggSdzvvvvu4957733wi73Yi702V1111VVXXfW/A8FVV1111VVX/S/xOq/zOu/13d/93dxPEpKQhCTe+I3fmJMnT3L77bdz++238y+xjW1s89/NNraxjW1s8z+dbWxjG9vYxja2ueqq/0q2sY1tbGMb29jmfxrb2MY2trHNfzXb2MY2tvnPZhvb2OY/i21sY5t/j7//+7/n9ttv55prruGjPuqjkMRzu++++/j1X/913umd3umzuOqqq6666qr/HQiuuuqqq6666n+BF3uxF3vtF3uxF3vtP/7jP0YSknggSbzJm7wJAH/0R3/Ev5ZtbGMb2/xPYBvb2MY2tvnfwja2sY1tbGMb21x11b+WbWxjG9vYxja2sc3/ZLaxjW1s89/BNraxjW3+K9jGNrb5z2Qb2/xH+oM/+AMAXuIlXoJrrrmG+0nifn/3d3/Hi73Yi732i73Yi702V1111VVXXfU/H8FVV1111VVX/S/wOq/zOu/1R3/0R9xPEpKQhCTe7d3eDYB/+Id/4Pbbb+ffyza2sY1t/qewjW1sYxvb/G9jG9vYxja2sY1tbGObq/5/sY1tbGMb29jGNrb538I2trGNbWzz38U2trHNfxXb2MY2/5lsYxvb/Ge47bbbuO2227jmmmt4l3d5FyTx3O677z5+/dd/ndd5ndd5L6666qqrrrrqfz6Cq6666qqrrvpf4HVe53Xe++d//ueRhCQe6OTJk7ziK74iAP/wD//Afwbb2MY2tvmfxDa2sY1tbPO/nW1sYxvb2MY2trGNbWxz1f9strGNbWxjG9vYxja2sc3/RraxjW1sY5v/TraxjW1s81/FNraxzX8m29jGNv8ZbGMb2wD80i/9EgAv8RIvwYu/+ItzP0nc7wd/8Ad5sRd7sdfmqquuuuqqq/7noxw/fpyrrrrqqquu+p/sHd/xHT9rf3//tf/oj/4ISUQEkpCEJD7gAz6AkydP8g//8A/85V/+Jf9dJPE/nST+v5PEVf82tvn/xjb/E9nmv4Nt/qvY5j+bbZ6f9XrNzs4OD33oQ7nmmmv4zd/8TZ7b4eEhr/zKr3z8mmuu4R/+4R9+h6uuuuqqq676n4vgqquuuuqqq/6He53XeZ33/qM/+iMkIYkHevjDH87DH/5wAP7gD/6A/062sY1tbPM/kW1sYxvb2MY2/5/Yxja2sY1tbGMb29jGNraxjW1sYxvb2MY2tvmfzja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbf6vs41tbGMb2/xPYRvb2MY2/5VsYxvb/GezjW1s85/FNraxzQvzB3/wBwC8xEu8BC/+4i/O/SRxvx/4gR/gdV/3dd+Hq6666qqrrvqfjeCqq6666qqr/gd7ndd5nffe3d198JOe9CQAJCEJSUjiTd/0TQH4wz/8Q/b29rCNbWxjm/9OtrGNbWxjm/+pbGMb29jGNra56oWzjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2uer5s41tbGMb29jmfxLb2MY2tvmvZhvb2OY/m21sY5v/TLaxzYtqb2+PX/zFXwTgoz/6o5HEc/v7v/977r777ge9zuu8zntz1VVXXXXVVf9zEVx11VVXXXXV/2Cv8zqv815/9Ed/hCQk8UCv9EqvxMMf/nAA/vAP/5Dnxza2sY1t/rvZxja2sc3/dLaxjW1sYxvb2Oaqq/4ns41tbGMb29jGNv/T2MY2trGNbf6r2cY2trHNfzbb2MY2/5lsYxvb/FvcfvvtXLp0iWuuuYbXe73XQxIAkrjfD/7gD/KO7/iOn8VVV1111VVX/c9FcNVVV1111VX/Q73O67zOe7/Yi73Ya//RH/0RAJKQhCQk8SZv8iYA/NIv/RIvKtvYxja2+e9mG9vYxja2+d/CNraxjW1sYxvbXHXVfwXb2MY2trGNbWzzP5ltbGMb2/x3sI1tbGOb/wq2sY1t/jPZxja2+fe6dOkSf/AHfwDAu7zLu/D83Hfffdh+8Iu92Iu9NlddddVVV131PxPBVVddddVVV/0P9Tqv8zrv9T3f8z1IQhIP9Eqv9EqcPHmS22+/nX/4h3/g38o2trGNbf4nsI1tbGMb2/xvYxvb2MY2trGNbWxz1VUvCtvYxja2sY1tbGOb/w1sYxvb2MY2/11sYxvb/FexjW1s85/NNrb5j3b77bdz2223cc011/B6r/d6SAJAEgD33XcfP/iDP8g7vdM7fRZXXXXVVVdd9T8TwVVXXXXVVVf9D3TNNdc8+MVe7MVe+4/+6I8AkIQkJCGJd3u3dwPgD//wD/mPZBvb2MY2/1PYxja2sY1t/jezjW1sYxvb2MY2trHNVf+32cY2trGNbWxjG9vY5n8b29jGNraxzX8n29jGNrb5r2Ib29jmP5ttbGOb/wy22d3d5Q/+4A8AeJd3eReen7/7u7/jxV7sxV77xV7sxV6bq6666qqrrvqfh3L8+HGuuuqqq6666n+a93mf9/mqe+6556X/9m//FklIQhKSeNM3fVMe8YhHcPvtt/OHf/iH/FeSxP90kvj/RhJX/c9gm/8PbPM/jW3+u9jmv4pt/rPZ5oEuXbrELbfcwg033MA111zDn/zJnwAgCYDDw0OuueYaHvrQh/Knf/qnP8NVV1111VVX/c9CcNVVV1111VX/A73O67zOe//8z/88AJKQhCROnTrFm7zJmwDwh3/4h/xXs41tbGOb/4lsYxvb2MY2/9fZxja2sY1tbGMb29jGNraxjW1sc9ULZhvb2MY2trGNbWxjG9vYxja2sc3/NbaxjW1sYxvb/E9gG9vYxjb/1WxjG9v8Z7ONbWzzn8U2trHN8/OLv/iLALzES7wE11xzDc/tB3/wB3mxF3ux1+aqq6666qqr/uehHD9+nKuuuuqqq676n+R1Xud13ru19tZ//Md/jCQkIQlJvN3bvR033XQTf//3f89f/MVfACCJ/ykk8b+JJK76zyOJ/yy2ueo/lm3+J7PNfyfb/FeyzX8F27wo1us1x44d46EPfSibm5v8yZ/8CQCSADg8POSVX/mVj19zzTX8wz/8w+9w1VVXXXXVVf9zEFx11VVXXXXV/zDv+I7v+Fl/9Ed/xP0kIYlHPOIRvNIrvRIAf/iHf8j9bGMb2/x3s41tbGMb2/xPZhvb2MY2trGNba7697ONbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2V/3b2cY2trGNbWzzP41tbGMb2/x3sI1tbPNfwTa2sc1/JtvYxjb/Gn/wB38AwOu93uvx4i/+4jy3H/zBH+R1Xud13purrrrqqquu+p+F4Kqrrrrqqqv+B3md13md997d3X3wk5/8ZCQhifu9yZu8CQB///d/z6VLl3h+bGMb29jmfwLb2MY2tvnfwja2sY1tbGObq67638A2trGNbWxjG9v8T2Qb29jGNrb572Ab29jGNv8VbGMb2/xnso1tbPNvdenSJX7/938fgHd5l3dBEgCSAPi7v/s77r333ge/+Iu/+Gtz1VVXXXXVVf9zEFx11VVXXXXV/yCv8zqv815/9Ed/xP0kIYlHPOIRPOIRjwDgl37pl3hR2cY2trHN/wS2sY1tbGOb/01sYxvb2MY2trGNba666r+KbWxjG9vYxja2+Z/ONraxjW3+O9nGNrb5r2Ib29jmP5ttbPMf5e///u8BeImXeAle/MVfnOf267/+63z4h3/4d3PVVVddddVV/3MQXHXVVVddddX/EC/2Yi/22i/2Yi/22n/8x3+MJCRxvzd5kzcB4Jd+6Zf497CNbWxjm/8pbGMb29jGNv9b2cY2trGNbWxjG9tcddWLyja2sY1tbGMb29jmfwvb2MY2trHNfyfb2MY2tvmvYhvb2OY/m21sY5v/aJcuXeIXf/EXAfjoj/5oJAEgCYC/+7u/IzMf9GIv9mKvzVVXXXXVVVf9z0Bw1VVXXXXVVf9DvM7rvM57/fzP/zz3k4QkXvmVX5lHPOIRXLp0ib//+7/nP5JtbGMb2/xPYhvb2MY2trHN/3a2sY1tbGMb29jGNra56v8+29jGNraxjW1sYxvb/G9kG9vYxja2+e9mG9vYxjb/lWxjG9v8Z7ONbWzzn8k2z3jGM7jtttu45ppreL3Xez0e6L777uMHf/AHead3eqfP4qqrrrrqqqv+ZyC46qqrrrrqqv8hXud1Xue9//iP/xhJSOJ+b/ImbwLAL/3SL/GfzTa2sY1t/ieyjW1sYxvb/F9jG9vYxja2sY1tbGMb29jmqv85bGMb29jGNraxjW1sYxvb/F9gG9vYxja2+Z/ANraxjW3+q9nGNrb5z2Yb29jmP5NtbGMbgEuXLvF3f/d3ALzLu7wLkgCQBMDf/d3fcebMmQe/2Iu92Gtz1VVXXXXVVf/9KMePH+eqq6666qqr/rt9+Id/+Hfdc889L/3Hf/zHSCIikMSbvumb8pIv+ZLcfvvt/OEf/iH/3STxv4kkrnrBJHHV87LNVc9mm//JbPPfyTb/1Wzzn802L8x9993HLbfcwg033MA111zDH//xH3O/w8NDHvKQhxx/6EMfyp/+6Z/+DFddddVVV13134vgqquuuuqqq/4HeJ3XeZ33/oVf+AUkIYn7vcmbvAkAv//7v49t/rvZxja2sY1t/iezjW1sYxvb2OaqK2xjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vY5t/KNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW3+P7ONbWxjG9v8T2Mb29jGNv8dbGMb2/xXsY1tbPOfyTa2eVH8/u//PgAv8RIvwbXXXguAJAB+8Ad/kBd7sRd7ba666qqrrrrqvx/l+PHjXHXVVVddddV/p9d5ndd579baW//xH/8xkogIJPHu7/7u3HTTTfz93/89f/EXf8HzI4n/aSTxv5Ukrrrq/wPb/G9hm/8JbPNfzTb/FWzzb3Hp0iVuueUWbrjhBjY3N/njP/5j7nd4eMgrv/IrH5f0jFtvvfWvueqqq6666qr/PgRXXXXVVVdd9d/sHd/xHT/rj//4j5GEJABOnjzJK73SKwHwd3/3d7wgtrGNbWzzP4FtbGMb29jmfwvb2MY2trGNbWxz1VX/29jGNraxjW1sY5v/qWxjG9vYxjb/XWxjG9vY5r+KbWxjm/9MtrGNbf49fuEXfgGAl3iJl+AlXuIlAJAEwA/+4A/yju/4jp/FVVddddVVV/33Irjqqquuuuqq/0av8zqv896llAc/6UlP4n6SePd3f3cA/v7v/57bb7+dF5VtbGMb2/xPYRvb2MY2tvnfxja2sY1tbGMb21x11X8X29jGNraxjW1s87+BbWxjG9v8d7KNbWxjm/9KtrGNbf6z2cY2/1EuXbrE3/3d33HNNdfwLu/yLtxPEn/3d3/Hvffe++AXe7EXe22uuuqqq6666r8PwVVXXXXVVVf9N3qd13md9/qFX/gFJCEJSTziEY/gEY94BAB/8Ad/wL+HbWxjG9v8T2Ib29jGNrb538o2trGNbWxjG9vYxjZXXfVvYRvb2MY2trGNbWzzv4ltbGMb29jmv5ttbGOb/0q2sY1tbPOfzTa2sc1/ht///d8H4CVe4iV4iZd4CR7o13/913mnd3qnz+Kqq6666qqr/vsQXHXVVVddddV/kxd7sRd77Rd7sRd77T/6oz/ifpJ4kzd5EwD+4A/+gEuXLvEfyTa2sY1t/qexjW1sYxvb/F9hG9vYxja2sY1tbGObq/5/sY1tbGMb29jGNraxzf9WtrGNbWxjm/8JbGMb29jmv5JtbGOb/wq2sY1t/jPZZnd3l5//+Z8H4KM/+qO5nyT+7u/+jhd7sRd77Rd/8Rd/ba666qqrrrrqvwfBVVddddVVV/03eZ3XeZ33+qM/+iMkIQlJvNIrvRKPeMQjAPiDP/gD/rPZxja2sc3/RLaxjW1sYxvb/F9kG9vYxja2sY1tbGMb29jmqv+ZbGMb29jGNraxjW1sYxvb/F9hG9vYxja2+Z/CNraxjW3+q9nGNrb5r2Ab29jmP5NtbGOb+912221cunSJa665htd//dfnfvfddx8/+IM/yGu/9mu/F1ddddVVV13134Pgqquuuuqqq/6bvM7rvM57/8Iv/AL3k8SbvumbAvCLv/iL/HewjW1sY5v/yWxjG9vYxjb/n9jGNraxjW1sYxvb2MY2trGNbWxz1YvGNraxjW1sYxvb2MY2trGNbWxjm//rbGMb29jGNv+T2MY2trHNfwfb2MY2/1VsY5v/bLaxzfNz6dIlfu/3fg+Ad3mXd+F+kvj1X/91XvzFX/x1rrnmmgdz1VVXXXXVVf/1KMePH+eqq6666qqr/qt9+Id/+Hfdc889L/0nf/InSEISr/zKr8wrvdIrcdttt/Ebv/EbAEjifxpJ/G8jiav+a0jiv4ptrvrPYZv/DWzz3802/x1s81/BNi+q9XrNtddeyw033MDZs2d52tOeBsDh4SEPechDjr/ES7zE8T/90z/9Ga666qqrrrrqvxbBVVddddVVV/03eJ3XeZ33/uM//mMe6N3f/d0B+IM/+APuZxvb2OZ/CtvYxja2+d/ANraxjW1sYxvbXPUfyza2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sc1V/362sY1tbGMb2/xPZRvb2MY2/11sYxvb/FeyjW1s85/NNrb517h06RK/93u/B8C7vMu7cD9J/OAP/iAv9mIv9tpcddVVV1111X89gquuuuqqq676L/Y6r/M67/2kJz2JJz/5yUhCEm/6pm8KwG233cZtt93G82Mb29jGNv9T2MY2trGNbf43sY1tbGMb29jmqqv+r7CNbWxjG9vYxjb/k9nGNraxjW3+u9jGNraxzX8l29jGNv/ZbGMb2/xb3Xbbbdx2221cc801fPRHfzT3u++++7j33nsf/Dqv8zrvzVVXXXXVVVf91yK46qqrrrrqqv9i7/iO7/hZv/ALv8D9Tp48yZu+6ZsC8Ad/8Ae8qGxjG9vY5n8S29jGNraxzf82trGNbWxjG9vYxjZXXfU/iW1sYxvb2MY2tvnfwja2sY1t/rvZxja2+a9mG9vY5j+bbWxjm/8oP//zPw/AS7zES3DNNdcAIIkf/MEf5B3f8R0/i6uuuuqqq676r0Vw1VVXXXXVVf+FXud1Xue9SykPfvKTn4wkJPFmb/ZmAPzd3/0dt912G/9WtrGNbWzzP41tbGMb29jmfzPb2MY2trGNbWxjm6uu+o9kG9vYxja2sY1tbPO/jW1sYxvb2Oa/m21sYxvb/FeyjW1sY5v/CraxzX+GS5cu8Xd/93dcc801vOu7viv3u/fee7n33nsf/GIv9mKvzVVXXXXVVVf91yG46qqrrrrqqv9Cr/M6r/Nev/ALv8D9HvGIR/BKr/RKAPzBH/wB/5FsYxvb2OZ/ItvYxja2sc3/FbaxjW1sYxvb2MY2trnqKgDb2MY2trGNbWxjG9v8b2Yb29jGNrb5n8A2trGNbf6r2cY2tvmvYhvb2OY/k21+93d/F4DXe73X4yVe4iUAOHv2LL/+67/OO73TO30WV1111VVXXfVfh+Cqq6666qqr/ou82Iu92Gu/2Iu92Gv/8R//MZKQxJu+6ZsC8Hd/93dcunSJ/0y2sY1tbPM/lW1sYxvb2Ob/KtvYxja2sY1tbGMb29jmqv+dbGMb29jGNraxjW1sY5v/S2xjG9vYxjb/k9jGNrb572Ab29jmv4ptbGOb/0y2sY1tAC5dusTv/d7vAfAu7/Iu3O/v/u7veLEXe7HXfrEXe7HX5qqrrrrqqqv+axBcddVVV1111X+R13md13mvP/qjP+J+j3jEI3jEIx4BwC/+4i/yX802trGNbf4ns41tbGMb29jm/wvb2MY2trGNbWxjG9vYxja2sc1V//FsYxvb2MY2trGNbWxjG9vY5v8629jGNraxzf80trGNbWzz38E2trHNfxXb2MY2/9lsY5vn52//9m8BeImXeAle4iVeAoCzZ8/ygz/4g7zO67zOe3HVVVddddVV/zUIrrrqqquuuuq/yOu8zuu89y/+4i8iCUm86Zu+KQC/8Au/wP8EtrGNbWxjm//pbGMb29jGNra5CmxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb/G9mG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2Ob/K9vYxja2sY1t/qexjW1sYxvb/HewjW1sY5v/KraxjW3+s9nGNrZ5YS5dusTP//zPA/DRH/3R3O/Xf/3XebEXe7HXvuaaax7MVVddddVVV/3noxw/fpyrrrrqqquu+s/2ju/4jp+1v7//2n/8x3+MJF7lVV6F13md1+HSpUv8wi/8As9NEv8TSeJ/M0lcddVVz59t/jexzf8UtvnvYJv/Srb511qtVlx77bXceOON3HfffTz96U/n6OiIV37lVz7+kIc85Pif/umf/gxXXXXVVVdd9Z+L4Kqrrrrqqqv+C7zO67zOe//xH/8xkpDEm77pmwLwC7/wCzw/trGNbWzzP4VtbGMb29jmfxPb2MY2trGNbWxz1VX/H9jGNraxjW1sY5v/6WxjG9vY5r+bbWxjm/9KtrGNbf4r2MY2tvm3uHTpEn/3d38HwLu+67tyvx/8wR/kxV/8xV+Hq6666qqrrvrPR3DVVVddddVV/8le53Ve5713d3cf/OQnPxmAN33TN+XkyZPcdttt3HbbbbwobGMb2/xPYxvb2MY2/1vZxja2sY1tbGObq67638Y2trGNbWxjm/8tbGMb29jGNv/dbGMb29jmv5JtbGOb/wq2sY1t/iP87d/+Lc94xjO45ppr+OiP/mgA/v7v/5577rnnQa/zOq/z3lx11VVXXXXVfy6Cq6666qqrrvpP9o7v+I6f9cd//MdIQhJv+qZvCsDv//7v829hG9vYxjb/09jGNraxjW3+t7ONbWxjG9vYxja2ueqq/2q2sY1tbGMb29jGNv/b2MY2trHN/wS2sY1tbPNfzTa2sc1/FdvY5j/D7/3e7wHwEi/xElxzzTUA/OAP/iDv+I7v+FlcddVVV1111X8ugquuuuqqq676T/Q6r/M6733NNdc8+I//+I8BePd3f3cA/u7v/o7bbruN/wi2sY1tbPM/kW1sYxvb2MY2/1fYxja2sY1tbGMb21x11b+WbWxjG9vYxja2sc3/ZraxjW1sY5v/KWxjG9v8d7CNbWzzX8U2trHNf6ZnPOMZPOMZz+Caa67hXd/1XQG47777uPfeex/8Yi/2Yq/NVVddddVVV/3nIbjqqquuuuqq/0Sv8zqv817f+73fiyROnTrFK7/yKwPwd3/3d/xnsY1tbGOb/8lsYxvb2MY2/xfZxja2sY1tbGMb29jGNlf932cb29jGNraxjW1sYxvb/F9hG9vYxja2+Z/ENraxjW3+O9jGNrb5r2Ib29jmP5ttbAPwcz/3cwC8xEu8BC/xEi/Bfffdx6//+q/zTu/0Tp/FVVddddVVV/3nIbjqqquuuuqq/yTXXHPNg1/sxV7stf/4j/8YgPd4j/cA4O/+7u+47bbb+K9iG9vYxja2+Z/MNraxjW1s8/+FbWxjG9vYxja2sY1tbGMb21z1P4NtbGMb29jGNraxjW1sY5v/y2xjG9vYxjb/09jGNraxzX8H29jGNrb5r2Ib29jmP5ttbGObB7p06RJ/+7d/yzXXXMO7vMu7APD3f//3vNiLvdhrv9iLvdhrc9VVV1111VX/OQiuuuqqq6666j/JO77jO37WH//xHyOJRz7ykTziEY8A4Pd///f572Yb29jGNv/T2cY2trGNbWzz/51tbGMb29jGNraxjW1sYxvb2MY2trnq2WxjG9vYxja2sY1tbGMb29jGNraxjW3+v7GNbWxjG9vY5n8i29jGNrb572Ib29jmv5JtbGOb/wq2sc0L87u/+7sAvMRLvAQv8RIvwX333cev//qv8zqv8zrvxVVXXXXVVVf95yC46qqrrrrqqv8kr/M6r/Pev/ALvwDAm77pmwLwe7/3e+zu7mIb2/xPYRvb2MY2/1vYxja2sY1tbHPVv8w2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxzVXPn21sYxvb2MY2/5PZxja2sc1/J9vYxjb/lWxjG9v8V7CNbWzzorh06RI/93M/B8BHf/RHA/BDP/RDvNiLvdhrc9VVV1111VX/OQiuuuqqq6666j/B67zO67z3H//xH3PhwgVe5VVehUc84hEA/P7v/z4PZBvb2MY2/1PYxja2sY1t/jexjW1sYxvb2MY2V1111XOyjW1sYxvb2OZ/OtvYxja2sc1/J9vYxja2+a9kG9vY5r+CbWxjm3+LZzzjGVy6dIlrrrmG13u91+O+++7j3nvvffA7vuM7fhZXXXXVVVdd9R+P4Kqrrrrqqqv+E7zjO77jZ/3RH/0RAG/yJm8CwM///M/zL7GNbWzzP41tbGMb29jmfyPb2MY2trGNbWxz1VX/V9nGNraxjW1sY5v/LWxjG9vY5n8C29jGNv/VbGMb2/xXsY1t/r0uXbrE7/7u7wLwru/6rgD80A/9EK/zOq/z3lx11VVXXXXVfzyCq6666qqrrvoP9jqv8zrvvbu7++CnPOUpvMqrvAqnTp3itttu4+/+7u/417CNbWxjm/+JbGMb29jGNv+b2cY2trGNbWxjm6uu+p/ONraxjW1sYxvb/G9jG9vYxja2+Z/ANraxjW3+q9nGNrb5r2Ib29jmP9IznvEMnvGMZ3DNNdfweq/3evzd3/0d995774Nf53Ve57256qqrrrrqqv9YBFddddVVV131H+x1Xud13uuP//iPAXj3d393AH7v936Pfy/b2MY2tvmfyja2sY1tbPN/gW1sYxvb2MY2trHNVVf9Z7ONbWxjG9vYxja2+d/MNraxjW3+p7CNbWxjm/8OtrGNbf6r2MY2tvnPcunSJX7v934PgHd913cF4Dd+4zd4p3d6p8/mqquuuuqqq/5jEVx11VVXXXXVf6AXe7EXe+0Xe7EXe+0/+ZM/4c3e7M0AuO2227jtttv4j2Yb29jGNv+T2cY2trGNbf6vsY1tbGMb29jGNraxjW2uuur5sY1tbGMb29jGNraxzf8VtrGNbWxjm/9JbGMb2/x3sY1tbPNfyTa2+a9gm1tvvZVnPOMZXHPNNXz0R380f/d3f0dmPujFXuzFXpurrrrqqquu+o9DcNVVV1111VX/gd7pnd7ps37hF36BU6dO8aZv+qYA/N7v/R7/FWxjG9vY5n8629jGNraxzf8HtrGNbWxjG9vYxja2sc1V/zfYxja2sY1tbGMb29jGNv8X2cY2trGNbWzzP41tbGMb2/x3sY1tbPNfyTa2sc1/NtvYxjb3+7mf+zkAXuIlXgKAH/qhH+Kd3umdPourrrrqqquu+o9DcNVVV1111VX/Qa655poHv9iLvdhr/8mf/Alv+qZvCsDf/d3fcdttt/HfwTa2sY1tbPM/nW1sYxvb2MY2/x/Zxja2sY1tbGMb29jGNraxjW2u+s9lG9vYxja2sY1tbGMb29jGNrb5/8I2trGNbWzzP5VtbGMb2/x3sY1tbGOb/0q2sY1t/ivYxjbPz+7uLn/zN3/DNddcw7u+67vyd3/3d5w5c+bBL/ZiL/baXHXVVVddddV/DMrx48e56qqrrrrqqv8I7/M+7/NV995770ufP3+et3/7twfgx3/8x1mv1/xPJYn/zSRx1X8OSfxfYZur/mPY5n8b2/xPYZv/Lrb5r2SbF9V9993HK77iK/LQhz6UP/mTP2Fzc/P4Qx/6UP70T//0Z7jqqquuuuqqfz+Cq6666qqrrvoP8jqv8zrv/Yu/+Iu82Zu9GQB/+7d/y6VLl7CNbWxjm/9JbGMb29jGNv+b2MY2trGNbWxz1b+fbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjm6v+9WxjG9vYxja2+Z/ONraxjW1s89/NNraxzX8129jGNv8VbGMb2/xr7O7u8ru/+7sAvOu7vis/+IM/yIu92Iu9NlddddVVV131H4Pgqquuuuqqq/4DvM7rvM57//Ef/zEnT57kEY94BAA///M/z/NjG9vYxjb/09jGNraxzf9GtrGNbWxjG9vY5qqrrno229jGNraxjW3+t7CNbWxjm/8JbGMb29jmv5ptbGOb/yq2sc2/x9/+7d8C8OIv/uJce+213HvvvQ9+ndd5nffmqquuuuqqq/79CK666qqrrrrqP8A7vuM7ftYf//Ef82Zv9mYA/PzP/zwvKtvYxja2+Z/GNraxjW1s87+ZbWxjG9vYxja2ueqq/4tsYxvb2MY2trHN/za2sY1tbPM/gW1sYxvb/HewjW1s81/FNraxzX+E3d1dfvZnfxaAj/7oj+aHfuiHeMd3fMfP4qqrrrrqqqv+/Qiuuuqqq6666t/pdV7ndd57d3f3wadOneIRj3gEly5d4m//9m/5t7KNbWxjm/+JbGMb29jGNv8X2MY2trGNbWxjm6uu+p/MNraxjW1sYxvb/G9lG9vYxja2+Z/CNraxzX8X29jGNv9VbGMb2/xnuO2223jGM57BNddcwzXXXMO999774Bd7sRd7ba666qqrrrrq34fgqquuuuqqq/6dXud1Xue9/viP/5g3fdM3BeDnfu7n+I9kG9vYxjb/U9nGNraxjW3+L7GNbWxjG9vYxja2sc1VV/1nsI1tbGMb29jGNraxzf92trGNbWxjm/9JbGMb29jmv4ttbGOb/0q2sc1/tt3dXf7mb/4GgHd913flN37jN3ind3qnz+Kqq6666qqr/n0Irrrqqquuuurf4cVe7MVe+8Ve7MVe+9SpU5w6dYpnPOMZ3Hbbbfxnso1tbGOb/8lsYxvb2MY2/5fZxja2sY1tbGMb29jmqqseyDa2sY1tbGMb29jGNv/X2MY2trGNbf6nsY1tbGOb/y62sY1tbPNfyTa2sc1/Fdv8zd/8Dc94xjO45ppreL3Xez1e7MVe7LVf/MVf/LW56qqrrrrqqn87gquuuuqqq676d3id13md9/qFX/gF3uzN3gyA3/u93+O/mm1sYxvb/E9nG9vYxja2sc3/F7axjW1sYxvb2MY2trGNbWxz1f8+trGNbWxjG9vYxja2sY1t/q+zjW1sYxvb/E9kG9vYxjb/nWxjG9v8V7ONbWzzX8k2trnf7/zO7wBw7bXX8hu/8Ru84zu+42dz1VVXXXXVVf92BFddddVVV1317/A6r/M67/3IRz4SgL/927/ltttu47+bbWxjG9v8b2Eb29jGNra5CmxjG9vYxja2sY1tbGMb29jGNra56j+GbWxjG9vYxja2sY1tbGMb29jm/yPb2MY2trGNbf6nso1tbGOb/262sY1t/qvZxja2+a9kG9vY5rk94xnP4BnPeAbXXHMN11xzDddcc82DX+zFXuy1ueqqq6666qp/G8rx48e56qqrrrrqqn+LD//wD/+uaZpe+hGPeAQAv/Zrv8bu7i4AkvifTBL/m0niqv8ekvifyDZX/dewzf82tvmfxDb/nWzz38U2L4pnPOMZvNIrvRKSAI5vbm7yp3/6pz/DVVddddVVV/3rUbnqqquuuuqqf6PXeZ3XeW+e6W//9m95xjOewf1s80CS+J/ENg8kif9NbPOCSOKq/zy2uer/B9v8b2Wb/2ls89/JNv9dbPOvtbu7y9/8zd/wUi/1Utx333282Iu92Gtz1VVXXXXVVf82BFddddVVV131b/A6r/M6780D/O7v/i4vjG1sY5v/iWxjG9vYxjb/W9nGNraxjW1sY5urrrrqOdnGNraxjW1sY5v/TWxjG9vY5n8C29jGNrb572Ab29jmv5ptbGObf6vf/d3fBeCaa67hmmuuefDrvM7rvDdXXXXVVVdd9a9HcNVVV1111VX/Bu/4ju/4WTzT7/7u73Lp0iVeVLaxjW1s8z+VbWxjG9v8X2Ab29jGNraxjW2uuur/KtvYxja2sY1tbPO/kW1sYxvb2OZ/CtvYxjb/XWxjG9v8d7CNbf4j7O7u8rM/+7Pc7x3f8R0/i6uuuuqqq6761yO46qqrrrrqqn+l13md13nva6655sE80+/93u/x72Eb29jGNv9T2cY2trGNbf4vsY1tbGMb29jGNra56qr/qWxjG9vYxja2sY1t/jezjW1sYxvb/E9iG9vYxjb/XWxjG9v8d7CNbWzzH+0Zz3gGu7u7AFxzzTUPfrEXe7HX5qqrrrrqqqv+dQiuuuqqq6666l/pdV7ndd6LZ/q5n/s5/qPZxja2sc3/ZLaxjW1sYxvb/F9kG9vYxja2sY1tbHPVVf9ZbGMb29jGNraxjW3+r7CNbWxjG9v8T2Mb29jGNv+dbGMb2/x3sI1tbPOfaXd3l9/93d/lfu/0Tu/0WVx11VVXXXXVvw7BVVddddVVV/0rvNiLvdhrv9iLvdhrAzzjGc/gb//2b/nPZhvb2MY2/xvYxja2sY1t/q+zjW1sYxvb2MY2trGNba666oFsYxvb2MY2trGNbWzzf5FtbGMb29jmfyrb2MY2/51sYxvb2Oa/g21sY5v/KrZ5+tOfzq233grAi73Yi732i73Yi702V1111VVXXfWiI7jqqquuuuqqf4XXeZ3XeS+e6fd+7/f472Ab29jGNrb538A2trGNbWzz/5FtbGMb29jGNraxjW1sY5ur/neyjW1sYxvb2MY2trGNbWzz/4FtbGMb29jmfzLb2MY2tvnvZBvb2Oa/i21sY5v/KraxjW0ALl26xO/8zu9wv9d5ndd5L6666qqrrrrqRUdw1VVXXXXVVf8Kr/M6r/PeAM94xjN4xjOewf8UtrGNbWzzv4VtbGMb29jGNlddYRvb2MY2trGNbWxjG9vYxja2sY1trvr3sY1tbGMb29jGNraxjW1sYxvb2MY2/5/Zxja2sY1t/qezjW1sY5v/braxjW3+O9nGNv9VbGMb2zw/z3jGM7j11lsBeLEXe7HXvuaaax7MVVddddVVV71oCK666qqrrrrqRfSO7/iOn8Uz/e7v/i62sY1t/qexjW1sY5v/bWxjG9vYxja2uepFZxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1s8z+BbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trnqhbONbWxjG9vY5n8629jGNraxzX8329jGNrb572Qb29jmv4ptbPOi+Nmf/VkArrnmmge/4zu+42dx1VVXXXXVVS8aKlddddVVV131Inqd13md9wb4m7/5G57xjGfwQLZ5IEn8T2Kb5yaJ/21s84JI4qr/Ora56v8+2/xvZpv/iWzzP4Vt/qvZ5t9id3eXv/mbv+GlXuqlePEXf/HX4aqrrrrqqqteNARXXXXVVVdd9SJ4ndd5nfe+5pprHgzwe7/3e/xLbGMb29jmfyLb2MY2trHN/2a2sY1tbGMb21x11VUvnG1sYxvb2MY2tvnfxja2sY1t/qewjW1sY5v/braxjW3+q9jGNrb59/id3/kdAM6cOfOg13md13lvrrrqqquuuupfRuWqq6666qqrXgTv+I7v+FkAz3jGMwA4fvw4/x9I4v86SVx11f91tvm/xjZXvehs89/BNv/R/uZv/oaXeqmX4h3f8R0/67d+67e+m6uuuuqqq6564ahcddVVV1111b/gmmuueTDP9KAHPYgP//AP56qrrrrqqquu+u93zTXXPPi+++67lauuuuqqq656wdCDHvQgrrrqqquuuupf8mIv9mKv/eEf/uHfxVVXXXXVVVdd9T/Cj/7oj37Ob/3Wb303V1111VVXXfXCoQc96EFcddVVV1111VVXXXXVVVddddVVV1111VX/J1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fxT8CVFr/nMHIqvMAAAAASUVORK5CYII=) diff --git a/docs/kcl/translate.md b/docs/kcl/translate.md index 0687f8086..57eba313b 100644 --- a/docs/kcl/translate.md +++ b/docs/kcl/translate.md @@ -45,9 +45,9 @@ translate( sweepPath = startSketchOn(XZ) |> startProfileAt([0.05, 0.05], %) |> line(end = [0, 7]) - |> tangentialArc({ offset = 90, radius = 5 }, %) + |> tangentialArc(angle = 90, radius = 5) |> line(end = [-3, 0]) - |> tangentialArc({ offset = -90, radius = 5 }, %) + |> tangentialArc(angle = -90, radius = 5) |> line(end = [0, 7]) // Create a hole for the pipe. @@ -97,7 +97,7 @@ circleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63) sketch002 = startSketchOn(YZ) sweepPath = startProfileAt([0, 0], sketch002) |> yLine(length = 231.81) - |> tangentialArc({ radius = 80, offset = -90 }, %) + |> tangentialArc(radius = 80, angle = -90) |> xLine(length = 384.93) parts = sweep([rectangleSketch, circleSketch], path = sweepPath) diff --git a/e2e/playwright/editor-tests.spec.ts b/e2e/playwright/editor-tests.spec.ts index 916a39c1a..d0936c1f1 100644 --- a/e2e/playwright/editor-tests.spec.ts +++ b/e2e/playwright/editor-tests.spec.ts @@ -920,7 +920,7 @@ sketch001 = startSketchOn(XZ) `sketch001 = startSketchOn(XZ) |> startProfileAt([4.61, -14.01], %) |> line(end = [12.73, -0.09]) - |> tangentialArcTo([24.95, -5.38], %) + |> tangentialArc(endAbsolute = [24.95, -5.38]) |> close()` ) }) @@ -969,7 +969,7 @@ sketch001 = startSketchOn(XZ) // expect the code to have changed await expect(page.locator('.cm-content')).toHaveText( - `sketch001 = startSketchOn(XZ) |> startProfileAt([4.61, -14.01], %) |> line(end = [12.73, -0.09]) |> tangentialArcTo([24.95, -5.38], %) |> close()extrude001 = extrude(sketch001, length = 5)` + `sketch001 = startSketchOn(XZ) |> startProfileAt([4.61, -14.01], %) |> line(end = [12.73, -0.09]) |> tangentialArc(endAbsolute = [24.95, -5.38]) |> close()extrude001 = extrude(sketch001, length = 5)` ) // Now hit undo @@ -982,7 +982,7 @@ sketch001 = startSketchOn(XZ) .toHaveText(`sketch001 = startSketchOn(XZ) |> startProfileAt([4.61, -14.01], %) |> line(end = [12.73, -0.09]) - |> tangentialArcTo([24.95, -5.38], %) + |> tangentialArc(endAbsolute = [24.95, -5.38]) |> close()`) }) @@ -998,7 +998,7 @@ sketch001 = startSketchOn(XZ) sketch001 = startSketchOn(XZ) |> startProfileAt([4.61, -10.01], %) |> line(end = [12.73, -0.09]) - |> tangentialArcTo([24.95, -0.38], %) + |> tangentialArc(endAbsolute = [24.95, -0.38]) |> close() |> extrude(length = 5)` ) @@ -1072,7 +1072,7 @@ sketch001 = startSketchOn(XZ) // we wait so it saves the code await page.waitForTimeout(800) - // drag tangentialArcTo handle + // drag tangentialArc handle const tangentEnd = await u.getBoundingBox('[data-overlay-index="1"]') await page.dragAndDrop('#stream', '#stream', { sourcePosition: { x: tangentEnd.x + 10, y: tangentEnd.y - 5 }, @@ -1089,7 +1089,7 @@ sketch001 = startSketchOn(XZ) `sketch001 = startSketchOn(XZ) |> startProfileAt([2.71, -2.71], %) |> line(end = [15.4, -2.78]) - |> tangentialArcTo([27.6, -3.05], %) + |> tangentialArc(endAbsolute = [27.6, -3.05]) |> close() |> extrude(length = 5)`, { shouldNormalise: true } @@ -1104,7 +1104,7 @@ sketch001 = startSketchOn(XZ) `sketch001 = startSketchOn(XZ) |> startProfileAt([2.71, -2.71], %) |> line(end = [15.4, -2.78]) - |> tangentialArcTo([24.95, -0.38], %) + |> tangentialArc(endAbsolute = [24.95, -0.38]) |> close() |> extrude(length = 5)`, { shouldNormalise: true } @@ -1119,7 +1119,7 @@ sketch001 = startSketchOn(XZ) `sketch001 = startSketchOn(XZ) |> startProfileAt([2.71, -2.71], %) |> line(end = [12.73, -0.09]) - |> tangentialArcTo([24.95, -0.38], %) + |> tangentialArc(endAbsolute = [24.95, -0.38]) |> close() |> extrude(length = 5)`, { shouldNormalise: true } @@ -1135,7 +1135,7 @@ sketch001 = startSketchOn(XZ) `sketch001 = startSketchOn(XZ) |> startProfileAt([4.61, -10.01], %) |> line(end = [12.73, -0.09]) - |> tangentialArcTo([24.95, -0.38], %) + |> tangentialArc(endAbsolute = [24.95, -0.38]) |> close() |> extrude(length = 5)`, { shouldNormalise: true } diff --git a/e2e/playwright/point-click.spec.ts b/e2e/playwright/point-click.spec.ts index aad952cd7..4c3147a84 100644 --- a/e2e/playwright/point-click.spec.ts +++ b/e2e/playwright/point-click.spec.ts @@ -550,7 +550,7 @@ openSketch = startSketchOn(XY) |> startProfileAt([-5, 0], %) |> line(endAbsolute = [0, 5]) |> xLine(length = 5) - |> tangentialArcTo([10, 0], %) + |> tangentialArc(endAbsolute = [10, 0]) ` const viewPortSize = { width: 1000, height: 500 } await page.setBodyDimensions(viewPortSize) @@ -634,8 +634,8 @@ openSketch = startSketchOn(XY) // Wait for enter sketch mode to complete await page.waitForTimeout(500) await editor.expectState({ - activeLines: [`|>tangentialArcTo([10,0],%)`], - highlightedCode: 'tangentialArcTo([10,0],%)', + activeLines: [`|>tangentialArc(endAbsolute=[10,0])`], + highlightedCode: 'tangentialArc(endAbsolute=[10,0])', diagnostics: [], }) }) @@ -1624,7 +1624,7 @@ profile001 = circle(sketch001, center = [0, 0], radius = 500) sketch002 = startSketchOn(XZ) |> startProfileAt([0, 0], %) |> xLine(length = -500) - |> tangentialArcTo([-2000, 500], %)`, + |> tangentialArc(endAbsolute = [-2000, 500])`, }, { targetType: 'rectangle', @@ -1640,7 +1640,7 @@ profile001 = startProfileAt([-400, -400], sketch001) sketch002 = startSketchOn(XZ) |> startProfileAt([0, 0], %) |> xLine(length = -500) - |> tangentialArcTo([-2000, 500], %)`, + |> tangentialArc(endAbsolute = [-2000, 500])`, }, ] sweepCases.map(({ initialCode, targetType, testPoint }) => { diff --git a/e2e/playwright/sketch-tests.spec.ts b/e2e/playwright/sketch-tests.spec.ts index 0229484bb..47b28cdc6 100644 --- a/e2e/playwright/sketch-tests.spec.ts +++ b/e2e/playwright/sketch-tests.spec.ts @@ -63,7 +63,7 @@ test.describe('Sketch tests', { tag: ['@skipWin'] }, () => { part002 = startSketchOn(-XZ) ${startProfileAt3} |> xLine(length = width / 4) - |> tangentialArcTo([width / 2, 0], %) + |> tangentialArc(endAbsolute = [width / 2, 0]) |> xLine(length = -width / 4 + wireRadius) |> yLine(length = wireOffset) |> arc({ @@ -119,7 +119,7 @@ test.describe('Sketch tests', { tag: ['@skipWin'] }, () => { sketch001 = startSketchOn(XZ) |> startProfileAt([2.61, -4.01], %) |> xLine(length = 8.73) - |> tangentialArcTo([8.33, -1.31], %)` + |> tangentialArc(endAbsolute = [8.33, -1.31])` ) }) @@ -130,7 +130,7 @@ sketch001 = startSketchOn(XZ) await expect(async () => { await page.mouse.click(700, 200) - await page.getByText('tangentialArcTo([8.33, -1.31], %)').click() + await page.getByText('tangentialArc(endAbsolute = [8.33, -1.31])').click() await expect( page.getByRole('button', { name: 'Edit Sketch' }) ).toBeEnabled({ timeout: 2000 }) @@ -139,7 +139,7 @@ sketch001 = startSketchOn(XZ) await page.waitForTimeout(600) // wait for animation - await page.getByText('tangentialArcTo([8.33, -1.31], %)').click() + await page.getByText('tangentialArc(endAbsolute = [8.33, -1.31])').click() await page.keyboard.press('End') await page.keyboard.down('Shift') await page.keyboard.press('ArrowUp') @@ -212,7 +212,7 @@ sketch001 = startProfileAt([12.34, -12.34], sketch002) `sketch001 = startSketchOn(XZ) |> startProfileAt([4.61, -14.01], %) |> line(end = [12.73, -0.09]) - |> tangentialArcTo([24.95, -5.38], %) + |> tangentialArc(endAbsolute = [24.95, -5.38]) |> arcTo({ interior = [20.18, -1.7], end = [11.82, -1.16] @@ -262,7 +262,7 @@ sketch001 = startProfileAt([12.34, -12.34], sketch002) await expect(u.codeLocator).toHaveText(`sketch001 = startSketchOn(XZ) |> startProfileAt([4.61, -14.01], %) |> line(end = [12.73, -0.09]) - |> tangentialArcTo([24.95, -5.38], %) + |> tangentialArc(endAbsolute = [24.95, -5.38]) |> arcTo({ interior = [20.18, -1.7], end = [11.82, -1.16] @@ -326,7 +326,7 @@ sketch001 = startProfileAt([12.34, -12.34], sketch002) prevContent = await page.locator('.cm-content').innerText() } - // drag tangentialArcTo handle + // drag tangentialArc handle const tangentEnd = await u.getBoundingBox('[data-overlay-index="1"]') await page.mouse.move(tangentEnd.x, tangentEnd.y - 5) await page.mouse.down() @@ -407,7 +407,7 @@ sketch001 = startProfileAt([12.34, -12.34], sketch002) .toHaveText(`sketch001 = startSketchOn(XZ) |> startProfileAt([6.44, -12.07], %) |> line(end = [14.72, 1.97]) - |> tangentialArcTo([26.92, -3.32], %) + |> tangentialArc(endAbsolute = [26.92, -3.32]) |> arcTo({ interior = [18.11, -3.73], end = [9.77, -3.19] @@ -577,7 +577,7 @@ sketch001 = startSketchOn(XZ) sketch001 = startSketchOn(XZ) |> startProfileAt([4.61, -10.01], %) |> line(end = [12.73, -0.09]) - |> tangentialArcTo([24.95, -0.38], %) + |> tangentialArc(endAbsolute = [24.95, -0.38]) |> close() |> extrude(length = 5)` ) @@ -646,7 +646,7 @@ sketch001 = startSketchOn(XZ) await expect(page.locator('.cm-content')).not.toHaveText(prevContent) prevContent = await page.locator('.cm-content').innerText() - // drag tangentialArcTo handle + // drag tangentialArc handle const tangentEnd = await u.getBoundingBox('[data-overlay-index="1"]') await page.dragAndDrop('#stream', '#stream', { sourcePosition: { x: tangentEnd.x + 10, y: tangentEnd.y - 5 }, @@ -663,7 +663,7 @@ sketch001 = startSketchOn(XZ) `sketch001 = startSketchOn(XZ) |> startProfileAt([7.12, -12.68], %) |> line(end = [12.68, -1.09]) - |> tangentialArcTo([24.89, 0.68], %) + |> tangentialArc(endAbsolute = [24.89, 0.68]) |> close() |> extrude(length = 5)`, { shouldNormalise: true } @@ -685,7 +685,7 @@ sketch001 = startSketchOn(XZ) sketch001 = startSketchOn(XZ) |> startProfileAt([4.61, -14.01], %) |> line(end = [12.73, -0.09]) - |> tangentialArcTo([24.95, -5.38], %) + |> tangentialArc(endAbsolute = [24.95, -5.38]) |> close() |> revolve(axis = X)` ) @@ -757,7 +757,7 @@ sketch001 = startSketchOn(XZ) await expect(page.locator('.cm-content')).not.toHaveText(prevContent) prevContent = await page.locator('.cm-content').innerText() - // drag tangentialArcTo handle + // drag tangentialArc handle const tangentEnd = await u.getBoundingBox('[data-overlay-index="1"]') await page.mouse.move(tangentEnd.x, tangentEnd.y - 5) await page.mouse.down() @@ -771,7 +771,7 @@ sketch001 = startSketchOn(XZ) `sketch001 = startSketchOn(XZ) |> startProfileAt([6.44, -12.07], %) |> line(end = [14.72, 1.97]) - |> tangentialArcTo([24.95, -5.38], %) + |> tangentialArc(endAbsolute = [24.95, -5.38]) |> line(end = [1.97, 2.06]) |> close() |> revolve(axis = X)`, @@ -1653,7 +1653,7 @@ profile003 = startProfileAt([206.63, -56.73], sketch001) await page.waitForTimeout(600) }) - const codeFromTangentialArc = ` |> tangentialArcTo([39.49, 88.22], %)` + const codeFromTangentialArc = ` |> tangentialArc(endAbsolute = [39.49, 88.22])` await test.step('check that tangential tool does not snap to other profile starts', async () => { await toolbar.tangentialArcBtn.click() await page.waitForTimeout(1000) @@ -1675,7 +1675,7 @@ profile003 = startProfileAt([206.63, -56.73], sketch001) // check pixel is now gray at tanArcLocation to verify code has executed await scene.expectPixelColor([26, 26, 26], tanArcLocation, 15) await editor.expectEditor.not.toContain( - `tangentialArcTo([39.49, 88.22], %)` + `tangentialArc(endAbsolute = [39.49, 88.22])` ) }) @@ -1876,7 +1876,7 @@ profile003 = startProfileAt([206.63, -56.73], sketch001) await endArcStartLine() await editor.expectEditor.toContain( - `|> tangentialArcTo([16.61, 4.14], %)` + `|> tangentialArc(endAbsolute = [16.61, 4.14])` ) // Add a three-point arc segment @@ -2416,7 +2416,7 @@ sketch001 = startSketchOn(XZ) profile001 = startProfileAt([-63.43, 193.08], sketch001) |> line(end = [168.52, 149.87]) |> line(end = [190.29, -39.18]) - |> tangentialArcTo([319.63, 129.65], %) + |> tangentialArc(endAbsolute = [319.63, 129.65]) |> line(end = [-217.65, -21.76]) |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() diff --git a/e2e/playwright/snapshot-tests.spec.ts b/e2e/playwright/snapshot-tests.spec.ts index 529524743..b74ffbe48 100644 --- a/e2e/playwright/snapshot-tests.spec.ts +++ b/e2e/playwright/snapshot-tests.spec.ts @@ -684,7 +684,7 @@ test.describe( await page.mouse.click(startXPx + PUR * 30, 500 - PUR * 20) code += ` - |> tangentialArcTo([551.2, -62.01], %)` + |> tangentialArc(endAbsolute = [551.2, -62.01])` await expect(u.codeLocator).toHaveText(code) // click tangential arc tool again to unequip it @@ -778,7 +778,7 @@ test.describe( await page.mouse.click(startXPx + PUR * 30, 500 - PUR * 20) code += ` - |> tangentialArcTo([551.2, -62.01], %)` + |> tangentialArc(endAbsolute = [551.2, -62.01])` await expect(u.codeLocator).toHaveText(code) await page diff --git a/e2e/playwright/storageStates.ts b/e2e/playwright/storageStates.ts index dffcedc18..2196702f4 100644 --- a/e2e/playwright/storageStates.ts +++ b/e2e/playwright/storageStates.ts @@ -98,7 +98,7 @@ part001 = startSketchOn(XZ) intersectTag: a, offset: 0 }, %) -|> tangentialArcTo([13.14 + 0, 13.14], %) +|> tangentialArc(endAbsolute = [13.14 + 0, 13.14]) |> close() |> extrude(length = 5 + 7) ` diff --git a/e2e/playwright/testing-segment-overlays.spec.ts b/e2e/playwright/testing-segment-overlays.spec.ts index d15afc78a..2684e9411 100644 --- a/e2e/playwright/testing-segment-overlays.spec.ts +++ b/e2e/playwright/testing-segment-overlays.spec.ts @@ -229,7 +229,7 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => { intersectTag = a, offset = 9 }, %) - |> tangentialArcTo([5 + 3.14 + 13, 20 + 3.14], %) + |> tangentialArc(endAbsolute = [5 + 3.14 + 13, 20 + 3.14]) ` ) }) @@ -477,7 +477,7 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => { intersectTag = a, offset = 9 }, %) - |> tangentialArcTo([3.14 + 13, 3.14], %) + |> tangentialArc(endAbsolute = [3.14 + 13, 3.14]) ` ) localStorage.setItem('disableAxis', 'true') @@ -602,7 +602,7 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => { intersectTag = a, offset = 9 }, %) - |> tangentialArcTo([3.14 + 13, 1.14], %) + |> tangentialArc(endAbsolute = [3.14 + 13, 1.14]) ` ) localStorage.setItem('disableAxis', 'true') @@ -735,11 +735,7 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => { locator: '[data-overlay-toolbar-index="11"]', }) }) - test('for segment [tangentialArcTo]', async ({ - page, - editor, - homePage, - }) => { + test('for segment [tangentialArc]', async ({ page, editor, homePage }) => { await page.addInitScript(async () => { localStorage.setItem( 'persistCode', @@ -762,7 +758,7 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => { intersectTag = a, offset = 9 }, %) - |> tangentialArcTo([3.14 + 13, -3.14], %) + |> tangentialArc(endAbsolute = [3.14 + 13, -3.14]) ` ) localStorage.setItem('disableAxis', 'true') @@ -787,28 +783,29 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => { const clickUnconstrained = _clickUnconstrained(page, editor) const clickConstrained = _clickConstrained(page, editor) - const tangentialArcTo = await u.getBoundingBox( - '[data-overlay-index="12"]' - ) + const tangentialArc = await u.getBoundingBox('[data-overlay-index="12"]') let ang = await u.getAngle('[data-overlay-index="12"]') - console.log('tangentialArcTo') + console.log('tangentialArc') await clickConstrained({ - hoverPos: { x: tangentialArcTo.x, y: tangentialArcTo.y }, + hoverPos: { x: tangentialArc.x, y: tangentialArc.y }, constraintType: 'xAbsolute', - expectBeforeUnconstrained: 'tangentialArcTo([3.14 + 13, -3.14], %)', - expectAfterUnconstrained: 'tangentialArcTo([16.14, -3.14], %)', - expectFinal: 'tangentialArcTo([xAbs001, -3.14], %)', + expectBeforeUnconstrained: + 'tangentialArc(endAbsolute = [3.14 + 13, -3.14])', + expectAfterUnconstrained: 'tangentialArc(endAbsolute = [16.14, -3.14])', + expectFinal: 'tangentialArc(endAbsolute = [xAbs001, -3.14])', ang: ang + 180, steps: 6, locator: '[data-overlay-toolbar-index="12"]', }) - console.log('tangentialArcTo2') + console.log('tangentialArc2') await clickUnconstrained({ - hoverPos: { x: tangentialArcTo.x, y: tangentialArcTo.y }, + hoverPos: { x: tangentialArc.x, y: tangentialArc.y }, constraintType: 'yAbsolute', - expectBeforeUnconstrained: 'tangentialArcTo([xAbs001, -3.14], %)', - expectAfterUnconstrained: 'tangentialArcTo([xAbs001, yAbs001], %)', - expectFinal: 'tangentialArcTo([xAbs001, -3.14], %)', + expectBeforeUnconstrained: + 'tangentialArc(endAbsolute = [xAbs001, -3.14])', + expectAfterUnconstrained: + 'tangentialArc(endAbsolute = [xAbs001, yAbs001])', + expectFinal: 'tangentialArc(endAbsolute = [xAbs001, -3.14])', ang: ang + 180, steps: 10, locator: '[data-overlay-toolbar-index="12"]', @@ -1091,7 +1088,7 @@ part001 = startSketchOn(XZ) intersectTag = a, offset = 9 }, %) - |> tangentialArcTo([3.14 + 13, 1.14], %) + |> tangentialArc(endAbsolute = [3.14 + 13, 1.14]) |> arcTo({ interior = [16.25, 5.12], end = [21.61, 4.15] @@ -1161,8 +1158,8 @@ part001 = startSketchOn(XZ) ang = await u.getAngle('[data-overlay-index="12"]') await deleteSegmentSequence({ hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, - codeToBeDeleted: 'tangentialArcTo([3.14 + 13, 1.14], %)', - stdLibFnName: 'tangentialArcTo', + codeToBeDeleted: 'tangentialArc(endAbsolute = [3.14 + 13, 1.14])', + stdLibFnName: 'tangentialArc', ang: ang + 180, steps: 6, locator: '[data-overlay-toolbar-index="12"]', diff --git a/e2e/playwright/testing-selections.spec.ts b/e2e/playwright/testing-selections.spec.ts index 9e9e3d9ad..853e62d92 100644 --- a/e2e/playwright/testing-selections.spec.ts +++ b/e2e/playwright/testing-selections.spec.ts @@ -535,7 +535,7 @@ part001 = startSketchOn(XZ) intersectTag = a, offset = 0 }, %) - |> tangentialArcTo([13.14 + 0, 13.14], %) + |> tangentialArc(endAbsolute = [13.14 + 0, 13.14]) |> close() |> extrude(length = 5 + 7) ` @@ -574,7 +574,7 @@ part001 = startSketchOn(XZ) const extrusionTopCap: Coords2d = [800, 240] const flatExtrusionFace: Coords2d = [960, 160] - const tangentialArcTo: Coords2d = [840, 160] + const tangentialArc: Coords2d = [840, 160] const close: Coords2d = [720, 200] const nothing: Coords2d = [600, 200] const closeEdge: Coords2d = [744, 233] @@ -671,28 +671,28 @@ part001 = startSketchOn(XZ) ) await checkCodeAtHoverPosition( - 'tangentialArcTo', - tangentialArcTo, - 'tangentialArcTo([13.14+0,13.14],%)extrude(length=5+7)', - 'tangentialArcTo([13.14 + 0, 13.14], %)' + 'tangentialArc', + tangentialArc, + 'tangentialArc(endAbsolute=[13.14+0,13.14])extrude(length=5+7)', + 'tangentialArc(endAbsolute = [13.14 + 0, 13.14])' ) await checkCodeAtHoverPosition( 'tangentialArcEdge', tangentialArcEdge, - `tangentialArcTo([13.14+0,13.14],%)`, - 'tangentialArcTo([13.14 + 0, 13.14], %)' + `tangentialArc(endAbsolute=[13.14+0,13.14])`, + 'tangentialArc(endAbsolute = [13.14 + 0, 13.14])' ) await checkCodeAtHoverPosition( 'tangentialArcOppositeEdge', tangentialArcOppositeEdge, - `tangentialArcTo([13.14+0,13.14],%)`, - 'tangentialArcTo([13.14 + 0, 13.14], %)' + `tangentialArc(endAbsolute=[13.14+0,13.14])`, + 'tangentialArc(endAbsolute = [13.14 + 0, 13.14])' ) await checkCodeAtHoverPosition( 'tangentialArcAdjacentEdge', tangentialArcAdjacentEdge, - `tangentialArcTo([13.14+0,13.14],%)`, - 'tangentialArcTo([13.14 + 0, 13.14], %)' + `tangentialArc(endAbsolute=[13.14+0,13.14])`, + 'tangentialArc(endAbsolute = [13.14 + 0, 13.14])' ) await checkCodeAtHoverPosition( @@ -940,7 +940,7 @@ part001 = startSketchOn(XZ) }, { pos: [1107, 161], - expectedCode: 'tangentialArcTo([167.95, -28.85], %)', + expectedCode: 'tangentialArc(endAbsolute = [167.95, -28.85])', }, ] as const await page.addInitScript( diff --git a/public/kcl-samples/bench/bench-parts.kcl b/public/kcl-samples/bench/bench-parts.kcl index f85ae964a..1bde4a7f0 100644 --- a/public/kcl-samples/bench/bench-parts.kcl +++ b/public/kcl-samples/bench/bench-parts.kcl @@ -10,25 +10,25 @@ fn dividerSketch(plane) { sketch000 = startSketchOn(plane) |> startProfileAt([-16.82, 21.2], %) |> line(end = [-0.13, -1.27]) - |> tangentialArcTo([-15.94, profileStartY(%) - 7.73], %) - |> tangentialArcTo([-16.6, profileStartY(%) - 15.52], %) - |> tangentialArcTo([-18.38, profileStartY(%) - 18.63], %) + |> tangentialArc(endAbsolute = [-15.94, profileStartY(%) - 7.73]) + |> tangentialArc(endAbsolute = [-16.6, profileStartY(%) - 15.52]) + |> tangentialArc(endAbsolute = [-18.38, profileStartY(%) - 18.63]) |> line(end = [-1.25, -2.6]) |> xLine(length = 6.04) |> line(end = [6.68, 7.87]) - |> tangentialArcTo([10.06, profileStartY(%) - 12.69], %) + |> tangentialArc(endAbsolute = [10.06, profileStartY(%) - 12.69]) |> line(end = [7.28, -8.47]) |> xLine(length = 5.98) |> line(end = [-1.3, 3.01]) - |> tangentialArcTo([22.45, profileStartY(%) - 2.84], %) - |> tangentialArcTo([25.08, profileStartY(%) + 6.42], %) + |> tangentialArc(endAbsolute = [22.45, profileStartY(%) - 2.84]) + |> tangentialArc(endAbsolute = [25.08, profileStartY(%) + 6.42]) |> line(end = [2.35, 16.36]) |> line(end = [1.78, 1.15]) - |> tangentialArcTo([23.93, profileStartY(%) + 27.29], %) + |> tangentialArc(endAbsolute = [23.93, profileStartY(%) + 27.29]) |> line(end = [-1.92, 0.21]) |> line(end = [-3.74, -26.54]) - |> tangentialArcTo([15.13, profileStartY(%) - 1.72], %) - |> tangentialArcTo(profileStart(%), %) + |> tangentialArc(endAbsolute = [15.13, profileStartY(%) - 1.72]) + |> tangentialArc(endAbsolute = profileStart(%)) |> close() return sketch000 } diff --git a/public/kcl-samples/car-wheel-assembly/brake-caliper.kcl b/public/kcl-samples/car-wheel-assembly/brake-caliper.kcl index bc7306ecf..15ce94f51 100644 --- a/public/kcl-samples/car-wheel-assembly/brake-caliper.kcl +++ b/public/kcl-samples/car-wheel-assembly/brake-caliper.kcl @@ -17,66 +17,42 @@ brakeCaliperSketch = startSketchOn(XY) 0, rotorTotalThickness + caliperTolerance - caliperInnerEdgeRadius ]) - |> tangentialArc({ - offset = 90, - radius = caliperInnerEdgeRadius - }, %) + |> tangentialArc(angle = 90, radius = caliperInnerEdgeRadius) |> line(end = [ -caliperPadLength + 2 * caliperInnerEdgeRadius, 0 ]) - |> tangentialArc({ - offset = -90, - radius = caliperInnerEdgeRadius - }, %) + |> tangentialArc(angle = -90, radius = caliperInnerEdgeRadius) |> line(end = [ 0, caliperThickness - (caliperInnerEdgeRadius * 2) ]) - |> tangentialArc({ - offset = -90, - radius = caliperInnerEdgeRadius - }, %) + |> tangentialArc(angle = -90, radius = caliperInnerEdgeRadius) |> line(end = [ caliperPadLength + caliperThickness - caliperOuterEdgeRadius - caliperInnerEdgeRadius, 0 ]) - |> tangentialArc({ - offset = -90, - radius = caliperOuterEdgeRadius - }, %) + |> tangentialArc(angle = -90, radius = caliperOuterEdgeRadius) |> line(end = [ 0, -2 * caliperTolerance - (2 * caliperThickness) - rotorTotalThickness + 2 * caliperOuterEdgeRadius ]) - |> tangentialArc({ - offset = -90, - radius = caliperOuterEdgeRadius - }, %) + |> tangentialArc(angle = -90, radius = caliperOuterEdgeRadius) |> line(end = [ -caliperPadLength - caliperThickness + caliperOuterEdgeRadius + caliperInnerEdgeRadius, 0 ]) - |> tangentialArc({ - offset = -90, - radius = caliperInnerEdgeRadius - }, %) + |> tangentialArc(angle = -90, radius = caliperInnerEdgeRadius) |> line(end = [ 0, caliperThickness - (2 * caliperInnerEdgeRadius) ]) - |> tangentialArc({ - offset = -90, - radius = caliperInnerEdgeRadius - }, %) + |> tangentialArc(angle = -90, radius = caliperInnerEdgeRadius) |> line(end = [ caliperPadLength - (2 * caliperInnerEdgeRadius), 0 ]) - |> tangentialArc({ - offset = 90, - radius = caliperInnerEdgeRadius - }, %) + |> tangentialArc(angle = 90, radius = caliperInnerEdgeRadius) |> close() // Revolve the brake caliper sketch diff --git a/public/kcl-samples/car-wheel-assembly/car-tire.kcl b/public/kcl-samples/car-wheel-assembly/car-tire.kcl index 0f8017d1f..1c20b1ea9 100644 --- a/public/kcl-samples/car-wheel-assembly/car-tire.kcl +++ b/public/kcl-samples/car-wheel-assembly/car-tire.kcl @@ -17,7 +17,7 @@ tireSketch = startSketchOn(XY) ], tag = $edge1, ) - |> tangentialArc({ offset = -90, radius = bendRadius }, %) + |> tangentialArc(angle = -90, radius = bendRadius) |> line(endAbsolute = [ tireOuterDiameter / 2, tireDepth / 2 - tireTreadOffset @@ -36,7 +36,7 @@ tireSketch = startSketchOn(XY) tireOuterDiameter / 2, -tireDepth / 2 + bendRadius ]) - |> tangentialArc({ offset = -90, radius = bendRadius }, %) + |> tangentialArc(angle = -90, radius = bendRadius) |> line(endAbsolute = [tireInnerDiameter / 2, -tireDepth / 2], tag = $edge2) |> close() diff --git a/public/kcl-samples/car-wheel-assembly/lug-nut.kcl b/public/kcl-samples/car-wheel-assembly/lug-nut.kcl index 1538eb7ff..5e9f54559 100644 --- a/public/kcl-samples/car-wheel-assembly/lug-nut.kcl +++ b/public/kcl-samples/car-wheel-assembly/lug-nut.kcl @@ -26,7 +26,7 @@ fn lug(plane, length, diameter) { |> angledLine(angle = 70, lengthY = lugHeadLength) |> xLine(endAbsolute = lugDiameter / 2) |> yLine(endAbsolute = lugLength) - |> tangentialArc({ offset = 90, radius = fromMm(3) }, %) + |> tangentialArc(angle = 90, radius = fromMm(3)) |> xLine(endAbsolute = 0 + .001, tag = $c1) |> yLine(endAbsolute = lugThreadDepth) |> xLine(endAbsolute = lugThreadDiameter) diff --git a/public/kcl-samples/cycloidal-gear/main.kcl b/public/kcl-samples/cycloidal-gear/main.kcl index 241ab23f3..7644e75d5 100644 --- a/public/kcl-samples/cycloidal-gear/main.kcl +++ b/public/kcl-samples/cycloidal-gear/main.kcl @@ -19,17 +19,11 @@ fn cycloidalGear(gearPitch, gearHeight, holeDiameter, helixAngle) { angleEnd = -90 + helixAngleP, radius = gearPitch }, %) - |> tangentialArc({ - radius = gearPitch * 1.67, - offset = 60 - }, %) - |> tangentialArc({ radius = gearPitch, offset = -180 }, %) - |> tangentialArc({ - radius = gearPitch * 1.67, - offset = 60 - }, %) - |> tangentialArc({ radius = gearPitch, offset = -180 }, %) - |> tangentialArcTo([profileStartX(%), profileStartY(%)], %) + |> tangentialArc(radius = gearPitch * 1.67, angle = 60) + |> tangentialArc(radius = gearPitch, angle = -180) + |> tangentialArc(radius = gearPitch * 1.67, angle = 60) + |> tangentialArc(radius = gearPitch, angle = -180) + |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close(%) |> hole(circle(center = [0, 0], radius = holeDiameter / 2), %) return gearProfile diff --git a/public/kcl-samples/dual-basin-utility-sink/main.kcl b/public/kcl-samples/dual-basin-utility-sink/main.kcl index ab8f15daf..f4cca9737 100644 --- a/public/kcl-samples/dual-basin-utility-sink/main.kcl +++ b/public/kcl-samples/dual-basin-utility-sink/main.kcl @@ -184,15 +184,15 @@ handlePlane = startSketchOn(offsetPlane(XY, offset = handleHeightAboveTheFloor)) handleProfilePath = startProfileAt([0 + handleOffset, 0], handlePlane) |> yLine(length = -handleLengthSegmentA) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ handleFillet + handleOffset, -handleDepth - ], %) + ]) |> xLine(length = handleLengthSegmentB) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ handleOffset + handleWidth, -handleLengthSegmentA - ], %) + ]) |> yLine(length = handleLengthSegmentA) handleSectionPlane = startSketchOn(XZ) handleProfileSection = circle( diff --git a/public/kcl-samples/exhaust-manifold/main.kcl b/public/kcl-samples/exhaust-manifold/main.kcl index f7414c23f..ee5965939 100644 --- a/public/kcl-samples/exhaust-manifold/main.kcl +++ b/public/kcl-samples/exhaust-manifold/main.kcl @@ -33,9 +33,9 @@ fn primaryTube(n, angle001, length001, length002, length003) { sweepPath = startSketchOn(sweepPlane) |> startProfileAt([0, plateHeight], %) |> line(end = [0, length001]) - |> tangentialArc({ offset = -80, radius = bendRadius }, %, $arc01) + |> tangentialArc(angle = -80, radius = bendRadius, tag = $arc01) |> angledLine(angle = tangentToEnd(arc01), length = length002) - |> tangentialArc({ offset = 85, radius = bendRadius }, %, $arc02) + |> tangentialArc(angle = 85, radius = bendRadius, tag = $arc02) |> angledLine(angle = tangentToEnd(arc02), length = length003) // Create the cross section of each tube and sweep them @@ -57,21 +57,21 @@ primaryTube(3, 25.2, 5, 5, 3) flangeSketch = startSketchOn(XY) |> startProfileAt([3 + 1.3, -1.25], %) |> xLine(length = -2.6, tag = $seg01) - |> tangentialArc({ radius = .3, offset = -40 }, %) - |> tangentialArc({ radius = .9, offset = 80 }, %) - |> tangentialArc({ radius = .3, offset = -40 }, %) + |> tangentialArc(radius = .3, angle = -40) + |> tangentialArc(radius = .9, angle = 80) + |> tangentialArc(radius = .3, angle = -40) |> xLine(length = -1.4, tag = $seg03) |> yLine(length = segLen(seg01), tag = $seg04) |> xLine(length = 3.1, tag = $seg05) - |> tangentialArc({ radius = .3, offset = -40 }, %) - |> tangentialArc({ radius = 1.5, offset = 80 }, %) - |> tangentialArc({ radius = .3, offset = -40 }, %) + |> tangentialArc(radius = .3, angle = -40) + |> tangentialArc(radius = 1.5, angle = 80) + |> tangentialArc(radius = .3, angle = -40) |> xLine(length = segLen(seg05), tag = $seg07) |> yLine(endAbsolute = profileStartY(%), tag = $seg08) |> xLine(length = -segLen(seg03), tag = $seg09) - |> tangentialArc({ radius = .3, offset = -40 }, %) - |> tangentialArc({ radius = .9, offset = 80 }, %) - |> tangentialArcTo([profileStartX(%), profileStartY(%)], %) + |> tangentialArc(radius = .3, angle = -40) + |> tangentialArc(radius = .9, angle = 80) + |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() // Create openings in the flange to accommodate each tube diff --git a/public/kcl-samples/food-service-spatula/main.kcl b/public/kcl-samples/food-service-spatula/main.kcl index 64b7183a2..23af8f009 100644 --- a/public/kcl-samples/food-service-spatula/main.kcl +++ b/public/kcl-samples/food-service-spatula/main.kcl @@ -36,9 +36,9 @@ fn slot(sketch1, start, end, width) { ystart = width / 2 * sin(toRadians(angle - 90)) + start[1] slotSketch = startProfileAt([xstart, ystart], sketch1) |> angledLine(angle = angle, length = dist) - |> tangentialArc({ radius = width / 2, offset = 180 }, %) + |> tangentialArc(radius = width / 2, angle = 180) |> angledLine(angle = angle, length = -dist) - |> tangentialArcTo([profileStartX(%), profileStartY(%)], %) + |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() return slotSketch } diff --git a/public/kcl-samples/french-press/main.kcl b/public/kcl-samples/french-press/main.kcl index 4f31d95e5..808d794f8 100644 --- a/public/kcl-samples/french-press/main.kcl +++ b/public/kcl-samples/french-press/main.kcl @@ -127,7 +127,7 @@ sketch006 = startSketchOn(XZ) |> yLine(length = 10) |> line(end = [0.6, 0]) |> yLine(length = -.05) - |> tangentialArc({ radius = 0.6, offset = -90 }, %) + |> tangentialArc(radius = 0.6, angle = -90) |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() |> revolve(axis = Y) @@ -192,15 +192,15 @@ sketch011 = startSketchOn(XZ) sketch012 = startSketchOn(offsetPlane(XZ, offset = handleThickness / 2)) |> startProfileAt([2.3, 6.4], %) |> line(end = [0.56, 0]) - |> tangentialArcTo([4.1, 5.26], %) - |> tangentialArcTo([4.17, 1.6], %) - |> tangentialArcTo([3.13, 0.61], %) + |> tangentialArc(endAbsolute = [4.1, 5.26]) + |> tangentialArc(endAbsolute = [4.17, 1.6]) + |> tangentialArc(endAbsolute = [3.13, 0.61]) |> line(end = [-1.09, 0]) |> line(end = [0, 0.43]) |> line(end = [0.99, -0.02]) - |> tangentialArcTo([3.63, 1.6], %) - |> tangentialArcTo([3.56, 5.15], %) - |> tangentialArcTo([2.72, 5.88], %) + |> tangentialArc(endAbsolute = [3.63, 1.6]) + |> tangentialArc(endAbsolute = [3.56, 5.15]) + |> tangentialArc(endAbsolute = [2.72, 5.88]) |> line(end = [-0.4, 0]) |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() diff --git a/public/kcl-samples/gear-rack/main.kcl b/public/kcl-samples/gear-rack/main.kcl index b87478778..972e943ff 100644 --- a/public/kcl-samples/gear-rack/main.kcl +++ b/public/kcl-samples/gear-rack/main.kcl @@ -24,13 +24,13 @@ rackBody = startSketchOn(XY) fn tooth() { toothSketch = startSketchOn(XY) |> startProfileAt([-length / 2 + 0.567672, minHeight], %) - |> tangentialArcToRelative([0.157636, 0.110378], %) + |> tangentialArc(end = [0.157636, 0.110378]) |> line(end = [0.329118, 0.904244]) - |> tangentialArcToRelative([0.157636, 0.110378], %) + |> tangentialArc(end = [0.157636, 0.110378]) |> line(end = [0.186505, 0]) - |> tangentialArcToRelative([0.157636, -0.110378], %) + |> tangentialArc(end = [0.157636, -0.110378]) |> line(end = [0.329118, -0.904244]) - |> tangentialArcToRelative([0.157636, -0.110378], %) + |> tangentialArc(end = [0.157636, -0.110378]) |> close() |> extrude(length = width) return toothSketch @@ -44,7 +44,7 @@ teeth = tooth() endCapTooth = startSketchOn(XY) |> startProfileAt([-length / 2, 11.849525], %) |> line(end = [0.314524, -0.864147]) - |> tangentialArcToRelative([0.157636, -0.110378], %) + |> tangentialArc(end = [0.157636, -0.110378]) |> line(endAbsolute = [-length / 2, minHeight]) |> close() |> extrude(length = width) @@ -53,7 +53,7 @@ endCapTooth = startSketchOn(XY) endCapTooth2 = startSketchOn(XY) |> startProfileAt([length / 2, 11.849525], %) |> line(end = [-0.314524, -0.864147]) - |> tangentialArcToRelative([-0.157636, -0.110378], %) + |> tangentialArc(end = [-0.157636, -0.110378]) |> line(endAbsolute = [length / 2, minHeight]) |> close() |> extrude(length = width) diff --git a/public/kcl-samples/i-beam/main.kcl b/public/kcl-samples/i-beam/main.kcl index dea2c6aff..544a43b18 100644 --- a/public/kcl-samples/i-beam/main.kcl +++ b/public/kcl-samples/i-beam/main.kcl @@ -18,7 +18,7 @@ iBeam = startSketchOn(-XZ) |> xLine(length = flangeWidth / 2) |> yLine(length = -flangeThickness) |> xLine(endAbsolute = webThickness / 2 + rootRadius) - |> tangentialArc({ radius = rootRadius, offset = 90 }, %) + |> tangentialArc(radius = rootRadius, angle = 90) |> yLine(endAbsolute = 0) |> mirror2d(axis = X) |> mirror2d(axis = Y) diff --git a/public/kcl-samples/keyboard/main.kcl b/public/kcl-samples/keyboard/main.kcl index 10754d990..4fcc0d82f 100644 --- a/public/kcl-samples/keyboard/main.kcl +++ b/public/kcl-samples/keyboard/main.kcl @@ -74,11 +74,11 @@ fn keyFn(originStart, keyWidth, keyHeight, repeats, color) { radius = 0.1 }, %) |> angledLine(angle = 0, length = keyWidth - .2, tag = $rectangleSegmentA001) - |> tangentialArc({ radius = 0.1, offset = 90 }, %) + |> tangentialArc(radius = 0.1, angle = 90) |> angledLine(angle = segAng(rectangleSegmentA001) + 90, length = keyHeight - .2, tag = $rectangleSegmentB001) - |> tangentialArc({ radius = 0.1, offset = 90 }, %) + |> tangentialArc(radius = 0.1, angle = 90) |> angledLine(angle = segAng(rectangleSegmentA001), length = -segLen(rectangleSegmentA001), tag = $rectangleSegmentC001) - |> tangentialArc({ radius = 0.1, offset = 90 }, %) + |> tangentialArc(radius = 0.1, angle = 90) |> line(endAbsolute = [profileStartX(%), profileStartY(%)], tag = $rectangleSegmentD001) |> close() |> extrude(length = keyDepth) diff --git a/public/kcl-samples/poopy-shoe/main.kcl b/public/kcl-samples/poopy-shoe/main.kcl index 224b4afd5..64aca1fd9 100644 --- a/public/kcl-samples/poopy-shoe/main.kcl +++ b/public/kcl-samples/poopy-shoe/main.kcl @@ -69,7 +69,7 @@ customPlane = { } sketch003 = startSketchOn(customPlane) |> startProfileAt([0, 0], %) - |> tangentialArc({ offset = 60, radius = height }, %) + |> tangentialArc(angle = 60, radius = height) |> angledLine(angle = 60, endAbsoluteY = 0) |> close() |> extrude(length = wallThickness) @@ -85,11 +85,11 @@ sketch004 = startSketchOn(sketch002, 'END') |> angledLine(angle = 60, endAbsoluteY = segEndY(seg01)) |> yLine(endAbsolute = height) |> xLine(length = wallThickness) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ (frontLength - wallsWidth) / 2 + wallsWidth, height - ((height - exitHeight) / 2) - ], %) - |> tangentialArcTo([frontLength, exitHeight], %) + ]) + |> tangentialArc(endAbsolute = [frontLength, exitHeight]) |> yLine(endAbsolute = 0) |> close(tag = $seg04) |> extrude(length = wallThickness) @@ -110,11 +110,11 @@ sketch005 = startSketchOn(customPlane2) |> startProfileAt([0, 0], %) |> yLine(endAbsolute = height) |> xLine(endAbsolute = wallsWidth) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ (frontLength - wallsWidth) / 2 + wallsWidth, height - ((height - exitHeight) / 2) - ], %) - |> tangentialArcTo([frontLength, exitHeight], %) + ]) + |> tangentialArc(endAbsolute = [frontLength, exitHeight]) |> yLine(endAbsolute = 0, tag = $seg03) |> close() |> extrude(length = wallThickness) diff --git a/public/kcl-samples/sheet-metal-bracket/main.kcl b/public/kcl-samples/sheet-metal-bracket/main.kcl index b70056488..9121c0e3d 100644 --- a/public/kcl-samples/sheet-metal-bracket/main.kcl +++ b/public/kcl-samples/sheet-metal-bracket/main.kcl @@ -37,49 +37,25 @@ bracketProfile = startSketchOn(XZ) 0 ], %) |> xLine(length = flangeLength) - |> tangentialArc({ - radius = exteriorBendRadius, - offset = bendAngle - }, %) + |> tangentialArc(radius = exteriorBendRadius, angle = bendAngle) |> angledLine(angle = bendAngle, endAbsoluteY = hatHeight - thickness, tag = $seg01) - |> tangentialArc({ - radius = interiorBendRadius, - offset = -bendAngle - }, %) + |> tangentialArc(radius = interiorBendRadius, angle = -bendAngle) |> xLine(endAbsolute = 0, tag = $seg02) |> xLine(length = segLen(seg02)) - |> tangentialArc({ - radius = interiorBendRadius, - offset = -bendAngle - }, %) + |> tangentialArc(radius = interiorBendRadius, angle = -bendAngle) |> angledLine(angle = -bendAngle, length = segLen(seg01)) - |> tangentialArc({ - radius = exteriorBendRadius, - offset = bendAngle - }, %) + |> tangentialArc(radius = exteriorBendRadius, angle = bendAngle) |> xLine(length = flangeLength) |> yLine(length = thickness, tag = $seg03) |> xLine(length = -flangeLength, tag = $seg04) - |> tangentialArc({ - radius = interiorBendRadius, - offset = -bendAngle - }, %) + |> tangentialArc(radius = interiorBendRadius, angle = -bendAngle) |> angledLine(angle = 180 - bendAngle, length = segLen(seg01)) - |> tangentialArc({ - radius = exteriorBendRadius, - offset = bendAngle - }, %) + |> tangentialArc(radius = exteriorBendRadius, angle = bendAngle) |> xLine(endAbsolute = 0, tag = $seg05) |> xLine(length = -segLen(seg05)) - |> tangentialArc({ - radius = exteriorBendRadius, - offset = bendAngle - }, %) + |> tangentialArc(radius = exteriorBendRadius, angle = bendAngle) |> angledLine(angle = bendAngle - 180, length = segLen(seg01)) - |> tangentialArc({ - radius = interiorBendRadius, - offset = -bendAngle - }, %) + |> tangentialArc(radius = interiorBendRadius, angle = -bendAngle) |> xLine(length = -flangeLength, tag = $seg06) |> line(endAbsolute = [profileStartX(%), profileStartY(%)], tag = $seg07) |> close() diff --git a/rust/kcl-lib/e2e/executor/inputs/i_shape.kcl b/rust/kcl-lib/e2e/executor/inputs/i_shape.kcl index 9440e15de..424df231e 100644 --- a/rust/kcl-lib/e2e/executor/inputs/i_shape.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/i_shape.kcl @@ -10,41 +10,41 @@ let corner_radius = 5.0 let brace_base = startSketchOn(XY) |> startProfileAt([corner_radius, 0], %) |> line(end = [width - corner_radius, 0.0]) - |> tangentialArcToRelative([corner_radius, corner_radius], %) + |> tangentialArc(end = [corner_radius, corner_radius]) |> yLine(length = 25.0 - corner_radius) - |> tangentialArcToRelative([-corner_radius, corner_radius], %) + |> tangentialArc(end = [-corner_radius, corner_radius]) |> xLine(length = -(d_wrist_circumference[0] - (corner_radius * 2))) - |> tangentialArcToRelative([-corner_radius, corner_radius], %) + |> tangentialArc(end = [-corner_radius, corner_radius]) |> yLine(length = length - 25.0 - 23.0 - (corner_radius * 2)) - |> tangentialArcToRelative([corner_radius, corner_radius], %) + |> tangentialArc(end = [corner_radius, corner_radius]) |> xLine(length = 15.0 - (corner_radius * 2)) - |> tangentialArcToRelative([corner_radius, corner_radius], %) + |> tangentialArc(end = [corner_radius, corner_radius]) |> yLine(length = 23.0 - corner_radius) - |> tangentialArcToRelative([-corner_radius, corner_radius], %) + |> tangentialArc(end = [-corner_radius, corner_radius]) |> xLine(length = -(hand_thickness + 15.0 + 15.0 - (corner_radius * 2))) - |> tangentialArcToRelative([-corner_radius, -corner_radius], %) + |> tangentialArc(end = [-corner_radius, -corner_radius]) |> yLine(length = -(23.0 - corner_radius)) - |> tangentialArcToRelative([corner_radius, -corner_radius], %) + |> tangentialArc(end = [corner_radius, -corner_radius]) |> xLine(length = 15.0 - (corner_radius * 2)) - |> tangentialArcToRelative([corner_radius, -corner_radius], %) + |> tangentialArc(end = [corner_radius, -corner_radius]) |> yLine(length = -(length - 25.0 - 23.0 - (corner_radius * 2))) - |> tangentialArcToRelative([-corner_radius, -corner_radius], %) + |> tangentialArc(end = [-corner_radius, -corner_radius]) |> xLine(length = -(d_wrist_circumference[1] + d_wrist_circumference[2] + d_wrist_circumference[3] - hand_thickness - corner_radius)) - |> tangentialArcToRelative([-corner_radius, -corner_radius], %) + |> tangentialArc(end = [-corner_radius, -corner_radius]) |> yLine(length = -(25.0 - corner_radius)) - |> tangentialArcToRelative([corner_radius, -corner_radius], %) + |> tangentialArc(end = [corner_radius, -corner_radius]) |> close() let inner = startSketchOn(XY) |> startProfileAt([0, 0], %) |> xLine(length = 1.0) - |> tangentialArcToRelative([corner_radius, corner_radius], %) + |> tangentialArc(end = [corner_radius, corner_radius]) |> yLine(length = 25.0 - (corner_radius * 2)) - |> tangentialArcToRelative([-corner_radius, corner_radius], %) + |> tangentialArc(end = [-corner_radius, corner_radius]) |> xLine(length = -1.0) - |> tangentialArcToRelative([-corner_radius, -corner_radius], %) + |> tangentialArc(end = [-corner_radius, -corner_radius]) |> yLine(length = -(25.0 - (corner_radius * 2))) - |> tangentialArcToRelative([corner_radius, -corner_radius], %) + |> tangentialArc(end = [corner_radius, -corner_radius]) |> close() let final = brace_base diff --git a/rust/kcl-lib/e2e/executor/inputs/parametric_with_tan_arc.kcl b/rust/kcl-lib/e2e/executor/inputs/parametric_with_tan_arc.kcl index fabaf0798..6fe6d3359 100644 --- a/rust/kcl-lib/e2e/executor/inputs/parametric_with_tan_arc.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/parametric_with_tan_arc.kcl @@ -11,17 +11,17 @@ const wallMountL = 8 const bracket = startSketchOn(XY) |> startProfileAt([0, 0], %) |> line(end = [0, wallMountL]) - |> tangentialArc({ - radius: filletR, - offset: 90 - }, %) + |> tangentialArc( + radius = filletR, + angle = 90, + ) |> line(end = [-shelfMountL, 0]) |> line(end = [0, -thickness]) |> line(end = [shelfMountL, 0]) - |> tangentialArc({ - radius: filletR - thickness, - offset: -90 - }, %) + |> tangentialArc( + radius = filletR - thickness, + angle = -90, + ) |> line(end = [0, -wallMountL]) |> close() |> extrude(length = width) diff --git a/rust/kcl-lib/e2e/executor/inputs/server-rack-heavy.kcl b/rust/kcl-lib/e2e/executor/inputs/server-rack-heavy.kcl index 69a44da58..daa958935 100644 --- a/rust/kcl-lib/e2e/executor/inputs/server-rack-heavy.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/server-rack-heavy.kcl @@ -763,9 +763,9 @@ const sketch010fl = startSketchOn(extrude001fl, 'START') originStart[2] + .81 - (.438 / 2) ], %) |> xLine(length = 0.75 - .438) - |> tangentialArcTo([-0.66 - originStart[0],originStart[2] + .81 + .438 / 2], %) + |> tangentialArc(endAbsolute = [-0.66 - originStart[0],originStart[2] + .81 + .438 / 2]) |> xLine(length = -0.75 + .438) - |> tangentialArcTo([profileStartX(%), profileStartY(%)], %) + |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() |> patternLinear2d( axis = [0, 1], @@ -781,12 +781,12 @@ const sketch011fl = startSketchOn(extrude001fl, 'START') originStart[2] + railHeight * 1.75 / 2 + .438 / 2 ], %) |> xLine(length = 0.75 - .438) - |> tangentialArcTo([ - -0.66 - originStart[0],originStart[2]+ - railHeight * 1.75 / 2 - (.438 / 2) - ], %) + |> tangentialArc(endAbsolute = [ + -0.66 - originStart[0], + originStart[2] + railHeight * 1.75 / 2 - (.438 / 2) + ]) |> xLine(length = -0.75 + .438) - |> tangentialArcTo([profileStartX(%), profileStartY(%)], %) + |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() const extrude011fl = extrude(sketch011fl, length = -thickness) @@ -798,12 +798,12 @@ const sketch012fl = startSketchOn(extrude001fl, 'START') railHeight * 1.75 - .81 + .438 / 2 ], %) |> xLine(length = 0.75 - .438) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ -0.66 - originStart[0], originStart[2]+ railHeight * 1.75 - .81 - (.438 / 2) - ], %) + ]) |> xLine(length = -0.75 + .438) - |> tangentialArcTo([profileStartX(%), profileStartY(%)], %) + |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() |> patternLinear2d( axis = [0, -1], @@ -1006,12 +1006,12 @@ const sketch010fr = startSketchOn(extrude001fr, 'START') originStart[2] + .81 - (.438 / 2) ], %) |> xLine(length = 0.75 - .438) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ -0.66 - originStart[0], originStart[2] + .81 + .438 / 2 - ], %) + ]) |> xLine(length = -0.75 + .438) - |> tangentialArcTo([profileStartX(%), profileStartY(%)], %) + |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() |> patternLinear2d( axis = [0, 1], @@ -1027,12 +1027,12 @@ const sketch011fr = startSketchOn(extrude001fr, 'START') originStart[2] + railHeight * 1.75 / 2 + .438 / 2 ], %) |> xLine(length = 0.75 - .438) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ -0.66 - originStart[0], originStart[2] + railHeight * 1.75 / 2 - (.438 / 2) - ], %) + ]) |> xLine(length = -0.75 + .438) - |> tangentialArcTo([profileStartX(%), profileStartY(%)], %) + |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() const extrude011fr = extrude(sketch011fr, length = -thickness) @@ -1044,12 +1044,12 @@ const sketch012fr = startSketchOn(extrude001fr, 'START') originStart[2] + railHeight * 1.75 - .81 + .438 / 2 ], %) |> xLine(length = 0.75 - .438) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ -0.66 - originStart[0], originStart[2] + railHeight * 1.75 - .81 - (.438 / 2) - ], %) + ]) |> xLine(length = -0.75 + .438) - |> tangentialArcTo([profileStartX(%), profileStartY(%)], %) + |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() |> patternLinear2d( axis = [0, -1], @@ -1252,12 +1252,12 @@ const sketch010rr = startSketchOn(extrude001rr, 'START') originStart[2] + .81 - (.438 / 2) ], %) |> xLine(length = 0.75 - .438) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ -0.66 - originStart[0]+1.5-serverDepth, originStart[2] + .81 + .438 / 2 - ], %) + ]) |> xLine(length = -0.75 + .438) - |> tangentialArcTo([profileStartX(%), profileStartY(%)], %) + |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() |> patternLinear2d( axis = [0, 1], @@ -1273,12 +1273,12 @@ const sketch011rr = startSketchOn(extrude001rr, 'START') originStart[2] + railHeight * 1.75 / 2 + .438 / 2 ], %) |> xLine(length = 0.75 - .438) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ -0.66 - originStart[0]+1.5-serverDepth, originStart[2] + railHeight * 1.75 / 2 - (.438 / 2) - ], %) + ]) |> xLine(length = -0.75 + .438) - |> tangentialArcTo([profileStartX(%), profileStartY(%)], %) + |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() const extrude011rr = extrude(sketch011rr, length = -thickness) @@ -1290,12 +1290,12 @@ const sketch012rr = startSketchOn(extrude001rr, 'START') originStart[2] + railHeight * 1.75 - .81 + .438 / 2 ], %) |> xLine(length = 0.75 - .438) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ -0.66 - originStart[0]+1.5-serverDepth, originStart[2] + railHeight * 1.75 - .81 - (.438 / 2) - ], %) + ]) |> xLine(length = -0.75 + .438) - |> tangentialArcTo([profileStartX(%), profileStartY(%)], %) + |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() |> patternLinear2d( axis = [0, -1], @@ -1497,12 +1497,12 @@ const sketch010rl = startSketchOn(extrude001rl, 'START') originStart[2] + .81 - (.438 / 2) ], %) |> xLine(length = 0.75 - .438) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ -0.66 - originStart[0] - serverDepth + 1.5, originStart[2] + .81 + .438 / 2 - ], %) + ]) |> xLine(length = -0.75 + .438) - |> tangentialArcTo([profileStartX(%), profileStartY(%)], %) + |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() |> patternLinear2d( axis = [0, 1], @@ -1518,12 +1518,12 @@ const sketch011rl = startSketchOn(extrude001rl, 'START') originStart[2] + railHeight * 1.75 / 2 + .438 / 2 ], %) |> xLine(length = 0.75 - .438) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ -0.66 - originStart[0] - serverDepth + 1.5, originStart[2] + railHeight * 1.75 / 2 - (.438 / 2) - ], %) + ]) |> xLine(length = -0.75 + .438) - |> tangentialArcTo([profileStartX(%), profileStartY(%)], %) + |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() const extrude011rl = extrude(sketch011rl, length = -thickness) @@ -1535,12 +1535,12 @@ const sketch012rl = startSketchOn(extrude001rl, 'START') originStart[2] + railHeight * 1.75 - .81 + .438 / 2 ], %) |> xLine(length = 0.75 - .438) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ -0.66 - originStart[0] - serverDepth + 1.5, originStart[2] + railHeight * 1.75 - .81 - (.438 / 2) - ], %) + ]) |> xLine(length = -0.75 + .438) - |> tangentialArcTo([profileStartX(%), profileStartY(%)], %) + |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() |> patternLinear2d( axis = [0, -1], @@ -1593,15 +1593,15 @@ fn streamServer = (serverPos) => { |> xLine(length = 0.2) |> yLine(length = -0.36) |> xLine(length = 0.5) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ 0.3, 17.15 + 4.114 + 1 + serverPos * 1.75 - 11.114 - ], %) + ]) |> yLine(length = -1.77) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ -0.13, 14.89 + 4.114 + 1 + serverPos * 1.75 - 11.114 - ], %) + ]) |> xLine(length = -0.52) |> yLine(length = -0.42) |> line(end = [0.34, -0.15]) @@ -1617,15 +1617,15 @@ fn streamServer = (serverPos) => { |> xLine(length = 0.2) |> yLine(length = -0.36) |> xLine(length = 0.5) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ 0.3, 17.15 + 4.114 + 1 + serverPos * 1.75 - 11.114 - ], %) + ]) |> yLine(length = -1.77) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ -0.13, 14.89 + 4.114 + 1 + serverPos * 1.75 - 11.114 - ], %) + ]) |> xLine(length = -0.52) |> yLine(length = -0.42) |> line(end = [0.34, -0.15]) diff --git a/rust/kcl-lib/e2e/executor/inputs/server-rack-lite.kcl b/rust/kcl-lib/e2e/executor/inputs/server-rack-lite.kcl index 52c9cd8fa..c5f4261c3 100644 --- a/rust/kcl-lib/e2e/executor/inputs/server-rack-lite.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/server-rack-lite.kcl @@ -676,12 +676,12 @@ const sketch010fl = startSketchOn(extrude001fl, 'START') originStart[2] + .81 - (.438 / 2) ], %) |> xLine(length = 0.75 - .438) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ -0.66 - originStart[0], originStart[2] + .81 + .438 / 2 - ], %) + ]) |> xLine(length = -0.75 + .438) - |> tangentialArcTo([profileStartX(%), profileStartY(%)], %) + |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() |> patternLinear2d( axis = [0, 1], @@ -697,12 +697,12 @@ const sketch011fl = startSketchOn(extrude001fl, 'START') originStart[2] + railHeight * 1.75 / 2 + .438 / 2 ], %) |> xLine(length = 0.75 - .438) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ -0.66 - originStart[0], originStart[2] + railHeight * 1.75 / 2 - (.438 / 2) - ], %) + ]) |> xLine(length = -0.75 + .438) - |> tangentialArcTo([profileStartX(%), profileStartY(%)], %) + |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() const extrude011fl = extrude(sketch011fl, length = -thickness) @@ -714,12 +714,12 @@ const sketch012fl = startSketchOn(extrude001fl, 'START') originStart[2] + railHeight * 1.75 - .81 + .438 / 2 ], %) |> xLine(length = 0.75 - .438) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ -0.66 - originStart[0], originStart[2] + railHeight * 1.75 - .81 - (.438 / 2) - ], %) + ]) |> xLine(length = -0.75 + .438) - |> tangentialArcTo([profileStartX(%), profileStartY(%)], %) + |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() |> patternLinear2d( axis = [0, -1], @@ -814,12 +814,12 @@ const sketch010fr = startSketchOn(extrude001fr, 'START') originStart[2] + .81 - (.438 / 2) ], %) |> xLine(length = 0.75 - .438) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ -0.66 - originStart[0], originStart[2] + .81 + .438 / 2 - ], %) + ]) |> xLine(length = -0.75 + .438) - |> tangentialArcTo([profileStartX(%), profileStartY(%)], %) + |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() |> patternLinear2d( axis = [0, 1], @@ -835,12 +835,12 @@ const sketch011fr = startSketchOn(extrude001fr, 'START') originStart[2] + railHeight * 1.75 / 2 + .438 / 2 ], %) |> xLine(length = 0.75 - .438) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ -0.66 - originStart[0], originStart[2] + railHeight * 1.75 / 2 - (.438 / 2) - ], %) + ]) |> xLine(length = -0.75 + .438) - |> tangentialArcTo([profileStartX(%), profileStartY(%)], %) + |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() const extrude011fr = extrude(sketch011fr, length = -thickness) @@ -852,12 +852,12 @@ const sketch012fr = startSketchOn(extrude001fr, 'START') originStart[2] + railHeight * 1.75 - .81 + .438 / 2 ], %) |> xLine(length = 0.75 - .438) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ -0.66 - originStart[0], originStart[2] + railHeight * 1.75 - .81 - (.438 / 2) - ], %) + ]) |> xLine(length = -0.75 + .438) - |> tangentialArcTo([profileStartX(%), profileStartY(%)], %) + |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() |> patternLinear2d( axis = [0, -1], @@ -952,12 +952,12 @@ const sketch010rr = startSketchOn(extrude001rr, 'START') originStart[2] + .81 - (.438 / 2) ], %) |> xLine(length = 0.75 - .438) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ -0.66 - originStart[0] + 1.5 - serverDepth, originStart[2] + .81 + .438 / 2 - ], %) + ]) |> xLine(length = -0.75 + .438) - |> tangentialArcTo([profileStartX(%), profileStartY(%)], %) + |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() |> patternLinear2d( axis = [0, 1], @@ -973,12 +973,12 @@ const sketch011rr = startSketchOn(extrude001rr, 'START') originStart[2] + railHeight * 1.75 / 2 + .438 / 2 ], %) |> xLine(length = 0.75 - .438) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ -0.66 - originStart[0] + 1.5 - serverDepth, originStart[2] + railHeight * 1.75 / 2 - (.438 / 2) - ], %) + ]) |> xLine(length = -0.75 + .438) - |> tangentialArcTo([profileStartX(%), profileStartY(%)], %) + |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() const extrude011rr = extrude(sketch011rr, length = -thickness) @@ -990,12 +990,12 @@ const sketch012rr = startSketchOn(extrude001rr, 'START') originStart[2] + railHeight * 1.75 - .81 + .438 / 2 ], %) |> xLine(length = 0.75 - .438) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ -0.66 - originStart[0] + 1.5 - serverDepth, originStart[2] + railHeight * 1.75 - .81 - (.438 / 2) - ], %) + ]) |> xLine(length = -0.75 + .438) - |> tangentialArcTo([profileStartX(%), profileStartY(%)], %) + |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() |> patternLinear2d( axis = [0, -1], @@ -1089,12 +1089,12 @@ const sketch010rl = startSketchOn(extrude001rl, 'START') originStart[2] + .81 - (.438 / 2) ], %) |> xLine(length = 0.75 - .438) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ -0.66 - originStart[0] - serverDepth + 1.5, originStart[2] + .81 + .438 / 2 - ], %) + ]) |> xLine(length = -0.75 + .438) - |> tangentialArcTo([profileStartX(%), profileStartY(%)], %) + |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() |> patternLinear2d( axis = [0, 1], @@ -1110,12 +1110,12 @@ const sketch011rl = startSketchOn(extrude001rl, 'START') originStart[2] + railHeight * 1.75 / 2 + .438 / 2 ], %) |> xLine(length = 0.75 - .438) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ -0.66 - originStart[0] - serverDepth + 1.5, originStart[2] + railHeight * 1.75 / 2 - (.438 / 2) - ], %) + ]) |> xLine(length = -0.75 + .438) - |> tangentialArcTo([profileStartX(%), profileStartY(%)], %) + |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() const extrude011rl = extrude(sketch011rl, length = -thickness) @@ -1127,12 +1127,12 @@ const sketch012rl = startSketchOn(extrude001rl, 'START') originStart[2] + railHeight * 1.75 - .81 + .438 / 2 ], %) |> xLine(length = 0.75 - .438) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ -0.66 - originStart[0] - serverDepth + 1.5, originStart[2] + railHeight * 1.75 - .81 - (.438 / 2) - ], %) + ]) |> xLine(length = -0.75 + .438) - |> tangentialArcTo([profileStartX(%), profileStartY(%)], %) + |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() |> patternLinear2d( axis = [0, -1], @@ -1184,15 +1184,15 @@ fn streamServer = (serverPos) => { |> xLine(length = 0.2) |> yLine(length = -0.36) |> xLine(length = 0.5) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ 0.3, 17.15 + 4.114 + 1 + serverPos * 1.75 - 11.114 - ], %) + ]) |> yLine(length = -1.77) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ -0.13, 14.89 + 4.114 + 1 + serverPos * 1.75 - 11.114 - ], %) + ]) |> xLine(length = -0.52) |> yLine(length = -0.42) |> line(end = [0.34, -0.15]) @@ -1208,15 +1208,15 @@ fn streamServer = (serverPos) => { |> xLine(length = 0.2) |> yLine(length = -0.36) |> xLine(length = 0.5) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ 0.3, 17.15 + 4.114 + 1 + serverPos * 1.75 - 11.114 - ], %) + ]) |> yLine(length = -1.77) - |> tangentialArcTo([ + |> tangentialArc(endAbsolute = [ -0.13, 14.89 + 4.114 + 1 + serverPos * 1.75 - 11.114 - ], %) + ]) |> xLine(length = -0.52) |> yLine(length = -0.42) |> line(end = [0.34, -0.15]) diff --git a/rust/kcl-lib/e2e/executor/inputs/tan_arc_x_line.kcl b/rust/kcl-lib/e2e/executor/inputs/tan_arc_x_line.kcl index 71ccd56b9..5da53aecd 100644 --- a/rust/kcl-lib/e2e/executor/inputs/tan_arc_x_line.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/tan_arc_x_line.kcl @@ -10,16 +10,17 @@ startSketchOn(XY) angle = angleStart, length = .000001, ) - |> tangentialArc({ - offset: angleOffset, + |> tangentialArc( + angle = angleOffset, radius: r, - }, %, $arc1) - |> tangentialArc({ - offset: angleOffset, - radius: 0.5*r, - }, %, $arc2) - |> tangentialArc({ - offset: -angleOffset, - radius: 0.5*r, -}, %, $arc3) + tag = $arc1, + ) + |> tangentialArc( + angle = angleOffset, + radius = 0.5*r, + tag = $arc2) + |> tangentialArc( + angle = -angleOffset, + radius = 0.5*r, + tag = $arc3) |> xLine(endAbsolute = 1) diff --git a/rust/kcl-lib/e2e/executor/inputs/tangential_arc.kcl b/rust/kcl-lib/e2e/executor/inputs/tangential_arc.kcl index 00e7280ac..625c59e92 100644 --- a/rust/kcl-lib/e2e/executor/inputs/tangential_arc.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/tangential_arc.kcl @@ -1,6 +1,6 @@ const boxSketch = startSketchOn(XY) |> startProfileAt([0, 0], %) |> line(end = [0, 10]) - |> tangentialArc({radius: 5, offset: 90}, %) + |> tangentialArc(radius = 5, angle = 90) |> line(end = [5, -15]) |> extrude(length = 10) diff --git a/rust/kcl-lib/e2e/executor/main.rs b/rust/kcl-lib/e2e/executor/main.rs index e809c277b..5c02cf0f8 100644 --- a/rust/kcl-lib/e2e/executor/main.rs +++ b/rust/kcl-lib/e2e/executor/main.rs @@ -159,7 +159,7 @@ async fn kcl_test_basic_tangential_arc_with_point() { let code = r#"boxSketch = startSketchOn(XY) |> startProfileAt([0, 0], %) |> line(end = [0, 10]) - |> tangentialArcToRelative([-5, 5], %) + |> tangentialArc(end = [-5, 5]) |> line(end = [5, -15]) |> extrude(length = 10) "#; @@ -173,7 +173,7 @@ async fn kcl_test_basic_tangential_arc_to() { let code = r#"boxSketch = startSketchOn(XY) |> startProfileAt([0, 0], %) |> line(end = [0, 10]) - |> tangentialArcTo([-5, 15], %) + |> tangentialArc(endAbsolute = [-5, 15]) |> line(end = [5, -15]) |> extrude(length = 10) "#; @@ -224,14 +224,14 @@ wallMountL = 8 bracket = startSketchOn(XY) |> startProfileAt([0, 0], %) |> line(end = [0, wallMountL]) - |> tangentialArc({ radius= filletR, offset: 90 }, %) + |> tangentialArc(radius = filletR, angle = 90 ) |> line(end = [-shelfMountL, 0]) |> line(end = [0, -thickness]) |> line(end = [shelfMountL, 0]) - |> tangentialArc({ - radius= filletR - thickness, - offset: -90 - }, %) + |> tangentialArc( + radius = filletR - thickness, + angle = -90, + ) |> line(end = [0, -wallMountL]) |> close() |> extrude(length = width) @@ -306,7 +306,7 @@ thing = other_circle([2, 2], 20) #[tokio::test(flavor = "multi_thread")] async fn kcl_test_rounded_with_holes() { let code = r#"fn tarc = (to, sktch, tag?) => { - return tangentialArcTo(to, sktch, tag) + return tangentialArc(sktch, endAbsolute = to, tag = tag) } fn roundedRectangle = (pos, w, l, cornerRadius) => { @@ -705,7 +705,7 @@ async fn kcl_test_error_sketch_on_arc_face() { let code = r#"fn cube = (pos, scale) => { sg = startSketchOn(XY) |> startProfileAt(pos, %) - |> tangentialArcToRelative([0, scale], %, $here) + |> tangentialArc(end = [0, scale], tag = $here) |> line(end = [scale, 0]) |> line(end = [0, -scale]) @@ -1342,7 +1342,7 @@ async fn kcl_test_error_empty_start_sketch_on_string() { |> line(end = [190.03, -118.13]) |> line(end = [-33.38, -202.86]) |> line(end = [-315.86, -64.2]) - |> tangentialArcTo([-147.66, 121.34], %) + |> tangentialArc(endAbsolute = [-147.66, 121.34]) |> close() |> extrude(length = 100) @@ -1352,10 +1352,11 @@ secondSketch = startSketchOn(part001, '') "#; let result = execute_and_snapshot(code, None).await; - assert!(result.is_err()); + let err = result.unwrap_err(); + let err = err.as_kcl_error().unwrap(); assert_eq!( - result.err().unwrap().to_string(), - r#"semantic: KclErrorDetails { source_ranges: [SourceRange([297, 299, 0])], message: "Argument at index 1 was supposed to be type Option but found string (text)" }"# + err.message(), + "Argument at index 1 was supposed to be type Option but found string (text)" ); } diff --git a/rust/kcl-lib/src/execution/state.rs b/rust/kcl-lib/src/execution/state.rs index a6f597c3d..b220072ae 100644 --- a/rust/kcl-lib/src/execution/state.rs +++ b/rust/kcl-lib/src/execution/state.rs @@ -7,6 +7,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use uuid::Uuid; +use super::types::NumericType; use crate::{ errors::{KclError, KclErrorDetails, Severity}, execution::{ @@ -22,8 +23,6 @@ use crate::{ CompilationError, }; -use super::types::NumericType; - /// State for executing a program. #[derive(Debug, Clone)] pub struct ExecState { diff --git a/rust/kcl-lib/src/execution/types.rs b/rust/kcl-lib/src/execution/types.rs index d3bb69250..3e5a94752 100644 --- a/rust/kcl-lib/src/execution/types.rs +++ b/rust/kcl-lib/src/execution/types.rs @@ -807,6 +807,7 @@ pub enum UnitAngle { impl UnitAngle { fn adjust_to(self, value: f64, to: UnitAngle) -> f64 { use std::f64::consts::PI; + use UnitAngle::*; if !*CHECK_NUMERIC_TYPES { @@ -1171,9 +1172,8 @@ impl KclValue { #[cfg(test)] mod test { - use crate::execution::{parse_execute, ExecTestResults}; - use super::*; + use crate::execution::{parse_execute, ExecTestResults}; fn values(exec_state: &mut ExecState) -> Vec { vec![ diff --git a/rust/kcl-lib/src/std/appearance.rs b/rust/kcl-lib/src/std/appearance.rs index 706e6c9fa..015cddec4 100644 --- a/rust/kcl-lib/src/std/appearance.rs +++ b/rust/kcl-lib/src/std/appearance.rs @@ -241,15 +241,9 @@ pub async fn appearance(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0.05, 0.05], %) /// |> line(end = [0, 7]) -/// |> tangentialArc({ -/// offset: 90, -/// radius: 5 -/// }, %) +/// |> tangentialArc(angle = 90, radius = 5) /// |> line(end = [-3, 0]) -/// |> tangentialArc({ -/// offset: -90, -/// radius: 5 -/// }, %) +/// |> tangentialArc(angle = -90, radius = 5) /// |> line(end = [0, 7]) /// /// pipeHole = startSketchOn(XY) diff --git a/rust/kcl-lib/src/std/args.rs b/rust/kcl-lib/src/std/args.rs index 904ad7628..d2cf8104e 100644 --- a/rust/kcl-lib/src/std/args.rs +++ b/rust/kcl-lib/src/std/args.rs @@ -151,6 +151,10 @@ impl Args { let Some(arg) = self.kw_args.labeled.get(label) else { return Ok(None); }; + if let KclValue::KclNone { .. } = arg.value { + // It is set, but it's an optional parameter that wasn't provided. + return Ok(None); + } T::from_kcl_val(&arg.value).map(Some).ok_or_else(|| { KclError::Type(KclErrorDetails { diff --git a/rust/kcl-lib/src/std/extrude.rs b/rust/kcl-lib/src/std/extrude.rs index 39007ef57..945f0983e 100644 --- a/rust/kcl-lib/src/std/extrude.rs +++ b/rust/kcl-lib/src/std/extrude.rs @@ -9,8 +9,7 @@ use kcmc::{ length_unit::LengthUnit, ok_response::OkModelingCmdResponse, output::ExtrusionFaceInfo, - shared::ExtrusionFaceCapType, - shared::Opposite, + shared::{ExtrusionFaceCapType, Opposite}, websocket::{ModelingCmdReq, OkWebSocketResponseData}, ModelingCmd, }; diff --git a/rust/kcl-lib/src/std/mod.rs b/rust/kcl-lib/src/std/mod.rs index c99e9e0ff..f0cdc13ce 100644 --- a/rust/kcl-lib/src/std/mod.rs +++ b/rust/kcl-lib/src/std/mod.rs @@ -85,8 +85,6 @@ lazy_static! { Box::new(crate::std::sketch::Arc), Box::new(crate::std::sketch::ArcTo), Box::new(crate::std::sketch::TangentialArc), - Box::new(crate::std::sketch::TangentialArcTo), - Box::new(crate::std::sketch::TangentialArcToRelative), Box::new(crate::std::sketch::BezierCurve), Box::new(crate::std::sketch::Hole), Box::new(crate::std::patterns::PatternLinear2D), diff --git a/rust/kcl-lib/src/std/patterns.rs b/rust/kcl-lib/src/std/patterns.rs index 6afb4e3fa..4478d60e5 100644 --- a/rust/kcl-lib/src/std/patterns.rs +++ b/rust/kcl-lib/src/std/patterns.rs @@ -824,7 +824,7 @@ pub async fn pattern_linear_3d(exec_state: &mut ExecState, args: Args) -> Result /// |> startProfileAt([-size, -size], %) /// |> line(end = [2 * size, 0]) /// |> line(end = [0, 2 * size]) -/// |> tangentialArcTo([-size, size], %) +/// |> tangentialArc(endAbsolute = [-size, size]) /// |> close(%) /// |> extrude(length = 65) /// @@ -852,7 +852,7 @@ pub async fn pattern_linear_3d(exec_state: &mut ExecState, args: Args) -> Result /// |> startProfileAt([-size, -size], %) /// |> line(end = [2 * size, 0]) /// |> line(end = [0, 2 * size]) -/// |> tangentialArcTo([-size, size], %) +/// |> tangentialArc(endAbsolute = [-size, size]) /// |> close(%) /// |> extrude(length = 65) /// diff --git a/rust/kcl-lib/src/std/revolve.rs b/rust/kcl-lib/src/std/revolve.rs index 48e77730d..581f75101 100644 --- a/rust/kcl-lib/src/std/revolve.rs +++ b/rust/kcl-lib/src/std/revolve.rs @@ -1,7 +1,12 @@ //! Standard library revolution surfaces. use anyhow::Result; -use kcmc::{each_cmd as mcmd, length_unit::LengthUnit, shared::Angle, shared::Opposite, ModelingCmd}; +use kcmc::{ + each_cmd as mcmd, + length_unit::LengthUnit, + shared::{Angle, Opposite}, + ModelingCmd, +}; use kittycad_modeling_cmds::{self as kcmc, shared::Point3d}; use super::DEFAULT_TOLERANCE; diff --git a/rust/kcl-lib/src/std/segment.rs b/rust/kcl-lib/src/std/segment.rs index 7616de4ce..8158d7560 100644 --- a/rust/kcl-lib/src/std/segment.rs +++ b/rust/kcl-lib/src/std/segment.rs @@ -393,10 +393,7 @@ pub async fn segment_length(exec_state: &mut ExecState, args: Args) -> Result tangentialArc({ -/// offset = -120, -/// radius = 5, -/// }, %) +/// |> tangentialArc(angle = -120, radius = 5) /// |> angledLine( /// angle = -60, /// length = segLen(thing), @@ -485,12 +482,12 @@ pub async fn tangent_to_end(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> line(end = [20, 0]) -/// |> tangentialArcToRelative([0, 10], %, $arc1) +/// |> tangentialArc(end = [0, 10], tag = $arc1) /// |> angledLine( /// angle = tangentToEnd(arc1), /// length = 20, /// ) -/// |> tangentialArcToRelative([0, -10], %) +/// |> tangentialArc(end = [0, -10]) /// |> close() /// /// pillExtrude = extrude(pillSketch, length = 10) @@ -501,12 +498,12 @@ pub async fn tangent_to_end(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0, 0], %) /// |> line(end = [0, 20]) -/// |> tangentialArcTo([10, 20], %, $arc1) +/// |> tangentialArc(endAbsolute = [10, 20], tag = $arc1) /// |> angledLine( /// angle = tangentToEnd(arc1), /// length = 20, /// ) -/// |> tangentialArcToRelative([-10, 0], %) +/// |> tangentialArc(end = [-10, 0]) /// |> close() /// /// pillExtrude = extrude(pillSketch, length = 10) diff --git a/rust/kcl-lib/src/std/shell.rs b/rust/kcl-lib/src/std/shell.rs index 618696f7c..3eb55380c 100644 --- a/rust/kcl-lib/src/std/shell.rs +++ b/rust/kcl-lib/src/std/shell.rs @@ -104,7 +104,7 @@ pub async fn shell(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([-size, -size], %) /// |> line(end = [2 * size, 0]) /// |> line(end = [0, 2 * size]) -/// |> tangentialArcTo([-size, size], %) +/// |> tangentialArc(endAbsolute = [-size, size]) /// |> close() /// |> extrude(length = 65) /// @@ -127,7 +127,7 @@ pub async fn shell(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([-size, -size], %) /// |> line(end = [2 * size, 0]) /// |> line(end = [0, 2 * size]) -/// |> tangentialArcTo([-size, size], %) +/// |> tangentialArc(endAbsolute = [-size, size]) /// |> close() /// |> extrude(length = 65) /// @@ -152,7 +152,7 @@ pub async fn shell(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([-size, -size], %) /// |> line(end = [2 * size, 0]) /// |> line(end = [0, 2 * size]) -/// |> tangentialArcTo([-size, size], %) +/// |> tangentialArc(endAbsolute = [-size, size]) /// |> close() /// |> extrude(length = 65) /// @@ -287,7 +287,7 @@ pub async fn hollow(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([-size, -size], %) /// |> line(end = [2 * size, 0]) /// |> line(end = [0, 2 * size]) -/// |> tangentialArcTo([-size, size], %) +/// |> tangentialArc(endAbsolute = [-size, size]) /// |> close() /// |> extrude(length = 65) /// diff --git a/rust/kcl-lib/src/std/sketch.rs b/rust/kcl-lib/src/std/sketch.rs index 3132a40fa..27eb22ab3 100644 --- a/rust/kcl-lib/src/std/sketch.rs +++ b/rust/kcl-lib/src/std/sketch.rs @@ -1705,6 +1705,127 @@ pub(crate) async fn inner_arc_to( Ok(new_sketch) } +/// Draw a tangential arc to a specific point. +pub async fn tangential_arc(exec_state: &mut ExecState, args: Args) -> Result { + let sketch = + args.get_unlabeled_kw_arg_typed("sketch", &RuntimeType::Primitive(PrimitiveType::Sketch), exec_state)?; + let end = args.get_kw_arg_opt("end")?; + let end_absolute = args.get_kw_arg_opt("endAbsolute")?; + let radius = args.get_kw_arg_opt("radius")?; + let angle = args.get_kw_arg_opt("angle")?; + let tag = args.get_kw_arg_opt(NEW_TAG_KW)?; + + let new_sketch = inner_tangential_arc(sketch, end_absolute, end, radius, angle, tag, exec_state, args).await?; + Ok(KclValue::Sketch { + value: Box::new(new_sketch), + }) +} + +/// Starting at the current sketch's origin, draw a curved line segment along +/// some part of an imaginary circle until it reaches the desired (x, y) +/// coordinates. +/// +/// When using radius and angle, draw a curved line segment along part of an +/// imaginary circle. The arc is constructed such that the last line segment is +/// placed tangent to the imaginary circle of the specified radius. The +/// resulting arc is the segment of the imaginary circle from that tangent point +/// for 'angle' degrees along the imaginary circle. +/// +/// ```no_run +/// exampleSketch = startSketchOn(XZ) +/// |> startProfileAt([0, 0], %) +/// |> angledLine( +/// angle = 45, +/// length = 10, +/// ) +/// |> tangentialArc(end = [0, -10]) +/// |> line(end = [-10, 0]) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 10) +/// ``` +/// +/// ```no_run +/// exampleSketch = startSketchOn(XZ) +/// |> startProfileAt([0, 0], %) +/// |> angledLine( +/// angle = 60, +/// length = 10, +/// ) +/// |> tangentialArc(endAbsolute = [15, 15]) +/// |> line(end = [10, -15]) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 10) +/// ``` +/// +/// ```no_run +/// exampleSketch = startSketchOn(XZ) +/// |> startProfileAt([0, 0], %) +/// |> angledLine( +/// angle = 60, +/// length = 10, +/// ) +/// |> tangentialArc(radius = 10, angle = -120) +/// |> angledLine( +/// angle = -60, +/// length = 10, +/// ) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 10) +/// ``` +#[stdlib { + name = "tangentialArc", + keywords = true, + unlabeled_first = true, + args = { + sketch = { docs = "Which sketch should this path be added to?"}, + end_absolute = { docs = "Which absolute point should this arc go to? Incompatible with `end`, `radius`, and `offset`."}, + end = { docs = "How far away (along the X and Y axes) should this arc go? Incompatible with `endAbsolute`, `radius`, and `offset`.", include_in_snippet = true }, + radius = { docs = "Radius of the imaginary circle. `angle` must be given. Incompatible with `end` and `endAbsolute`."}, + angle = { docs = "Offset of the arc in degrees. `radius` must be given. Incompatible with `end` and `endAbsolute`."}, + tag = { docs = "Create a new tag which refers to this arc"}, + } +}] +#[allow(clippy::too_many_arguments)] +async fn inner_tangential_arc( + sketch: Sketch, + end_absolute: Option<[f64; 2]>, + end: Option<[f64; 2]>, + radius: Option, + angle: Option, + tag: Option, + exec_state: &mut ExecState, + args: Args, +) -> Result { + match (end_absolute, end, radius, angle) { + (Some(point), None, None, None) => { + inner_tangential_arc_to_point(sketch, point, true, tag, exec_state, args).await + } + (None, Some(point), None, None) => { + inner_tangential_arc_to_point(sketch, point, false, tag, exec_state, args).await + } + (None, None, Some(radius), Some(angle)) => { + let data = TangentialArcData::RadiusAndOffset { radius, offset: angle }; + inner_tangential_arc_radius_angle(data, sketch, tag, exec_state, args).await + } + (Some(_), Some(_), None, None) => Err(KclError::Semantic(KclErrorDetails { + source_ranges: vec![args.source_range], + message: "You cannot give both `end` and `endAbsolute` params, you have to choose one or the other" + .to_owned(), + })), + (None, None, Some(_), None) | (None, None, None, Some(_)) => Err(KclError::Semantic(KclErrorDetails { + source_ranges: vec![args.source_range], + message: "You must supply both `radius` and `angle` arguments".to_owned(), + })), + (_, _, _, _) => Err(KclError::Semantic(KclErrorDetails { + source_ranges: vec![args.source_range], + message: "You must supply `end`, `endAbsolute`, or both `radius` and `angle` arguments".to_owned(), + })), + } +} + /// Data to draw a tangential arc. #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, JsonSchema, ts_rs::TS)] #[ts(export)] @@ -1719,44 +1840,13 @@ pub enum TangentialArcData { }, } -/// Draw a tangential arc. -pub async fn tangential_arc(exec_state: &mut ExecState, args: Args) -> Result { - let (data, sketch, tag): (TangentialArcData, Sketch, Option) = - args.get_data_and_sketch_and_tag(exec_state)?; - - let new_sketch = inner_tangential_arc(data, sketch, tag, exec_state, args).await?; - Ok(KclValue::Sketch { - value: Box::new(new_sketch), - }) -} - /// Draw a curved line segment along part of an imaginary circle. /// /// The arc is constructed such that the last line segment is placed tangent /// to the imaginary circle of the specified radius. The resulting arc is the -/// segment of the imaginary circle from that tangent point for 'offset' +/// segment of the imaginary circle from that tangent point for 'angle' /// degrees along the imaginary circle. -/// -/// ```no_run -/// exampleSketch = startSketchOn(XZ) -/// |> startProfileAt([0, 0], %) -/// |> angledLine( -/// angle = 60, -/// length = 10, -/// ) -/// |> tangentialArc({ radius = 10, offset = -120 }, %) -/// |> angledLine( -/// angle = -60, -/// length = 10, -/// ) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 10) -/// ``` -#[stdlib { - name = "tangentialArc", -}] -async fn inner_tangential_arc( +async fn inner_tangential_arc_radius_angle( data: TangentialArcData, sketch: Sketch, tag: Option, @@ -1847,49 +1937,10 @@ fn tan_arc_to(sketch: &Sketch, to: &[f64; 2]) -> ModelingCmd { }) } -/// Draw a tangential arc to a specific point. -pub async fn tangential_arc_to(exec_state: &mut ExecState, args: Args) -> Result { - let (to, sketch, tag): ([f64; 2], Sketch, Option) = args.get_data_and_sketch_and_tag(exec_state)?; - - let new_sketch = inner_tangential_arc_to(to, sketch, tag, exec_state, args).await?; - Ok(KclValue::Sketch { - value: Box::new(new_sketch), - }) -} - -/// Draw a tangential arc to point some distance away.. -pub async fn tangential_arc_to_relative(exec_state: &mut ExecState, args: Args) -> Result { - let (delta, sketch, tag): ([f64; 2], Sketch, Option) = args.get_data_and_sketch_and_tag(exec_state)?; - - let new_sketch = inner_tangential_arc_to_relative(delta, sketch, tag, exec_state, args).await?; - Ok(KclValue::Sketch { - value: Box::new(new_sketch), - }) -} - -/// Starting at the current sketch's origin, draw a curved line segment along -/// some part of an imaginary circle until it reaches the desired (x, y) -/// coordinates. -/// -/// ```no_run -/// exampleSketch = startSketchOn(XZ) -/// |> startProfileAt([0, 0], %) -/// |> angledLine( -/// angle = 60, -/// length = 10, -/// ) -/// |> tangentialArcTo([15, 15], %) -/// |> line(end = [10, -15]) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 10) -/// ``` -#[stdlib { - name = "tangentialArcTo", -}] -async fn inner_tangential_arc_to( - to: [f64; 2], +async fn inner_tangential_arc_to_point( sketch: Sketch, + point: [f64; 2], + is_absolute: bool, tag: Option, exec_state: &mut ExecState, args: Args, @@ -1897,6 +1948,12 @@ async fn inner_tangential_arc_to( let from: Point2d = sketch.current_pen_position()?; let tangent_info = sketch.get_tangential_info_from_paths(); let tan_previous_point = tangent_info.tan_previous_point(from.into()); + + let to = if is_absolute { + point + } else { + [from.x + point[0], from.y + point[1]] + }; let [to_x, to_y] = to; let result = get_tangential_arc_to_info(TangentialArcInfoInput { arc_start_point: [from.x, from.y], @@ -1905,75 +1962,6 @@ async fn inner_tangential_arc_to( obtuse: true, }); - let delta = [to_x - from.x, to_y - from.y]; - let id = exec_state.next_uuid(); - args.batch_modeling_cmd(id, tan_arc_to(&sketch, &delta)).await?; - - let current_path = Path::TangentialArcTo { - base: BasePath { - from: from.into(), - to, - tag: tag.clone(), - units: sketch.units, - geo_meta: GeoMeta { - id, - metadata: args.source_range.into(), - }, - }, - center: result.center, - ccw: result.ccw > 0, - }; - - let mut new_sketch = sketch.clone(); - if let Some(tag) = &tag { - new_sketch.add_tag(tag, ¤t_path, exec_state); - } - - new_sketch.paths.push(current_path); - - Ok(new_sketch) -} - -/// Starting at the current sketch's origin, draw a curved line segment along -/// some part of an imaginary circle until it reaches a point the given (x, y) -/// distance away. -/// -/// ```no_run -/// exampleSketch = startSketchOn(XZ) -/// |> startProfileAt([0, 0], %) -/// |> angledLine( -/// angle = 45, -/// length = 10, -/// ) -/// |> tangentialArcToRelative([0, -10], %) -/// |> line(end = [-10, 0]) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 10) -/// ``` -#[stdlib { - name = "tangentialArcToRelative", -}] -async fn inner_tangential_arc_to_relative( - delta: [f64; 2], - sketch: Sketch, - tag: Option, - exec_state: &mut ExecState, - args: Args, -) -> Result { - let from: Point2d = sketch.current_pen_position()?; - let to = [from.x + delta[0], from.y + delta[1]]; - let tangent_info = sketch.get_tangential_info_from_paths(); - let tan_previous_point = tangent_info.tan_previous_point(from.into()); - - let [dx, dy] = delta; - let result = get_tangential_arc_to_info(TangentialArcInfoInput { - arc_start_point: [from.x, from.y], - arc_end_point: [from.x + dx, from.y + dy], - tan_previous_point, - obtuse: true, - }); - if result.center[0].is_infinite() { return Err(KclError::Semantic(KclErrorDetails { source_ranges: vec![args.source_range], @@ -1990,6 +1978,11 @@ async fn inner_tangential_arc_to_relative( })); } + let delta = if is_absolute { + [to_x - from.x, to_y - from.y] + } else { + point + }; let id = exec_state.next_uuid(); args.batch_modeling_cmd(id, tan_arc_to(&sketch, &delta)).await?; diff --git a/rust/kcl-lib/src/std/sweep.rs b/rust/kcl-lib/src/std/sweep.rs index becbb3aed..3bd722583 100644 --- a/rust/kcl-lib/src/std/sweep.rs +++ b/rust/kcl-lib/src/std/sweep.rs @@ -58,15 +58,9 @@ pub async fn sweep(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0.05, 0.05], %) /// |> line(end = [0, 7]) -/// |> tangentialArc({ -/// offset: 90, -/// radius: 5 -/// }, %) +/// |> tangentialArc(angle = 90, radius = 5) /// |> line(end = [-3, 0]) -/// |> tangentialArc({ -/// offset: -90, -/// radius: 5 -/// }, %) +/// |> tangentialArc(angle = -90, radius = 5) /// |> line(end = [0, 7]) /// /// // Create a hole for the pipe. @@ -127,10 +121,7 @@ pub async fn sweep(exec_state: &mut ExecState, args: Args) -> Result yLine(length = 231.81) -/// |> tangentialArc({ -/// radius = 80, -/// offset = -90, -/// }, %) +/// |> tangentialArc(radius = 80, angle = -90) /// |> xLine(length = 384.93) /// /// sweep([rectangleSketch, circleSketch], path = sweepPath) @@ -144,10 +135,7 @@ pub async fn sweep(exec_state: &mut ExecState, args: Args) -> Result yLine(length = 231.81) -/// |> tangentialArc({ -/// radius = 80, -/// offset = -90, -/// }, %) +/// |> tangentialArc(radius = 80, angle = -90) /// |> xLine(length = 384.93) /// /// sweep(circleSketch, path = sweepPath, sectional = true) diff --git a/rust/kcl-lib/src/std/transform.rs b/rust/kcl-lib/src/std/transform.rs index d34029920..6611d6f53 100644 --- a/rust/kcl-lib/src/std/transform.rs +++ b/rust/kcl-lib/src/std/transform.rs @@ -67,15 +67,9 @@ pub async fn scale(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0.05, 0.05], %) /// |> line(end = [0, 7]) -/// |> tangentialArc({ -/// offset: 90, -/// radius: 5 -/// }, %) +/// |> tangentialArc(angle = 90, radius = 5) /// |> line(end = [-3, 0]) -/// |> tangentialArc({ -/// offset: -90, -/// radius: 5 -/// }, %) +/// |> tangentialArc(angle = -90, radius = 5) /// |> line(end = [0, 7]) /// /// // Create a hole for the pipe. @@ -130,10 +124,7 @@ pub async fn scale(exec_state: &mut ExecState, args: Args) -> Result yLine(length = 231.81) -/// |> tangentialArc({ -/// radius = 80, -/// offset = -90, -/// }, %) +/// |> tangentialArc(radius = 80, angle = -90) /// |> xLine(length = 384.93) /// /// parts = sweep([rectangleSketch, circleSketch], path = sweepPath) @@ -241,15 +232,9 @@ pub async fn translate(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0.05, 0.05], %) /// |> line(end = [0, 7]) -/// |> tangentialArc({ -/// offset: 90, -/// radius: 5 -/// }, %) +/// |> tangentialArc(angle = 90, radius = 5) /// |> line(end = [-3, 0]) -/// |> tangentialArc({ -/// offset: -90, -/// radius: 5 -/// }, %) +/// |> tangentialArc(angle = -90, radius = 5) /// |> line(end = [0, 7]) /// /// // Create a hole for the pipe. @@ -318,10 +303,7 @@ pub async fn translate(exec_state: &mut ExecState, args: Args) -> Result yLine(length = 231.81) -/// |> tangentialArc({ -/// radius = 80, -/// offset = -90, -/// }, %) +/// |> tangentialArc(radius = 80, angle = -90) /// |> xLine(length = 384.93) /// /// parts = sweep([rectangleSketch, circleSketch], path = sweepPath) @@ -575,15 +557,9 @@ pub async fn rotate(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0.05, 0.05], %) /// |> line(end = [0, 7]) -/// |> tangentialArc({ -/// offset: 90, -/// radius: 5 -/// }, %) +/// |> tangentialArc(angle = 90, radius = 5) /// |> line(end = [-3, 0]) -/// |> tangentialArc({ -/// offset: -90, -/// radius: 5 -/// }, %) +/// |> tangentialArc(angle = -90, radius = 5) /// |> line(end = [0, 7]) /// /// // Create a hole for the pipe. @@ -614,15 +590,9 @@ pub async fn rotate(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0.05, 0.05], %) /// |> line(end = [0, 7]) -/// |> tangentialArc({ -/// offset: 90, -/// radius: 5 -/// }, %) +/// |> tangentialArc(angle = 90, radius = 5) /// |> line(end = [-3, 0]) -/// |> tangentialArc({ -/// offset: -90, -/// radius: 5 -/// }, %) +/// |> tangentialArc(angle = -90, radius = 5) /// |> line(end = [0, 7]) /// /// // Create a hole for the pipe. @@ -651,15 +621,9 @@ pub async fn rotate(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([0.05, 0.05], %) /// |> line(end = [0, 7]) -/// |> tangentialArc({ -/// offset: 90, -/// radius: 5 -/// }, %) +/// |> tangentialArc(angle = 90, radius = 5) /// |> line(end = [-3, 0]) -/// |> tangentialArc({ -/// offset: -90, -/// radius: 5 -/// }, %) +/// |> tangentialArc(angle = -90, radius = 5) /// |> line(end = [0, 7]) /// /// // Create a hole for the pipe. @@ -716,10 +680,7 @@ pub async fn rotate(exec_state: &mut ExecState, args: Args) -> Result yLine(length = 231.81) -/// |> tangentialArc({ -/// radius = 80, -/// offset = -90, -/// }, %) +/// |> tangentialArc(radius = 80, angle = -90) /// |> xLine(length = 384.93) /// /// parts = sweep([rectangleSketch, circleSketch], path = sweepPath) @@ -846,15 +807,9 @@ mod tests { const PIPE: &str = r#"sweepPath = startSketchOn('XZ') |> startProfileAt([0.05, 0.05], %) |> line(end = [0, 7]) - |> tangentialArc({ - offset: 90, - radius: 5 - }, %) + |> tangentialArc(angle = 90, radius = 5) |> line(end = [-3, 0]) - |> tangentialArc({ - offset: -90, - radius: 5 - }, %) + |> tangentialArc(angle = -90, radius = 5) |> line(end = [0, 7]) // Create a hole for the pipe. diff --git a/rust/kcl-lib/std/sketch.kcl b/rust/kcl-lib/std/sketch.kcl index 4d9458fad..e6c75b6bb 100644 --- a/rust/kcl-lib/std/sketch.kcl +++ b/rust/kcl-lib/std/sketch.kcl @@ -103,9 +103,9 @@ export fn circle( /// sketch0011 = startSketchOn(XY) /// |> startProfileAt([6.77, 0], %) /// |> yLine(length = 1.27) -/// |> tangentialArcTo([5.96, 2.37], %) -/// |> tangentialArcTo([-6.2, 2.44], %) -/// |> tangentialArcTo([-6.6, 1.82], %) +/// |> tangentialArc(endAbsolute = [5.96, 2.37]) +/// |> tangentialArc(endAbsolute = [-6.2, 2.44]) +/// |> tangentialArc(endAbsolute = [-6.6, 1.82]) /// |> yLine(length = -1.82) /// |> mirror2d( axis = X ) /// |> extrude(length = 10) diff --git a/rust/kcl-lib/tests/artifact_graph_example_code_no_3d/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/artifact_graph_example_code_no_3d/artifact_graph_flowchart.snap.md index ea36a8a2c..6995f4f79 100644 --- a/rust/kcl-lib/tests/artifact_graph_example_code_no_3d/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/artifact_graph_example_code_no_3d/artifact_graph_flowchart.snap.md @@ -12,8 +12,8 @@ flowchart LR subgraph path10 [Path] 10["Path
[479, 508, 0]"] 11["Segment
[514, 539, 0]"] - 12["Segment
[545, 571, 0]"] - 13["Segment
[577, 609, 0]"] + 12["Segment
[545, 580, 0]"] + 13["Segment
[586, 627, 0]"] end 1["Plane
[12, 31, 0]"] 9["Plane
[453, 473, 0]"] diff --git a/rust/kcl-lib/tests/artifact_graph_example_code_no_3d/ast.snap b/rust/kcl-lib/tests/artifact_graph_example_code_no_3d/ast.snap index 71d453e3f..6e7ef93bf 100644 --- a/rust/kcl-lib/tests/artifact_graph_example_code_no_3d/ast.snap +++ b/rust/kcl-lib/tests/artifact_graph_example_code_no_3d/ast.snap @@ -816,116 +816,47 @@ description: Result of parsing artifact_graph_example_code_no_3d.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "tangentialArcTo", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - { - "arguments": [ - { - "commentStart": 0, - "elements": [ - { - "argument": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { "commentStart": 0, "end": 0, - "raw": "6.8", + "raw": "0", "start": 0, "type": "Literal", "type": "Literal", "value": { - "value": 6.8, + "value": 0.0, "suffix": "None" } }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "8.17", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 8.17, - "suffix": "None" + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -935,7 +866,7 @@ description: Result of parsing artifact_graph_example_code_no_3d.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcTo", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -946,8 +877,85 @@ description: Result of parsing artifact_graph_example_code_no_3d.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "6.8", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 6.8, + "suffix": "None" + } + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "commentStart": 0, + "end": 0, + "raw": "8.17", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 8.17, + "suffix": "None" + } + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "tangentialArc", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null } ], "commentStart": 0, diff --git a/rust/kcl-lib/tests/artifact_graph_example_code_no_3d/input.kcl b/rust/kcl-lib/tests/artifact_graph_example_code_no_3d/input.kcl index 9c73312bf..e2f8b35c0 100644 --- a/rust/kcl-lib/tests/artifact_graph_example_code_no_3d/input.kcl +++ b/rust/kcl-lib/tests/artifact_graph_example_code_no_3d/input.kcl @@ -8,5 +8,5 @@ sketch003 = startSketchOn('YZ') sketch004 = startSketchOn('-XZ') |> startProfileAt([0, 14.36], %) |> line(end = [15.49, 0.05]) - |> tangentialArcTo([0, 0], %) - |> tangentialArcTo([-6.8, 8.17], %) + |> tangentialArc(endAbsolute = [0, 0]) + |> tangentialArc(endAbsolute = [-6.8, 8.17]) diff --git a/rust/kcl-lib/tests/artifact_graph_example_code_no_3d/unparsed.snap b/rust/kcl-lib/tests/artifact_graph_example_code_no_3d/unparsed.snap index 8be33b44b..882091554 100644 --- a/rust/kcl-lib/tests/artifact_graph_example_code_no_3d/unparsed.snap +++ b/rust/kcl-lib/tests/artifact_graph_example_code_no_3d/unparsed.snap @@ -12,5 +12,5 @@ sketch003 = startSketchOn(YZ) sketch004 = startSketchOn(-XZ) |> startProfileAt([0, 14.36], %) |> line(end = [15.49, 0.05]) - |> tangentialArcTo([0, 0], %) - |> tangentialArcTo([-6.8, 8.17], %) + |> tangentialArc(endAbsolute = [0, 0]) + |> tangentialArc(endAbsolute = [-6.8, 8.17]) diff --git a/rust/kcl-lib/tests/i_shape/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/i_shape/artifact_graph_flowchart.snap.md index d2a06f43a..589599aec 100644 --- a/rust/kcl-lib/tests/i_shape/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/i_shape/artifact_graph_flowchart.snap.md @@ -3,48 +3,48 @@ flowchart LR subgraph path2 [Path] 2["Path
[422, 459, 0]"] 3["Segment
[465, 505, 0]"] - 4["Segment
[511, 569, 0]"] - 5["Segment
[575, 611, 0]"] - 6["Segment
[617, 676, 0]"] - 7["Segment
[682, 747, 0]"] - 8["Segment
[753, 812, 0]"] - 9["Segment
[818, 876, 0]"] - 10["Segment
[882, 940, 0]"] - 11["Segment
[946, 988, 0]"] - 12["Segment
[994, 1052, 0]"] - 13["Segment
[1058, 1094, 0]"] - 14["Segment
[1100, 1159, 0]"] - 15["Segment
[1165, 1234, 0]"] - 16["Segment
[1240, 1300, 0]"] - 17["Segment
[1306, 1345, 0]"] - 18["Segment
[1351, 1410, 0]"] - 19["Segment
[1416, 1458, 0]"] - 20["Segment
[1464, 1523, 0]"] - 21["Segment
[1529, 1590, 0]"] - 22["Segment
[1596, 1656, 0]"] - 23["Segment
[1662, 1792, 0]"] - 24["Segment
[1798, 1858, 0]"] - 25["Segment
[1864, 1903, 0]"] - 26["Segment
[1909, 1968, 0]"] - 27["Segment
[1974, 1982, 0]"] + 4["Segment
[511, 562, 0]"] + 5["Segment
[568, 604, 0]"] + 6["Segment
[610, 662, 0]"] + 7["Segment
[668, 733, 0]"] + 8["Segment
[739, 791, 0]"] + 9["Segment
[797, 855, 0]"] + 10["Segment
[861, 912, 0]"] + 11["Segment
[918, 960, 0]"] + 12["Segment
[966, 1017, 0]"] + 13["Segment
[1023, 1059, 0]"] + 14["Segment
[1065, 1117, 0]"] + 15["Segment
[1123, 1192, 0]"] + 16["Segment
[1198, 1251, 0]"] + 17["Segment
[1257, 1296, 0]"] + 18["Segment
[1302, 1354, 0]"] + 19["Segment
[1360, 1402, 0]"] + 20["Segment
[1408, 1460, 0]"] + 21["Segment
[1466, 1527, 0]"] + 22["Segment
[1533, 1586, 0]"] + 23["Segment
[1592, 1722, 0]"] + 24["Segment
[1728, 1781, 0]"] + 25["Segment
[1787, 1826, 0]"] + 26["Segment
[1832, 1884, 0]"] + 27["Segment
[1890, 1898, 0]"] 28[Solid2d] end subgraph path30 [Path] - 30["Path
[2015, 2040, 0]"] - 31["Segment
[2046, 2065, 0]"] - 32["Segment
[2071, 2129, 0]"] - 33["Segment
[2135, 2177, 0]"] - 34["Segment
[2183, 2242, 0]"] - 35["Segment
[2248, 2268, 0]"] - 36["Segment
[2274, 2334, 0]"] - 37["Segment
[2340, 2385, 0]"] - 38["Segment
[2391, 2450, 0]"] - 39["Segment
[2456, 2464, 0]"] + 30["Path
[1931, 1956, 0]"] + 31["Segment
[1962, 1981, 0]"] + 32["Segment
[1987, 2038, 0]"] + 33["Segment
[2044, 2086, 0]"] + 34["Segment
[2092, 2144, 0]"] + 35["Segment
[2150, 2170, 0]"] + 36["Segment
[2176, 2229, 0]"] + 37["Segment
[2235, 2280, 0]"] + 38["Segment
[2286, 2338, 0]"] + 39["Segment
[2344, 2352, 0]"] 40[Solid2d] end 1["Plane
[399, 416, 0]"] - 29["Plane
[1992, 2009, 0]"] - 41["Sweep Extrusion
[2510, 2531, 0]"] + 29["Plane
[1908, 1925, 0]"] + 41["Sweep Extrusion
[2398, 2419, 0]"] 42[Wall] 43[Wall] 44[Wall] diff --git a/rust/kcl-lib/tests/i_shape/ast.snap b/rust/kcl-lib/tests/i_shape/ast.snap index 4c5439e38..eb9a2389d 100644 --- a/rust/kcl-lib/tests/i_shape/ast.snap +++ b/rust/kcl-lib/tests/i_shape/ast.snap @@ -560,52 +560,55 @@ description: Result of parsing i_shape.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "end", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "corner_radius", + "name": { + "commentStart": 0, + "end": 0, + "name": "corner_radius", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "corner_radius", + "name": { + "commentStart": 0, + "end": 0, + "name": "corner_radius", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -615,7 +618,7 @@ description: Result of parsing i_shape.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcToRelative", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -626,8 +629,9 @@ description: Result of parsing i_shape.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -703,10 +707,42 @@ description: Result of parsing i_shape.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "argument": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "end", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "corner_radius", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { "abs_path": false, "commentStart": 0, "end": 0, @@ -721,42 +757,13 @@ description: Result of parsing i_shape.kcl "start": 0, "type": "Name", "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "corner_radius", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -766,7 +773,7 @@ description: Result of parsing i_shape.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcToRelative", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -777,8 +784,9 @@ description: Result of parsing i_shape.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -898,10 +906,42 @@ description: Result of parsing i_shape.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "argument": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "end", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "corner_radius", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { "abs_path": false, "commentStart": 0, "end": 0, @@ -916,42 +956,13 @@ description: Result of parsing i_shape.kcl "start": 0, "type": "Name", "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "corner_radius", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -961,7 +972,7 @@ description: Result of parsing i_shape.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcToRelative", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -972,8 +983,9 @@ description: Result of parsing i_shape.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -1113,52 +1125,55 @@ description: Result of parsing i_shape.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "end", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "corner_radius", + "name": { + "commentStart": 0, + "end": 0, + "name": "corner_radius", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "corner_radius", + "name": { + "commentStart": 0, + "end": 0, + "name": "corner_radius", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -1168,7 +1183,7 @@ description: Result of parsing i_shape.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcToRelative", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -1179,8 +1194,9 @@ description: Result of parsing i_shape.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -1276,52 +1292,55 @@ description: Result of parsing i_shape.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "end", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "corner_radius", + "name": { + "commentStart": 0, + "end": 0, + "name": "corner_radius", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "corner_radius", + "name": { + "commentStart": 0, + "end": 0, + "name": "corner_radius", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -1331,7 +1350,7 @@ description: Result of parsing i_shape.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcToRelative", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -1342,8 +1361,9 @@ description: Result of parsing i_shape.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -1419,10 +1439,42 @@ description: Result of parsing i_shape.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "argument": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "end", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "corner_radius", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { "abs_path": false, "commentStart": 0, "end": 0, @@ -1437,42 +1489,13 @@ description: Result of parsing i_shape.kcl "start": 0, "type": "Name", "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "corner_radius", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -1482,7 +1505,7 @@ description: Result of parsing i_shape.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcToRelative", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -1493,8 +1516,9 @@ description: Result of parsing i_shape.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -1642,68 +1666,71 @@ description: Result of parsing i_shape.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "argument": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "end", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "argument": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "corner_radius", + "name": { + "commentStart": 0, + "end": 0, + "name": "corner_radius", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - { - "argument": { - "abs_path": false, "commentStart": 0, "end": 0, - "name": { + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "corner_radius", + "name": { + "commentStart": 0, + "end": 0, + "name": "corner_radius", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" }, - "path": [], + "commentStart": 0, + "end": 0, + "operator": "-", "start": 0, - "type": "Name", - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -1713,7 +1740,7 @@ description: Result of parsing i_shape.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcToRelative", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -1724,8 +1751,9 @@ description: Result of parsing i_shape.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -1809,26 +1837,18 @@ description: Result of parsing i_shape.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "corner_radius", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "argument": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "end", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { "abs_path": false, "commentStart": 0, "end": 0, @@ -1844,25 +1864,36 @@ description: Result of parsing i_shape.kcl "type": "Name", "type": "Name" }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "corner_radius", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -1872,7 +1903,7 @@ description: Result of parsing i_shape.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcToRelative", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -1883,8 +1914,9 @@ description: Result of parsing i_shape.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -1980,26 +2012,18 @@ description: Result of parsing i_shape.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "corner_radius", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "argument": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "end", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { "abs_path": false, "commentStart": 0, "end": 0, @@ -2015,25 +2039,36 @@ description: Result of parsing i_shape.kcl "type": "Name", "type": "Name" }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "corner_radius", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -2043,7 +2078,7 @@ description: Result of parsing i_shape.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcToRelative", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -2054,8 +2089,9 @@ description: Result of parsing i_shape.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -2203,68 +2239,71 @@ description: Result of parsing i_shape.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "argument": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "end", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "argument": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "corner_radius", + "name": { + "commentStart": 0, + "end": 0, + "name": "corner_radius", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - { - "argument": { - "abs_path": false, "commentStart": 0, "end": 0, - "name": { + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "corner_radius", + "name": { + "commentStart": 0, + "end": 0, + "name": "corner_radius", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" }, - "path": [], + "commentStart": 0, + "end": 0, + "operator": "-", "start": 0, - "type": "Name", - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -2274,7 +2313,7 @@ description: Result of parsing i_shape.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcToRelative", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -2285,8 +2324,9 @@ description: Result of parsing i_shape.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -2482,68 +2522,71 @@ description: Result of parsing i_shape.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "argument": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "end", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "argument": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "corner_radius", + "name": { + "commentStart": 0, + "end": 0, + "name": "corner_radius", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - { - "argument": { - "abs_path": false, "commentStart": 0, "end": 0, - "name": { + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "corner_radius", + "name": { + "commentStart": 0, + "end": 0, + "name": "corner_radius", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" }, - "path": [], + "commentStart": 0, + "end": 0, + "operator": "-", "start": 0, - "type": "Name", - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -2553,7 +2596,7 @@ description: Result of parsing i_shape.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcToRelative", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -2564,8 +2607,9 @@ description: Result of parsing i_shape.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -2649,26 +2693,18 @@ description: Result of parsing i_shape.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "corner_radius", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "argument": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "end", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { "abs_path": false, "commentStart": 0, "end": 0, @@ -2684,25 +2720,36 @@ description: Result of parsing i_shape.kcl "type": "Name", "type": "Name" }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "corner_radius", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -2712,7 +2759,7 @@ description: Result of parsing i_shape.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcToRelative", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -2723,8 +2770,9 @@ description: Result of parsing i_shape.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -2948,52 +2996,55 @@ description: Result of parsing i_shape.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "end", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "corner_radius", + "name": { + "commentStart": 0, + "end": 0, + "name": "corner_radius", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "corner_radius", + "name": { + "commentStart": 0, + "end": 0, + "name": "corner_radius", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -3003,7 +3054,7 @@ description: Result of parsing i_shape.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcToRelative", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -3014,8 +3065,9 @@ description: Result of parsing i_shape.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -3111,10 +3163,42 @@ description: Result of parsing i_shape.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "argument": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "end", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "corner_radius", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { "abs_path": false, "commentStart": 0, "end": 0, @@ -3129,42 +3213,13 @@ description: Result of parsing i_shape.kcl "start": 0, "type": "Name", "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "corner_radius", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -3174,7 +3229,7 @@ description: Result of parsing i_shape.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcToRelative", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -3185,8 +3240,9 @@ description: Result of parsing i_shape.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -3246,68 +3302,71 @@ description: Result of parsing i_shape.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "argument": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "end", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "argument": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "corner_radius", + "name": { + "commentStart": 0, + "end": 0, + "name": "corner_radius", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - { - "argument": { - "abs_path": false, "commentStart": 0, "end": 0, - "name": { + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "corner_radius", + "name": { + "commentStart": 0, + "end": 0, + "name": "corner_radius", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" }, - "path": [], + "commentStart": 0, + "end": 0, + "operator": "-", "start": 0, - "type": "Name", - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -3317,7 +3376,7 @@ description: Result of parsing i_shape.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcToRelative", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -3328,8 +3387,9 @@ description: Result of parsing i_shape.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -3433,26 +3493,18 @@ description: Result of parsing i_shape.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "corner_radius", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "argument": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "end", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { "abs_path": false, "commentStart": 0, "end": 0, @@ -3468,25 +3520,36 @@ description: Result of parsing i_shape.kcl "type": "Name", "type": "Name" }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "corner_radius", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -3496,7 +3559,7 @@ description: Result of parsing i_shape.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcToRelative", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -3507,8 +3570,9 @@ description: Result of parsing i_shape.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ diff --git a/rust/kcl-lib/tests/i_shape/input.kcl b/rust/kcl-lib/tests/i_shape/input.kcl index b0ada6d7c..3e76da0c0 100644 --- a/rust/kcl-lib/tests/i_shape/input.kcl +++ b/rust/kcl-lib/tests/i_shape/input.kcl @@ -10,41 +10,41 @@ corner_radius = 5.0 brace_base = startSketchOn(XY) |> startProfileAt([corner_radius, 0], %) |> line(end = [width - corner_radius, 0.0]) - |> tangentialArcToRelative([corner_radius, corner_radius], %) + |> tangentialArc(end = [corner_radius, corner_radius]) |> yLine(length = 25.0 - corner_radius) - |> tangentialArcToRelative([-corner_radius, corner_radius], %) + |> tangentialArc(end = [-corner_radius, corner_radius]) |> xLine(length = -(d_wrist_circumference[0] - (corner_radius * 2))) - |> tangentialArcToRelative([-corner_radius, corner_radius], %) + |> tangentialArc(end = [-corner_radius, corner_radius]) |> yLine(length = length - 25.0 - 23.0 - (corner_radius * 2)) - |> tangentialArcToRelative([corner_radius, corner_radius], %) + |> tangentialArc(end = [corner_radius, corner_radius]) |> xLine(length = 15.0 - (corner_radius * 2)) - |> tangentialArcToRelative([corner_radius, corner_radius], %) + |> tangentialArc(end = [corner_radius, corner_radius]) |> yLine(length = 23.0 - corner_radius) - |> tangentialArcToRelative([-corner_radius, corner_radius], %) + |> tangentialArc(end = [-corner_radius, corner_radius]) |> xLine(length = -(hand_thickness + 15.0 + 15.0 - (corner_radius * 2))) - |> tangentialArcToRelative([-corner_radius, -corner_radius], %) + |> tangentialArc(end = [-corner_radius, -corner_radius]) |> yLine(length = -(23.0 - corner_radius)) - |> tangentialArcToRelative([corner_radius, -corner_radius], %) + |> tangentialArc(end = [corner_radius, -corner_radius]) |> xLine(length = 15.0 - (corner_radius * 2)) - |> tangentialArcToRelative([corner_radius, -corner_radius], %) + |> tangentialArc(end = [corner_radius, -corner_radius]) |> yLine(length = -(length - 25.0 - 23.0 - (corner_radius * 2))) - |> tangentialArcToRelative([-corner_radius, -corner_radius], %) + |> tangentialArc(end = [-corner_radius, -corner_radius]) |> xLine(length = -(d_wrist_circumference[1] + d_wrist_circumference[2] + d_wrist_circumference[3] - hand_thickness - corner_radius)) - |> tangentialArcToRelative([-corner_radius, -corner_radius], %) + |> tangentialArc(end = [-corner_radius, -corner_radius]) |> yLine(length = -(25.0 - corner_radius)) - |> tangentialArcToRelative([corner_radius, -corner_radius], %) + |> tangentialArc(end = [corner_radius, -corner_radius]) |> close(%) inner = startSketchOn(XY) |> startProfileAt([0, 0], %) |> xLine(length = 1.0) - |> tangentialArcToRelative([corner_radius, corner_radius], %) + |> tangentialArc(end = [corner_radius, corner_radius]) |> yLine(length = 25.0 - (corner_radius * 2)) - |> tangentialArcToRelative([-corner_radius, corner_radius], %) + |> tangentialArc(end = [-corner_radius, corner_radius]) |> xLine(length = -1.0) - |> tangentialArcToRelative([-corner_radius, -corner_radius], %) + |> tangentialArc(end = [-corner_radius, -corner_radius]) |> yLine(length = -(25.0 - (corner_radius * 2))) - |> tangentialArcToRelative([corner_radius, -corner_radius], %) + |> tangentialArc(end = [corner_radius, -corner_radius]) |> close(%) final = brace_base diff --git a/rust/kcl-lib/tests/i_shape/unparsed.snap b/rust/kcl-lib/tests/i_shape/unparsed.snap index eb144b2f8..0e47c18ac 100644 --- a/rust/kcl-lib/tests/i_shape/unparsed.snap +++ b/rust/kcl-lib/tests/i_shape/unparsed.snap @@ -14,41 +14,41 @@ corner_radius = 5.0 brace_base = startSketchOn(XY) |> startProfileAt([corner_radius, 0], %) |> line(end = [width - corner_radius, 0.0]) - |> tangentialArcToRelative([corner_radius, corner_radius], %) + |> tangentialArc(end = [corner_radius, corner_radius]) |> yLine(length = 25.0 - corner_radius) - |> tangentialArcToRelative([-corner_radius, corner_radius], %) + |> tangentialArc(end = [-corner_radius, corner_radius]) |> xLine(length = -(d_wrist_circumference[0] - (corner_radius * 2))) - |> tangentialArcToRelative([-corner_radius, corner_radius], %) + |> tangentialArc(end = [-corner_radius, corner_radius]) |> yLine(length = length - 25.0 - 23.0 - (corner_radius * 2)) - |> tangentialArcToRelative([corner_radius, corner_radius], %) + |> tangentialArc(end = [corner_radius, corner_radius]) |> xLine(length = 15.0 - (corner_radius * 2)) - |> tangentialArcToRelative([corner_radius, corner_radius], %) + |> tangentialArc(end = [corner_radius, corner_radius]) |> yLine(length = 23.0 - corner_radius) - |> tangentialArcToRelative([-corner_radius, corner_radius], %) + |> tangentialArc(end = [-corner_radius, corner_radius]) |> xLine(length = -(hand_thickness + 15.0 + 15.0 - (corner_radius * 2))) - |> tangentialArcToRelative([-corner_radius, -corner_radius], %) + |> tangentialArc(end = [-corner_radius, -corner_radius]) |> yLine(length = -(23.0 - corner_radius)) - |> tangentialArcToRelative([corner_radius, -corner_radius], %) + |> tangentialArc(end = [corner_radius, -corner_radius]) |> xLine(length = 15.0 - (corner_radius * 2)) - |> tangentialArcToRelative([corner_radius, -corner_radius], %) + |> tangentialArc(end = [corner_radius, -corner_radius]) |> yLine(length = -(length - 25.0 - 23.0 - (corner_radius * 2))) - |> tangentialArcToRelative([-corner_radius, -corner_radius], %) + |> tangentialArc(end = [-corner_radius, -corner_radius]) |> xLine(length = -(d_wrist_circumference[1] + d_wrist_circumference[2] + d_wrist_circumference[3] - hand_thickness - corner_radius)) - |> tangentialArcToRelative([-corner_radius, -corner_radius], %) + |> tangentialArc(end = [-corner_radius, -corner_radius]) |> yLine(length = -(25.0 - corner_radius)) - |> tangentialArcToRelative([corner_radius, -corner_radius], %) + |> tangentialArc(end = [corner_radius, -corner_radius]) |> close(%) inner = startSketchOn(XY) |> startProfileAt([0, 0], %) |> xLine(length = 1.0) - |> tangentialArcToRelative([corner_radius, corner_radius], %) + |> tangentialArc(end = [corner_radius, corner_radius]) |> yLine(length = 25.0 - (corner_radius * 2)) - |> tangentialArcToRelative([-corner_radius, corner_radius], %) + |> tangentialArc(end = [-corner_radius, corner_radius]) |> xLine(length = -1.0) - |> tangentialArcToRelative([-corner_radius, -corner_radius], %) + |> tangentialArc(end = [-corner_radius, -corner_radius]) |> yLine(length = -(25.0 - (corner_radius * 2))) - |> tangentialArcToRelative([corner_radius, -corner_radius], %) + |> tangentialArc(end = [corner_radius, -corner_radius]) |> close(%) final = brace_base diff --git a/rust/kcl-lib/tests/kcl_samples/bench/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/bench/artifact_graph_flowchart.snap.md index 5f27067ac..931d158b0 100644 --- a/rust/kcl-lib/tests/kcl_samples/bench/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/bench/artifact_graph_flowchart.snap.md @@ -3,237 +3,237 @@ flowchart LR subgraph path2 [Path] 2["Path
[361, 394, 5]"] 3["Segment
[402, 428, 5]"] - 4["Segment
[436, 489, 5]"] - 5["Segment
[497, 550, 5]"] - 6["Segment
[558, 612, 5]"] - 7["Segment
[620, 645, 5]"] - 8["Segment
[653, 673, 5]"] - 9["Segment
[681, 705, 5]"] - 10["Segment
[713, 766, 5]"] - 11["Segment
[774, 799, 5]"] - 12["Segment
[807, 827, 5]"] - 13["Segment
[835, 859, 5]"] - 14["Segment
[867, 919, 5]"] - 15["Segment
[927, 979, 5]"] - 16["Segment
[987, 1012, 5]"] - 17["Segment
[1020, 1044, 5]"] - 18["Segment
[1052, 1105, 5]"] - 19["Segment
[1113, 1138, 5]"] - 20["Segment
[1146, 1173, 5]"] - 21["Segment
[1181, 1233, 5]"] - 22["Segment
[1241, 1276, 5]"] - 23["Segment
[1284, 1291, 5]"] + 4["Segment
[436, 498, 5]"] + 5["Segment
[506, 568, 5]"] + 6["Segment
[576, 639, 5]"] + 7["Segment
[647, 672, 5]"] + 8["Segment
[680, 700, 5]"] + 9["Segment
[708, 732, 5]"] + 10["Segment
[740, 802, 5]"] + 11["Segment
[810, 835, 5]"] + 12["Segment
[843, 863, 5]"] + 13["Segment
[871, 895, 5]"] + 14["Segment
[903, 964, 5]"] + 15["Segment
[972, 1033, 5]"] + 16["Segment
[1041, 1066, 5]"] + 17["Segment
[1074, 1098, 5]"] + 18["Segment
[1106, 1168, 5]"] + 19["Segment
[1176, 1201, 5]"] + 20["Segment
[1209, 1236, 5]"] + 21["Segment
[1244, 1305, 5]"] + 22["Segment
[1313, 1357, 5]"] + 23["Segment
[1365, 1372, 5]"] 24[Solid2d] end subgraph path89 [Path] 89["Path
[361, 394, 5]"] 90["Segment
[402, 428, 5]"] - 91["Segment
[436, 489, 5]"] - 92["Segment
[497, 550, 5]"] - 93["Segment
[558, 612, 5]"] - 94["Segment
[620, 645, 5]"] - 95["Segment
[653, 673, 5]"] - 96["Segment
[681, 705, 5]"] - 97["Segment
[713, 766, 5]"] - 98["Segment
[774, 799, 5]"] - 99["Segment
[807, 827, 5]"] - 100["Segment
[835, 859, 5]"] - 101["Segment
[867, 919, 5]"] - 102["Segment
[927, 979, 5]"] - 103["Segment
[987, 1012, 5]"] - 104["Segment
[1020, 1044, 5]"] - 105["Segment
[1052, 1105, 5]"] - 106["Segment
[1113, 1138, 5]"] - 107["Segment
[1146, 1173, 5]"] - 108["Segment
[1181, 1233, 5]"] - 109["Segment
[1241, 1276, 5]"] - 110["Segment
[1284, 1291, 5]"] + 91["Segment
[436, 498, 5]"] + 92["Segment
[506, 568, 5]"] + 93["Segment
[576, 639, 5]"] + 94["Segment
[647, 672, 5]"] + 95["Segment
[680, 700, 5]"] + 96["Segment
[708, 732, 5]"] + 97["Segment
[740, 802, 5]"] + 98["Segment
[810, 835, 5]"] + 99["Segment
[843, 863, 5]"] + 100["Segment
[871, 895, 5]"] + 101["Segment
[903, 964, 5]"] + 102["Segment
[972, 1033, 5]"] + 103["Segment
[1041, 1066, 5]"] + 104["Segment
[1074, 1098, 5]"] + 105["Segment
[1106, 1168, 5]"] + 106["Segment
[1176, 1201, 5]"] + 107["Segment
[1209, 1236, 5]"] + 108["Segment
[1244, 1305, 5]"] + 109["Segment
[1313, 1357, 5]"] + 110["Segment
[1365, 1372, 5]"] 111[Solid2d] end subgraph path176 [Path] 176["Path
[361, 394, 5]"] 177["Segment
[402, 428, 5]"] - 178["Segment
[436, 489, 5]"] - 179["Segment
[497, 550, 5]"] - 180["Segment
[558, 612, 5]"] - 181["Segment
[620, 645, 5]"] - 182["Segment
[653, 673, 5]"] - 183["Segment
[681, 705, 5]"] - 184["Segment
[713, 766, 5]"] - 185["Segment
[774, 799, 5]"] - 186["Segment
[807, 827, 5]"] - 187["Segment
[835, 859, 5]"] - 188["Segment
[867, 919, 5]"] - 189["Segment
[927, 979, 5]"] - 190["Segment
[987, 1012, 5]"] - 191["Segment
[1020, 1044, 5]"] - 192["Segment
[1052, 1105, 5]"] - 193["Segment
[1113, 1138, 5]"] - 194["Segment
[1146, 1173, 5]"] - 195["Segment
[1181, 1233, 5]"] - 196["Segment
[1241, 1276, 5]"] - 197["Segment
[1284, 1291, 5]"] + 178["Segment
[436, 498, 5]"] + 179["Segment
[506, 568, 5]"] + 180["Segment
[576, 639, 5]"] + 181["Segment
[647, 672, 5]"] + 182["Segment
[680, 700, 5]"] + 183["Segment
[708, 732, 5]"] + 184["Segment
[740, 802, 5]"] + 185["Segment
[810, 835, 5]"] + 186["Segment
[843, 863, 5]"] + 187["Segment
[871, 895, 5]"] + 188["Segment
[903, 964, 5]"] + 189["Segment
[972, 1033, 5]"] + 190["Segment
[1041, 1066, 5]"] + 191["Segment
[1074, 1098, 5]"] + 192["Segment
[1106, 1168, 5]"] + 193["Segment
[1176, 1201, 5]"] + 194["Segment
[1209, 1236, 5]"] + 195["Segment
[1244, 1305, 5]"] + 196["Segment
[1313, 1357, 5]"] + 197["Segment
[1365, 1372, 5]"] 198[Solid2d] end subgraph path262 [Path] 262["Path
[361, 394, 5]"] 263["Segment
[402, 428, 5]"] - 264["Segment
[436, 489, 5]"] - 265["Segment
[497, 550, 5]"] - 266["Segment
[558, 612, 5]"] - 267["Segment
[620, 645, 5]"] - 268["Segment
[653, 673, 5]"] - 269["Segment
[681, 705, 5]"] - 270["Segment
[713, 766, 5]"] - 271["Segment
[774, 799, 5]"] - 272["Segment
[807, 827, 5]"] - 273["Segment
[835, 859, 5]"] - 274["Segment
[867, 919, 5]"] - 275["Segment
[927, 979, 5]"] - 276["Segment
[987, 1012, 5]"] - 277["Segment
[1020, 1044, 5]"] - 278["Segment
[1052, 1105, 5]"] - 279["Segment
[1113, 1138, 5]"] - 280["Segment
[1146, 1173, 5]"] - 281["Segment
[1181, 1233, 5]"] - 282["Segment
[1241, 1276, 5]"] - 283["Segment
[1284, 1291, 5]"] + 264["Segment
[436, 498, 5]"] + 265["Segment
[506, 568, 5]"] + 266["Segment
[576, 639, 5]"] + 267["Segment
[647, 672, 5]"] + 268["Segment
[680, 700, 5]"] + 269["Segment
[708, 732, 5]"] + 270["Segment
[740, 802, 5]"] + 271["Segment
[810, 835, 5]"] + 272["Segment
[843, 863, 5]"] + 273["Segment
[871, 895, 5]"] + 274["Segment
[903, 964, 5]"] + 275["Segment
[972, 1033, 5]"] + 276["Segment
[1041, 1066, 5]"] + 277["Segment
[1074, 1098, 5]"] + 278["Segment
[1106, 1168, 5]"] + 279["Segment
[1176, 1201, 5]"] + 280["Segment
[1209, 1236, 5]"] + 281["Segment
[1244, 1305, 5]"] + 282["Segment
[1313, 1357, 5]"] + 283["Segment
[1365, 1372, 5]"] 284[Solid2d] end subgraph path349 [Path] 349["Path
[361, 394, 5]"] 350["Segment
[402, 428, 5]"] - 351["Segment
[436, 489, 5]"] - 352["Segment
[497, 550, 5]"] - 353["Segment
[558, 612, 5]"] - 354["Segment
[620, 645, 5]"] - 355["Segment
[653, 673, 5]"] - 356["Segment
[681, 705, 5]"] - 357["Segment
[713, 766, 5]"] - 358["Segment
[774, 799, 5]"] - 359["Segment
[807, 827, 5]"] - 360["Segment
[835, 859, 5]"] - 361["Segment
[867, 919, 5]"] - 362["Segment
[927, 979, 5]"] - 363["Segment
[987, 1012, 5]"] - 364["Segment
[1020, 1044, 5]"] - 365["Segment
[1052, 1105, 5]"] - 366["Segment
[1113, 1138, 5]"] - 367["Segment
[1146, 1173, 5]"] - 368["Segment
[1181, 1233, 5]"] - 369["Segment
[1241, 1276, 5]"] - 370["Segment
[1284, 1291, 5]"] + 351["Segment
[436, 498, 5]"] + 352["Segment
[506, 568, 5]"] + 353["Segment
[576, 639, 5]"] + 354["Segment
[647, 672, 5]"] + 355["Segment
[680, 700, 5]"] + 356["Segment
[708, 732, 5]"] + 357["Segment
[740, 802, 5]"] + 358["Segment
[810, 835, 5]"] + 359["Segment
[843, 863, 5]"] + 360["Segment
[871, 895, 5]"] + 361["Segment
[903, 964, 5]"] + 362["Segment
[972, 1033, 5]"] + 363["Segment
[1041, 1066, 5]"] + 364["Segment
[1074, 1098, 5]"] + 365["Segment
[1106, 1168, 5]"] + 366["Segment
[1176, 1201, 5]"] + 367["Segment
[1209, 1236, 5]"] + 368["Segment
[1244, 1305, 5]"] + 369["Segment
[1313, 1357, 5]"] + 370["Segment
[1365, 1372, 5]"] 371[Solid2d] end subgraph path435 [Path] 435["Path
[361, 394, 5]"] 436["Segment
[402, 428, 5]"] - 437["Segment
[436, 489, 5]"] - 438["Segment
[497, 550, 5]"] - 439["Segment
[558, 612, 5]"] - 440["Segment
[620, 645, 5]"] - 441["Segment
[653, 673, 5]"] - 442["Segment
[681, 705, 5]"] - 443["Segment
[713, 766, 5]"] - 444["Segment
[774, 799, 5]"] - 445["Segment
[807, 827, 5]"] - 446["Segment
[835, 859, 5]"] - 447["Segment
[867, 919, 5]"] - 448["Segment
[927, 979, 5]"] - 449["Segment
[987, 1012, 5]"] - 450["Segment
[1020, 1044, 5]"] - 451["Segment
[1052, 1105, 5]"] - 452["Segment
[1113, 1138, 5]"] - 453["Segment
[1146, 1173, 5]"] - 454["Segment
[1181, 1233, 5]"] - 455["Segment
[1241, 1276, 5]"] - 456["Segment
[1284, 1291, 5]"] + 437["Segment
[436, 498, 5]"] + 438["Segment
[506, 568, 5]"] + 439["Segment
[576, 639, 5]"] + 440["Segment
[647, 672, 5]"] + 441["Segment
[680, 700, 5]"] + 442["Segment
[708, 732, 5]"] + 443["Segment
[740, 802, 5]"] + 444["Segment
[810, 835, 5]"] + 445["Segment
[843, 863, 5]"] + 446["Segment
[871, 895, 5]"] + 447["Segment
[903, 964, 5]"] + 448["Segment
[972, 1033, 5]"] + 449["Segment
[1041, 1066, 5]"] + 450["Segment
[1074, 1098, 5]"] + 451["Segment
[1106, 1168, 5]"] + 452["Segment
[1176, 1201, 5]"] + 453["Segment
[1209, 1236, 5]"] + 454["Segment
[1244, 1305, 5]"] + 455["Segment
[1313, 1357, 5]"] + 456["Segment
[1365, 1372, 5]"] 457[Solid2d] end subgraph path522 [Path] - 522["Path
[1685, 1709, 5]"] + 522["Path
[1766, 1790, 5]"] end subgraph path523 [Path] - 523["Path
[1717, 1847, 5]"] - 524["Segment
[1717, 1847, 5]"] - 525["Segment
[1717, 1847, 5]"] - 526["Segment
[1717, 1847, 5]"] - 527["Segment
[1717, 1847, 5]"] - 528["Segment
[1717, 1847, 5]"] - 529["Segment
[1717, 1847, 5]"] - 530["Segment
[1717, 1847, 5]"] + 523["Path
[1798, 1928, 5]"] + 524["Segment
[1798, 1928, 5]"] + 525["Segment
[1798, 1928, 5]"] + 526["Segment
[1798, 1928, 5]"] + 527["Segment
[1798, 1928, 5]"] + 528["Segment
[1798, 1928, 5]"] + 529["Segment
[1798, 1928, 5]"] + 530["Segment
[1798, 1928, 5]"] 531[Solid2d] end subgraph path553 [Path] - 553["Path
[1685, 1709, 5]"] + 553["Path
[1766, 1790, 5]"] end subgraph path554 [Path] - 554["Path
[1717, 1847, 5]"] - 555["Segment
[1717, 1847, 5]"] - 556["Segment
[1717, 1847, 5]"] - 557["Segment
[1717, 1847, 5]"] - 558["Segment
[1717, 1847, 5]"] - 559["Segment
[1717, 1847, 5]"] - 560["Segment
[1717, 1847, 5]"] - 561["Segment
[1717, 1847, 5]"] + 554["Path
[1798, 1928, 5]"] + 555["Segment
[1798, 1928, 5]"] + 556["Segment
[1798, 1928, 5]"] + 557["Segment
[1798, 1928, 5]"] + 558["Segment
[1798, 1928, 5]"] + 559["Segment
[1798, 1928, 5]"] + 560["Segment
[1798, 1928, 5]"] + 561["Segment
[1798, 1928, 5]"] 562[Solid2d] end subgraph path585 [Path] - 585["Path
[2123, 2150, 5]"] - 586["Segment
[2158, 2180, 5]"] - 587["Segment
[2188, 2210, 5]"] - 588["Segment
[2218, 2240, 5]"] - 589["Segment
[2248, 2271, 5]"] - 590["Segment
[2279, 2302, 5]"] - 591["Segment
[2310, 2345, 5]"] - 592["Segment
[2353, 2360, 5]"] + 585["Path
[2204, 2231, 5]"] + 586["Segment
[2239, 2261, 5]"] + 587["Segment
[2269, 2291, 5]"] + 588["Segment
[2299, 2321, 5]"] + 589["Segment
[2329, 2352, 5]"] + 590["Segment
[2360, 2383, 5]"] + 591["Segment
[2391, 2426, 5]"] + 592["Segment
[2434, 2441, 5]"] 593[Solid2d] end subgraph path618 [Path] - 618["Path
[2632, 2661, 5]"] - 619["Segment
[2669, 2704, 5]"] - 620["Segment
[2712, 2737, 5]"] - 621["Segment
[2745, 2781, 5]"] - 622["Segment
[2789, 2813, 5]"] - 623["Segment
[2821, 2855, 5]"] - 624["Segment
[2863, 2898, 5]"] - 625["Segment
[2906, 2913, 5]"] + 618["Path
[2713, 2742, 5]"] + 619["Segment
[2750, 2785, 5]"] + 620["Segment
[2793, 2818, 5]"] + 621["Segment
[2826, 2862, 5]"] + 622["Segment
[2870, 2894, 5]"] + 623["Segment
[2902, 2936, 5]"] + 624["Segment
[2944, 2979, 5]"] + 625["Segment
[2987, 2994, 5]"] 626[Solid2d] end subgraph path650 [Path] - 650["Path
[3188, 3215, 5]"] - 651["Segment
[3223, 3242, 5]"] - 652["Segment
[3250, 3340, 5]"] + 650["Path
[3269, 3296, 5]"] + 651["Segment
[3304, 3323, 5]"] + 652["Segment
[3331, 3421, 5]"] end subgraph path654 [Path] - 654["Path
[3440, 3473, 5]"] - 655["Segment
[3481, 3500, 5]"] - 656["Segment
[3508, 3530, 5]"] - 657["Segment
[3538, 3561, 5]"] - 658["Segment
[3569, 3589, 5]"] - 659["Segment
[3597, 3621, 5]"] - 660["Segment
[3629, 3652, 5]"] - 661["Segment
[3660, 3667, 5]"] + 654["Path
[3521, 3554, 5]"] + 655["Segment
[3562, 3581, 5]"] + 656["Segment
[3589, 3611, 5]"] + 657["Segment
[3619, 3642, 5]"] + 658["Segment
[3650, 3670, 5]"] + 659["Segment
[3678, 3702, 5]"] + 660["Segment
[3710, 3733, 5]"] + 661["Segment
[3741, 3748, 5]"] 662[Solid2d] end subgraph path688 [Path] - 688["Path
[3188, 3215, 5]"] - 689["Segment
[3223, 3242, 5]"] - 690["Segment
[3250, 3340, 5]"] + 688["Path
[3269, 3296, 5]"] + 689["Segment
[3304, 3323, 5]"] + 690["Segment
[3331, 3421, 5]"] end subgraph path692 [Path] - 692["Path
[3440, 3473, 5]"] - 693["Segment
[3481, 3500, 5]"] - 694["Segment
[3508, 3530, 5]"] - 695["Segment
[3538, 3561, 5]"] - 696["Segment
[3569, 3589, 5]"] - 697["Segment
[3597, 3621, 5]"] - 698["Segment
[3629, 3652, 5]"] - 699["Segment
[3660, 3667, 5]"] + 692["Path
[3521, 3554, 5]"] + 693["Segment
[3562, 3581, 5]"] + 694["Segment
[3589, 3611, 5]"] + 695["Segment
[3619, 3642, 5]"] + 696["Segment
[3650, 3670, 5]"] + 697["Segment
[3678, 3702, 5]"] + 698["Segment
[3710, 3733, 5]"] + 699["Segment
[3741, 3748, 5]"] 700[Solid2d] end 1["Plane
[333, 353, 5]"] - 25["Sweep Extrusion
[1379, 1417, 5]"] + 25["Sweep Extrusion
[1460, 1498, 5]"] 26[Wall] 27[Wall] 28[Wall] @@ -297,7 +297,7 @@ flowchart LR 86["SweepEdge Opposite"] 87["SweepEdge Adjacent"] 88["Plane
[333, 353, 5]"] - 112["Sweep Extrusion
[1455, 1494, 5]"] + 112["Sweep Extrusion
[1536, 1575, 5]"] 113[Wall] 114[Wall] 115[Wall] @@ -361,7 +361,7 @@ flowchart LR 173["SweepEdge Opposite"] 174["SweepEdge Adjacent"] 175["Plane
[823, 865, 0]"] - 199["Sweep Extrusion
[1379, 1417, 5]"] + 199["Sweep Extrusion
[1460, 1498, 5]"] 200[Wall] 201[Wall] 202[Wall] @@ -424,7 +424,7 @@ flowchart LR 259["SweepEdge Adjacent"] 260["SweepEdge Opposite"] 261["SweepEdge Adjacent"] - 285["Sweep Extrusion
[1455, 1494, 5]"] + 285["Sweep Extrusion
[1536, 1575, 5]"] 286[Wall] 287[Wall] 288[Wall] @@ -488,7 +488,7 @@ flowchart LR 346["SweepEdge Opposite"] 347["SweepEdge Adjacent"] 348["Plane
[875, 916, 0]"] - 372["Sweep Extrusion
[1379, 1417, 5]"] + 372["Sweep Extrusion
[1460, 1498, 5]"] 373[Wall] 374[Wall] 375[Wall] @@ -551,7 +551,7 @@ flowchart LR 432["SweepEdge Adjacent"] 433["SweepEdge Opposite"] 434["SweepEdge Adjacent"] - 458["Sweep Extrusion
[1455, 1494, 5]"] + 458["Sweep Extrusion
[1536, 1575, 5]"] 459[Wall] 460[Wall] 461[Wall] @@ -615,7 +615,7 @@ flowchart LR 519["SweepEdge Opposite"] 520["SweepEdge Adjacent"] 521["Plane
[975, 1017, 0]"] - 532["Sweep Extrusion
[1949, 1973, 5]"] + 532["Sweep Extrusion
[2030, 2054, 5]"] 533[Wall] 534[Wall] 535[Wall] @@ -636,7 +636,7 @@ flowchart LR 550["SweepEdge Adjacent"] 551["SweepEdge Opposite"] 552["SweepEdge Adjacent"] - 563["Sweep Extrusion
[2015, 2039, 5]"] + 563["Sweep Extrusion
[2096, 2120, 5]"] 564[Wall] 565[Wall] 566[Wall] @@ -658,7 +658,7 @@ flowchart LR 582["SweepEdge Opposite"] 583["SweepEdge Adjacent"] 584["Plane
[1068, 1135, 0]"] - 594["Sweep Extrusion
[2523, 2547, 5]"] + 594["Sweep Extrusion
[2604, 2628, 5]"] 595[Wall] 596[Wall] 597[Wall] @@ -679,10 +679,10 @@ flowchart LR 612["SweepEdge Adjacent"] 613["SweepEdge Opposite"] 614["SweepEdge Adjacent"] - 615["Sweep Extrusion
[2523, 2547, 5]"] - 616["Sweep Extrusion
[2523, 2547, 5]"] + 615["Sweep Extrusion
[2604, 2628, 5]"] + 616["Sweep Extrusion
[2604, 2628, 5]"] 617["Plane
[1205, 1272, 0]"] - 627["Sweep Extrusion
[3083, 3107, 5]"] + 627["Sweep Extrusion
[3164, 3188, 5]"] 628[Wall] 629[Wall] 630[Wall] @@ -703,10 +703,10 @@ flowchart LR 645["SweepEdge Adjacent"] 646["SweepEdge Opposite"] 647["SweepEdge Adjacent"] - 648["Sweep Extrusion
[3083, 3107, 5]"] - 649["Plane
[3748, 3783, 5]"] - 653["Plane
[3814, 3843, 5]"] - 663["Sweep Sweep
[3855, 3882, 5]"] + 648["Sweep Extrusion
[3164, 3188, 5]"] + 649["Plane
[3829, 3864, 5]"] + 653["Plane
[3895, 3924, 5]"] + 663["Sweep Sweep
[3936, 3963, 5]"] 664[Wall] 665[Wall] 666[Wall] @@ -730,9 +730,9 @@ flowchart LR 684["SweepEdge Adjacent"] 685["SweepEdge Opposite"] 686["SweepEdge Adjacent"] - 687["Plane
[3748, 3783, 5]"] - 691["Plane
[3814, 3843, 5]"] - 701["Sweep Sweep
[3855, 3882, 5]"] + 687["Plane
[3829, 3864, 5]"] + 691["Plane
[3895, 3924, 5]"] + 701["Sweep Sweep
[3936, 3963, 5]"] 702[Wall] 703[Wall] 704[Wall] @@ -760,14 +760,14 @@ flowchart LR 726["StartSketchOnPlane
[333, 353, 5]"] 727["StartSketchOnPlane
[333, 353, 5]"] 728["StartSketchOnPlane
[333, 353, 5]"] - 729["StartSketchOnPlane
[1657, 1677, 5]"] - 730["StartSketchOnPlane
[1657, 1677, 5]"] - 731["StartSketchOnPlane
[2095, 2115, 5]"] - 732["StartSketchOnPlane
[2604, 2624, 5]"] - 733["StartSketchOnPlane
[3160, 3180, 5]"] - 734["StartSketchOnPlane
[3412, 3432, 5]"] - 735["StartSketchOnPlane
[3160, 3180, 5]"] - 736["StartSketchOnPlane
[3412, 3432, 5]"] + 729["StartSketchOnPlane
[1738, 1758, 5]"] + 730["StartSketchOnPlane
[1738, 1758, 5]"] + 731["StartSketchOnPlane
[2176, 2196, 5]"] + 732["StartSketchOnPlane
[2685, 2705, 5]"] + 733["StartSketchOnPlane
[3241, 3261, 5]"] + 734["StartSketchOnPlane
[3493, 3513, 5]"] + 735["StartSketchOnPlane
[3241, 3261, 5]"] + 736["StartSketchOnPlane
[3493, 3513, 5]"] 1 --- 2 2 --- 3 2 --- 4 diff --git a/rust/kcl-lib/tests/kcl_samples/bench/ops.snap b/rust/kcl-lib/tests/kcl_samples/bench/ops.snap index d11f7459c..510a5d36a 100644 --- a/rust/kcl-lib/tests/kcl_samples/bench/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/bench/ops.snap @@ -9,8 +9,8 @@ description: Operations executed bench.kcl "type": "FunctionCall", "name": "divider", "functionSourceRange": [ - 1331, - 1606, + 1412, + 1687, 5 ], "unlabeledArg": null, @@ -25,7 +25,7 @@ description: Operations executed bench.kcl "name": "dividerSketch", "functionSourceRange": [ 309, - 1312, + 1393, 5 ], "unlabeledArg": null, @@ -85,7 +85,7 @@ description: Operations executed bench.kcl "name": "dividerSketch", "functionSourceRange": [ 309, - 1312, + 1393, 5 ], "unlabeledArg": null, @@ -260,8 +260,8 @@ description: Operations executed bench.kcl "type": "FunctionCall", "name": "divider", "functionSourceRange": [ - 1331, - 1606, + 1412, + 1687, 5 ], "unlabeledArg": null, @@ -276,7 +276,7 @@ description: Operations executed bench.kcl "name": "dividerSketch", "functionSourceRange": [ 309, - 1312, + 1393, 5 ], "unlabeledArg": null, @@ -336,7 +336,7 @@ description: Operations executed bench.kcl "name": "dividerSketch", "functionSourceRange": [ 309, - 1312, + 1393, 5 ], "unlabeledArg": null, @@ -511,8 +511,8 @@ description: Operations executed bench.kcl "type": "FunctionCall", "name": "divider", "functionSourceRange": [ - 1331, - 1606, + 1412, + 1687, 5 ], "unlabeledArg": null, @@ -527,7 +527,7 @@ description: Operations executed bench.kcl "name": "dividerSketch", "functionSourceRange": [ 309, - 1312, + 1393, 5 ], "unlabeledArg": null, @@ -587,7 +587,7 @@ description: Operations executed bench.kcl "name": "dividerSketch", "functionSourceRange": [ 309, - 1312, + 1393, 5 ], "unlabeledArg": null, @@ -762,8 +762,8 @@ description: Operations executed bench.kcl "type": "FunctionCall", "name": "connector", "functionSourceRange": [ - 1889, - 2052, + 1970, + 2133, 5 ], "unlabeledArg": null, @@ -777,8 +777,8 @@ description: Operations executed bench.kcl "type": "FunctionCall", "name": "connectorSketch", "functionSourceRange": [ - 1626, - 1868, + 1707, + 1949, 5 ], "unlabeledArg": null, @@ -842,8 +842,8 @@ description: Operations executed bench.kcl "type": "FunctionCall", "name": "connectorSketch", "functionSourceRange": [ - 1626, - 1868, + 1707, + 1949, 5 ], "unlabeledArg": null, @@ -935,8 +935,8 @@ description: Operations executed bench.kcl "type": "FunctionCall", "name": "seatSlats", "functionSourceRange": [ - 2474, - 2560, + 2555, + 2641, 5 ], "unlabeledArg": null, @@ -950,8 +950,8 @@ description: Operations executed bench.kcl "type": "FunctionCall", "name": "seatSlatSketch", "functionSourceRange": [ - 2071, - 2453, + 2152, + 2534, 5 ], "unlabeledArg": null, @@ -1060,8 +1060,8 @@ description: Operations executed bench.kcl "type": "FunctionCall", "name": "backSlats", "functionSourceRange": [ - 3029, - 3120, + 3110, + 3201, 5 ], "unlabeledArg": null, @@ -1075,8 +1075,8 @@ description: Operations executed bench.kcl "type": "FunctionCall", "name": "backSlatsSketch", "functionSourceRange": [ - 2580, - 3008, + 2661, + 3089, 5 ], "unlabeledArg": null, @@ -1154,8 +1154,8 @@ description: Operations executed bench.kcl "type": "FunctionCall", "name": "armRest", "functionSourceRange": [ - 3707, - 3895, + 3788, + 3976, 5 ], "unlabeledArg": null, @@ -1194,8 +1194,8 @@ description: Operations executed bench.kcl "type": "FunctionCall", "name": "armRestPath", "functionSourceRange": [ - 3136, - 3361, + 3217, + 3442, 5 ], "unlabeledArg": null, @@ -1257,8 +1257,8 @@ description: Operations executed bench.kcl "type": "FunctionCall", "name": "armRestProfile", "functionSourceRange": [ - 3380, - 3688, + 3461, + 3769, 5 ], "unlabeledArg": null, @@ -1318,8 +1318,8 @@ description: Operations executed bench.kcl "type": "FunctionCall", "name": "armRest", "functionSourceRange": [ - 3707, - 3895, + 3788, + 3976, 5 ], "unlabeledArg": null, @@ -1358,8 +1358,8 @@ description: Operations executed bench.kcl "type": "FunctionCall", "name": "armRestPath", "functionSourceRange": [ - 3136, - 3361, + 3217, + 3442, 5 ], "unlabeledArg": null, @@ -1421,8 +1421,8 @@ description: Operations executed bench.kcl "type": "FunctionCall", "name": "armRestProfile", "functionSourceRange": [ - 3380, - 3688, + 3461, + 3769, 5 ], "unlabeledArg": null, diff --git a/rust/kcl-lib/tests/kcl_samples/car-wheel-assembly/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/car-wheel-assembly/artifact_graph_flowchart.snap.md index 942213f66..71ecd9942 100644 --- a/rust/kcl-lib/tests/kcl_samples/car-wheel-assembly/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/car-wheel-assembly/artifact_graph_flowchart.snap.md @@ -152,51 +152,51 @@ flowchart LR 335["Segment
[793, 840, 8]"] 336["Segment
[848, 884, 8]"] 337["Segment
[892, 922, 8]"] - 338["Segment
[930, 983, 8]"] - 339["Segment
[991, 1031, 8]"] - 340["Segment
[1039, 1074, 8]"] - 341["Segment
[1082, 1120, 8]"] - 342["Segment
[1128, 1150, 8]"] - 343["Segment
[1158, 1165, 8]"] + 338["Segment
[930, 975, 8]"] + 339["Segment
[983, 1023, 8]"] + 340["Segment
[1031, 1066, 8]"] + 341["Segment
[1074, 1112, 8]"] + 342["Segment
[1120, 1142, 8]"] + 343["Segment
[1150, 1157, 8]"] 344[Solid2d] end subgraph path365 [Path] 365["Path
[511, 592, 7]"] 366["Segment
[598, 699, 7]"] - 367["Segment
[705, 790, 7]"] - 368["Segment
[796, 880, 7]"] - 369["Segment
[886, 972, 7]"] - 370["Segment
[978, 1063, 7]"] - 371["Segment
[1069, 1155, 7]"] - 372["Segment
[1161, 1284, 7]"] - 373["Segment
[1290, 1376, 7]"] - 374["Segment
[1382, 1517, 7]"] - 375["Segment
[1523, 1609, 7]"] - 376["Segment
[1615, 1739, 7]"] - 377["Segment
[1745, 1831, 7]"] - 378["Segment
[1837, 1922, 7]"] - 379["Segment
[1928, 2014, 7]"] - 380["Segment
[2020, 2105, 7]"] - 381["Segment
[2111, 2196, 7]"] - 382["Segment
[2202, 2209, 7]"] + 367["Segment
[705, 763, 7]"] + 368["Segment
[769, 853, 7]"] + 369["Segment
[859, 918, 7]"] + 370["Segment
[924, 1009, 7]"] + 371["Segment
[1015, 1074, 7]"] + 372["Segment
[1080, 1203, 7]"] + 373["Segment
[1209, 1268, 7]"] + 374["Segment
[1274, 1409, 7]"] + 375["Segment
[1415, 1474, 7]"] + 376["Segment
[1480, 1604, 7]"] + 377["Segment
[1610, 1669, 7]"] + 378["Segment
[1675, 1760, 7]"] + 379["Segment
[1766, 1825, 7]"] + 380["Segment
[1831, 1916, 7]"] + 381["Segment
[1922, 1980, 7]"] + 382["Segment
[1986, 1993, 7]"] 383[Solid2d] end subgraph path439 [Path] 439["Path
[487, 544, 9]"] 440["Segment
[550, 684, 9]"] - 441["Segment
[690, 745, 9]"] - 442["Segment
[751, 848, 9]"] - 443["Segment
[854, 886, 9]"] - 444["Segment
[892, 924, 9]"] - 445["Segment
[930, 961, 9]"] - 446["Segment
[967, 1082, 9]"] - 447["Segment
[1088, 1120, 9]"] - 448["Segment
[1126, 1158, 9]"] - 449["Segment
[1164, 1195, 9]"] - 450["Segment
[1201, 1294, 9]"] - 451["Segment
[1300, 1355, 9]"] - 452["Segment
[1361, 1434, 9]"] - 453["Segment
[1440, 1447, 9]"] + 441["Segment
[690, 737, 9]"] + 442["Segment
[743, 840, 9]"] + 443["Segment
[846, 878, 9]"] + 444["Segment
[884, 916, 9]"] + 445["Segment
[922, 953, 9]"] + 446["Segment
[959, 1074, 9]"] + 447["Segment
[1080, 1112, 9]"] + 448["Segment
[1118, 1150, 9]"] + 449["Segment
[1156, 1187, 9]"] + 450["Segment
[1193, 1286, 9]"] + 451["Segment
[1292, 1339, 9]"] + 452["Segment
[1345, 1418, 9]"] + 453["Segment
[1424, 1431, 9]"] 454[Solid2d] end 1["Plane
[548, 565, 6]"] @@ -425,7 +425,7 @@ flowchart LR 331["SweepEdge Adjacent"] 332["SweepEdge Adjacent"] 333["Plane
[711, 737, 8]"] - 345["Sweep Revolve
[1173, 1190, 8]"] + 345["Sweep Revolve
[1165, 1182, 8]"] 346[Wall] 347[Wall] 348[Wall] @@ -445,7 +445,7 @@ flowchart LR 362["SweepEdge Adjacent"] 363["SweepEdge Adjacent"] 364["Plane
[488, 505, 7]"] - 384["Sweep Revolve
[2247, 2297, 7]"] + 384["Sweep Revolve
[2031, 2081, 7]"] 385[Wall] 386[Wall] 387[Wall] @@ -500,7 +500,7 @@ flowchart LR 436["SweepEdge Opposite"] 437["SweepEdge Adjacent"] 438["Plane
[464, 481, 9]"] - 455["Sweep Revolve
[1490, 1519, 9]"] + 455["Sweep Revolve
[1474, 1503, 9]"] 456[Wall] 457[Wall] 458[Wall] diff --git a/rust/kcl-lib/tests/kcl_samples/car-wheel-assembly/ops.snap b/rust/kcl-lib/tests/kcl_samples/car-wheel-assembly/ops.snap index ec6030cd1..a472775d7 100644 --- a/rust/kcl-lib/tests/kcl_samples/car-wheel-assembly/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/car-wheel-assembly/ops.snap @@ -2129,7 +2129,7 @@ description: Operations executed car-wheel-assembly.kcl "name": "lug", "functionSourceRange": [ 669, - 1280, + 1272, 8 ], "unlabeledArg": null, diff --git a/rust/kcl-lib/tests/kcl_samples/cycloidal-gear/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/cycloidal-gear/artifact_graph_flowchart.snap.md index 8a44ca201..b1def1e22 100644 --- a/rust/kcl-lib/tests/kcl_samples/cycloidal-gear/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/cycloidal-gear/artifact_graph_flowchart.snap.md @@ -3,43 +3,43 @@ flowchart LR subgraph path2 [Path] 2["Path
[631, 865, 0]"] 3["Segment
[875, 1008, 0]"] - 4["Segment
[1018, 1109, 0]"] - 5["Segment
[1119, 1174, 0]"] - 6["Segment
[1184, 1275, 0]"] - 7["Segment
[1285, 1340, 0]"] - 8["Segment
[1350, 1406, 0]"] - 9["Segment
[1416, 1424, 0]"] + 4["Segment
[1018, 1070, 0]"] + 5["Segment
[1080, 1127, 0]"] + 6["Segment
[1137, 1189, 0]"] + 7["Segment
[1199, 1246, 0]"] + 8["Segment
[1256, 1321, 0]"] + 9["Segment
[1331, 1339, 0]"] 10[Solid2d] end subgraph path11 [Path] - 11["Path
[1439, 1489, 0]"] - 12["Segment
[1439, 1489, 0]"] + 11["Path
[1354, 1404, 0]"] + 12["Segment
[1354, 1404, 0]"] 13[Solid2d] end subgraph path15 [Path] 15["Path
[631, 865, 0]"] 16["Segment
[875, 1008, 0]"] - 17["Segment
[1018, 1109, 0]"] - 18["Segment
[1119, 1174, 0]"] - 19["Segment
[1184, 1275, 0]"] - 20["Segment
[1285, 1340, 0]"] - 21["Segment
[1350, 1406, 0]"] - 22["Segment
[1416, 1424, 0]"] + 17["Segment
[1018, 1070, 0]"] + 18["Segment
[1080, 1127, 0]"] + 19["Segment
[1137, 1189, 0]"] + 20["Segment
[1199, 1246, 0]"] + 21["Segment
[1256, 1321, 0]"] + 22["Segment
[1331, 1339, 0]"] 23[Solid2d] end subgraph path24 [Path] - 24["Path
[1439, 1489, 0]"] - 25["Segment
[1439, 1489, 0]"] + 24["Path
[1354, 1404, 0]"] + 25["Segment
[1354, 1404, 0]"] 26[Solid2d] end subgraph path28 [Path] 28["Path
[631, 865, 0]"] - 35["Segment
[1416, 1424, 0]"] + 35["Segment
[1331, 1339, 0]"] 36[Solid2d] end subgraph path37 [Path] - 37["Path
[1439, 1489, 0]"] - 38["Segment
[1439, 1489, 0]"] + 37["Path
[1354, 1404, 0]"] + 38["Segment
[1354, 1404, 0]"] 39[Solid2d] end 1["Plane
[587, 620, 0]"] @@ -51,7 +51,7 @@ flowchart LR 32["SweepEdge Opposite"] 33["SweepEdge Opposite"] 34["SweepEdge Opposite"] - 40["Sweep Loft
[1619, 1708, 0]"] + 40["Sweep Loft
[1534, 1623, 0]"] 41[Wall] 42[Wall] 43[Wall] diff --git a/rust/kcl-lib/tests/kcl_samples/cycloidal-gear/ast.snap b/rust/kcl-lib/tests/kcl_samples/cycloidal-gear/ast.snap index 358dda330..3394ccb51 100644 --- a/rust/kcl-lib/tests/kcl_samples/cycloidal-gear/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/cycloidal-gear/ast.snap @@ -866,310 +866,433 @@ description: Result of parsing cycloidal-gear.kcl { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, "commentStart": 0, "end": 0, - "key": { + "name": { "commentStart": 0, "end": 0, - "name": "radius", + "name": "gearPitch", "start": 0, "type": "Identifier" }, + "path": [], "start": 0, - "type": "ObjectProperty", + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "1.67", + "start": 0, + "type": "Literal", + "type": "Literal", "value": { + "value": 1.67, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "60", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 60.0, + "suffix": "None" + } + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "tangentialArc", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "gearPitch", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "180", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 180.0, + "suffix": "None" + } + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "tangentialArc", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { "commentStart": 0, "end": 0, - "left": { + "name": "gearPitch", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "1.67", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.67, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "60", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 60.0, + "suffix": "None" + } + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "tangentialArc", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "gearPitch", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "180", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 180.0, + "suffix": "None" + } + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "tangentialArc", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "arguments": [ + { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "gearPitch", + "name": "profileStartX", "start": 0, "type": "Identifier" }, "path": [], "start": 0, - "type": "Name", "type": "Name" }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "1.67", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.67, - "suffix": "None" + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeSubstitution", + "type": "PipeSubstitution" } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - }, - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "commentStart": 0, - "end": 0, - "raw": "60", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 60.0, - "suffix": "None" - } - } - } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "tangentialArc", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - { - "arguments": [ - { - "commentStart": 0, - "end": 0, - "properties": [ - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "gearPitch", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - }, - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "argument": { - "commentStart": 0, - "end": 0, - "raw": "180", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 180.0, - "suffix": "None" - } - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "tangentialArc", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - { - "arguments": [ - { - "commentStart": 0, - "end": 0, - "properties": [ - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "commentStart": 0, - "end": 0, - "left": { + ], + "callee": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "gearPitch", + "name": "profileStartY", "start": 0, "type": "Identifier" }, "path": [], "start": 0, - "type": "Name", "type": "Name" }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "1.67", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.67, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - }, - { - "commentStart": 0, - "end": 0, - "key": { "commentStart": 0, "end": 0, - "name": "offset", "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "commentStart": 0, - "end": 0, - "raw": "60", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 60.0, - "suffix": "None" - } + "type": "CallExpression", + "type": "CallExpression" } - } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -1190,212 +1313,9 @@ description: Result of parsing cycloidal-gear.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - { - "arguments": [ - { - "commentStart": 0, - "end": 0, - "properties": [ - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "gearPitch", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - }, - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "argument": { - "commentStart": 0, - "end": 0, - "raw": "180", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 180.0, - "suffix": "None" - } - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "tangentialArc", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - { - "arguments": [ - { - "commentStart": 0, - "elements": [ - { - "arguments": [ - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "profileStartX", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - { - "arguments": [ - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "profileStartY", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "tangentialArcTo", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ diff --git a/rust/kcl-lib/tests/kcl_samples/cycloidal-gear/ops.snap b/rust/kcl-lib/tests/kcl_samples/cycloidal-gear/ops.snap index 9b6acc412..12da54530 100644 --- a/rust/kcl-lib/tests/kcl_samples/cycloidal-gear/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/cycloidal-gear/ops.snap @@ -10,7 +10,7 @@ description: Operations executed cycloidal-gear.kcl "name": "cycloidalGear", "functionSourceRange": [ 265, - 1729, + 1644, 0 ], "unlabeledArg": null, @@ -25,7 +25,7 @@ description: Operations executed cycloidal-gear.kcl "name": "gearSketch", "functionSourceRange": [ 491, - 1520, + 1435, 0 ], "unlabeledArg": null, @@ -186,7 +186,7 @@ description: Operations executed cycloidal-gear.kcl "name": "gearSketch", "functionSourceRange": [ 491, - 1520, + 1435, 0 ], "unlabeledArg": null, @@ -342,7 +342,7 @@ description: Operations executed cycloidal-gear.kcl "name": "gearSketch", "functionSourceRange": [ 491, - 1520, + 1435, 0 ], "unlabeledArg": null, diff --git a/rust/kcl-lib/tests/kcl_samples/dual-basin-utility-sink/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/dual-basin-utility-sink/artifact_graph_flowchart.snap.md index 2a97ac77b..1adcd9c1b 100644 --- a/rust/kcl-lib/tests/kcl_samples/dual-basin-utility-sink/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/dual-basin-utility-sink/artifact_graph_flowchart.snap.md @@ -102,14 +102,14 @@ flowchart LR subgraph path276 [Path] 276["Path
[6877, 6927, 0]"] 277["Segment
[6933, 6970, 0]"] - 278["Segment
[6976, 7060, 0]"] - 279["Segment
[7066, 7102, 0]"] - 280["Segment
[7108, 7200, 0]"] - 281["Segment
[7206, 7242, 0]"] + 278["Segment
[6976, 7069, 0]"] + 279["Segment
[7075, 7111, 0]"] + 280["Segment
[7117, 7218, 0]"] + 281["Segment
[7224, 7260, 0]"] end subgraph path283 [Path] - 283["Path
[7305, 7416, 0]"] - 284["Segment
[7305, 7416, 0]"] + 283["Path
[7323, 7434, 0]"] + 284["Segment
[7323, 7434, 0]"] 285[Solid2d] end 1["Plane
[565, 582, 0]"] @@ -310,8 +310,8 @@ flowchart LR 273["SweepEdge Adjacent"] 274["Sweep Extrusion
[6482, 6510, 0]"] 275["Plane
[6803, 6854, 0]"] - 282["Plane
[7264, 7281, 0]"] - 286["Sweep Sweep
[7430, 7483, 0]"] + 282["Plane
[7282, 7299, 0]"] + 286["Sweep Sweep
[7448, 7501, 0]"] 287[Wall] 288["Cap Start"] 289["Cap Start"] diff --git a/rust/kcl-lib/tests/kcl_samples/dual-basin-utility-sink/ast.snap b/rust/kcl-lib/tests/kcl_samples/dual-basin-utility-sink/ast.snap index 2a1f8eea4..941986985 100644 --- a/rust/kcl-lib/tests/kcl_samples/dual-basin-utility-sink/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/dual-basin-utility-sink/ast.snap @@ -10274,84 +10274,87 @@ description: Result of parsing dual-basin-utility-sink.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { "commentStart": 0, "end": 0, - "name": { + "left": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "handleFillet", + "name": { + "commentStart": 0, + "end": 0, + "name": "handleFillet", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "handleOffset", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" }, - "path": [], "start": 0, - "type": "Name", - "type": "Name" + "type": "BinaryExpression", + "type": "BinaryExpression" }, - "operator": "+", - "right": { - "abs_path": false, + { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "handleDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, "commentStart": 0, "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "handleOffset", - "start": 0, - "type": "Identifier" - }, - "path": [], + "operator": "-", "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "argument": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "handleDepth", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -10361,7 +10364,7 @@ description: Result of parsing dual-basin-utility-sink.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcTo", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -10372,8 +10375,9 @@ description: Result of parsing dual-basin-utility-sink.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -10429,84 +10433,87 @@ description: Result of parsing dual-basin-utility-sink.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { "commentStart": 0, "end": 0, - "name": { + "left": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "handleOffset", + "name": { + "commentStart": 0, + "end": 0, + "name": "handleOffset", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "handleWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" }, - "path": [], "start": 0, - "type": "Name", - "type": "Name" + "type": "BinaryExpression", + "type": "BinaryExpression" }, - "operator": "+", - "right": { - "abs_path": false, + { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "handleLengthSegmentA", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, "commentStart": 0, "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "handleWidth", - "start": 0, - "type": "Identifier" - }, - "path": [], + "operator": "-", "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "argument": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "handleLengthSegmentA", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -10516,7 +10523,7 @@ description: Result of parsing dual-basin-utility-sink.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcTo", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -10527,8 +10534,9 @@ description: Result of parsing dual-basin-utility-sink.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ diff --git a/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/artifact_graph_flowchart.snap.md index ba70de1a9..f7817b9e6 100644 --- a/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/artifact_graph_flowchart.snap.md @@ -3,170 +3,170 @@ flowchart LR subgraph path2 [Path] 2["Path
[817, 852, 0]"] 3["Segment
[860, 886, 0]"] - 4["Segment
[894, 957, 0]"] - 5["Segment
[965, 1024, 0]"] - 6["Segment
[1032, 1094, 0]"] - 7["Segment
[1102, 1161, 0]"] + 4["Segment
[894, 955, 0]"] + 5["Segment
[963, 1022, 0]"] + 6["Segment
[1030, 1090, 0]"] + 7["Segment
[1098, 1157, 0]"] end subgraph path9 [Path] - 9["Path
[1263, 1325, 0]"] - 10["Segment
[1263, 1325, 0]"] + 9["Path
[1259, 1321, 0]"] + 10["Segment
[1259, 1321, 0]"] 11[Solid2d] end subgraph path12 [Path] - 12["Path
[1338, 1416, 0]"] - 13["Segment
[1338, 1416, 0]"] + 12["Path
[1334, 1412, 0]"] + 13["Segment
[1334, 1412, 0]"] 14[Solid2d] end subgraph path22 [Path] 22["Path
[817, 852, 0]"] 23["Segment
[860, 886, 0]"] - 24["Segment
[894, 957, 0]"] - 25["Segment
[965, 1024, 0]"] - 26["Segment
[1032, 1094, 0]"] - 27["Segment
[1102, 1161, 0]"] + 24["Segment
[894, 955, 0]"] + 25["Segment
[963, 1022, 0]"] + 26["Segment
[1030, 1090, 0]"] + 27["Segment
[1098, 1157, 0]"] end subgraph path29 [Path] - 29["Path
[1263, 1325, 0]"] - 30["Segment
[1263, 1325, 0]"] + 29["Path
[1259, 1321, 0]"] + 30["Segment
[1259, 1321, 0]"] 31[Solid2d] end subgraph path32 [Path] - 32["Path
[1338, 1416, 0]"] - 33["Segment
[1338, 1416, 0]"] + 32["Path
[1334, 1412, 0]"] + 33["Segment
[1334, 1412, 0]"] 34[Solid2d] end subgraph path42 [Path] 42["Path
[817, 852, 0]"] 43["Segment
[860, 886, 0]"] - 44["Segment
[894, 957, 0]"] - 45["Segment
[965, 1024, 0]"] - 46["Segment
[1032, 1094, 0]"] - 47["Segment
[1102, 1161, 0]"] + 44["Segment
[894, 955, 0]"] + 45["Segment
[963, 1022, 0]"] + 46["Segment
[1030, 1090, 0]"] + 47["Segment
[1098, 1157, 0]"] end subgraph path49 [Path] - 49["Path
[1263, 1325, 0]"] - 50["Segment
[1263, 1325, 0]"] + 49["Path
[1259, 1321, 0]"] + 50["Segment
[1259, 1321, 0]"] 51[Solid2d] end subgraph path52 [Path] - 52["Path
[1338, 1416, 0]"] - 53["Segment
[1338, 1416, 0]"] + 52["Path
[1334, 1412, 0]"] + 53["Segment
[1334, 1412, 0]"] 54[Solid2d] end subgraph path62 [Path] 62["Path
[817, 852, 0]"] 63["Segment
[860, 886, 0]"] - 64["Segment
[894, 957, 0]"] - 65["Segment
[965, 1024, 0]"] - 66["Segment
[1032, 1094, 0]"] - 67["Segment
[1102, 1161, 0]"] + 64["Segment
[894, 955, 0]"] + 65["Segment
[963, 1022, 0]"] + 66["Segment
[1030, 1090, 0]"] + 67["Segment
[1098, 1157, 0]"] end subgraph path69 [Path] - 69["Path
[1263, 1325, 0]"] - 70["Segment
[1263, 1325, 0]"] + 69["Path
[1259, 1321, 0]"] + 70["Segment
[1259, 1321, 0]"] 71[Solid2d] end subgraph path72 [Path] - 72["Path
[1338, 1416, 0]"] - 73["Segment
[1338, 1416, 0]"] + 72["Path
[1334, 1412, 0]"] + 73["Segment
[1334, 1412, 0]"] 74[Solid2d] end subgraph path82 [Path] - 82["Path
[1743, 1778, 0]"] - 83["Segment
[1784, 1818, 0]"] - 84["Segment
[1824, 1871, 0]"] - 85["Segment
[1877, 1923, 0]"] - 86["Segment
[1929, 1976, 0]"] - 87["Segment
[1982, 2016, 0]"] - 88["Segment
[2022, 2065, 0]"] - 89["Segment
[2071, 2104, 0]"] - 90["Segment
[2110, 2157, 0]"] - 91["Segment
[2163, 2210, 0]"] - 92["Segment
[2216, 2263, 0]"] - 93["Segment
[2269, 2312, 0]"] - 94["Segment
[2318, 2369, 0]"] - 95["Segment
[2375, 2419, 0]"] - 96["Segment
[2425, 2472, 0]"] - 97["Segment
[2478, 2524, 0]"] - 98["Segment
[2530, 2586, 0]"] - 99["Segment
[2592, 2599, 0]"] + 82["Path
[1739, 1774, 0]"] + 83["Segment
[1780, 1814, 0]"] + 84["Segment
[1820, 1859, 0]"] + 85["Segment
[1865, 1903, 0]"] + 86["Segment
[1909, 1948, 0]"] + 87["Segment
[1954, 1988, 0]"] + 88["Segment
[1994, 2037, 0]"] + 89["Segment
[2043, 2076, 0]"] + 90["Segment
[2082, 2121, 0]"] + 91["Segment
[2127, 2166, 0]"] + 92["Segment
[2172, 2211, 0]"] + 93["Segment
[2217, 2260, 0]"] + 94["Segment
[2266, 2317, 0]"] + 95["Segment
[2323, 2367, 0]"] + 96["Segment
[2373, 2412, 0]"] + 97["Segment
[2418, 2456, 0]"] + 98["Segment
[2462, 2527, 0]"] + 99["Segment
[2533, 2540, 0]"] 100[Solid2d] end subgraph path101 [Path] - 101["Path
[2671, 2744, 0]"] - 102["Segment
[2671, 2744, 0]"] + 101["Path
[2612, 2685, 0]"] + 102["Segment
[2612, 2685, 0]"] 103[Solid2d] end subgraph path104 [Path] - 104["Path
[2759, 2832, 0]"] - 105["Segment
[2759, 2832, 0]"] + 104["Path
[2700, 2773, 0]"] + 105["Segment
[2700, 2773, 0]"] 106[Solid2d] end subgraph path107 [Path] - 107["Path
[2847, 2920, 0]"] - 108["Segment
[2847, 2920, 0]"] + 107["Path
[2788, 2861, 0]"] + 108["Segment
[2788, 2861, 0]"] 109[Solid2d] end subgraph path110 [Path] - 110["Path
[2935, 3008, 0]"] - 111["Segment
[2935, 3008, 0]"] + 110["Path
[2876, 2949, 0]"] + 111["Segment
[2876, 2949, 0]"] 112[Solid2d] end subgraph path113 [Path] - 113["Path
[3062, 3201, 0]"] - 114["Segment
[3062, 3201, 0]"] + 113["Path
[3003, 3142, 0]"] + 114["Segment
[3003, 3142, 0]"] 115[Solid2d] end subgraph path116 [Path] - 116["Path
[3216, 3353, 0]"] - 117["Segment
[3216, 3353, 0]"] + 116["Path
[3157, 3294, 0]"] + 117["Segment
[3157, 3294, 0]"] 118[Solid2d] end subgraph path119 [Path] - 119["Path
[3368, 3515, 0]"] - 120["Segment
[3368, 3515, 0]"] + 119["Path
[3309, 3456, 0]"] + 120["Segment
[3309, 3456, 0]"] 121[Solid2d] end subgraph path122 [Path] - 122["Path
[3530, 3676, 0]"] - 123["Segment
[3530, 3676, 0]"] + 122["Path
[3471, 3617, 0]"] + 123["Segment
[3471, 3617, 0]"] 124[Solid2d] end 1["Plane
[784, 809, 0]"] - 8["Plane
[1238, 1255, 0]"] - 15["Sweep Sweep
[1428, 1451, 0]"] + 8["Plane
[1234, 1251, 0]"] + 15["Sweep Sweep
[1424, 1447, 0]"] 16[Wall] 17["Cap Start"] 18["Cap End"] 19["SweepEdge Opposite"] 20["SweepEdge Adjacent"] 21["Plane
[784, 809, 0]"] - 28["Plane
[1238, 1255, 0]"] - 35["Sweep Sweep
[1428, 1451, 0]"] + 28["Plane
[1234, 1251, 0]"] + 35["Sweep Sweep
[1424, 1447, 0]"] 36[Wall] 37["Cap Start"] 38["Cap End"] 39["SweepEdge Opposite"] 40["SweepEdge Adjacent"] 41["Plane
[784, 809, 0]"] - 48["Plane
[1238, 1255, 0]"] - 55["Sweep Sweep
[1428, 1451, 0]"] + 48["Plane
[1234, 1251, 0]"] + 55["Sweep Sweep
[1424, 1447, 0]"] 56[Wall] 57["Cap Start"] 58["Cap End"] 59["SweepEdge Opposite"] 60["SweepEdge Adjacent"] 61["Plane
[784, 809, 0]"] - 68["Plane
[1238, 1255, 0]"] - 75["Sweep Sweep
[1428, 1451, 0]"] + 68["Plane
[1234, 1251, 0]"] + 75["Sweep Sweep
[1424, 1447, 0]"] 76[Wall] 77["Cap Start"] 78["Cap End"] 79["SweepEdge Opposite"] 80["SweepEdge Adjacent"] - 81["Plane
[1720, 1737, 0]"] - 125["Sweep Extrusion
[3732, 3761, 0]"] + 81["Plane
[1716, 1733, 0]"] + 125["Sweep Extrusion
[3673, 3702, 0]"] 126[Wall] 127[Wall] 128[Wall] @@ -217,10 +217,10 @@ flowchart LR 173["SweepEdge Adjacent"] 174["SweepEdge Opposite"] 175["SweepEdge Adjacent"] - 176["EdgeCut Fillet
[3767, 3901, 0]"] - 177["EdgeCut Fillet
[3767, 3901, 0]"] - 178["EdgeCut Fillet
[3907, 4041, 0]"] - 179["EdgeCut Fillet
[3907, 4041, 0]"] + 176["EdgeCut Fillet
[3708, 3842, 0]"] + 177["EdgeCut Fillet
[3708, 3842, 0]"] + 178["EdgeCut Fillet
[3848, 3982, 0]"] + 179["EdgeCut Fillet
[3848, 3982, 0]"] 1 --- 2 2 --- 3 2 --- 4 diff --git a/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/ast.snap b/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/ast.snap index 289edb885..6dc761fa7 100644 --- a/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/ast.snap @@ -825,90 +825,78 @@ description: Result of parsing exhaust-manifold.kcl { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { "commentStart": 0, "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, + "raw": "80", "start": 0, - "type": "ObjectProperty", + "type": "Literal", + "type": "Literal", "value": { - "argument": { - "commentStart": 0, - "end": 0, - "raw": "80", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 80.0, - "suffix": "None" - } - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" + "value": 80.0, + "suffix": "None" } }, - { + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { "commentStart": 0, "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, + "name": "bendRadius", "start": 0, - "type": "ObjectProperty", - "value": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "bendRadius", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "TagDeclarator", - "type": "TagDeclarator", - "value": "arc01" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tag", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "arc01" + } } ], "callee": { @@ -929,8 +917,9 @@ description: Result of parsing exhaust-manifold.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -1036,82 +1025,70 @@ description: Result of parsing exhaust-manifold.kcl { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "commentStart": 0, - "end": 0, - "raw": "85", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 85.0, - "suffix": "None" - } - } - }, - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "bendRadius", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "85", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 85.0, + "suffix": "None" } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" + } }, { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "bendRadius", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "TagDeclarator", - "type": "TagDeclarator", - "value": "arc02" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tag", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "arc02" + } } ], "callee": { @@ -1132,8 +1109,9 @@ description: Result of parsing exhaust-manifold.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -2386,78 +2364,56 @@ description: Result of parsing exhaust-manifold.kcl { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "commentStart": 0, - "end": 0, - "raw": ".3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.3, - "suffix": "None" - } - } - }, - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "argument": { - "commentStart": 0, - "end": 0, - "raw": "40", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 40.0, - "suffix": "None" - } - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": ".3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.3, + "suffix": "None" } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" + } }, { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "40", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 40.0, + "suffix": "None" + } + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } } ], "callee": { @@ -2478,76 +2434,55 @@ description: Result of parsing exhaust-manifold.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "commentStart": 0, - "end": 0, - "raw": ".9", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.9, - "suffix": "None" - } - } - }, - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "commentStart": 0, - "end": 0, - "raw": "80", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 80.0, - "suffix": "None" - } - } + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": ".9", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.9, + "suffix": "None" } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" + } }, { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "80", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 80.0, + "suffix": "None" + } + } } ], "callee": { @@ -2568,84 +2503,63 @@ description: Result of parsing exhaust-manifold.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "commentStart": 0, - "end": 0, - "raw": ".3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.3, - "suffix": "None" - } - } - }, - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "argument": { - "commentStart": 0, - "end": 0, - "raw": "40", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 40.0, - "suffix": "None" - } - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": ".3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.3, + "suffix": "None" } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" + } }, { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "40", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 40.0, + "suffix": "None" + } + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } } ], "callee": { @@ -2666,8 +2580,9 @@ description: Result of parsing exhaust-manifold.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -2903,78 +2818,56 @@ description: Result of parsing exhaust-manifold.kcl { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "commentStart": 0, - "end": 0, - "raw": ".3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.3, - "suffix": "None" - } - } - }, - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "argument": { - "commentStart": 0, - "end": 0, - "raw": "40", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 40.0, - "suffix": "None" - } - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": ".3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.3, + "suffix": "None" } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" + } }, { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "40", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 40.0, + "suffix": "None" + } + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } } ], "callee": { @@ -2995,76 +2888,55 @@ description: Result of parsing exhaust-manifold.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "commentStart": 0, - "end": 0, - "raw": "1.5", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.5, - "suffix": "None" - } - } - }, - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "commentStart": 0, - "end": 0, - "raw": "80", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 80.0, - "suffix": "None" - } - } + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "1.5", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.5, + "suffix": "None" } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" + } }, { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "80", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 80.0, + "suffix": "None" + } + } } ], "callee": { @@ -3085,84 +2957,63 @@ description: Result of parsing exhaust-manifold.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "commentStart": 0, - "end": 0, - "raw": ".3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.3, - "suffix": "None" - } - } - }, - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "argument": { - "commentStart": 0, - "end": 0, - "raw": "40", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 40.0, - "suffix": "None" - } - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": ".3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.3, + "suffix": "None" } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" + } }, { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "40", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 40.0, + "suffix": "None" + } + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } } ], "callee": { @@ -3183,8 +3034,9 @@ description: Result of parsing exhaust-manifold.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -3467,78 +3319,231 @@ description: Result of parsing exhaust-manifold.kcl { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": ".3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.3, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { "commentStart": 0, "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, + "raw": "40", "start": 0, - "type": "ObjectProperty", + "type": "Literal", + "type": "Literal", "value": { - "commentStart": 0, - "end": 0, - "raw": ".3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.3, - "suffix": "None" - } + "value": 40.0, + "suffix": "None" } }, - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "argument": { - "commentStart": 0, - "end": 0, - "raw": "40", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 40.0, - "suffix": "None" + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "tangentialArc", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": ".9", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.9, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "80", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 80.0, + "suffix": "None" + } + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "tangentialArc", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "arguments": [ + { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeSubstitution", + "type": "PipeSubstitution" } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "profileStartX", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" }, "commentStart": 0, "end": 0, - "operator": "-", "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "profileStartY", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpression", + "type": "CallExpression" } - } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -3559,200 +3564,9 @@ description: Result of parsing exhaust-manifold.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - { - "arguments": [ - { - "commentStart": 0, - "end": 0, - "properties": [ - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "commentStart": 0, - "end": 0, - "raw": ".9", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.9, - "suffix": "None" - } - } - }, - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "commentStart": 0, - "end": 0, - "raw": "80", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 80.0, - "suffix": "None" - } - } - } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "tangentialArc", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - { - "arguments": [ - { - "commentStart": 0, - "elements": [ - { - "arguments": [ - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "profileStartX", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - { - "arguments": [ - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "profileStartY", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "tangentialArcTo", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [], diff --git a/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/ops.snap b/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/ops.snap index 00a6e262d..68caa0612 100644 --- a/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/ops.snap @@ -10,7 +10,7 @@ description: Operations executed exhaust-manifold.kcl "name": "primaryTube", "functionSourceRange": [ 330, - 1468, + 1464, 0 ], "unlabeledArg": null, @@ -317,7 +317,7 @@ description: Operations executed exhaust-manifold.kcl "name": "primaryTube", "functionSourceRange": [ 330, - 1468, + 1464, 0 ], "unlabeledArg": null, @@ -624,7 +624,7 @@ description: Operations executed exhaust-manifold.kcl "name": "primaryTube", "functionSourceRange": [ 330, - 1468, + 1464, 0 ], "unlabeledArg": null, @@ -931,7 +931,7 @@ description: Operations executed exhaust-manifold.kcl "name": "primaryTube", "functionSourceRange": [ 330, - 1468, + 1464, 0 ], "unlabeledArg": null, diff --git a/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/program_memory.snap b/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/program_memory.snap index 3226d5b04..c2b6c8227 100644 --- a/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/program_memory.snap +++ b/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/program_memory.snap @@ -28,9 +28,9 @@ description: Variables in memory after executing exhaust-manifold.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1811, - "end": 1817, - "start": 1811, + "commentStart": 1807, + "end": 1813, + "start": 1807, "type": "TagDeclarator", "value": "seg01" }, @@ -62,9 +62,9 @@ description: Variables in memory after executing exhaust-manifold.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2009, - "end": 2015, - "start": 2009, + "commentStart": 1981, + "end": 1987, + "start": 1981, "type": "TagDeclarator", "value": "seg03" }, @@ -75,9 +75,9 @@ description: Variables in memory after executing exhaust-manifold.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2058, - "end": 2064, - "start": 2058, + "commentStart": 2030, + "end": 2036, + "start": 2030, "type": "TagDeclarator", "value": "seg04" }, @@ -88,9 +88,9 @@ description: Variables in memory after executing exhaust-manifold.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2097, - "end": 2103, - "start": 2097, + "commentStart": 2069, + "end": 2075, + "start": 2069, "type": "TagDeclarator", "value": "seg05" }, @@ -122,9 +122,9 @@ description: Variables in memory after executing exhaust-manifold.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2305, - "end": 2311, - "start": 2305, + "commentStart": 2253, + "end": 2259, + "start": 2253, "type": "TagDeclarator", "value": "seg07" }, @@ -135,9 +135,9 @@ description: Variables in memory after executing exhaust-manifold.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2362, - "end": 2368, - "start": 2362, + "commentStart": 2310, + "end": 2316, + "start": 2310, "type": "TagDeclarator", "value": "seg08" }, @@ -148,9 +148,9 @@ description: Variables in memory after executing exhaust-manifold.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2412, - "end": 2418, - "start": 2412, + "commentStart": 2360, + "end": 2366, + "start": 2360, "type": "TagDeclarator", "value": "seg09" }, @@ -192,9 +192,9 @@ description: Variables in memory after executing exhaust-manifold.kcl -1.25 ], "tag": { - "commentStart": 1811, - "end": 1817, - "start": 1811, + "commentStart": 1807, + "end": 1813, + "start": 1807, "type": "TagDeclarator", "value": "seg01" }, @@ -289,9 +289,9 @@ description: Variables in memory after executing exhaust-manifold.kcl -1.25 ], "tag": { - "commentStart": 2009, - "end": 2015, - "start": 2009, + "commentStart": 1981, + "end": 1987, + "start": 1981, "type": "TagDeclarator", "value": "seg03" }, @@ -314,9 +314,9 @@ description: Variables in memory after executing exhaust-manifold.kcl -1.25 ], "tag": { - "commentStart": 2058, - "end": 2064, - "start": 2058, + "commentStart": 2030, + "end": 2036, + "start": 2030, "type": "TagDeclarator", "value": "seg04" }, @@ -339,9 +339,9 @@ description: Variables in memory after executing exhaust-manifold.kcl 1.35 ], "tag": { - "commentStart": 2097, - "end": 2103, - "start": 2097, + "commentStart": 2069, + "end": 2075, + "start": 2069, "type": "TagDeclarator", "value": "seg05" }, @@ -436,9 +436,9 @@ description: Variables in memory after executing exhaust-manifold.kcl 1.35 ], "tag": { - "commentStart": 2305, - "end": 2311, - "start": 2305, + "commentStart": 2253, + "end": 2259, + "start": 2253, "type": "TagDeclarator", "value": "seg07" }, @@ -461,9 +461,9 @@ description: Variables in memory after executing exhaust-manifold.kcl 1.35 ], "tag": { - "commentStart": 2362, - "end": 2368, - "start": 2362, + "commentStart": 2310, + "end": 2316, + "start": 2310, "type": "TagDeclarator", "value": "seg08" }, @@ -486,9 +486,9 @@ description: Variables in memory after executing exhaust-manifold.kcl -1.25 ], "tag": { - "commentStart": 2412, - "end": 2418, - "start": 2412, + "commentStart": 2360, + "end": 2366, + "start": 2360, "type": "TagDeclarator", "value": "seg09" }, diff --git a/rust/kcl-lib/tests/kcl_samples/food-service-spatula/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/food-service-spatula/artifact_graph_flowchart.snap.md index d01f798c0..99720ad29 100644 --- a/rust/kcl-lib/tests/kcl_samples/food-service-spatula/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/food-service-spatula/artifact_graph_flowchart.snap.md @@ -1,76 +1,76 @@ ```mermaid flowchart LR subgraph path2 [Path] - 2["Path
[1444, 1498, 0]"] - 3["Segment
[1504, 1536, 0]"] - 4["Segment
[1542, 1579, 0]"] - 5["Segment
[1585, 1618, 0]"] - 6["Segment
[1624, 1724, 0]"] - 7["Segment
[1730, 1737, 0]"] + 2["Path
[1445, 1499, 0]"] + 3["Segment
[1505, 1537, 0]"] + 4["Segment
[1543, 1580, 0]"] + 5["Segment
[1586, 1619, 0]"] + 6["Segment
[1625, 1725, 0]"] + 7["Segment
[1731, 1738, 0]"] 8[Solid2d] end subgraph path9 [Path] 9["Path
[1001, 1042, 0]"] 10["Segment
[1050, 1090, 0]"] - 11["Segment
[1098, 1152, 0]"] - 12["Segment
[1160, 1201, 0]"] - 13["Segment
[1209, 1265, 0]"] - 14["Segment
[1273, 1280, 0]"] + 11["Segment
[1098, 1144, 0]"] + 12["Segment
[1152, 1193, 0]"] + 13["Segment
[1201, 1266, 0]"] + 14["Segment
[1274, 1281, 0]"] 15[Solid2d] end subgraph path16 [Path] 16["Path
[1001, 1042, 0]"] 17["Segment
[1050, 1090, 0]"] - 18["Segment
[1098, 1152, 0]"] - 19["Segment
[1160, 1201, 0]"] - 20["Segment
[1209, 1265, 0]"] - 21["Segment
[1273, 1280, 0]"] + 18["Segment
[1098, 1144, 0]"] + 19["Segment
[1152, 1193, 0]"] + 20["Segment
[1201, 1266, 0]"] + 21["Segment
[1274, 1281, 0]"] 22[Solid2d] end subgraph path23 [Path] 23["Path
[1001, 1042, 0]"] 24["Segment
[1050, 1090, 0]"] - 25["Segment
[1098, 1152, 0]"] - 26["Segment
[1160, 1201, 0]"] - 27["Segment
[1209, 1265, 0]"] - 28["Segment
[1273, 1280, 0]"] + 25["Segment
[1098, 1144, 0]"] + 26["Segment
[1152, 1193, 0]"] + 27["Segment
[1201, 1266, 0]"] + 28["Segment
[1274, 1281, 0]"] 29[Solid2d] end subgraph path49 [Path] - 49["Path
[2740, 2793, 0]"] - 50["Segment
[2799, 2858, 0]"] - 51["Segment
[2864, 2899, 0]"] - 52["Segment
[2905, 2938, 0]"] - 53["Segment
[2944, 3003, 0]"] - 54["Segment
[3009, 3045, 0]"] - 55["Segment
[3051, 3075, 0]"] - 56["Segment
[3081, 3088, 0]"] + 49["Path
[2741, 2794, 0]"] + 50["Segment
[2800, 2859, 0]"] + 51["Segment
[2865, 2900, 0]"] + 52["Segment
[2906, 2939, 0]"] + 53["Segment
[2945, 3004, 0]"] + 54["Segment
[3010, 3046, 0]"] + 55["Segment
[3052, 3076, 0]"] + 56["Segment
[3082, 3089, 0]"] 57[Solid2d] end subgraph path83 [Path] - 83["Path
[3707, 3754, 0]"] - 84["Segment
[3760, 3810, 0]"] - 85["Segment
[3816, 3915, 0]"] - 86["Segment
[3921, 3972, 0]"] - 87["Segment
[3978, 4076, 0]"] - 88["Segment
[4082, 4135, 0]"] - 89["Segment
[4141, 4241, 0]"] - 90["Segment
[4247, 4321, 0]"] - 91["Segment
[4327, 4428, 0]"] - 92["Segment
[4434, 4441, 0]"] + 83["Path
[3708, 3755, 0]"] + 84["Segment
[3761, 3811, 0]"] + 85["Segment
[3817, 3916, 0]"] + 86["Segment
[3922, 3973, 0]"] + 87["Segment
[3979, 4077, 0]"] + 88["Segment
[4083, 4136, 0]"] + 89["Segment
[4142, 4242, 0]"] + 90["Segment
[4248, 4322, 0]"] + 91["Segment
[4328, 4429, 0]"] + 92["Segment
[4435, 4442, 0]"] 93[Solid2d] end subgraph path121 [Path] 121["Path
[1001, 1042, 0]"] 122["Segment
[1050, 1090, 0]"] - 123["Segment
[1098, 1152, 0]"] - 124["Segment
[1160, 1201, 0]"] - 125["Segment
[1209, 1265, 0]"] - 126["Segment
[1273, 1280, 0]"] + 123["Segment
[1098, 1144, 0]"] + 124["Segment
[1152, 1193, 0]"] + 125["Segment
[1201, 1266, 0]"] + 126["Segment
[1274, 1281, 0]"] 127[Solid2d] end - 1["Plane
[1373, 1390, 0]"] - 30["Sweep Extrusion
[2312, 2362, 0]"] + 1["Plane
[1374, 1391, 0]"] + 30["Sweep Extrusion
[2313, 2363, 0]"] 31[Wall] 32[Wall] 33[Wall] @@ -88,8 +88,8 @@ flowchart LR 45["SweepEdge Adjacent"] 46["SweepEdge Opposite"] 47["SweepEdge Adjacent"] - 48["Plane
[2637, 2679, 0]"] - 58["Sweep Extrusion
[3122, 3166, 0]"] + 48["Plane
[2638, 2680, 0]"] + 58["Sweep Extrusion
[3123, 3167, 0]"] 59[Wall] 60[Wall] 61[Wall] @@ -113,8 +113,8 @@ flowchart LR 79["SweepEdge Adjacent"] 80["SweepEdge Opposite"] 81["SweepEdge Adjacent"] - 82["Plane
[3633, 3659, 0]"] - 94["Sweep Extrusion
[4497, 4539, 0]"] + 82["Plane
[3634, 3660, 0]"] + 94["Sweep Extrusion
[4498, 4540, 0]"] 95[Wall] 96[Wall] 97[Wall] @@ -141,7 +141,7 @@ flowchart LR 118["SweepEdge Adjacent"] 119["SweepEdge Opposite"] 120["SweepEdge Adjacent"] - 128["Sweep Extrusion
[4767, 4817, 0]"] + 128["Sweep Extrusion
[4768, 4818, 0]"] 129[Wall] 130[Wall] 131[Wall] @@ -154,12 +154,12 @@ flowchart LR 138["SweepEdge Adjacent"] 139["SweepEdge Opposite"] 140["SweepEdge Adjacent"] - 141["EdgeCut Fillet
[2399, 2540, 0]"] - 142["EdgeCut Fillet
[2399, 2540, 0]"] - 143["EdgeCut Fillet
[3209, 3340, 0]"] - 144["EdgeCut Fillet
[3209, 3340, 0]"] - 145["StartSketchOnPlane
[2623, 2680, 0]"] - 146["StartSketchOnFace
[4598, 4630, 0]"] + 141["EdgeCut Fillet
[2400, 2541, 0]"] + 142["EdgeCut Fillet
[2400, 2541, 0]"] + 143["EdgeCut Fillet
[3210, 3341, 0]"] + 144["EdgeCut Fillet
[3210, 3341, 0]"] + 145["StartSketchOnPlane
[2624, 2681, 0]"] + 146["StartSketchOnFace
[4599, 4631, 0]"] 1 --- 2 1 --- 9 1 --- 16 diff --git a/rust/kcl-lib/tests/kcl_samples/food-service-spatula/ast.snap b/rust/kcl-lib/tests/kcl_samples/food-service-spatula/ast.snap index c91646deb..6e49aa21f 100644 --- a/rust/kcl-lib/tests/kcl_samples/food-service-spatula/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/food-service-spatula/ast.snap @@ -1887,94 +1887,72 @@ description: Result of parsing food-service-spatula.kcl { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, "commentStart": 0, "end": 0, - "key": { + "name": { "commentStart": 0, "end": 0, - "name": "radius", + "name": "width", "start": 0, "type": "Identifier" }, + "path": [], "start": 0, - "type": "ObjectProperty", + "type": "Name", + "type": "Name" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", "value": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "width", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + "value": 2.0, + "suffix": "None" } }, - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "commentStart": 0, - "end": 0, - "raw": "180", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 180.0, - "suffix": "None" - } - } - } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } }, { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "180", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 180.0, + "suffix": "None" + } + } } ], "callee": { @@ -1995,8 +1973,9 @@ description: Result of parsing food-service-spatula.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -2086,82 +2065,85 @@ description: Result of parsing food-service-spatula.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "arguments": [ - { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "arguments": [ + { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "abs_path": false, "commentStart": 0, "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "profileStartX", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - } - ], - "callee": { - "abs_path": false, + "type": "Name" + }, "commentStart": 0, "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "profileStartX", - "start": 0, - "type": "Identifier" - }, - "path": [], "start": 0, - "type": "Name" + "type": "CallExpression", + "type": "CallExpression" }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - { - "arguments": [ - { + { + "arguments": [ + { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "abs_path": false, "commentStart": 0, "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "profileStartY", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - } - ], - "callee": { - "abs_path": false, + "type": "Name" + }, "commentStart": 0, "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "profileStartY", - "start": 0, - "type": "Identifier" - }, - "path": [], "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -2171,7 +2153,7 @@ description: Result of parsing food-service-spatula.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcTo", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -2182,8 +2164,9 @@ description: Result of parsing food-service-spatula.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [], diff --git a/rust/kcl-lib/tests/kcl_samples/food-service-spatula/ops.snap b/rust/kcl-lib/tests/kcl_samples/food-service-spatula/ops.snap index a4b6bcd6f..32ced4ae5 100644 --- a/rust/kcl-lib/tests/kcl_samples/food-service-spatula/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/food-service-spatula/ops.snap @@ -25,7 +25,7 @@ description: Operations executed food-service-spatula.kcl "name": "slot", "functionSourceRange": [ 462, - 1302, + 1303, 0 ], "unlabeledArg": null, @@ -79,7 +79,7 @@ description: Operations executed food-service-spatula.kcl "name": "slot", "functionSourceRange": [ 462, - 1302, + 1303, 0 ], "unlabeledArg": null, @@ -133,7 +133,7 @@ description: Operations executed food-service-spatula.kcl "name": "slot", "functionSourceRange": [ 462, - 1302, + 1303, 0 ], "unlabeledArg": null, @@ -719,7 +719,7 @@ description: Operations executed food-service-spatula.kcl "name": "slot", "functionSourceRange": [ 462, - 1302, + 1303, 0 ], "unlabeledArg": null, diff --git a/rust/kcl-lib/tests/kcl_samples/food-service-spatula/program_memory.snap b/rust/kcl-lib/tests/kcl_samples/food-service-spatula/program_memory.snap index e4a2fef02..7b2c09f64 100644 --- a/rust/kcl-lib/tests/kcl_samples/food-service-spatula/program_memory.snap +++ b/rust/kcl-lib/tests/kcl_samples/food-service-spatula/program_memory.snap @@ -27,9 +27,9 @@ description: Variables in memory after executing food-service-spatula.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1569, - "end": 1578, - "start": 1569, + "commentStart": 1570, + "end": 1579, + "start": 1570, "type": "TagDeclarator", "value": "backEdge" }, @@ -90,9 +90,9 @@ description: Variables in memory after executing food-service-spatula.kcl -30.0 ], "tag": { - "commentStart": 1569, - "end": 1578, - "start": 1569, + "commentStart": 1570, + "end": 1579, + "start": 1570, "type": "TagDeclarator", "value": "backEdge" }, @@ -297,9 +297,9 @@ description: Variables in memory after executing food-service-spatula.kcl -30.0 ], "tag": { - "commentStart": 1569, - "end": 1578, - "start": 1569, + "commentStart": 1570, + "end": 1579, + "start": 1570, "type": "TagDeclarator", "value": "backEdge" }, @@ -547,9 +547,9 @@ description: Variables in memory after executing food-service-spatula.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4308, - "end": 4320, - "start": 4308, + "commentStart": 4309, + "end": 4321, + "start": 4309, "type": "TagDeclarator", "value": "gripEdgeTop" }, @@ -709,9 +709,9 @@ description: Variables in memory after executing food-service-spatula.kcl 7.0 ], "tag": { - "commentStart": 4308, - "end": 4320, - "start": 4308, + "commentStart": 4309, + "end": 4321, + "start": 4309, "type": "TagDeclarator", "value": "gripEdgeTop" }, @@ -1051,9 +1051,9 @@ description: Variables in memory after executing food-service-spatula.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4308, - "end": 4320, - "start": 4308, + "commentStart": 4309, + "end": 4321, + "start": 4309, "type": "TagDeclarator", "value": "gripEdgeTop" }, @@ -1213,9 +1213,9 @@ description: Variables in memory after executing food-service-spatula.kcl 7.0 ], "tag": { - "commentStart": 4308, - "end": 4320, - "start": 4308, + "commentStart": 4309, + "end": 4321, + "start": 4309, "type": "TagDeclarator", "value": "gripEdgeTop" }, @@ -1529,9 +1529,9 @@ description: Variables in memory after executing food-service-spatula.kcl 7.0 ], "tag": { - "commentStart": 4308, - "end": 4320, - "start": 4308, + "commentStart": 4309, + "end": 4321, + "start": 4309, "type": "TagDeclarator", "value": "gripEdgeTop" }, @@ -1718,9 +1718,9 @@ description: Variables in memory after executing food-service-spatula.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2840, - "end": 2857, - "start": 2840, + "commentStart": 2841, + "end": 2858, + "start": 2841, "type": "TagDeclarator", "value": "handleBottomEdge" }, @@ -1745,9 +1745,9 @@ description: Variables in memory after executing food-service-spatula.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2988, - "end": 3002, - "start": 2988, + "commentStart": 2989, + "end": 3003, + "start": 2989, "type": "TagDeclarator", "value": "handleTopEdge" }, @@ -1789,9 +1789,9 @@ description: Variables in memory after executing food-service-spatula.kcl 3.5 ], "tag": { - "commentStart": 2840, - "end": 2857, - "start": 2840, + "commentStart": 2841, + "end": 2858, + "start": 2841, "type": "TagDeclarator", "value": "handleBottomEdge" }, @@ -1852,9 +1852,9 @@ description: Variables in memory after executing food-service-spatula.kcl 91.3213 ], "tag": { - "commentStart": 2988, - "end": 3002, - "start": 2988, + "commentStart": 2989, + "end": 3003, + "start": 2989, "type": "TagDeclarator", "value": "handleTopEdge" }, @@ -2203,9 +2203,9 @@ description: Variables in memory after executing food-service-spatula.kcl 3.5 ], "tag": { - "commentStart": 2840, - "end": 2857, - "start": 2840, + "commentStart": 2841, + "end": 2858, + "start": 2841, "type": "TagDeclarator", "value": "handleBottomEdge" }, @@ -2266,9 +2266,9 @@ description: Variables in memory after executing food-service-spatula.kcl 91.3213 ], "tag": { - "commentStart": 2988, - "end": 3002, - "start": 2988, + "commentStart": 2989, + "end": 3003, + "start": 2989, "type": "TagDeclarator", "value": "handleTopEdge" }, @@ -2525,9 +2525,9 @@ description: Variables in memory after executing food-service-spatula.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4308, - "end": 4320, - "start": 4308, + "commentStart": 4309, + "end": 4321, + "start": 4309, "type": "TagDeclarator", "value": "gripEdgeTop" }, @@ -2687,9 +2687,9 @@ description: Variables in memory after executing food-service-spatula.kcl 7.0 ], "tag": { - "commentStart": 4308, - "end": 4320, - "start": 4308, + "commentStart": 4309, + "end": 4321, + "start": 4309, "type": "TagDeclarator", "value": "gripEdgeTop" }, @@ -3354,9 +3354,9 @@ description: Variables in memory after executing food-service-spatula.kcl -30.0 ], "tag": { - "commentStart": 1569, - "end": 1578, - "start": 1569, + "commentStart": 1570, + "end": 1579, + "start": 1570, "type": "TagDeclarator", "value": "backEdge" }, diff --git a/rust/kcl-lib/tests/kcl_samples/french-press/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/french-press/artifact_graph_flowchart.snap.md index 0cab3dd46..0341c0a08 100644 --- a/rust/kcl-lib/tests/kcl_samples/french-press/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/french-press/artifact_graph_flowchart.snap.md @@ -61,63 +61,63 @@ flowchart LR 143["Segment
[3558, 3576, 0]"] 144["Segment
[3582, 3602, 0]"] 145["Segment
[3608, 3628, 0]"] - 146["Segment
[3634, 3682, 0]"] - 147["Segment
[3688, 3744, 0]"] - 148["Segment
[3750, 3757, 0]"] + 146["Segment
[3634, 3674, 0]"] + 147["Segment
[3680, 3736, 0]"] + 148["Segment
[3742, 3749, 0]"] 149[Solid2d] end subgraph path166 [Path] - 166["Path
[3861, 3920, 0]"] - 167["Segment
[3861, 3920, 0]"] + 166["Path
[3853, 3912, 0]"] + 167["Segment
[3853, 3912, 0]"] 168[Solid2d] end subgraph path169 [Path] - 169["Path
[3931, 3968, 0]"] - 170["Segment
[3931, 3968, 0]"] + 169["Path
[3923, 3960, 0]"] + 170["Segment
[3923, 3960, 0]"] 171[Solid2d] end subgraph path178 [Path] - 178["Path
[4110, 4148, 0]"] - 179["Segment
[4110, 4148, 0]"] + 178["Path
[4102, 4140, 0]"] + 179["Segment
[4102, 4140, 0]"] 180[Solid2d] end subgraph path192 [Path] - 192["Path
[4421, 4459, 0]"] - 193["Segment
[4421, 4459, 0]"] + 192["Path
[4413, 4451, 0]"] + 193["Segment
[4413, 4451, 0]"] 194[Solid2d] end subgraph path203 [Path] - 203["Path
[4711, 4763, 0]"] - 204["Segment
[4711, 4763, 0]"] + 203["Path
[4703, 4755, 0]"] + 204["Segment
[4703, 4755, 0]"] 205[Solid2d] end subgraph path213 [Path] - 213["Path
[5010, 5054, 0]"] - 214["Segment
[5060, 5100, 0]"] - 215["Segment
[5106, 5125, 0]"] - 216["Segment
[5131, 5150, 0]"] - 217["Segment
[5156, 5175, 0]"] - 218["Segment
[5181, 5206, 0]"] - 219["Segment
[5212, 5352, 0]"] - 220["Segment
[5358, 5414, 0]"] - 221["Segment
[5420, 5427, 0]"] + 213["Path
[5002, 5046, 0]"] + 214["Segment
[5052, 5092, 0]"] + 215["Segment
[5098, 5117, 0]"] + 216["Segment
[5123, 5142, 0]"] + 217["Segment
[5148, 5167, 0]"] + 218["Segment
[5173, 5198, 0]"] + 219["Segment
[5204, 5344, 0]"] + 220["Segment
[5350, 5406, 0]"] + 221["Segment
[5412, 5419, 0]"] 222[Solid2d] end subgraph path239 [Path] - 239["Path
[5557, 5586, 0]"] - 240["Segment
[5592, 5613, 0]"] - 241["Segment
[5619, 5650, 0]"] - 242["Segment
[5656, 5687, 0]"] - 243["Segment
[5693, 5725, 0]"] - 244["Segment
[5731, 5753, 0]"] - 245["Segment
[5759, 5780, 0]"] - 246["Segment
[5786, 5811, 0]"] - 247["Segment
[5817, 5848, 0]"] - 248["Segment
[5854, 5886, 0]"] - 249["Segment
[5892, 5924, 0]"] - 250["Segment
[5930, 5951, 0]"] - 251["Segment
[5957, 6013, 0]"] - 252["Segment
[6019, 6026, 0]"] + 239["Path
[5549, 5578, 0]"] + 240["Segment
[5584, 5605, 0]"] + 241["Segment
[5611, 5651, 0]"] + 242["Segment
[5657, 5697, 0]"] + 243["Segment
[5703, 5744, 0]"] + 244["Segment
[5750, 5772, 0]"] + 245["Segment
[5778, 5799, 0]"] + 246["Segment
[5805, 5830, 0]"] + 247["Segment
[5836, 5876, 0]"] + 248["Segment
[5882, 5923, 0]"] + 249["Segment
[5929, 5970, 0]"] + 250["Segment
[5976, 5997, 0]"] + 251["Segment
[6003, 6059, 0]"] + 252["Segment
[6065, 6072, 0]"] 253[Solid2d] end 1["Plane
[242, 259, 0]"] @@ -215,7 +215,7 @@ flowchart LR 137["SweepEdge Adjacent"] 138["SweepEdge Adjacent"] 139["Plane
[3427, 3444, 0]"] - 150["Sweep Revolve
[3763, 3780, 0]"] + 150["Sweep Revolve
[3755, 3772, 0]"] 151[Wall] 152[Wall] 153[Wall] @@ -230,40 +230,40 @@ flowchart LR 162["SweepEdge Adjacent"] 163["SweepEdge Adjacent"] 164["SweepEdge Adjacent"] - 165["Plane
[3824, 3854, 0]"] - 172["Sweep Extrusion
[3987, 4021, 0]"] + 165["Plane
[3816, 3846, 0]"] + 172["Sweep Extrusion
[3979, 4013, 0]"] 173[Wall] 174["Cap Start"] 175["Cap End"] 176["SweepEdge Opposite"] 177["SweepEdge Adjacent"] - 181["Sweep Extrusion
[4297, 4332, 0]"] + 181["Sweep Extrusion
[4289, 4324, 0]"] 182[Wall] 183["SweepEdge Opposite"] 184["SweepEdge Adjacent"] - 185["Sweep Extrusion
[4297, 4332, 0]"] - 186["Sweep Extrusion
[4297, 4332, 0]"] - 187["Sweep Extrusion
[4297, 4332, 0]"] - 188["Sweep Extrusion
[4297, 4332, 0]"] - 189["Sweep Extrusion
[4297, 4332, 0]"] - 190["Sweep Extrusion
[4297, 4332, 0]"] - 191["Sweep Extrusion
[4297, 4332, 0]"] - 195["Sweep Extrusion
[4608, 4643, 0]"] + 185["Sweep Extrusion
[4289, 4324, 0]"] + 186["Sweep Extrusion
[4289, 4324, 0]"] + 187["Sweep Extrusion
[4289, 4324, 0]"] + 188["Sweep Extrusion
[4289, 4324, 0]"] + 189["Sweep Extrusion
[4289, 4324, 0]"] + 190["Sweep Extrusion
[4289, 4324, 0]"] + 191["Sweep Extrusion
[4289, 4324, 0]"] + 195["Sweep Extrusion
[4600, 4635, 0]"] 196[Wall] 197["SweepEdge Opposite"] 198["SweepEdge Adjacent"] - 199["Sweep Extrusion
[4608, 4643, 0]"] - 200["Sweep Extrusion
[4608, 4643, 0]"] - 201["Sweep Extrusion
[4608, 4643, 0]"] - 202["Plane
[4688, 4705, 0]"] - 206["Sweep Extrusion
[4859, 4900, 0]"] + 199["Sweep Extrusion
[4600, 4635, 0]"] + 200["Sweep Extrusion
[4600, 4635, 0]"] + 201["Sweep Extrusion
[4600, 4635, 0]"] + 202["Plane
[4680, 4697, 0]"] + 206["Sweep Extrusion
[4851, 4892, 0]"] 207[Wall] 208["Cap Start"] 209["Cap End"] 210["SweepEdge Opposite"] 211["SweepEdge Adjacent"] - 212["Plane
[4987, 5004, 0]"] - 223["Sweep Revolve
[5433, 5450, 0]"] + 212["Plane
[4979, 4996, 0]"] + 223["Sweep Revolve
[5425, 5442, 0]"] 224[Wall] 225[Wall] 226[Wall] @@ -278,8 +278,8 @@ flowchart LR 235["SweepEdge Adjacent"] 236["SweepEdge Adjacent"] 237["SweepEdge Adjacent"] - 238["Plane
[5505, 5550, 0]"] - 254["Sweep Extrusion
[6040, 6085, 0]"] + 238["Plane
[5497, 5542, 0]"] + 254["Sweep Extrusion
[6086, 6131, 0]"] 255[Wall] 256[Wall] 257[Wall] @@ -320,10 +320,10 @@ flowchart LR 292["SweepEdge Adjacent"] 293["StartSketchOnPlane
[2337, 2379, 0]"] 294["StartSketchOnFace
[2507, 2539, 0]"] - 295["StartSketchOnPlane
[3810, 3855, 0]"] - 296["StartSketchOnFace
[4072, 4104, 0]"] - 297["StartSketchOnFace
[4383, 4415, 0]"] - 298["StartSketchOnPlane
[5491, 5551, 0]"] + 295["StartSketchOnPlane
[3802, 3847, 0]"] + 296["StartSketchOnFace
[4064, 4096, 0]"] + 297["StartSketchOnFace
[4375, 4407, 0]"] + 298["StartSketchOnPlane
[5483, 5543, 0]"] 1 --- 2 2 --- 3 2 --- 4 diff --git a/rust/kcl-lib/tests/kcl_samples/french-press/ast.snap b/rust/kcl-lib/tests/kcl_samples/french-press/ast.snap index e4f86513d..6cef53915 100644 --- a/rust/kcl-lib/tests/kcl_samples/french-press/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/french-press/ast.snap @@ -5466,78 +5466,56 @@ description: Result of parsing french-press.kcl { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "commentStart": 0, - "end": 0, - "raw": "0.6", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.6, - "suffix": "None" - } - } - }, - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "argument": { - "commentStart": 0, - "end": 0, - "raw": "90", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 90.0, - "suffix": "None" - } - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0.6", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.6, + "suffix": "None" } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" + } }, { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "90", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 90.0, + "suffix": "None" + } + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } } ], "callee": { @@ -5558,8 +5536,9 @@ description: Result of parsing french-press.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -8602,44 +8581,47 @@ description: Result of parsing french-press.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "4.1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 4.1, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "4.1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 4.1, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "5.26", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 5.26, + "suffix": "None" + } } - }, - { - "commentStart": 0, - "end": 0, - "raw": "5.26", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 5.26, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -8649,7 +8631,7 @@ description: Result of parsing french-press.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcTo", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -8660,50 +8642,54 @@ description: Result of parsing french-press.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "4.17", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 4.17, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "4.17", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 4.17, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "1.6", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.6, + "suffix": "None" + } } - }, - { - "commentStart": 0, - "end": 0, - "raw": "1.6", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.6, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -8713,7 +8699,7 @@ description: Result of parsing french-press.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcTo", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -8724,50 +8710,54 @@ description: Result of parsing french-press.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "3.13", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.13, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "3.13", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.13, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "0.61", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.61, + "suffix": "None" + } } - }, - { - "commentStart": 0, - "end": 0, - "raw": "0.61", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.61, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -8777,7 +8767,7 @@ description: Result of parsing french-press.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcTo", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -8788,8 +8778,9 @@ description: Result of parsing french-press.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -9014,44 +9005,47 @@ description: Result of parsing french-press.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "3.63", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.63, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "3.63", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.63, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "1.6", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.6, + "suffix": "None" + } } - }, - { - "commentStart": 0, - "end": 0, - "raw": "1.6", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.6, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -9061,7 +9055,7 @@ description: Result of parsing french-press.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcTo", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -9072,50 +9066,54 @@ description: Result of parsing french-press.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "3.56", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.56, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "3.56", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.56, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "5.15", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 5.15, + "suffix": "None" + } } - }, - { - "commentStart": 0, - "end": 0, - "raw": "5.15", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 5.15, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -9125,7 +9123,7 @@ description: Result of parsing french-press.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcTo", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -9136,50 +9134,54 @@ description: Result of parsing french-press.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "2.72", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.72, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "2.72", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.72, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "5.88", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 5.88, + "suffix": "None" + } } - }, - { - "commentStart": 0, - "end": 0, - "raw": "5.88", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 5.88, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -9189,7 +9191,7 @@ description: Result of parsing french-press.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcTo", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -9200,8 +9202,9 @@ description: Result of parsing french-press.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ diff --git a/rust/kcl-lib/tests/kcl_samples/gear-rack/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/gear-rack/artifact_graph_flowchart.snap.md index e508a21e3..8b1f38fc2 100644 --- a/rust/kcl-lib/tests/kcl_samples/gear-rack/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/gear-rack/artifact_graph_flowchart.snap.md @@ -10,30 +10,30 @@ flowchart LR end subgraph path24 [Path] 24["Path
[859, 913, 0]"] - 25["Segment
[921, 969, 0]"] - 26["Segment
[977, 1009, 0]"] - 27["Segment
[1017, 1065, 0]"] - 28["Segment
[1073, 1098, 0]"] - 29["Segment
[1106, 1155, 0]"] - 30["Segment
[1163, 1196, 0]"] - 31["Segment
[1204, 1253, 0]"] - 32["Segment
[1261, 1268, 0]"] + 25["Segment
[921, 962, 0]"] + 26["Segment
[970, 1002, 0]"] + 27["Segment
[1010, 1051, 0]"] + 28["Segment
[1059, 1084, 0]"] + 29["Segment
[1092, 1134, 0]"] + 30["Segment
[1142, 1175, 0]"] + 31["Segment
[1183, 1225, 0]"] + 32["Segment
[1233, 1240, 0]"] 33[Solid2d] end subgraph path62 [Path] - 62["Path
[1581, 1624, 0]"] - 63["Segment
[1630, 1663, 0]"] - 64["Segment
[1669, 1718, 0]"] - 65["Segment
[1724, 1768, 0]"] - 66["Segment
[1774, 1781, 0]"] + 62["Path
[1553, 1596, 0]"] + 63["Segment
[1602, 1635, 0]"] + 64["Segment
[1641, 1683, 0]"] + 65["Segment
[1689, 1733, 0]"] + 66["Segment
[1739, 1746, 0]"] 67[Solid2d] end subgraph path84 [Path] - 84["Path
[1916, 1958, 0]"] - 85["Segment
[1964, 1998, 0]"] - 86["Segment
[2004, 2054, 0]"] - 87["Segment
[2060, 2103, 0]"] - 88["Segment
[2109, 2116, 0]"] + 84["Path
[1881, 1923, 0]"] + 85["Segment
[1929, 1963, 0]"] + 86["Segment
[1969, 2012, 0]"] + 87["Segment
[2018, 2061, 0]"] + 88["Segment
[2067, 2074, 0]"] 89[Solid2d] end 1["Plane
[562, 579, 0]"] @@ -53,7 +53,7 @@ flowchart LR 21["SweepEdge Opposite"] 22["SweepEdge Adjacent"] 23["Plane
[834, 851, 0]"] - 34["Sweep Extrusion
[1276, 1299, 0]"] + 34["Sweep Extrusion
[1248, 1271, 0]"] 35[Wall] 36[Wall] 37[Wall] @@ -80,8 +80,8 @@ flowchart LR 58["SweepEdge Adjacent"] 59["SweepEdge Opposite"] 60["SweepEdge Adjacent"] - 61["Plane
[1558, 1575, 0]"] - 68["Sweep Extrusion
[1787, 1810, 0]"] + 61["Plane
[1530, 1547, 0]"] + 68["Sweep Extrusion
[1752, 1775, 0]"] 69[Wall] 70[Wall] 71[Wall] @@ -96,8 +96,8 @@ flowchart LR 80["SweepEdge Adjacent"] 81["SweepEdge Opposite"] 82["SweepEdge Adjacent"] - 83["Plane
[1893, 1910, 0]"] - 90["Sweep Extrusion
[2122, 2145, 0]"] + 83["Plane
[1858, 1875, 0]"] + 90["Sweep Extrusion
[2080, 2103, 0]"] 91[Wall] 92[Wall] 93[Wall] diff --git a/rust/kcl-lib/tests/kcl_samples/gear-rack/ast.snap b/rust/kcl-lib/tests/kcl_samples/gear-rack/ast.snap index 422646bc2..37a8025d4 100644 --- a/rust/kcl-lib/tests/kcl_samples/gear-rack/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/gear-rack/ast.snap @@ -852,44 +852,47 @@ description: Result of parsing gear-rack.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0.157636", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.157636, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "end", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "0.157636", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.157636, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "0.110378", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.110378, + "suffix": "None" + } } - }, - { - "commentStart": 0, - "end": 0, - "raw": "0.110378", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.110378, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -899,7 +902,7 @@ description: Result of parsing gear-rack.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcToRelative", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -910,8 +913,9 @@ description: Result of parsing gear-rack.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -984,44 +988,47 @@ description: Result of parsing gear-rack.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0.157636", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.157636, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "end", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "0.157636", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.157636, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "0.110378", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.110378, + "suffix": "None" + } } - }, - { - "commentStart": 0, - "end": 0, - "raw": "0.110378", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.110378, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -1031,7 +1038,7 @@ description: Result of parsing gear-rack.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcToRelative", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -1042,8 +1049,9 @@ description: Result of parsing gear-rack.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -1116,52 +1124,55 @@ description: Result of parsing gear-rack.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0.157636", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.157636, - "suffix": "None" - } - }, - { - "argument": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "end", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { "commentStart": 0, "end": 0, - "raw": "0.110378", + "raw": "0.157636", "start": 0, "type": "Literal", "type": "Literal", "value": { - "value": 0.110378, + "value": 0.157636, "suffix": "None" } }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "0.110378", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.110378, + "suffix": "None" + } + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -1171,7 +1182,7 @@ description: Result of parsing gear-rack.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcToRelative", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -1182,8 +1193,9 @@ description: Result of parsing gear-rack.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -1264,52 +1276,55 @@ description: Result of parsing gear-rack.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0.157636", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.157636, - "suffix": "None" - } - }, - { - "argument": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "end", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { "commentStart": 0, "end": 0, - "raw": "0.110378", + "raw": "0.157636", "start": 0, "type": "Literal", "type": "Literal", "value": { - "value": 0.110378, + "value": 0.157636, "suffix": "None" } }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "0.110378", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.110378, + "suffix": "None" + } + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -1319,7 +1334,7 @@ description: Result of parsing gear-rack.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcToRelative", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -1330,8 +1345,9 @@ description: Result of parsing gear-rack.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [], @@ -1896,52 +1912,55 @@ description: Result of parsing gear-rack.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0.157636", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.157636, - "suffix": "None" - } - }, - { - "argument": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "end", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { "commentStart": 0, "end": 0, - "raw": "0.110378", + "raw": "0.157636", "start": 0, "type": "Literal", "type": "Literal", "value": { - "value": 0.110378, + "value": 0.157636, "suffix": "None" } }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "0.110378", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.110378, + "suffix": "None" + } + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -1951,7 +1970,7 @@ description: Result of parsing gear-rack.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcToRelative", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -1962,8 +1981,9 @@ description: Result of parsing gear-rack.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -2406,60 +2426,63 @@ description: Result of parsing gear-rack.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "argument": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "end", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "0.157636", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.157636, + "suffix": "None" + } + }, "commentStart": 0, "end": 0, - "raw": "0.157636", + "operator": "-", "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.157636, - "suffix": "None" - } + "type": "UnaryExpression", + "type": "UnaryExpression" }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - { - "argument": { + { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "0.110378", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.110378, + "suffix": "None" + } + }, "commentStart": 0, "end": 0, - "raw": "0.110378", + "operator": "-", "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.110378, - "suffix": "None" - } - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -2469,7 +2492,7 @@ description: Result of parsing gear-rack.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcToRelative", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -2480,8 +2503,9 @@ description: Result of parsing gear-rack.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ diff --git a/rust/kcl-lib/tests/kcl_samples/gear-rack/ops.snap b/rust/kcl-lib/tests/kcl_samples/gear-rack/ops.snap index f016f5ee5..8d84ce5ef 100644 --- a/rust/kcl-lib/tests/kcl_samples/gear-rack/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/gear-rack/ops.snap @@ -57,7 +57,7 @@ description: Operations executed gear-rack.kcl "name": "tooth", "functionSourceRange": [ 813, - 1322, + 1294, 0 ], "unlabeledArg": null, diff --git a/rust/kcl-lib/tests/kcl_samples/i-beam/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/i-beam/artifact_graph_flowchart.snap.md index a3806fe7e..ab5aa44a7 100644 --- a/rust/kcl-lib/tests/kcl_samples/i-beam/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/i-beam/artifact_graph_flowchart.snap.md @@ -5,11 +5,11 @@ flowchart LR 3["Segment
[507, 538, 0]"] 4["Segment
[544, 576, 0]"] 5["Segment
[582, 632, 0]"] - 6["Segment
[638, 692, 0]"] - 7["Segment
[698, 720, 0]"] + 6["Segment
[638, 684, 0]"] + 7["Segment
[690, 712, 0]"] end 1["Plane
[439, 457, 0]"] - 8["Sweep Extrusion
[774, 802, 0]"] + 8["Sweep Extrusion
[766, 794, 0]"] 1 --- 2 2 --- 3 2 --- 4 diff --git a/rust/kcl-lib/tests/kcl_samples/i-beam/ast.snap b/rust/kcl-lib/tests/kcl_samples/i-beam/ast.snap index e54cbb878..2a7150c8e 100644 --- a/rust/kcl-lib/tests/kcl_samples/i-beam/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/i-beam/ast.snap @@ -608,74 +608,52 @@ description: Result of parsing i-beam.kcl { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { "commentStart": 0, "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, + "name": "rootRadius", "start": 0, - "type": "ObjectProperty", - "value": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "rootRadius", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } + "type": "Identifier" }, - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "commentStart": 0, - "end": 0, - "raw": "90", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 90.0, - "suffix": "None" - } - } - } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "90", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 90.0, + "suffix": "None" + } + } } ], "callee": { @@ -696,8 +674,9 @@ description: Result of parsing i-beam.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ diff --git a/rust/kcl-lib/tests/kcl_samples/keyboard/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/keyboard/artifact_graph_flowchart.snap.md index 45defc898..28b406110 100644 --- a/rust/kcl-lib/tests/kcl_samples/keyboard/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/keyboard/artifact_graph_flowchart.snap.md @@ -33,325 +33,325 @@ flowchart LR 61["Path
[2010, 2069, 0]"] 62["Segment
[2077, 2169, 0]"] 63["Segment
[2177, 2251, 0]"] - 64["Segment
[2259, 2306, 0]"] - 65["Segment
[2314, 2421, 0]"] - 66["Segment
[2429, 2476, 0]"] - 67["Segment
[2484, 2601, 0]"] - 68["Segment
[2609, 2656, 0]"] - 69["Segment
[2664, 2749, 0]"] - 70["Segment
[2757, 2764, 0]"] + 64["Segment
[2259, 2298, 0]"] + 65["Segment
[2306, 2413, 0]"] + 66["Segment
[2421, 2460, 0]"] + 67["Segment
[2468, 2585, 0]"] + 68["Segment
[2593, 2632, 0]"] + 69["Segment
[2640, 2725, 0]"] + 70["Segment
[2733, 2740, 0]"] 71[Solid2d] end subgraph path100 [Path] 100["Path
[2010, 2069, 0]"] 101["Segment
[2077, 2169, 0]"] 102["Segment
[2177, 2251, 0]"] - 103["Segment
[2259, 2306, 0]"] - 104["Segment
[2314, 2421, 0]"] - 105["Segment
[2429, 2476, 0]"] - 106["Segment
[2484, 2601, 0]"] - 107["Segment
[2609, 2656, 0]"] - 108["Segment
[2664, 2749, 0]"] - 109["Segment
[2757, 2764, 0]"] + 103["Segment
[2259, 2298, 0]"] + 104["Segment
[2306, 2413, 0]"] + 105["Segment
[2421, 2460, 0]"] + 106["Segment
[2468, 2585, 0]"] + 107["Segment
[2593, 2632, 0]"] + 108["Segment
[2640, 2725, 0]"] + 109["Segment
[2733, 2740, 0]"] 110[Solid2d] end subgraph path139 [Path] 139["Path
[2010, 2069, 0]"] 140["Segment
[2077, 2169, 0]"] 141["Segment
[2177, 2251, 0]"] - 142["Segment
[2259, 2306, 0]"] - 143["Segment
[2314, 2421, 0]"] - 144["Segment
[2429, 2476, 0]"] - 145["Segment
[2484, 2601, 0]"] - 146["Segment
[2609, 2656, 0]"] - 147["Segment
[2664, 2749, 0]"] - 148["Segment
[2757, 2764, 0]"] + 142["Segment
[2259, 2298, 0]"] + 143["Segment
[2306, 2413, 0]"] + 144["Segment
[2421, 2460, 0]"] + 145["Segment
[2468, 2585, 0]"] + 146["Segment
[2593, 2632, 0]"] + 147["Segment
[2640, 2725, 0]"] + 148["Segment
[2733, 2740, 0]"] 149[Solid2d] end subgraph path178 [Path] 178["Path
[2010, 2069, 0]"] 179["Segment
[2077, 2169, 0]"] 180["Segment
[2177, 2251, 0]"] - 181["Segment
[2259, 2306, 0]"] - 182["Segment
[2314, 2421, 0]"] - 183["Segment
[2429, 2476, 0]"] - 184["Segment
[2484, 2601, 0]"] - 185["Segment
[2609, 2656, 0]"] - 186["Segment
[2664, 2749, 0]"] - 187["Segment
[2757, 2764, 0]"] + 181["Segment
[2259, 2298, 0]"] + 182["Segment
[2306, 2413, 0]"] + 183["Segment
[2421, 2460, 0]"] + 184["Segment
[2468, 2585, 0]"] + 185["Segment
[2593, 2632, 0]"] + 186["Segment
[2640, 2725, 0]"] + 187["Segment
[2733, 2740, 0]"] 188[Solid2d] end subgraph path217 [Path] 217["Path
[2010, 2069, 0]"] 218["Segment
[2077, 2169, 0]"] 219["Segment
[2177, 2251, 0]"] - 220["Segment
[2259, 2306, 0]"] - 221["Segment
[2314, 2421, 0]"] - 222["Segment
[2429, 2476, 0]"] - 223["Segment
[2484, 2601, 0]"] - 224["Segment
[2609, 2656, 0]"] - 225["Segment
[2664, 2749, 0]"] - 226["Segment
[2757, 2764, 0]"] + 220["Segment
[2259, 2298, 0]"] + 221["Segment
[2306, 2413, 0]"] + 222["Segment
[2421, 2460, 0]"] + 223["Segment
[2468, 2585, 0]"] + 224["Segment
[2593, 2632, 0]"] + 225["Segment
[2640, 2725, 0]"] + 226["Segment
[2733, 2740, 0]"] 227[Solid2d] end subgraph path256 [Path] 256["Path
[2010, 2069, 0]"] 257["Segment
[2077, 2169, 0]"] 258["Segment
[2177, 2251, 0]"] - 259["Segment
[2259, 2306, 0]"] - 260["Segment
[2314, 2421, 0]"] - 261["Segment
[2429, 2476, 0]"] - 262["Segment
[2484, 2601, 0]"] - 263["Segment
[2609, 2656, 0]"] - 264["Segment
[2664, 2749, 0]"] - 265["Segment
[2757, 2764, 0]"] + 259["Segment
[2259, 2298, 0]"] + 260["Segment
[2306, 2413, 0]"] + 261["Segment
[2421, 2460, 0]"] + 262["Segment
[2468, 2585, 0]"] + 263["Segment
[2593, 2632, 0]"] + 264["Segment
[2640, 2725, 0]"] + 265["Segment
[2733, 2740, 0]"] 266[Solid2d] end subgraph path295 [Path] 295["Path
[2010, 2069, 0]"] 296["Segment
[2077, 2169, 0]"] 297["Segment
[2177, 2251, 0]"] - 298["Segment
[2259, 2306, 0]"] - 299["Segment
[2314, 2421, 0]"] - 300["Segment
[2429, 2476, 0]"] - 301["Segment
[2484, 2601, 0]"] - 302["Segment
[2609, 2656, 0]"] - 303["Segment
[2664, 2749, 0]"] - 304["Segment
[2757, 2764, 0]"] + 298["Segment
[2259, 2298, 0]"] + 299["Segment
[2306, 2413, 0]"] + 300["Segment
[2421, 2460, 0]"] + 301["Segment
[2468, 2585, 0]"] + 302["Segment
[2593, 2632, 0]"] + 303["Segment
[2640, 2725, 0]"] + 304["Segment
[2733, 2740, 0]"] 305[Solid2d] end subgraph path334 [Path] 334["Path
[2010, 2069, 0]"] 335["Segment
[2077, 2169, 0]"] 336["Segment
[2177, 2251, 0]"] - 337["Segment
[2259, 2306, 0]"] - 338["Segment
[2314, 2421, 0]"] - 339["Segment
[2429, 2476, 0]"] - 340["Segment
[2484, 2601, 0]"] - 341["Segment
[2609, 2656, 0]"] - 342["Segment
[2664, 2749, 0]"] - 343["Segment
[2757, 2764, 0]"] + 337["Segment
[2259, 2298, 0]"] + 338["Segment
[2306, 2413, 0]"] + 339["Segment
[2421, 2460, 0]"] + 340["Segment
[2468, 2585, 0]"] + 341["Segment
[2593, 2632, 0]"] + 342["Segment
[2640, 2725, 0]"] + 343["Segment
[2733, 2740, 0]"] 344[Solid2d] end subgraph path373 [Path] 373["Path
[2010, 2069, 0]"] 374["Segment
[2077, 2169, 0]"] 375["Segment
[2177, 2251, 0]"] - 376["Segment
[2259, 2306, 0]"] - 377["Segment
[2314, 2421, 0]"] - 378["Segment
[2429, 2476, 0]"] - 379["Segment
[2484, 2601, 0]"] - 380["Segment
[2609, 2656, 0]"] - 381["Segment
[2664, 2749, 0]"] - 382["Segment
[2757, 2764, 0]"] + 376["Segment
[2259, 2298, 0]"] + 377["Segment
[2306, 2413, 0]"] + 378["Segment
[2421, 2460, 0]"] + 379["Segment
[2468, 2585, 0]"] + 380["Segment
[2593, 2632, 0]"] + 381["Segment
[2640, 2725, 0]"] + 382["Segment
[2733, 2740, 0]"] 383[Solid2d] end subgraph path412 [Path] 412["Path
[2010, 2069, 0]"] 413["Segment
[2077, 2169, 0]"] 414["Segment
[2177, 2251, 0]"] - 415["Segment
[2259, 2306, 0]"] - 416["Segment
[2314, 2421, 0]"] - 417["Segment
[2429, 2476, 0]"] - 418["Segment
[2484, 2601, 0]"] - 419["Segment
[2609, 2656, 0]"] - 420["Segment
[2664, 2749, 0]"] - 421["Segment
[2757, 2764, 0]"] + 415["Segment
[2259, 2298, 0]"] + 416["Segment
[2306, 2413, 0]"] + 417["Segment
[2421, 2460, 0]"] + 418["Segment
[2468, 2585, 0]"] + 419["Segment
[2593, 2632, 0]"] + 420["Segment
[2640, 2725, 0]"] + 421["Segment
[2733, 2740, 0]"] 422[Solid2d] end subgraph path451 [Path] 451["Path
[2010, 2069, 0]"] 452["Segment
[2077, 2169, 0]"] 453["Segment
[2177, 2251, 0]"] - 454["Segment
[2259, 2306, 0]"] - 455["Segment
[2314, 2421, 0]"] - 456["Segment
[2429, 2476, 0]"] - 457["Segment
[2484, 2601, 0]"] - 458["Segment
[2609, 2656, 0]"] - 459["Segment
[2664, 2749, 0]"] - 460["Segment
[2757, 2764, 0]"] + 454["Segment
[2259, 2298, 0]"] + 455["Segment
[2306, 2413, 0]"] + 456["Segment
[2421, 2460, 0]"] + 457["Segment
[2468, 2585, 0]"] + 458["Segment
[2593, 2632, 0]"] + 459["Segment
[2640, 2725, 0]"] + 460["Segment
[2733, 2740, 0]"] 461[Solid2d] end subgraph path490 [Path] 490["Path
[2010, 2069, 0]"] 491["Segment
[2077, 2169, 0]"] 492["Segment
[2177, 2251, 0]"] - 493["Segment
[2259, 2306, 0]"] - 494["Segment
[2314, 2421, 0]"] - 495["Segment
[2429, 2476, 0]"] - 496["Segment
[2484, 2601, 0]"] - 497["Segment
[2609, 2656, 0]"] - 498["Segment
[2664, 2749, 0]"] - 499["Segment
[2757, 2764, 0]"] + 493["Segment
[2259, 2298, 0]"] + 494["Segment
[2306, 2413, 0]"] + 495["Segment
[2421, 2460, 0]"] + 496["Segment
[2468, 2585, 0]"] + 497["Segment
[2593, 2632, 0]"] + 498["Segment
[2640, 2725, 0]"] + 499["Segment
[2733, 2740, 0]"] 500[Solid2d] end subgraph path529 [Path] 529["Path
[2010, 2069, 0]"] 530["Segment
[2077, 2169, 0]"] 531["Segment
[2177, 2251, 0]"] - 532["Segment
[2259, 2306, 0]"] - 533["Segment
[2314, 2421, 0]"] - 534["Segment
[2429, 2476, 0]"] - 535["Segment
[2484, 2601, 0]"] - 536["Segment
[2609, 2656, 0]"] - 537["Segment
[2664, 2749, 0]"] - 538["Segment
[2757, 2764, 0]"] + 532["Segment
[2259, 2298, 0]"] + 533["Segment
[2306, 2413, 0]"] + 534["Segment
[2421, 2460, 0]"] + 535["Segment
[2468, 2585, 0]"] + 536["Segment
[2593, 2632, 0]"] + 537["Segment
[2640, 2725, 0]"] + 538["Segment
[2733, 2740, 0]"] 539[Solid2d] end subgraph path568 [Path] 568["Path
[2010, 2069, 0]"] 569["Segment
[2077, 2169, 0]"] 570["Segment
[2177, 2251, 0]"] - 571["Segment
[2259, 2306, 0]"] - 572["Segment
[2314, 2421, 0]"] - 573["Segment
[2429, 2476, 0]"] - 574["Segment
[2484, 2601, 0]"] - 575["Segment
[2609, 2656, 0]"] - 576["Segment
[2664, 2749, 0]"] - 577["Segment
[2757, 2764, 0]"] + 571["Segment
[2259, 2298, 0]"] + 572["Segment
[2306, 2413, 0]"] + 573["Segment
[2421, 2460, 0]"] + 574["Segment
[2468, 2585, 0]"] + 575["Segment
[2593, 2632, 0]"] + 576["Segment
[2640, 2725, 0]"] + 577["Segment
[2733, 2740, 0]"] 578[Solid2d] end subgraph path607 [Path] 607["Path
[2010, 2069, 0]"] 608["Segment
[2077, 2169, 0]"] 609["Segment
[2177, 2251, 0]"] - 610["Segment
[2259, 2306, 0]"] - 611["Segment
[2314, 2421, 0]"] - 612["Segment
[2429, 2476, 0]"] - 613["Segment
[2484, 2601, 0]"] - 614["Segment
[2609, 2656, 0]"] - 615["Segment
[2664, 2749, 0]"] - 616["Segment
[2757, 2764, 0]"] + 610["Segment
[2259, 2298, 0]"] + 611["Segment
[2306, 2413, 0]"] + 612["Segment
[2421, 2460, 0]"] + 613["Segment
[2468, 2585, 0]"] + 614["Segment
[2593, 2632, 0]"] + 615["Segment
[2640, 2725, 0]"] + 616["Segment
[2733, 2740, 0]"] 617[Solid2d] end subgraph path646 [Path] 646["Path
[2010, 2069, 0]"] 647["Segment
[2077, 2169, 0]"] 648["Segment
[2177, 2251, 0]"] - 649["Segment
[2259, 2306, 0]"] - 650["Segment
[2314, 2421, 0]"] - 651["Segment
[2429, 2476, 0]"] - 652["Segment
[2484, 2601, 0]"] - 653["Segment
[2609, 2656, 0]"] - 654["Segment
[2664, 2749, 0]"] - 655["Segment
[2757, 2764, 0]"] + 649["Segment
[2259, 2298, 0]"] + 650["Segment
[2306, 2413, 0]"] + 651["Segment
[2421, 2460, 0]"] + 652["Segment
[2468, 2585, 0]"] + 653["Segment
[2593, 2632, 0]"] + 654["Segment
[2640, 2725, 0]"] + 655["Segment
[2733, 2740, 0]"] 656[Solid2d] end subgraph path685 [Path] 685["Path
[2010, 2069, 0]"] 686["Segment
[2077, 2169, 0]"] 687["Segment
[2177, 2251, 0]"] - 688["Segment
[2259, 2306, 0]"] - 689["Segment
[2314, 2421, 0]"] - 690["Segment
[2429, 2476, 0]"] - 691["Segment
[2484, 2601, 0]"] - 692["Segment
[2609, 2656, 0]"] - 693["Segment
[2664, 2749, 0]"] - 694["Segment
[2757, 2764, 0]"] + 688["Segment
[2259, 2298, 0]"] + 689["Segment
[2306, 2413, 0]"] + 690["Segment
[2421, 2460, 0]"] + 691["Segment
[2468, 2585, 0]"] + 692["Segment
[2593, 2632, 0]"] + 693["Segment
[2640, 2725, 0]"] + 694["Segment
[2733, 2740, 0]"] 695[Solid2d] end subgraph path724 [Path] 724["Path
[2010, 2069, 0]"] 725["Segment
[2077, 2169, 0]"] 726["Segment
[2177, 2251, 0]"] - 727["Segment
[2259, 2306, 0]"] - 728["Segment
[2314, 2421, 0]"] - 729["Segment
[2429, 2476, 0]"] - 730["Segment
[2484, 2601, 0]"] - 731["Segment
[2609, 2656, 0]"] - 732["Segment
[2664, 2749, 0]"] - 733["Segment
[2757, 2764, 0]"] + 727["Segment
[2259, 2298, 0]"] + 728["Segment
[2306, 2413, 0]"] + 729["Segment
[2421, 2460, 0]"] + 730["Segment
[2468, 2585, 0]"] + 731["Segment
[2593, 2632, 0]"] + 732["Segment
[2640, 2725, 0]"] + 733["Segment
[2733, 2740, 0]"] 734[Solid2d] end subgraph path763 [Path] 763["Path
[2010, 2069, 0]"] 764["Segment
[2077, 2169, 0]"] 765["Segment
[2177, 2251, 0]"] - 766["Segment
[2259, 2306, 0]"] - 767["Segment
[2314, 2421, 0]"] - 768["Segment
[2429, 2476, 0]"] - 769["Segment
[2484, 2601, 0]"] - 770["Segment
[2609, 2656, 0]"] - 771["Segment
[2664, 2749, 0]"] - 772["Segment
[2757, 2764, 0]"] + 766["Segment
[2259, 2298, 0]"] + 767["Segment
[2306, 2413, 0]"] + 768["Segment
[2421, 2460, 0]"] + 769["Segment
[2468, 2585, 0]"] + 770["Segment
[2593, 2632, 0]"] + 771["Segment
[2640, 2725, 0]"] + 772["Segment
[2733, 2740, 0]"] 773[Solid2d] end subgraph path802 [Path] 802["Path
[2010, 2069, 0]"] 803["Segment
[2077, 2169, 0]"] 804["Segment
[2177, 2251, 0]"] - 805["Segment
[2259, 2306, 0]"] - 806["Segment
[2314, 2421, 0]"] - 807["Segment
[2429, 2476, 0]"] - 808["Segment
[2484, 2601, 0]"] - 809["Segment
[2609, 2656, 0]"] - 810["Segment
[2664, 2749, 0]"] - 811["Segment
[2757, 2764, 0]"] + 805["Segment
[2259, 2298, 0]"] + 806["Segment
[2306, 2413, 0]"] + 807["Segment
[2421, 2460, 0]"] + 808["Segment
[2468, 2585, 0]"] + 809["Segment
[2593, 2632, 0]"] + 810["Segment
[2640, 2725, 0]"] + 811["Segment
[2733, 2740, 0]"] 812[Solid2d] end subgraph path841 [Path] 841["Path
[2010, 2069, 0]"] 842["Segment
[2077, 2169, 0]"] 843["Segment
[2177, 2251, 0]"] - 844["Segment
[2259, 2306, 0]"] - 845["Segment
[2314, 2421, 0]"] - 846["Segment
[2429, 2476, 0]"] - 847["Segment
[2484, 2601, 0]"] - 848["Segment
[2609, 2656, 0]"] - 849["Segment
[2664, 2749, 0]"] - 850["Segment
[2757, 2764, 0]"] + 844["Segment
[2259, 2298, 0]"] + 845["Segment
[2306, 2413, 0]"] + 846["Segment
[2421, 2460, 0]"] + 847["Segment
[2468, 2585, 0]"] + 848["Segment
[2593, 2632, 0]"] + 849["Segment
[2640, 2725, 0]"] + 850["Segment
[2733, 2740, 0]"] 851[Solid2d] end subgraph path880 [Path] - 880["Path
[5020, 5107, 0]"] - 881["Segment
[5115, 5144, 0]"] - 882["Segment
[5152, 5180, 0]"] - 883["Segment
[5188, 5266, 0]"] - 884["Segment
[5274, 5321, 0]"] - 885["Segment
[5329, 5357, 0]"] - 886["Segment
[5365, 5394, 0]"] - 887["Segment
[5402, 5431, 0]"] - 888["Segment
[5439, 5505, 0]"] - 889["Segment
[5513, 5541, 0]"] - 890["Segment
[5549, 5578, 0]"] - 891["Segment
[5586, 5648, 0]"] - 892["Segment
[5656, 5684, 0]"] - 893["Segment
[5692, 5726, 0]"] - 894["Segment
[5734, 5764, 0]"] - 895["Segment
[5772, 5881, 0]"] - 896["Segment
[5889, 5896, 0]"] + 880["Path
[4996, 5083, 0]"] + 881["Segment
[5091, 5120, 0]"] + 882["Segment
[5128, 5156, 0]"] + 883["Segment
[5164, 5242, 0]"] + 884["Segment
[5250, 5297, 0]"] + 885["Segment
[5305, 5333, 0]"] + 886["Segment
[5341, 5370, 0]"] + 887["Segment
[5378, 5407, 0]"] + 888["Segment
[5415, 5481, 0]"] + 889["Segment
[5489, 5517, 0]"] + 890["Segment
[5525, 5554, 0]"] + 891["Segment
[5562, 5624, 0]"] + 892["Segment
[5632, 5660, 0]"] + 893["Segment
[5668, 5702, 0]"] + 894["Segment
[5710, 5740, 0]"] + 895["Segment
[5748, 5857, 0]"] + 896["Segment
[5865, 5872, 0]"] 897[Solid2d] end subgraph path950 [Path] - 950["Path
[6096, 6194, 0]"] - 951["Segment
[6202, 6321, 0]"] - 952["Segment
[6329, 6376, 0]"] - 953["Segment
[6384, 6505, 0]"] - 954["Segment
[6513, 6520, 0]"] + 950["Path
[6072, 6170, 0]"] + 951["Segment
[6178, 6297, 0]"] + 952["Segment
[6305, 6352, 0]"] + 953["Segment
[6360, 6481, 0]"] + 954["Segment
[6489, 6496, 0]"] 955[Solid2d] end subgraph path972 [Path] - 972["Path
[6628, 6725, 0]"] - 973["Segment
[6733, 6852, 0]"] - 974["Segment
[6860, 6908, 0]"] - 975["Segment
[6916, 7037, 0]"] - 976["Segment
[7045, 7052, 0]"] + 972["Path
[6604, 6701, 0]"] + 973["Segment
[6709, 6828, 0]"] + 974["Segment
[6836, 6884, 0]"] + 975["Segment
[6892, 7013, 0]"] + 976["Segment
[7021, 7028, 0]"] 977[Solid2d] end subgraph path994 [Path] - 994["Path
[6096, 6194, 0]"] - 995["Segment
[6202, 6321, 0]"] - 996["Segment
[6329, 6376, 0]"] - 997["Segment
[6384, 6505, 0]"] - 998["Segment
[6513, 6520, 0]"] + 994["Path
[6072, 6170, 0]"] + 995["Segment
[6178, 6297, 0]"] + 996["Segment
[6305, 6352, 0]"] + 997["Segment
[6360, 6481, 0]"] + 998["Segment
[6489, 6496, 0]"] 999[Solid2d] end subgraph path1016 [Path] - 1016["Path
[6628, 6725, 0]"] - 1017["Segment
[6733, 6852, 0]"] - 1018["Segment
[6860, 6908, 0]"] - 1019["Segment
[6916, 7037, 0]"] - 1020["Segment
[7045, 7052, 0]"] + 1016["Path
[6604, 6701, 0]"] + 1017["Segment
[6709, 6828, 0]"] + 1018["Segment
[6836, 6884, 0]"] + 1019["Segment
[6892, 7013, 0]"] + 1020["Segment
[7021, 7028, 0]"] 1021[Solid2d] end 1["Plane
[532, 549, 0]"] @@ -395,7 +395,7 @@ flowchart LR 58["SweepEdge Opposite"] 59["SweepEdge Adjacent"] 60["Plane
[1971, 1994, 0]"] - 72["Sweep Extrusion
[2772, 2798, 0]"] + 72["Sweep Extrusion
[2748, 2774, 0]"] 73[Wall] 74[Wall] 75[Wall] @@ -423,7 +423,7 @@ flowchart LR 97["SweepEdge Opposite"] 98["SweepEdge Adjacent"] 99["Plane
[1971, 1994, 0]"] - 111["Sweep Extrusion
[2772, 2798, 0]"] + 111["Sweep Extrusion
[2748, 2774, 0]"] 112[Wall] 113[Wall] 114[Wall] @@ -451,7 +451,7 @@ flowchart LR 136["SweepEdge Opposite"] 137["SweepEdge Adjacent"] 138["Plane
[1971, 1994, 0]"] - 150["Sweep Extrusion
[2772, 2798, 0]"] + 150["Sweep Extrusion
[2748, 2774, 0]"] 151[Wall] 152[Wall] 153[Wall] @@ -479,7 +479,7 @@ flowchart LR 175["SweepEdge Opposite"] 176["SweepEdge Adjacent"] 177["Plane
[1971, 1994, 0]"] - 189["Sweep Extrusion
[2772, 2798, 0]"] + 189["Sweep Extrusion
[2748, 2774, 0]"] 190[Wall] 191[Wall] 192[Wall] @@ -507,7 +507,7 @@ flowchart LR 214["SweepEdge Opposite"] 215["SweepEdge Adjacent"] 216["Plane
[1971, 1994, 0]"] - 228["Sweep Extrusion
[2772, 2798, 0]"] + 228["Sweep Extrusion
[2748, 2774, 0]"] 229[Wall] 230[Wall] 231[Wall] @@ -535,7 +535,7 @@ flowchart LR 253["SweepEdge Opposite"] 254["SweepEdge Adjacent"] 255["Plane
[1971, 1994, 0]"] - 267["Sweep Extrusion
[2772, 2798, 0]"] + 267["Sweep Extrusion
[2748, 2774, 0]"] 268[Wall] 269[Wall] 270[Wall] @@ -563,7 +563,7 @@ flowchart LR 292["SweepEdge Opposite"] 293["SweepEdge Adjacent"] 294["Plane
[1971, 1994, 0]"] - 306["Sweep Extrusion
[2772, 2798, 0]"] + 306["Sweep Extrusion
[2748, 2774, 0]"] 307[Wall] 308[Wall] 309[Wall] @@ -591,7 +591,7 @@ flowchart LR 331["SweepEdge Opposite"] 332["SweepEdge Adjacent"] 333["Plane
[1971, 1994, 0]"] - 345["Sweep Extrusion
[2772, 2798, 0]"] + 345["Sweep Extrusion
[2748, 2774, 0]"] 346[Wall] 347[Wall] 348[Wall] @@ -619,7 +619,7 @@ flowchart LR 370["SweepEdge Opposite"] 371["SweepEdge Adjacent"] 372["Plane
[1971, 1994, 0]"] - 384["Sweep Extrusion
[2772, 2798, 0]"] + 384["Sweep Extrusion
[2748, 2774, 0]"] 385[Wall] 386[Wall] 387[Wall] @@ -647,7 +647,7 @@ flowchart LR 409["SweepEdge Opposite"] 410["SweepEdge Adjacent"] 411["Plane
[1971, 1994, 0]"] - 423["Sweep Extrusion
[2772, 2798, 0]"] + 423["Sweep Extrusion
[2748, 2774, 0]"] 424[Wall] 425[Wall] 426[Wall] @@ -675,7 +675,7 @@ flowchart LR 448["SweepEdge Opposite"] 449["SweepEdge Adjacent"] 450["Plane
[1971, 1994, 0]"] - 462["Sweep Extrusion
[2772, 2798, 0]"] + 462["Sweep Extrusion
[2748, 2774, 0]"] 463[Wall] 464[Wall] 465[Wall] @@ -703,7 +703,7 @@ flowchart LR 487["SweepEdge Opposite"] 488["SweepEdge Adjacent"] 489["Plane
[1971, 1994, 0]"] - 501["Sweep Extrusion
[2772, 2798, 0]"] + 501["Sweep Extrusion
[2748, 2774, 0]"] 502[Wall] 503[Wall] 504[Wall] @@ -731,7 +731,7 @@ flowchart LR 526["SweepEdge Opposite"] 527["SweepEdge Adjacent"] 528["Plane
[1971, 1994, 0]"] - 540["Sweep Extrusion
[2772, 2798, 0]"] + 540["Sweep Extrusion
[2748, 2774, 0]"] 541[Wall] 542[Wall] 543[Wall] @@ -759,7 +759,7 @@ flowchart LR 565["SweepEdge Opposite"] 566["SweepEdge Adjacent"] 567["Plane
[1971, 1994, 0]"] - 579["Sweep Extrusion
[2772, 2798, 0]"] + 579["Sweep Extrusion
[2748, 2774, 0]"] 580[Wall] 581[Wall] 582[Wall] @@ -787,7 +787,7 @@ flowchart LR 604["SweepEdge Opposite"] 605["SweepEdge Adjacent"] 606["Plane
[1971, 1994, 0]"] - 618["Sweep Extrusion
[2772, 2798, 0]"] + 618["Sweep Extrusion
[2748, 2774, 0]"] 619[Wall] 620[Wall] 621[Wall] @@ -815,7 +815,7 @@ flowchart LR 643["SweepEdge Opposite"] 644["SweepEdge Adjacent"] 645["Plane
[1971, 1994, 0]"] - 657["Sweep Extrusion
[2772, 2798, 0]"] + 657["Sweep Extrusion
[2748, 2774, 0]"] 658[Wall] 659[Wall] 660[Wall] @@ -843,7 +843,7 @@ flowchart LR 682["SweepEdge Opposite"] 683["SweepEdge Adjacent"] 684["Plane
[1971, 1994, 0]"] - 696["Sweep Extrusion
[2772, 2798, 0]"] + 696["Sweep Extrusion
[2748, 2774, 0]"] 697[Wall] 698[Wall] 699[Wall] @@ -871,7 +871,7 @@ flowchart LR 721["SweepEdge Opposite"] 722["SweepEdge Adjacent"] 723["Plane
[1971, 1994, 0]"] - 735["Sweep Extrusion
[2772, 2798, 0]"] + 735["Sweep Extrusion
[2748, 2774, 0]"] 736[Wall] 737[Wall] 738[Wall] @@ -899,7 +899,7 @@ flowchart LR 760["SweepEdge Opposite"] 761["SweepEdge Adjacent"] 762["Plane
[1971, 1994, 0]"] - 774["Sweep Extrusion
[2772, 2798, 0]"] + 774["Sweep Extrusion
[2748, 2774, 0]"] 775[Wall] 776[Wall] 777[Wall] @@ -927,7 +927,7 @@ flowchart LR 799["SweepEdge Opposite"] 800["SweepEdge Adjacent"] 801["Plane
[1971, 1994, 0]"] - 813["Sweep Extrusion
[2772, 2798, 0]"] + 813["Sweep Extrusion
[2748, 2774, 0]"] 814[Wall] 815[Wall] 816[Wall] @@ -955,7 +955,7 @@ flowchart LR 838["SweepEdge Opposite"] 839["SweepEdge Adjacent"] 840["Plane
[1971, 1994, 0]"] - 852["Sweep Extrusion
[2772, 2798, 0]"] + 852["Sweep Extrusion
[2748, 2774, 0]"] 853[Wall] 854[Wall] 855[Wall] @@ -982,8 +982,8 @@ flowchart LR 876["SweepEdge Adjacent"] 877["SweepEdge Opposite"] 878["SweepEdge Adjacent"] - 879["Plane
[4989, 5012, 0]"] - 898["Sweep Extrusion
[5904, 5928, 0]"] + 879["Plane
[4965, 4988, 0]"] + 898["Sweep Extrusion
[5880, 5904, 0]"] 899[Wall] 900[Wall] 901[Wall] @@ -1034,8 +1034,8 @@ flowchart LR 946["SweepEdge Adjacent"] 947["SweepEdge Opposite"] 948["SweepEdge Adjacent"] - 949["Plane
[6065, 6088, 0]"] - 956["Sweep Extrusion
[6528, 6552, 0]"] + 949["Plane
[6041, 6064, 0]"] + 956["Sweep Extrusion
[6504, 6528, 0]"] 957[Wall] 958[Wall] 959[Wall] @@ -1050,8 +1050,8 @@ flowchart LR 968["SweepEdge Adjacent"] 969["SweepEdge Opposite"] 970["SweepEdge Adjacent"] - 971["Plane
[6597, 6620, 0]"] - 978["Sweep Extrusion
[7060, 7084, 0]"] + 971["Plane
[6573, 6596, 0]"] + 978["Sweep Extrusion
[7036, 7060, 0]"] 979[Wall] 980[Wall] 981[Wall] @@ -1066,8 +1066,8 @@ flowchart LR 990["SweepEdge Adjacent"] 991["SweepEdge Opposite"] 992["SweepEdge Adjacent"] - 993["Plane
[6065, 6088, 0]"] - 1000["Sweep Extrusion
[6528, 6552, 0]"] + 993["Plane
[6041, 6064, 0]"] + 1000["Sweep Extrusion
[6504, 6528, 0]"] 1001[Wall] 1002[Wall] 1003[Wall] @@ -1082,8 +1082,8 @@ flowchart LR 1012["SweepEdge Adjacent"] 1013["SweepEdge Opposite"] 1014["SweepEdge Adjacent"] - 1015["Plane
[6597, 6620, 0]"] - 1022["Sweep Extrusion
[7060, 7084, 0]"] + 1015["Plane
[6573, 6596, 0]"] + 1022["Sweep Extrusion
[7036, 7060, 0]"] 1023[Wall] 1024[Wall] 1025[Wall] diff --git a/rust/kcl-lib/tests/kcl_samples/keyboard/ast.snap b/rust/kcl-lib/tests/kcl_samples/keyboard/ast.snap index 8993067db..26fa0d017 100644 --- a/rust/kcl-lib/tests/kcl_samples/keyboard/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/keyboard/ast.snap @@ -3106,70 +3106,48 @@ description: Result of parsing keyboard.kcl { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "commentStart": 0, - "end": 0, - "raw": "0.1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.1, - "suffix": "None" - } - } - }, - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "commentStart": 0, - "end": 0, - "raw": "90", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 90.0, - "suffix": "None" - } - } + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0.1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.1, + "suffix": "None" } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" + } }, { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "90", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 90.0, + "suffix": "None" + } + } } ], "callee": { @@ -3190,8 +3168,9 @@ description: Result of parsing keyboard.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -3355,70 +3334,48 @@ description: Result of parsing keyboard.kcl { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "commentStart": 0, - "end": 0, - "raw": "0.1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.1, - "suffix": "None" - } - } - }, - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "commentStart": 0, - "end": 0, - "raw": "90", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 90.0, - "suffix": "None" - } - } + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0.1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.1, + "suffix": "None" } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" + } }, { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "90", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 90.0, + "suffix": "None" + } + } } ], "callee": { @@ -3439,8 +3396,9 @@ description: Result of parsing keyboard.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -3596,70 +3554,48 @@ description: Result of parsing keyboard.kcl { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "commentStart": 0, - "end": 0, - "raw": "0.1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.1, - "suffix": "None" - } - } - }, - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "commentStart": 0, - "end": 0, - "raw": "90", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 90.0, - "suffix": "None" - } - } + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0.1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.1, + "suffix": "None" } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" + } }, { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "90", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 90.0, + "suffix": "None" + } + } } ], "callee": { @@ -3680,8 +3616,9 @@ description: Result of parsing keyboard.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ diff --git a/rust/kcl-lib/tests/kcl_samples/keyboard/ops.snap b/rust/kcl-lib/tests/kcl_samples/keyboard/ops.snap index 3f3667ec6..f3cda484c 100644 --- a/rust/kcl-lib/tests/kcl_samples/keyboard/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/keyboard/ops.snap @@ -213,7 +213,7 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [ 1904, - 3056, + 3032, 0 ], "unlabeledArg": null, @@ -550,7 +550,7 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [ 1904, - 3056, + 3032, 0 ], "unlabeledArg": null, @@ -887,7 +887,7 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [ 1904, - 3056, + 3032, 0 ], "unlabeledArg": null, @@ -1224,7 +1224,7 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [ 1904, - 3056, + 3032, 0 ], "unlabeledArg": null, @@ -1561,7 +1561,7 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [ 1904, - 3056, + 3032, 0 ], "unlabeledArg": null, @@ -1898,7 +1898,7 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [ 1904, - 3056, + 3032, 0 ], "unlabeledArg": null, @@ -2235,7 +2235,7 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [ 1904, - 3056, + 3032, 0 ], "unlabeledArg": null, @@ -2572,7 +2572,7 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [ 1904, - 3056, + 3032, 0 ], "unlabeledArg": null, @@ -2909,7 +2909,7 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [ 1904, - 3056, + 3032, 0 ], "unlabeledArg": null, @@ -3246,7 +3246,7 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [ 1904, - 3056, + 3032, 0 ], "unlabeledArg": null, @@ -3583,7 +3583,7 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [ 1904, - 3056, + 3032, 0 ], "unlabeledArg": null, @@ -3920,7 +3920,7 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [ 1904, - 3056, + 3032, 0 ], "unlabeledArg": null, @@ -4257,7 +4257,7 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [ 1904, - 3056, + 3032, 0 ], "unlabeledArg": null, @@ -4594,7 +4594,7 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [ 1904, - 3056, + 3032, 0 ], "unlabeledArg": null, @@ -4931,7 +4931,7 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [ 1904, - 3056, + 3032, 0 ], "unlabeledArg": null, @@ -5268,7 +5268,7 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [ 1904, - 3056, + 3032, 0 ], "unlabeledArg": null, @@ -5605,7 +5605,7 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [ 1904, - 3056, + 3032, 0 ], "unlabeledArg": null, @@ -5942,7 +5942,7 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [ 1904, - 3056, + 3032, 0 ], "unlabeledArg": null, @@ -6279,7 +6279,7 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [ 1904, - 3056, + 3032, 0 ], "unlabeledArg": null, @@ -6616,7 +6616,7 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [ 1904, - 3056, + 3032, 0 ], "unlabeledArg": null, @@ -6953,7 +6953,7 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [ 1904, - 3056, + 3032, 0 ], "unlabeledArg": null, @@ -7307,8 +7307,8 @@ description: Operations executed keyboard.kcl "type": "FunctionCall", "name": "z", "functionSourceRange": [ - 4958, - 5978, + 4934, + 5954, 0 ], "unlabeledArg": null, @@ -7549,8 +7549,8 @@ description: Operations executed keyboard.kcl "type": "FunctionCall", "name": "o", "functionSourceRange": [ - 6025, - 7134, + 6001, + 7110, 0 ], "unlabeledArg": null, @@ -8015,8 +8015,8 @@ description: Operations executed keyboard.kcl "type": "FunctionCall", "name": "o", "functionSourceRange": [ - 6025, - 7134, + 6001, + 7110, 0 ], "unlabeledArg": null, diff --git a/rust/kcl-lib/tests/kcl_samples/poopy-shoe/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/poopy-shoe/artifact_graph_flowchart.snap.md index bf4a5ad66..c5589a6a9 100644 --- a/rust/kcl-lib/tests/kcl_samples/poopy-shoe/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/poopy-shoe/artifact_graph_flowchart.snap.md @@ -36,59 +36,59 @@ flowchart LR end subgraph path118 [Path] 118["Path
[2063, 2088, 0]"] - 119["Segment
[2094, 2144, 0]"] - 120["Segment
[2150, 2190, 0]"] - 121["Segment
[2196, 2203, 0]"] + 119["Segment
[2094, 2136, 0]"] + 120["Segment
[2142, 2182, 0]"] + 121["Segment
[2188, 2195, 0]"] 122[Solid2d] end subgraph path135 [Path] - 135["Path
[2332, 2357, 0]"] - 136["Segment
[2363, 2390, 0]"] - 137["Segment
[2396, 2430, 0]"] - 138["Segment
[2436, 2471, 0]"] - 139["Segment
[2477, 2558, 0]"] - 140["Segment
[2564, 2593, 0]"] - 141["Segment
[2599, 2652, 0]"] - 142["Segment
[2658, 2685, 0]"] - 143["Segment
[2691, 2720, 0]"] - 144["Segment
[2726, 2850, 0]"] - 145["Segment
[2856, 2901, 0]"] - 146["Segment
[2907, 2929, 0]"] - 147["Segment
[2935, 2954, 0]"] + 135["Path
[2324, 2349, 0]"] + 136["Segment
[2355, 2382, 0]"] + 137["Segment
[2388, 2422, 0]"] + 138["Segment
[2428, 2463, 0]"] + 139["Segment
[2469, 2550, 0]"] + 140["Segment
[2556, 2585, 0]"] + 141["Segment
[2591, 2644, 0]"] + 142["Segment
[2650, 2677, 0]"] + 143["Segment
[2683, 2712, 0]"] + 144["Segment
[2718, 2851, 0]"] + 145["Segment
[2857, 2911, 0]"] + 146["Segment
[2917, 2939, 0]"] + 147["Segment
[2945, 2964, 0]"] 148[Solid2d] end subgraph path189 [Path] - 189["Path
[3282, 3307, 0]"] - 190["Segment
[3313, 3340, 0]"] - 191["Segment
[3346, 3377, 0]"] - 192["Segment
[3383, 3507, 0]"] - 193["Segment
[3513, 3558, 0]"] - 194["Segment
[3564, 3600, 0]"] - 195["Segment
[3606, 3613, 0]"] + 189["Path
[3292, 3317, 0]"] + 190["Segment
[3323, 3350, 0]"] + 191["Segment
[3356, 3387, 0]"] + 192["Segment
[3393, 3526, 0]"] + 193["Segment
[3532, 3586, 0]"] + 194["Segment
[3592, 3628, 0]"] + 195["Segment
[3634, 3641, 0]"] 196[Solid2d] end subgraph path218 [Path] - 218["Path
[3701, 3751, 0]"] - 219["Segment
[3757, 3789, 0]"] - 220["Segment
[3795, 3822, 0]"] - 221["Segment
[3828, 3850, 0]"] - 222["Segment
[3856, 3863, 0]"] + 218["Path
[3729, 3779, 0]"] + 219["Segment
[3785, 3817, 0]"] + 220["Segment
[3823, 3850, 0]"] + 221["Segment
[3856, 3878, 0]"] + 222["Segment
[3884, 3891, 0]"] 223[Solid2d] end subgraph path239 [Path] - 239["Path
[3951, 3976, 0]"] - 240["Segment
[3982, 4016, 0]"] - 241["Segment
[4022, 4049, 0]"] - 242["Segment
[4055, 4077, 0]"] - 243["Segment
[4083, 4090, 0]"] + 239["Path
[3979, 4004, 0]"] + 240["Segment
[4010, 4044, 0]"] + 241["Segment
[4050, 4077, 0]"] + 242["Segment
[4083, 4105, 0]"] + 243["Segment
[4111, 4118, 0]"] 244[Solid2d] end subgraph path261 [Path] - 261["Path
[4450, 4499, 0]"] - 262["Segment
[4505, 4537, 0]"] - 263["Segment
[4543, 4591, 0]"] - 264["Segment
[4597, 4631, 0]"] - 265["Segment
[4637, 4644, 0]"] + 261["Path
[4478, 4527, 0]"] + 262["Segment
[4533, 4565, 0]"] + 263["Segment
[4571, 4619, 0]"] + 264["Segment
[4625, 4659, 0]"] + 265["Segment
[4665, 4672, 0]"] 266[Solid2d] end 1["Plane
[338, 356, 0]"] @@ -178,7 +178,7 @@ flowchart LR 115["SweepEdge Opposite"] 116["SweepEdge Adjacent"] 117["Plane
[2031, 2057, 0]"] - 123["Sweep Extrusion
[2209, 2240, 0]"] + 123["Sweep Extrusion
[2201, 2232, 0]"] 124[Wall] 125[Wall] 126[Wall] @@ -190,7 +190,7 @@ flowchart LR 132["SweepEdge Adjacent"] 133["SweepEdge Opposite"] 134["SweepEdge Adjacent"] - 149["Sweep Extrusion
[2960, 2991, 0]"] + 149["Sweep Extrusion
[2970, 3001, 0]"] 150[Wall] 151[Wall] 152[Wall] @@ -229,8 +229,8 @@ flowchart LR 185["SweepEdge Adjacent"] 186["SweepEdge Opposite"] 187["SweepEdge Adjacent"] - 188["Plane
[3249, 3276, 0]"] - 197["Sweep Extrusion
[3619, 3650, 0]"] + 188["Plane
[3259, 3286, 0]"] + 197["Sweep Extrusion
[3647, 3678, 0]"] 198[Wall] 199[Wall] 200[Wall] @@ -251,7 +251,7 @@ flowchart LR 215["SweepEdge Adjacent"] 216["SweepEdge Opposite"] 217["SweepEdge Adjacent"] - 224["Sweep Extrusion
[3869, 3900, 0]"] + 224["Sweep Extrusion
[3897, 3928, 0]"] 225[Wall] 226[Wall] 227[Wall] @@ -266,7 +266,7 @@ flowchart LR 236["SweepEdge Adjacent"] 237["SweepEdge Opposite"] 238["SweepEdge Adjacent"] - 245["Sweep Extrusion
[4096, 4146, 0]"] + 245["Sweep Extrusion
[4124, 4174, 0]"] 246[Wall] 247[Wall] 248[Wall] @@ -281,8 +281,8 @@ flowchart LR 257["SweepEdge Adjacent"] 258["SweepEdge Opposite"] 259["SweepEdge Adjacent"] - 260["Plane
[4417, 4444, 0]"] - 267["Sweep Extrusion
[4650, 4682, 0]"] + 260["Plane
[4445, 4472, 0]"] + 267["Sweep Extrusion
[4678, 4710, 0]"] 268[Wall] 269[Wall] 270[Wall] @@ -297,9 +297,9 @@ flowchart LR 279["SweepEdge Adjacent"] 280["SweepEdge Opposite"] 281["SweepEdge Adjacent"] - 282["StartSketchOnFace
[2295, 2326, 0]"] - 283["StartSketchOnFace
[3664, 3695, 0]"] - 284["StartSketchOnFace
[3914, 3945, 0]"] + 282["StartSketchOnFace
[2287, 2318, 0]"] + 283["StartSketchOnFace
[3692, 3723, 0]"] + 284["StartSketchOnFace
[3942, 3973, 0]"] 1 --- 2 2 --- 3 2 --- 4 diff --git a/rust/kcl-lib/tests/kcl_samples/poopy-shoe/ast.snap b/rust/kcl-lib/tests/kcl_samples/poopy-shoe/ast.snap index 8ac941ea7..caac9ca04 100644 --- a/rust/kcl-lib/tests/kcl_samples/poopy-shoe/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/poopy-shoe/ast.snap @@ -3356,74 +3356,52 @@ description: Result of parsing poopy-shoe.kcl { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "commentStart": 0, - "end": 0, - "raw": "60", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 60.0, - "suffix": "None" - } - } - }, - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "height", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "60", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 60.0, + "suffix": "None" } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" + } }, { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "height", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -3444,8 +3422,9 @@ description: Result of parsing poopy-shoe.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -4338,188 +4317,191 @@ description: Result of parsing poopy-shoe.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { "commentStart": 0, "end": 0, "left": { "commentStart": 0, "end": 0, "left": { - "abs_path": false, "commentStart": 0, "end": 0, - "name": { + "left": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "frontLength", + "name": { + "commentStart": 0, + "end": 0, + "name": "frontLength", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" + }, + "operator": "-", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "wallsWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" }, - "path": [], "start": 0, - "type": "Name", - "type": "Name" + "type": "BinaryExpression", + "type": "BinaryExpression" }, - "operator": "-", + "operator": "/", "right": { - "abs_path": false, "commentStart": 0, "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "wallsWidth", - "start": 0, - "type": "Identifier" - }, - "path": [], + "raw": "2", "start": 0, - "type": "Name", - "type": "Name" + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" }, - "operator": "/", + "operator": "+", "right": { + "abs_path": false, "commentStart": 0, "end": 0, - "raw": "2", + "name": { + "commentStart": 0, + "end": 0, + "name": "wallsWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } + "type": "Name", + "type": "Name" }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "wallsWidth", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "height", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "-", - "right": { + { "commentStart": 0, "end": 0, "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "height", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "-", + "right": { "commentStart": 0, "end": 0, "left": { - "abs_path": false, "commentStart": 0, "end": 0, - "name": { + "left": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "height", + "name": { + "commentStart": 0, + "end": 0, + "name": "height", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" + }, + "operator": "-", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "exitHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" }, - "path": [], "start": 0, - "type": "Name", - "type": "Name" + "type": "BinaryExpression", + "type": "BinaryExpression" }, - "operator": "-", + "operator": "/", "right": { - "abs_path": false, "commentStart": 0, "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "exitHeight", - "start": 0, - "type": "Identifier" - }, - "path": [], + "raw": "2", "start": 0, - "type": "Name", - "type": "Name" + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -4529,7 +4511,7 @@ description: Result of parsing poopy-shoe.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcTo", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -4540,58 +4522,62 @@ description: Result of parsing poopy-shoe.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "frontLength", + "name": { + "commentStart": 0, + "end": 0, + "name": "frontLength", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "exitHeight", + "name": { + "commentStart": 0, + "end": 0, + "name": "exitHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -4601,7 +4587,7 @@ description: Result of parsing poopy-shoe.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcTo", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -4612,8 +4598,9 @@ description: Result of parsing poopy-shoe.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -5523,188 +5510,191 @@ description: Result of parsing poopy-shoe.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { "commentStart": 0, "end": 0, "left": { "commentStart": 0, "end": 0, "left": { - "abs_path": false, "commentStart": 0, "end": 0, - "name": { + "left": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "frontLength", + "name": { + "commentStart": 0, + "end": 0, + "name": "frontLength", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" + }, + "operator": "-", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "wallsWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" }, - "path": [], "start": 0, - "type": "Name", - "type": "Name" + "type": "BinaryExpression", + "type": "BinaryExpression" }, - "operator": "-", + "operator": "/", "right": { - "abs_path": false, "commentStart": 0, "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "wallsWidth", - "start": 0, - "type": "Identifier" - }, - "path": [], + "raw": "2", "start": 0, - "type": "Name", - "type": "Name" + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" }, - "operator": "/", + "operator": "+", "right": { + "abs_path": false, "commentStart": 0, "end": 0, - "raw": "2", + "name": { + "commentStart": 0, + "end": 0, + "name": "wallsWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } + "type": "Name", + "type": "Name" }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "wallsWidth", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "height", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "-", - "right": { + { "commentStart": 0, "end": 0, "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "height", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "-", + "right": { "commentStart": 0, "end": 0, "left": { - "abs_path": false, "commentStart": 0, "end": 0, - "name": { + "left": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "height", + "name": { + "commentStart": 0, + "end": 0, + "name": "height", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" + }, + "operator": "-", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "exitHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" }, - "path": [], "start": 0, - "type": "Name", - "type": "Name" + "type": "BinaryExpression", + "type": "BinaryExpression" }, - "operator": "-", + "operator": "/", "right": { - "abs_path": false, "commentStart": 0, "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "exitHeight", - "start": 0, - "type": "Identifier" - }, - "path": [], + "raw": "2", "start": 0, - "type": "Name", - "type": "Name" + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -5714,7 +5704,7 @@ description: Result of parsing poopy-shoe.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcTo", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -5725,58 +5715,62 @@ description: Result of parsing poopy-shoe.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "frontLength", + "name": { + "commentStart": 0, + "end": 0, + "name": "frontLength", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "exitHeight", + "name": { + "commentStart": 0, + "end": 0, + "name": "exitHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -5786,7 +5780,7 @@ description: Result of parsing poopy-shoe.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcTo", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -5797,8 +5791,9 @@ description: Result of parsing poopy-shoe.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ diff --git a/rust/kcl-lib/tests/kcl_samples/poopy-shoe/program_memory.snap b/rust/kcl-lib/tests/kcl_samples/poopy-shoe/program_memory.snap index 09cf05a0c..77e5f7b70 100644 --- a/rust/kcl-lib/tests/kcl_samples/poopy-shoe/program_memory.snap +++ b/rust/kcl-lib/tests/kcl_samples/poopy-shoe/program_memory.snap @@ -2067,9 +2067,9 @@ description: Variables in memory after executing poopy-shoe.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2947, - "end": 2953, - "start": 2947, + "commentStart": 2957, + "end": 2963, + "start": 2957, "type": "TagDeclarator", "value": "seg04" }, @@ -2309,9 +2309,9 @@ description: Variables in memory after executing poopy-shoe.kcl 0.0 ], "tag": { - "commentStart": 2947, - "end": 2953, - "start": 2947, + "commentStart": 2957, + "end": 2963, + "start": 2957, "type": "TagDeclarator", "value": "seg04" }, @@ -2854,9 +2854,9 @@ description: Variables in memory after executing poopy-shoe.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 3593, - "end": 3599, - "start": 3593, + "commentStart": 3621, + "end": 3627, + "start": 3621, "type": "TagDeclarator", "value": "seg03" }, @@ -2970,9 +2970,9 @@ description: Variables in memory after executing poopy-shoe.kcl 1.0 ], "tag": { - "commentStart": 3593, - "end": 3599, - "start": 3593, + "commentStart": 3621, + "end": 3627, + "start": 3621, "type": "TagDeclarator", "value": "seg03" }, @@ -3247,9 +3247,9 @@ description: Variables in memory after executing poopy-shoe.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 3593, - "end": 3599, - "start": 3593, + "commentStart": 3621, + "end": 3627, + "start": 3621, "type": "TagDeclarator", "value": "seg03" }, @@ -3363,9 +3363,9 @@ description: Variables in memory after executing poopy-shoe.kcl 1.0 ], "tag": { - "commentStart": 3593, - "end": 3599, - "start": 3593, + "commentStart": 3621, + "end": 3627, + "start": 3621, "type": "TagDeclarator", "value": "seg03" }, @@ -3724,9 +3724,9 @@ description: Variables in memory after executing poopy-shoe.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2947, - "end": 2953, - "start": 2947, + "commentStart": 2957, + "end": 2963, + "start": 2957, "type": "TagDeclarator", "value": "seg04" }, @@ -3966,9 +3966,9 @@ description: Variables in memory after executing poopy-shoe.kcl 0.0 ], "tag": { - "commentStart": 2947, - "end": 2953, - "start": 2947, + "commentStart": 2957, + "end": 2963, + "start": 2957, "type": "TagDeclarator", "value": "seg04" }, diff --git a/rust/kcl-lib/tests/kcl_samples/sheet-metal-bracket/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/sheet-metal-bracket/artifact_graph_flowchart.snap.md index 8bd9d4a78..bd52588e1 100644 --- a/rust/kcl-lib/tests/kcl_samples/sheet-metal-bracket/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/sheet-metal-bracket/artifact_graph_flowchart.snap.md @@ -3,52 +3,52 @@ flowchart LR subgraph path2 [Path] 2["Path
[1228, 1309, 0]"] 3["Segment
[1315, 1343, 0]"] - 4["Segment
[1349, 1437, 0]"] - 5["Segment
[1443, 1524, 0]"] - 6["Segment
[1530, 1619, 0]"] - 7["Segment
[1625, 1661, 0]"] - 8["Segment
[1667, 1696, 0]"] - 9["Segment
[1702, 1791, 0]"] - 10["Segment
[1797, 1851, 0]"] - 11["Segment
[1857, 1945, 0]"] - 12["Segment
[1951, 1979, 0]"] - 13["Segment
[1985, 2024, 0]"] - 14["Segment
[2030, 2073, 0]"] - 15["Segment
[2079, 2168, 0]"] - 16["Segment
[2174, 2233, 0]"] - 17["Segment
[2239, 2327, 0]"] - 18["Segment
[2333, 2369, 0]"] - 19["Segment
[2375, 2405, 0]"] - 20["Segment
[2411, 2499, 0]"] - 21["Segment
[2505, 2564, 0]"] - 22["Segment
[2570, 2659, 0]"] - 23["Segment
[2665, 2708, 0]"] - 24["Segment
[2714, 2784, 0]"] - 25["Segment
[2790, 2797, 0]"] + 4["Segment
[1349, 1410, 0]"] + 5["Segment
[1416, 1497, 0]"] + 6["Segment
[1503, 1565, 0]"] + 7["Segment
[1571, 1607, 0]"] + 8["Segment
[1613, 1642, 0]"] + 9["Segment
[1648, 1710, 0]"] + 10["Segment
[1716, 1770, 0]"] + 11["Segment
[1776, 1837, 0]"] + 12["Segment
[1843, 1871, 0]"] + 13["Segment
[1877, 1916, 0]"] + 14["Segment
[1922, 1965, 0]"] + 15["Segment
[1971, 2033, 0]"] + 16["Segment
[2039, 2098, 0]"] + 17["Segment
[2104, 2165, 0]"] + 18["Segment
[2171, 2207, 0]"] + 19["Segment
[2213, 2243, 0]"] + 20["Segment
[2249, 2310, 0]"] + 21["Segment
[2316, 2375, 0]"] + 22["Segment
[2381, 2443, 0]"] + 23["Segment
[2449, 2492, 0]"] + 24["Segment
[2498, 2568, 0]"] + 25["Segment
[2574, 2581, 0]"] 26[Solid2d] end subgraph path94 [Path] - 94["Path
[3129, 3218, 0]"] - 95["Segment
[3129, 3218, 0]"] + 94["Path
[2913, 3002, 0]"] + 95["Segment
[2913, 3002, 0]"] 96[Solid2d] end subgraph path102 [Path] - 102["Path
[3493, 3581, 0]"] - 103["Segment
[3493, 3581, 0]"] + 102["Path
[3277, 3365, 0]"] + 103["Segment
[3277, 3365, 0]"] 104[Solid2d] end subgraph path110 [Path] - 110["Path
[3863, 4043, 0]"] - 111["Segment
[3863, 4043, 0]"] + 110["Path
[3647, 3827, 0]"] + 111["Segment
[3647, 3827, 0]"] 112[Solid2d] end subgraph path120 [Path] - 120["Path
[4459, 4515, 0]"] - 121["Segment
[4459, 4515, 0]"] + 120["Path
[4243, 4299, 0]"] + 121["Segment
[4243, 4299, 0]"] 122[Solid2d] end 1["Plane
[1205, 1222, 0]"] - 27["Sweep Extrusion
[2803, 2836, 0]"] + 27["Sweep Extrusion
[2587, 2620, 0]"] 28[Wall] 29[Wall] 30[Wall] @@ -111,35 +111,35 @@ flowchart LR 87["SweepEdge Adjacent"] 88["SweepEdge Opposite"] 89["SweepEdge Adjacent"] - 90["EdgeCut Fillet
[2842, 3013, 0]"] - 91["EdgeCut Fillet
[2842, 3013, 0]"] - 92["EdgeCut Fillet
[2842, 3013, 0]"] - 93["EdgeCut Fillet
[2842, 3013, 0]"] - 97["Sweep Extrusion
[3347, 3375, 0]"] + 90["EdgeCut Fillet
[2626, 2797, 0]"] + 91["EdgeCut Fillet
[2626, 2797, 0]"] + 92["EdgeCut Fillet
[2626, 2797, 0]"] + 93["EdgeCut Fillet
[2626, 2797, 0]"] + 97["Sweep Extrusion
[3131, 3159, 0]"] 98[Wall] 99["SweepEdge Opposite"] 100["SweepEdge Adjacent"] - 101["Sweep Extrusion
[3347, 3375, 0]"] - 105["Sweep Extrusion
[3710, 3738, 0]"] + 101["Sweep Extrusion
[3131, 3159, 0]"] + 105["Sweep Extrusion
[3494, 3522, 0]"] 106[Wall] 107["SweepEdge Opposite"] 108["SweepEdge Adjacent"] - 109["Sweep Extrusion
[3710, 3738, 0]"] - 113["Sweep Extrusion
[4297, 4325, 0]"] + 109["Sweep Extrusion
[3494, 3522, 0]"] + 113["Sweep Extrusion
[4081, 4109, 0]"] 114[Wall] 115["SweepEdge Opposite"] 116["SweepEdge Adjacent"] - 117["Sweep Extrusion
[4297, 4325, 0]"] - 118["Sweep Extrusion
[4297, 4325, 0]"] - 119["Sweep Extrusion
[4297, 4325, 0]"] - 123["Sweep Extrusion
[4521, 4549, 0]"] + 117["Sweep Extrusion
[4081, 4109, 0]"] + 118["Sweep Extrusion
[4081, 4109, 0]"] + 119["Sweep Extrusion
[4081, 4109, 0]"] + 123["Sweep Extrusion
[4305, 4333, 0]"] 124[Wall] 125["SweepEdge Opposite"] 126["SweepEdge Adjacent"] - 127["StartSketchOnFace
[3087, 3123, 0]"] - 128["StartSketchOnFace
[3451, 3487, 0]"] - 129["StartSketchOnFace
[3821, 3857, 0]"] - 130["StartSketchOnFace
[4417, 4453, 0]"] + 127["StartSketchOnFace
[2871, 2907, 0]"] + 128["StartSketchOnFace
[3235, 3271, 0]"] + 129["StartSketchOnFace
[3605, 3641, 0]"] + 130["StartSketchOnFace
[4201, 4237, 0]"] 1 --- 2 2 --- 3 2 --- 4 diff --git a/rust/kcl-lib/tests/kcl_samples/sheet-metal-bracket/ast.snap b/rust/kcl-lib/tests/kcl_samples/sheet-metal-bracket/ast.snap index b4a96fb91..45cc05688 100644 --- a/rust/kcl-lib/tests/kcl_samples/sheet-metal-bracket/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/sheet-metal-bracket/ast.snap @@ -1014,78 +1014,56 @@ description: Result of parsing sheet-metal-bracket.kcl { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { "commentStart": 0, "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, + "name": "exteriorBendRadius", "start": 0, - "type": "ObjectProperty", - "value": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "exteriorBendRadius", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } + "type": "Identifier" }, - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "bendAngle", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "bendAngle", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -1106,8 +1084,9 @@ description: Result of parsing sheet-metal-bracket.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -1231,86 +1210,64 @@ description: Result of parsing sheet-metal-bracket.kcl { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { "commentStart": 0, "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, + "name": "interiorBendRadius", "start": 0, - "type": "ObjectProperty", - "value": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "interiorBendRadius", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } + "type": "Identifier" }, - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "argument": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "bendAngle", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "bendAngle", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } } ], "callee": { @@ -1331,8 +1288,9 @@ description: Result of parsing sheet-metal-bracket.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -1477,86 +1435,64 @@ description: Result of parsing sheet-metal-bracket.kcl { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { "commentStart": 0, "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, + "name": "interiorBendRadius", "start": 0, - "type": "ObjectProperty", - "value": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "interiorBendRadius", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } + "type": "Identifier" }, - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "argument": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "bendAngle", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "bendAngle", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } } ], "callee": { @@ -1577,8 +1513,9 @@ description: Result of parsing sheet-metal-bracket.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -1692,78 +1629,56 @@ description: Result of parsing sheet-metal-bracket.kcl { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { "commentStart": 0, "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, + "name": "exteriorBendRadius", "start": 0, - "type": "ObjectProperty", - "value": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "exteriorBendRadius", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } + "type": "Identifier" }, - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "bendAngle", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "bendAngle", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -1784,8 +1699,9 @@ description: Result of parsing sheet-metal-bracket.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -1987,86 +1903,64 @@ description: Result of parsing sheet-metal-bracket.kcl { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { "commentStart": 0, "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, + "name": "interiorBendRadius", "start": 0, - "type": "ObjectProperty", - "value": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "interiorBendRadius", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } + "type": "Identifier" }, - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "argument": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "bendAngle", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "bendAngle", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } } ], "callee": { @@ -2087,8 +1981,9 @@ description: Result of parsing sheet-metal-bracket.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -2214,78 +2109,56 @@ description: Result of parsing sheet-metal-bracket.kcl { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { "commentStart": 0, "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, + "name": "exteriorBendRadius", "start": 0, - "type": "ObjectProperty", - "value": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "exteriorBendRadius", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } + "type": "Identifier" }, - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "bendAngle", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "bendAngle", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -2306,8 +2179,9 @@ description: Result of parsing sheet-metal-bracket.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -2460,78 +2334,56 @@ description: Result of parsing sheet-metal-bracket.kcl { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { "commentStart": 0, "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, + "name": "exteriorBendRadius", "start": 0, - "type": "ObjectProperty", - "value": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "exteriorBendRadius", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } + "type": "Identifier" }, - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "bendAngle", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "bendAngle", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -2552,8 +2404,9 @@ description: Result of parsing sheet-metal-bracket.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -2679,86 +2532,64 @@ description: Result of parsing sheet-metal-bracket.kcl { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { "commentStart": 0, "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, + "name": "interiorBendRadius", "start": 0, - "type": "ObjectProperty", - "value": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "interiorBendRadius", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } + "type": "Identifier" }, - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "argument": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "bendAngle", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "bendAngle", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } } ], "callee": { @@ -2779,8 +2610,9 @@ description: Result of parsing sheet-metal-bracket.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ diff --git a/rust/kcl-lib/tests/kcl_samples/sheet-metal-bracket/program_memory.snap b/rust/kcl-lib/tests/kcl_samples/sheet-metal-bracket/program_memory.snap index 04cac3a18..9d1289cc8 100644 --- a/rust/kcl-lib/tests/kcl_samples/sheet-metal-bracket/program_memory.snap +++ b/rust/kcl-lib/tests/kcl_samples/sheet-metal-bracket/program_memory.snap @@ -42,9 +42,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1517, - "end": 1523, - "start": 1517, + "commentStart": 1490, + "end": 1496, + "start": 1490, "type": "TagDeclarator", "value": "seg01" }, @@ -62,9 +62,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1654, - "end": 1660, - "start": 1654, + "commentStart": 1600, + "end": 1606, + "start": 1600, "type": "TagDeclarator", "value": "seg02" }, @@ -103,9 +103,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2017, - "end": 2023, - "start": 2017, + "commentStart": 1909, + "end": 1915, + "start": 1909, "type": "TagDeclarator", "value": "seg03" }, @@ -116,9 +116,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2066, - "end": 2072, - "start": 2066, + "commentStart": 1958, + "end": 1964, + "start": 1958, "type": "TagDeclarator", "value": "seg04" }, @@ -150,9 +150,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2362, - "end": 2368, - "start": 2362, + "commentStart": 2200, + "end": 2206, + "start": 2200, "type": "TagDeclarator", "value": "seg05" }, @@ -184,9 +184,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2701, - "end": 2707, - "start": 2701, + "commentStart": 2485, + "end": 2491, + "start": 2485, "type": "TagDeclarator", "value": "seg06" }, @@ -197,9 +197,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2777, - "end": 2783, - "start": 2777, + "commentStart": 2561, + "end": 2567, + "start": 2561, "type": "TagDeclarator", "value": "seg07" }, @@ -263,9 +263,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.1853 ], "tag": { - "commentStart": 1517, - "end": 1523, - "start": 1517, + "commentStart": 1490, + "end": 1496, + "start": 1490, "type": "TagDeclarator", "value": "seg01" }, @@ -312,9 +312,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 2.4676 ], "tag": { - "commentStart": 1654, - "end": 1660, - "start": 1654, + "commentStart": 1600, + "end": 1606, + "start": 1600, "type": "TagDeclarator", "value": "seg02" }, @@ -442,9 +442,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl -0.0 ], "tag": { - "commentStart": 2017, - "end": 2023, - "start": 2017, + "commentStart": 1909, + "end": 1915, + "start": 1909, "type": "TagDeclarator", "value": "seg03" }, @@ -467,9 +467,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.125 ], "tag": { - "commentStart": 2066, - "end": 2072, - "start": 2066, + "commentStart": 1958, + "end": 1964, + "start": 1958, "type": "TagDeclarator", "value": "seg04" }, @@ -559,9 +559,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 2.5926 ], "tag": { - "commentStart": 2362, - "end": 2368, - "start": 2362, + "commentStart": 2200, + "end": 2206, + "start": 2200, "type": "TagDeclarator", "value": "seg05" }, @@ -670,9 +670,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.125 ], "tag": { - "commentStart": 2701, - "end": 2707, - "start": 2701, + "commentStart": 2485, + "end": 2491, + "start": 2485, "type": "TagDeclarator", "value": "seg06" }, @@ -695,9 +695,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.125 ], "tag": { - "commentStart": 2777, - "end": 2783, - "start": 2777, + "commentStart": 2561, + "end": 2567, + "start": 2561, "type": "TagDeclarator", "value": "seg07" }, @@ -940,9 +940,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1517, - "end": 1523, - "start": 1517, + "commentStart": 1490, + "end": 1496, + "start": 1490, "type": "TagDeclarator", "value": "seg01" }, @@ -960,9 +960,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1654, - "end": 1660, - "start": 1654, + "commentStart": 1600, + "end": 1606, + "start": 1600, "type": "TagDeclarator", "value": "seg02" }, @@ -1001,9 +1001,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2017, - "end": 2023, - "start": 2017, + "commentStart": 1909, + "end": 1915, + "start": 1909, "type": "TagDeclarator", "value": "seg03" }, @@ -1014,9 +1014,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2066, - "end": 2072, - "start": 2066, + "commentStart": 1958, + "end": 1964, + "start": 1958, "type": "TagDeclarator", "value": "seg04" }, @@ -1048,9 +1048,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2362, - "end": 2368, - "start": 2362, + "commentStart": 2200, + "end": 2206, + "start": 2200, "type": "TagDeclarator", "value": "seg05" }, @@ -1082,9 +1082,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2701, - "end": 2707, - "start": 2701, + "commentStart": 2485, + "end": 2491, + "start": 2485, "type": "TagDeclarator", "value": "seg06" }, @@ -1095,9 +1095,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2777, - "end": 2783, - "start": 2777, + "commentStart": 2561, + "end": 2567, + "start": 2561, "type": "TagDeclarator", "value": "seg07" }, @@ -1161,9 +1161,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.1853 ], "tag": { - "commentStart": 1517, - "end": 1523, - "start": 1517, + "commentStart": 1490, + "end": 1496, + "start": 1490, "type": "TagDeclarator", "value": "seg01" }, @@ -1210,9 +1210,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 2.4676 ], "tag": { - "commentStart": 1654, - "end": 1660, - "start": 1654, + "commentStart": 1600, + "end": 1606, + "start": 1600, "type": "TagDeclarator", "value": "seg02" }, @@ -1340,9 +1340,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl -0.0 ], "tag": { - "commentStart": 2017, - "end": 2023, - "start": 2017, + "commentStart": 1909, + "end": 1915, + "start": 1909, "type": "TagDeclarator", "value": "seg03" }, @@ -1365,9 +1365,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.125 ], "tag": { - "commentStart": 2066, - "end": 2072, - "start": 2066, + "commentStart": 1958, + "end": 1964, + "start": 1958, "type": "TagDeclarator", "value": "seg04" }, @@ -1457,9 +1457,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 2.5926 ], "tag": { - "commentStart": 2362, - "end": 2368, - "start": 2362, + "commentStart": 2200, + "end": 2206, + "start": 2200, "type": "TagDeclarator", "value": "seg05" }, @@ -1568,9 +1568,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.125 ], "tag": { - "commentStart": 2701, - "end": 2707, - "start": 2701, + "commentStart": 2485, + "end": 2491, + "start": 2485, "type": "TagDeclarator", "value": "seg06" }, @@ -1593,9 +1593,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.125 ], "tag": { - "commentStart": 2777, - "end": 2783, - "start": 2777, + "commentStart": 2561, + "end": 2567, + "start": 2561, "type": "TagDeclarator", "value": "seg07" }, @@ -1970,9 +1970,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1517, - "end": 1523, - "start": 1517, + "commentStart": 1490, + "end": 1496, + "start": 1490, "type": "TagDeclarator", "value": "seg01" }, @@ -1990,9 +1990,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1654, - "end": 1660, - "start": 1654, + "commentStart": 1600, + "end": 1606, + "start": 1600, "type": "TagDeclarator", "value": "seg02" }, @@ -2031,9 +2031,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2017, - "end": 2023, - "start": 2017, + "commentStart": 1909, + "end": 1915, + "start": 1909, "type": "TagDeclarator", "value": "seg03" }, @@ -2044,9 +2044,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2066, - "end": 2072, - "start": 2066, + "commentStart": 1958, + "end": 1964, + "start": 1958, "type": "TagDeclarator", "value": "seg04" }, @@ -2078,9 +2078,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2362, - "end": 2368, - "start": 2362, + "commentStart": 2200, + "end": 2206, + "start": 2200, "type": "TagDeclarator", "value": "seg05" }, @@ -2112,9 +2112,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2701, - "end": 2707, - "start": 2701, + "commentStart": 2485, + "end": 2491, + "start": 2485, "type": "TagDeclarator", "value": "seg06" }, @@ -2125,9 +2125,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2777, - "end": 2783, - "start": 2777, + "commentStart": 2561, + "end": 2567, + "start": 2561, "type": "TagDeclarator", "value": "seg07" }, @@ -2191,9 +2191,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.1853 ], "tag": { - "commentStart": 1517, - "end": 1523, - "start": 1517, + "commentStart": 1490, + "end": 1496, + "start": 1490, "type": "TagDeclarator", "value": "seg01" }, @@ -2240,9 +2240,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 2.4676 ], "tag": { - "commentStart": 1654, - "end": 1660, - "start": 1654, + "commentStart": 1600, + "end": 1606, + "start": 1600, "type": "TagDeclarator", "value": "seg02" }, @@ -2370,9 +2370,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl -0.0 ], "tag": { - "commentStart": 2017, - "end": 2023, - "start": 2017, + "commentStart": 1909, + "end": 1915, + "start": 1909, "type": "TagDeclarator", "value": "seg03" }, @@ -2395,9 +2395,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.125 ], "tag": { - "commentStart": 2066, - "end": 2072, - "start": 2066, + "commentStart": 1958, + "end": 1964, + "start": 1958, "type": "TagDeclarator", "value": "seg04" }, @@ -2487,9 +2487,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 2.5926 ], "tag": { - "commentStart": 2362, - "end": 2368, - "start": 2362, + "commentStart": 2200, + "end": 2206, + "start": 2200, "type": "TagDeclarator", "value": "seg05" }, @@ -2598,9 +2598,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.125 ], "tag": { - "commentStart": 2701, - "end": 2707, - "start": 2701, + "commentStart": 2485, + "end": 2491, + "start": 2485, "type": "TagDeclarator", "value": "seg06" }, @@ -2623,9 +2623,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.125 ], "tag": { - "commentStart": 2777, - "end": 2783, - "start": 2777, + "commentStart": 2561, + "end": 2567, + "start": 2561, "type": "TagDeclarator", "value": "seg07" }, @@ -2903,9 +2903,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1517, - "end": 1523, - "start": 1517, + "commentStart": 1490, + "end": 1496, + "start": 1490, "type": "TagDeclarator", "value": "seg01" }, @@ -2923,9 +2923,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1654, - "end": 1660, - "start": 1654, + "commentStart": 1600, + "end": 1606, + "start": 1600, "type": "TagDeclarator", "value": "seg02" }, @@ -2964,9 +2964,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2017, - "end": 2023, - "start": 2017, + "commentStart": 1909, + "end": 1915, + "start": 1909, "type": "TagDeclarator", "value": "seg03" }, @@ -2977,9 +2977,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2066, - "end": 2072, - "start": 2066, + "commentStart": 1958, + "end": 1964, + "start": 1958, "type": "TagDeclarator", "value": "seg04" }, @@ -3011,9 +3011,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2362, - "end": 2368, - "start": 2362, + "commentStart": 2200, + "end": 2206, + "start": 2200, "type": "TagDeclarator", "value": "seg05" }, @@ -3045,9 +3045,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2701, - "end": 2707, - "start": 2701, + "commentStart": 2485, + "end": 2491, + "start": 2485, "type": "TagDeclarator", "value": "seg06" }, @@ -3058,9 +3058,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2777, - "end": 2783, - "start": 2777, + "commentStart": 2561, + "end": 2567, + "start": 2561, "type": "TagDeclarator", "value": "seg07" }, @@ -3124,9 +3124,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.1853 ], "tag": { - "commentStart": 1517, - "end": 1523, - "start": 1517, + "commentStart": 1490, + "end": 1496, + "start": 1490, "type": "TagDeclarator", "value": "seg01" }, @@ -3173,9 +3173,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 2.4676 ], "tag": { - "commentStart": 1654, - "end": 1660, - "start": 1654, + "commentStart": 1600, + "end": 1606, + "start": 1600, "type": "TagDeclarator", "value": "seg02" }, @@ -3303,9 +3303,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl -0.0 ], "tag": { - "commentStart": 2017, - "end": 2023, - "start": 2017, + "commentStart": 1909, + "end": 1915, + "start": 1909, "type": "TagDeclarator", "value": "seg03" }, @@ -3328,9 +3328,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.125 ], "tag": { - "commentStart": 2066, - "end": 2072, - "start": 2066, + "commentStart": 1958, + "end": 1964, + "start": 1958, "type": "TagDeclarator", "value": "seg04" }, @@ -3420,9 +3420,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 2.5926 ], "tag": { - "commentStart": 2362, - "end": 2368, - "start": 2362, + "commentStart": 2200, + "end": 2206, + "start": 2200, "type": "TagDeclarator", "value": "seg05" }, @@ -3531,9 +3531,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.125 ], "tag": { - "commentStart": 2701, - "end": 2707, - "start": 2701, + "commentStart": 2485, + "end": 2491, + "start": 2485, "type": "TagDeclarator", "value": "seg06" }, @@ -3556,9 +3556,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.125 ], "tag": { - "commentStart": 2777, - "end": 2783, - "start": 2777, + "commentStart": 2561, + "end": 2567, + "start": 2561, "type": "TagDeclarator", "value": "seg07" }, @@ -3883,9 +3883,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1517, - "end": 1523, - "start": 1517, + "commentStart": 1490, + "end": 1496, + "start": 1490, "type": "TagDeclarator", "value": "seg01" }, @@ -3903,9 +3903,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1654, - "end": 1660, - "start": 1654, + "commentStart": 1600, + "end": 1606, + "start": 1600, "type": "TagDeclarator", "value": "seg02" }, @@ -3944,9 +3944,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2017, - "end": 2023, - "start": 2017, + "commentStart": 1909, + "end": 1915, + "start": 1909, "type": "TagDeclarator", "value": "seg03" }, @@ -3957,9 +3957,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2066, - "end": 2072, - "start": 2066, + "commentStart": 1958, + "end": 1964, + "start": 1958, "type": "TagDeclarator", "value": "seg04" }, @@ -3991,9 +3991,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2362, - "end": 2368, - "start": 2362, + "commentStart": 2200, + "end": 2206, + "start": 2200, "type": "TagDeclarator", "value": "seg05" }, @@ -4025,9 +4025,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2701, - "end": 2707, - "start": 2701, + "commentStart": 2485, + "end": 2491, + "start": 2485, "type": "TagDeclarator", "value": "seg06" }, @@ -4038,9 +4038,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2777, - "end": 2783, - "start": 2777, + "commentStart": 2561, + "end": 2567, + "start": 2561, "type": "TagDeclarator", "value": "seg07" }, @@ -4104,9 +4104,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.1853 ], "tag": { - "commentStart": 1517, - "end": 1523, - "start": 1517, + "commentStart": 1490, + "end": 1496, + "start": 1490, "type": "TagDeclarator", "value": "seg01" }, @@ -4153,9 +4153,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 2.4676 ], "tag": { - "commentStart": 1654, - "end": 1660, - "start": 1654, + "commentStart": 1600, + "end": 1606, + "start": 1600, "type": "TagDeclarator", "value": "seg02" }, @@ -4283,9 +4283,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl -0.0 ], "tag": { - "commentStart": 2017, - "end": 2023, - "start": 2017, + "commentStart": 1909, + "end": 1915, + "start": 1909, "type": "TagDeclarator", "value": "seg03" }, @@ -4308,9 +4308,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.125 ], "tag": { - "commentStart": 2066, - "end": 2072, - "start": 2066, + "commentStart": 1958, + "end": 1964, + "start": 1958, "type": "TagDeclarator", "value": "seg04" }, @@ -4400,9 +4400,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 2.5926 ], "tag": { - "commentStart": 2362, - "end": 2368, - "start": 2362, + "commentStart": 2200, + "end": 2206, + "start": 2200, "type": "TagDeclarator", "value": "seg05" }, @@ -4511,9 +4511,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.125 ], "tag": { - "commentStart": 2701, - "end": 2707, - "start": 2701, + "commentStart": 2485, + "end": 2491, + "start": 2485, "type": "TagDeclarator", "value": "seg06" }, @@ -4536,9 +4536,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.125 ], "tag": { - "commentStart": 2777, - "end": 2783, - "start": 2777, + "commentStart": 2561, + "end": 2567, + "start": 2561, "type": "TagDeclarator", "value": "seg07" }, @@ -4816,9 +4816,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1517, - "end": 1523, - "start": 1517, + "commentStart": 1490, + "end": 1496, + "start": 1490, "type": "TagDeclarator", "value": "seg01" }, @@ -4836,9 +4836,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1654, - "end": 1660, - "start": 1654, + "commentStart": 1600, + "end": 1606, + "start": 1600, "type": "TagDeclarator", "value": "seg02" }, @@ -4877,9 +4877,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2017, - "end": 2023, - "start": 2017, + "commentStart": 1909, + "end": 1915, + "start": 1909, "type": "TagDeclarator", "value": "seg03" }, @@ -4890,9 +4890,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2066, - "end": 2072, - "start": 2066, + "commentStart": 1958, + "end": 1964, + "start": 1958, "type": "TagDeclarator", "value": "seg04" }, @@ -4924,9 +4924,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2362, - "end": 2368, - "start": 2362, + "commentStart": 2200, + "end": 2206, + "start": 2200, "type": "TagDeclarator", "value": "seg05" }, @@ -4958,9 +4958,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2701, - "end": 2707, - "start": 2701, + "commentStart": 2485, + "end": 2491, + "start": 2485, "type": "TagDeclarator", "value": "seg06" }, @@ -4971,9 +4971,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2777, - "end": 2783, - "start": 2777, + "commentStart": 2561, + "end": 2567, + "start": 2561, "type": "TagDeclarator", "value": "seg07" }, @@ -5037,9 +5037,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.1853 ], "tag": { - "commentStart": 1517, - "end": 1523, - "start": 1517, + "commentStart": 1490, + "end": 1496, + "start": 1490, "type": "TagDeclarator", "value": "seg01" }, @@ -5086,9 +5086,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 2.4676 ], "tag": { - "commentStart": 1654, - "end": 1660, - "start": 1654, + "commentStart": 1600, + "end": 1606, + "start": 1600, "type": "TagDeclarator", "value": "seg02" }, @@ -5216,9 +5216,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl -0.0 ], "tag": { - "commentStart": 2017, - "end": 2023, - "start": 2017, + "commentStart": 1909, + "end": 1915, + "start": 1909, "type": "TagDeclarator", "value": "seg03" }, @@ -5241,9 +5241,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.125 ], "tag": { - "commentStart": 2066, - "end": 2072, - "start": 2066, + "commentStart": 1958, + "end": 1964, + "start": 1958, "type": "TagDeclarator", "value": "seg04" }, @@ -5333,9 +5333,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 2.5926 ], "tag": { - "commentStart": 2362, - "end": 2368, - "start": 2362, + "commentStart": 2200, + "end": 2206, + "start": 2200, "type": "TagDeclarator", "value": "seg05" }, @@ -5444,9 +5444,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.125 ], "tag": { - "commentStart": 2701, - "end": 2707, - "start": 2701, + "commentStart": 2485, + "end": 2491, + "start": 2485, "type": "TagDeclarator", "value": "seg06" }, @@ -5469,9 +5469,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.125 ], "tag": { - "commentStart": 2777, - "end": 2783, - "start": 2777, + "commentStart": 2561, + "end": 2567, + "start": 2561, "type": "TagDeclarator", "value": "seg07" }, @@ -5802,9 +5802,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1517, - "end": 1523, - "start": 1517, + "commentStart": 1490, + "end": 1496, + "start": 1490, "type": "TagDeclarator", "value": "seg01" }, @@ -5822,9 +5822,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1654, - "end": 1660, - "start": 1654, + "commentStart": 1600, + "end": 1606, + "start": 1600, "type": "TagDeclarator", "value": "seg02" }, @@ -5863,9 +5863,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2017, - "end": 2023, - "start": 2017, + "commentStart": 1909, + "end": 1915, + "start": 1909, "type": "TagDeclarator", "value": "seg03" }, @@ -5876,9 +5876,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2066, - "end": 2072, - "start": 2066, + "commentStart": 1958, + "end": 1964, + "start": 1958, "type": "TagDeclarator", "value": "seg04" }, @@ -5910,9 +5910,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2362, - "end": 2368, - "start": 2362, + "commentStart": 2200, + "end": 2206, + "start": 2200, "type": "TagDeclarator", "value": "seg05" }, @@ -5944,9 +5944,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2701, - "end": 2707, - "start": 2701, + "commentStart": 2485, + "end": 2491, + "start": 2485, "type": "TagDeclarator", "value": "seg06" }, @@ -5957,9 +5957,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2777, - "end": 2783, - "start": 2777, + "commentStart": 2561, + "end": 2567, + "start": 2561, "type": "TagDeclarator", "value": "seg07" }, @@ -6023,9 +6023,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.1853 ], "tag": { - "commentStart": 1517, - "end": 1523, - "start": 1517, + "commentStart": 1490, + "end": 1496, + "start": 1490, "type": "TagDeclarator", "value": "seg01" }, @@ -6072,9 +6072,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 2.4676 ], "tag": { - "commentStart": 1654, - "end": 1660, - "start": 1654, + "commentStart": 1600, + "end": 1606, + "start": 1600, "type": "TagDeclarator", "value": "seg02" }, @@ -6202,9 +6202,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl -0.0 ], "tag": { - "commentStart": 2017, - "end": 2023, - "start": 2017, + "commentStart": 1909, + "end": 1915, + "start": 1909, "type": "TagDeclarator", "value": "seg03" }, @@ -6227,9 +6227,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.125 ], "tag": { - "commentStart": 2066, - "end": 2072, - "start": 2066, + "commentStart": 1958, + "end": 1964, + "start": 1958, "type": "TagDeclarator", "value": "seg04" }, @@ -6319,9 +6319,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 2.5926 ], "tag": { - "commentStart": 2362, - "end": 2368, - "start": 2362, + "commentStart": 2200, + "end": 2206, + "start": 2200, "type": "TagDeclarator", "value": "seg05" }, @@ -6430,9 +6430,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.125 ], "tag": { - "commentStart": 2701, - "end": 2707, - "start": 2701, + "commentStart": 2485, + "end": 2491, + "start": 2485, "type": "TagDeclarator", "value": "seg06" }, @@ -6455,9 +6455,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.125 ], "tag": { - "commentStart": 2777, - "end": 2783, - "start": 2777, + "commentStart": 2561, + "end": 2567, + "start": 2561, "type": "TagDeclarator", "value": "seg07" }, @@ -6735,9 +6735,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1517, - "end": 1523, - "start": 1517, + "commentStart": 1490, + "end": 1496, + "start": 1490, "type": "TagDeclarator", "value": "seg01" }, @@ -6755,9 +6755,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1654, - "end": 1660, - "start": 1654, + "commentStart": 1600, + "end": 1606, + "start": 1600, "type": "TagDeclarator", "value": "seg02" }, @@ -6796,9 +6796,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2017, - "end": 2023, - "start": 2017, + "commentStart": 1909, + "end": 1915, + "start": 1909, "type": "TagDeclarator", "value": "seg03" }, @@ -6809,9 +6809,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2066, - "end": 2072, - "start": 2066, + "commentStart": 1958, + "end": 1964, + "start": 1958, "type": "TagDeclarator", "value": "seg04" }, @@ -6843,9 +6843,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2362, - "end": 2368, - "start": 2362, + "commentStart": 2200, + "end": 2206, + "start": 2200, "type": "TagDeclarator", "value": "seg05" }, @@ -6877,9 +6877,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2701, - "end": 2707, - "start": 2701, + "commentStart": 2485, + "end": 2491, + "start": 2485, "type": "TagDeclarator", "value": "seg06" }, @@ -6890,9 +6890,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2777, - "end": 2783, - "start": 2777, + "commentStart": 2561, + "end": 2567, + "start": 2561, "type": "TagDeclarator", "value": "seg07" }, @@ -6956,9 +6956,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.1853 ], "tag": { - "commentStart": 1517, - "end": 1523, - "start": 1517, + "commentStart": 1490, + "end": 1496, + "start": 1490, "type": "TagDeclarator", "value": "seg01" }, @@ -7005,9 +7005,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 2.4676 ], "tag": { - "commentStart": 1654, - "end": 1660, - "start": 1654, + "commentStart": 1600, + "end": 1606, + "start": 1600, "type": "TagDeclarator", "value": "seg02" }, @@ -7135,9 +7135,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl -0.0 ], "tag": { - "commentStart": 2017, - "end": 2023, - "start": 2017, + "commentStart": 1909, + "end": 1915, + "start": 1909, "type": "TagDeclarator", "value": "seg03" }, @@ -7160,9 +7160,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.125 ], "tag": { - "commentStart": 2066, - "end": 2072, - "start": 2066, + "commentStart": 1958, + "end": 1964, + "start": 1958, "type": "TagDeclarator", "value": "seg04" }, @@ -7252,9 +7252,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 2.5926 ], "tag": { - "commentStart": 2362, - "end": 2368, - "start": 2362, + "commentStart": 2200, + "end": 2206, + "start": 2200, "type": "TagDeclarator", "value": "seg05" }, @@ -7363,9 +7363,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.125 ], "tag": { - "commentStart": 2701, - "end": 2707, - "start": 2701, + "commentStart": 2485, + "end": 2491, + "start": 2485, "type": "TagDeclarator", "value": "seg06" }, @@ -7388,9 +7388,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.125 ], "tag": { - "commentStart": 2777, - "end": 2783, - "start": 2777, + "commentStart": 2561, + "end": 2567, + "start": 2561, "type": "TagDeclarator", "value": "seg07" }, @@ -7668,9 +7668,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1517, - "end": 1523, - "start": 1517, + "commentStart": 1490, + "end": 1496, + "start": 1490, "type": "TagDeclarator", "value": "seg01" }, @@ -7688,9 +7688,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1654, - "end": 1660, - "start": 1654, + "commentStart": 1600, + "end": 1606, + "start": 1600, "type": "TagDeclarator", "value": "seg02" }, @@ -7729,9 +7729,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2017, - "end": 2023, - "start": 2017, + "commentStart": 1909, + "end": 1915, + "start": 1909, "type": "TagDeclarator", "value": "seg03" }, @@ -7742,9 +7742,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2066, - "end": 2072, - "start": 2066, + "commentStart": 1958, + "end": 1964, + "start": 1958, "type": "TagDeclarator", "value": "seg04" }, @@ -7776,9 +7776,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2362, - "end": 2368, - "start": 2362, + "commentStart": 2200, + "end": 2206, + "start": 2200, "type": "TagDeclarator", "value": "seg05" }, @@ -7810,9 +7810,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2701, - "end": 2707, - "start": 2701, + "commentStart": 2485, + "end": 2491, + "start": 2485, "type": "TagDeclarator", "value": "seg06" }, @@ -7823,9 +7823,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2777, - "end": 2783, - "start": 2777, + "commentStart": 2561, + "end": 2567, + "start": 2561, "type": "TagDeclarator", "value": "seg07" }, @@ -7889,9 +7889,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.1853 ], "tag": { - "commentStart": 1517, - "end": 1523, - "start": 1517, + "commentStart": 1490, + "end": 1496, + "start": 1490, "type": "TagDeclarator", "value": "seg01" }, @@ -7938,9 +7938,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 2.4676 ], "tag": { - "commentStart": 1654, - "end": 1660, - "start": 1654, + "commentStart": 1600, + "end": 1606, + "start": 1600, "type": "TagDeclarator", "value": "seg02" }, @@ -8068,9 +8068,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl -0.0 ], "tag": { - "commentStart": 2017, - "end": 2023, - "start": 2017, + "commentStart": 1909, + "end": 1915, + "start": 1909, "type": "TagDeclarator", "value": "seg03" }, @@ -8093,9 +8093,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.125 ], "tag": { - "commentStart": 2066, - "end": 2072, - "start": 2066, + "commentStart": 1958, + "end": 1964, + "start": 1958, "type": "TagDeclarator", "value": "seg04" }, @@ -8185,9 +8185,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 2.5926 ], "tag": { - "commentStart": 2362, - "end": 2368, - "start": 2362, + "commentStart": 2200, + "end": 2206, + "start": 2200, "type": "TagDeclarator", "value": "seg05" }, @@ -8296,9 +8296,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.125 ], "tag": { - "commentStart": 2701, - "end": 2707, - "start": 2701, + "commentStart": 2485, + "end": 2491, + "start": 2485, "type": "TagDeclarator", "value": "seg06" }, @@ -8321,9 +8321,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.125 ], "tag": { - "commentStart": 2777, - "end": 2783, - "start": 2777, + "commentStart": 2561, + "end": 2567, + "start": 2561, "type": "TagDeclarator", "value": "seg07" }, @@ -8601,9 +8601,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1517, - "end": 1523, - "start": 1517, + "commentStart": 1490, + "end": 1496, + "start": 1490, "type": "TagDeclarator", "value": "seg01" }, @@ -8621,9 +8621,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1654, - "end": 1660, - "start": 1654, + "commentStart": 1600, + "end": 1606, + "start": 1600, "type": "TagDeclarator", "value": "seg02" }, @@ -8662,9 +8662,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2017, - "end": 2023, - "start": 2017, + "commentStart": 1909, + "end": 1915, + "start": 1909, "type": "TagDeclarator", "value": "seg03" }, @@ -8675,9 +8675,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2066, - "end": 2072, - "start": 2066, + "commentStart": 1958, + "end": 1964, + "start": 1958, "type": "TagDeclarator", "value": "seg04" }, @@ -8709,9 +8709,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2362, - "end": 2368, - "start": 2362, + "commentStart": 2200, + "end": 2206, + "start": 2200, "type": "TagDeclarator", "value": "seg05" }, @@ -8743,9 +8743,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2701, - "end": 2707, - "start": 2701, + "commentStart": 2485, + "end": 2491, + "start": 2485, "type": "TagDeclarator", "value": "seg06" }, @@ -8756,9 +8756,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2777, - "end": 2783, - "start": 2777, + "commentStart": 2561, + "end": 2567, + "start": 2561, "type": "TagDeclarator", "value": "seg07" }, @@ -8822,9 +8822,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.1853 ], "tag": { - "commentStart": 1517, - "end": 1523, - "start": 1517, + "commentStart": 1490, + "end": 1496, + "start": 1490, "type": "TagDeclarator", "value": "seg01" }, @@ -8871,9 +8871,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 2.4676 ], "tag": { - "commentStart": 1654, - "end": 1660, - "start": 1654, + "commentStart": 1600, + "end": 1606, + "start": 1600, "type": "TagDeclarator", "value": "seg02" }, @@ -9001,9 +9001,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl -0.0 ], "tag": { - "commentStart": 2017, - "end": 2023, - "start": 2017, + "commentStart": 1909, + "end": 1915, + "start": 1909, "type": "TagDeclarator", "value": "seg03" }, @@ -9026,9 +9026,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.125 ], "tag": { - "commentStart": 2066, - "end": 2072, - "start": 2066, + "commentStart": 1958, + "end": 1964, + "start": 1958, "type": "TagDeclarator", "value": "seg04" }, @@ -9118,9 +9118,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 2.5926 ], "tag": { - "commentStart": 2362, - "end": 2368, - "start": 2362, + "commentStart": 2200, + "end": 2206, + "start": 2200, "type": "TagDeclarator", "value": "seg05" }, @@ -9229,9 +9229,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.125 ], "tag": { - "commentStart": 2701, - "end": 2707, - "start": 2701, + "commentStart": 2485, + "end": 2491, + "start": 2485, "type": "TagDeclarator", "value": "seg06" }, @@ -9254,9 +9254,9 @@ description: Variables in memory after executing sheet-metal-bracket.kcl 0.125 ], "tag": { - "commentStart": 2777, - "end": 2783, - "start": 2777, + "commentStart": 2561, + "end": 2567, + "start": 2561, "type": "TagDeclarator", "value": "seg07" }, diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_tangential_arc0.png b/rust/kcl-lib/tests/outputs/serial_test_example_tangential_arc0.png index f569cb166..f73ecd755 100644 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_tangential_arc0.png and b/rust/kcl-lib/tests/outputs/serial_test_example_tangential_arc0.png differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_tangential_arc_to0.png b/rust/kcl-lib/tests/outputs/serial_test_example_tangential_arc1.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_tangential_arc_to0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_tangential_arc1.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_tangential_arc2.png b/rust/kcl-lib/tests/outputs/serial_test_example_tangential_arc2.png new file mode 100644 index 000000000..f569cb166 Binary files /dev/null and b/rust/kcl-lib/tests/outputs/serial_test_example_tangential_arc2.png differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_tangential_arc_to_relative0.png b/rust/kcl-lib/tests/outputs/serial_test_example_tangential_arc_to_relative0.png deleted file mode 100644 index f73ecd755..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_tangential_arc_to_relative0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/parametric_with_tan_arc/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/parametric_with_tan_arc/artifact_graph_flowchart.snap.md index f45177055..a16afa7ac 100644 --- a/rust/kcl-lib/tests/parametric_with_tan_arc/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/parametric_with_tan_arc/artifact_graph_flowchart.snap.md @@ -3,17 +3,17 @@ flowchart LR subgraph path2 [Path] 2["Path
[262, 287, 0]"] 3["Segment
[293, 320, 0]"] - 4["Segment
[326, 377, 0]"] - 5["Segment
[383, 412, 0]"] - 6["Segment
[418, 445, 0]"] - 7["Segment
[451, 479, 0]"] - 8["Segment
[485, 568, 0]"] - 9["Segment
[574, 602, 0]"] - 10["Segment
[608, 616, 0]"] + 4["Segment
[326, 369, 0]"] + 5["Segment
[375, 404, 0]"] + 6["Segment
[410, 437, 0]"] + 7["Segment
[443, 471, 0]"] + 8["Segment
[477, 533, 0]"] + 9["Segment
[539, 567, 0]"] + 10["Segment
[573, 581, 0]"] 11[Solid2d] end 1["Plane
[239, 256, 0]"] - 12["Sweep Extrusion
[622, 645, 0]"] + 12["Sweep Extrusion
[587, 610, 0]"] 13[Wall] 14[Wall] 15[Wall] diff --git a/rust/kcl-lib/tests/parametric_with_tan_arc/ast.snap b/rust/kcl-lib/tests/parametric_with_tan_arc/ast.snap index 1fbb09e67..8cf62c5cd 100644 --- a/rust/kcl-lib/tests/parametric_with_tan_arc/ast.snap +++ b/rust/kcl-lib/tests/parametric_with_tan_arc/ast.snap @@ -663,74 +663,52 @@ description: Result of parsing parametric_with_tan_arc.kcl { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { "commentStart": 0, "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, + "name": "filletR", "start": 0, - "type": "ObjectProperty", - "value": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "filletR", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } + "type": "Identifier" }, - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "commentStart": 0, - "end": 0, - "raw": "90", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 90.0, - "suffix": "None" - } - } - } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "90", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 90.0, + "suffix": "None" + } + } } ], "callee": { @@ -751,8 +729,9 @@ description: Result of parsing parametric_with_tan_arc.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -989,106 +968,84 @@ description: Result of parsing parametric_with_tan_arc.kcl { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, "commentStart": 0, "end": 0, - "key": { + "name": { "commentStart": 0, "end": 0, - "name": "radius", + "name": "filletR", "start": 0, "type": "Identifier" }, + "path": [], "start": 0, - "type": "ObjectProperty", - "value": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "filletR", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "-", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "thickness", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } + "type": "Name", + "type": "Name" }, - { + "operator": "-", + "right": { + "abs_path": false, "commentStart": 0, "end": 0, - "key": { + "name": { "commentStart": 0, "end": 0, - "name": "offset", + "name": "thickness", "start": 0, "type": "Identifier" }, + "path": [], "start": 0, - "type": "ObjectProperty", - "value": { - "argument": { - "commentStart": 0, - "end": 0, - "raw": "90", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 90.0, - "suffix": "None" - } - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } }, { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "90", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 90.0, + "suffix": "None" + } + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } } ], "callee": { @@ -1109,8 +1066,9 @@ description: Result of parsing parametric_with_tan_arc.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ diff --git a/rust/kcl-lib/tests/parametric_with_tan_arc/input.kcl b/rust/kcl-lib/tests/parametric_with_tan_arc/input.kcl index 411257836..73c238f1a 100644 --- a/rust/kcl-lib/tests/parametric_with_tan_arc/input.kcl +++ b/rust/kcl-lib/tests/parametric_with_tan_arc/input.kcl @@ -11,14 +11,11 @@ wallMountL = 8 bracket = startSketchOn(XY) |> startProfileAt([0, 0], %) |> line(end = [0, wallMountL]) - |> tangentialArc({ radius = filletR, offset = 90 }, %) + |> tangentialArc(radius = filletR, angle = 90) |> line(end = [-shelfMountL, 0]) |> line(end = [0, -thickness]) |> line(end = [shelfMountL, 0]) - |> tangentialArc({ - radius = filletR - thickness, - offset = -90 - }, %) + |> tangentialArc(radius = filletR - thickness, angle = -90) |> line(end = [0, -wallMountL]) |> close(%) |> extrude(length = width) diff --git a/rust/kcl-lib/tests/parametric_with_tan_arc/unparsed.snap b/rust/kcl-lib/tests/parametric_with_tan_arc/unparsed.snap index 821f3e487..0377fd103 100644 --- a/rust/kcl-lib/tests/parametric_with_tan_arc/unparsed.snap +++ b/rust/kcl-lib/tests/parametric_with_tan_arc/unparsed.snap @@ -15,14 +15,11 @@ wallMountL = 8 bracket = startSketchOn(XY) |> startProfileAt([0, 0], %) |> line(end = [0, wallMountL]) - |> tangentialArc({ radius = filletR, offset = 90 }, %) + |> tangentialArc(radius = filletR, angle = 90) |> line(end = [-shelfMountL, 0]) |> line(end = [0, -thickness]) |> line(end = [shelfMountL, 0]) - |> tangentialArc({ - radius = filletR - thickness, - offset = -90 - }, %) + |> tangentialArc(radius = filletR - thickness, angle = -90) |> line(end = [0, -wallMountL]) |> close(%) |> extrude(length = width) diff --git a/rust/kcl-lib/tests/ssi_pattern/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/ssi_pattern/artifact_graph_flowchart.snap.md index 2512c43fd..baceda5d5 100644 --- a/rust/kcl-lib/tests/ssi_pattern/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/ssi_pattern/artifact_graph_flowchart.snap.md @@ -4,19 +4,19 @@ flowchart LR 2["Path
[37, 71, 0]"] 3["Segment
[77, 97, 0]"] 4["Segment
[103, 128, 0]"] - 5["Segment
[134, 167, 0]"] - 6["Segment
[173, 195, 0]"] - 7["Segment
[201, 271, 0]"] - 8["Segment
[277, 284, 0]"] + 5["Segment
[134, 176, 0]"] + 6["Segment
[182, 204, 0]"] + 7["Segment
[210, 280, 0]"] + 8["Segment
[286, 293, 0]"] 9[Solid2d] end subgraph path28 [Path] - 28["Path
[382, 426, 0]"] - 29["Segment
[382, 426, 0]"] + 28["Path
[391, 435, 0]"] + 29["Segment
[391, 435, 0]"] 30[Solid2d] end 1["Plane
[12, 31, 0]"] - 10["Sweep Extrusion
[299, 330, 0]"] + 10["Sweep Extrusion
[308, 339, 0]"] 11[Wall] 12[Wall] 13[Wall] @@ -34,40 +34,40 @@ flowchart LR 25["SweepEdge Adjacent"] 26["SweepEdge Opposite"] 27["SweepEdge Adjacent"] - 31["Sweep Extrusion
[616, 637, 0]"] + 31["Sweep Extrusion
[625, 646, 0]"] 32[Wall] 33["SweepEdge Opposite"] 34["SweepEdge Adjacent"] - 35["Sweep Extrusion
[616, 637, 0]"] - 36["Sweep Extrusion
[616, 637, 0]"] - 37["Sweep Extrusion
[616, 637, 0]"] - 38["Sweep Extrusion
[616, 637, 0]"] - 39["Sweep Extrusion
[616, 637, 0]"] - 40["Sweep Extrusion
[616, 637, 0]"] - 41["Sweep Extrusion
[616, 637, 0]"] - 42["Sweep Extrusion
[616, 637, 0]"] - 43["Sweep Extrusion
[616, 637, 0]"] - 44["Sweep Extrusion
[616, 637, 0]"] - 45["Sweep Extrusion
[616, 637, 0]"] - 46["Sweep Extrusion
[616, 637, 0]"] - 47["Sweep Extrusion
[616, 637, 0]"] - 48["Sweep Extrusion
[616, 637, 0]"] - 49["Sweep Extrusion
[616, 637, 0]"] - 50["Sweep Extrusion
[616, 637, 0]"] - 51["Sweep Extrusion
[616, 637, 0]"] - 52["Sweep Extrusion
[616, 637, 0]"] - 53["Sweep Extrusion
[616, 637, 0]"] - 54["Sweep Extrusion
[616, 637, 0]"] - 55["Sweep Extrusion
[616, 637, 0]"] - 56["Sweep Extrusion
[616, 637, 0]"] - 57["Sweep Extrusion
[616, 637, 0]"] - 58["Sweep Extrusion
[616, 637, 0]"] - 59["Sweep Extrusion
[616, 637, 0]"] - 60["Sweep Extrusion
[616, 637, 0]"] - 61["Sweep Extrusion
[616, 637, 0]"] - 62["Sweep Extrusion
[616, 637, 0]"] - 63["Sweep Extrusion
[616, 637, 0]"] - 64["StartSketchOnFace
[344, 376, 0]"] + 35["Sweep Extrusion
[625, 646, 0]"] + 36["Sweep Extrusion
[625, 646, 0]"] + 37["Sweep Extrusion
[625, 646, 0]"] + 38["Sweep Extrusion
[625, 646, 0]"] + 39["Sweep Extrusion
[625, 646, 0]"] + 40["Sweep Extrusion
[625, 646, 0]"] + 41["Sweep Extrusion
[625, 646, 0]"] + 42["Sweep Extrusion
[625, 646, 0]"] + 43["Sweep Extrusion
[625, 646, 0]"] + 44["Sweep Extrusion
[625, 646, 0]"] + 45["Sweep Extrusion
[625, 646, 0]"] + 46["Sweep Extrusion
[625, 646, 0]"] + 47["Sweep Extrusion
[625, 646, 0]"] + 48["Sweep Extrusion
[625, 646, 0]"] + 49["Sweep Extrusion
[625, 646, 0]"] + 50["Sweep Extrusion
[625, 646, 0]"] + 51["Sweep Extrusion
[625, 646, 0]"] + 52["Sweep Extrusion
[625, 646, 0]"] + 53["Sweep Extrusion
[625, 646, 0]"] + 54["Sweep Extrusion
[625, 646, 0]"] + 55["Sweep Extrusion
[625, 646, 0]"] + 56["Sweep Extrusion
[625, 646, 0]"] + 57["Sweep Extrusion
[625, 646, 0]"] + 58["Sweep Extrusion
[625, 646, 0]"] + 59["Sweep Extrusion
[625, 646, 0]"] + 60["Sweep Extrusion
[625, 646, 0]"] + 61["Sweep Extrusion
[625, 646, 0]"] + 62["Sweep Extrusion
[625, 646, 0]"] + 63["Sweep Extrusion
[625, 646, 0]"] + 64["StartSketchOnFace
[353, 385, 0]"] 1 --- 2 2 --- 3 2 --- 4 diff --git a/rust/kcl-lib/tests/ssi_pattern/ast.snap b/rust/kcl-lib/tests/ssi_pattern/ast.snap index 559376708..6baf5192d 100644 --- a/rust/kcl-lib/tests/ssi_pattern/ast.snap +++ b/rust/kcl-lib/tests/ssi_pattern/ast.snap @@ -258,44 +258,47 @@ description: Result of parsing ssi_pattern.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "20.4", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 20.4, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "20.4", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 20.4, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "14.61", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 14.61, + "suffix": "None" + } } - }, - { - "commentStart": 0, - "end": 0, - "raw": "14.61", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 14.61, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -305,7 +308,7 @@ description: Result of parsing ssi_pattern.kcl "name": { "commentStart": 0, "end": 0, - "name": "tangentialArcTo", + "name": "tangentialArc", "start": 0, "type": "Identifier" }, @@ -316,8 +319,9 @@ description: Result of parsing ssi_pattern.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ diff --git a/rust/kcl-lib/tests/ssi_pattern/input.kcl b/rust/kcl-lib/tests/ssi_pattern/input.kcl index f03508c12..b5872c033 100644 --- a/rust/kcl-lib/tests/ssi_pattern/input.kcl +++ b/rust/kcl-lib/tests/ssi_pattern/input.kcl @@ -2,7 +2,7 @@ sketch001 = startSketchOn('XZ') |> startProfileAt([-4.35, -12.26], %) |> yLine(length = 10.2) |> line(end = [0.54, -0.03]) - |> tangentialArcTo([20.4, 14.61], %) + |> tangentialArc(endAbsolute = [20.4, 14.61]) |> yLine(length = -26.76) |> line(endAbsolute = [profileStartX(%), profileStartY(%)], tag = $seg01) |> close() diff --git a/rust/kcl-lib/tests/ssi_pattern/program_memory.snap b/rust/kcl-lib/tests/ssi_pattern/program_memory.snap index f388be277..f547b5144 100644 --- a/rust/kcl-lib/tests/ssi_pattern/program_memory.snap +++ b/rust/kcl-lib/tests/ssi_pattern/program_memory.snap @@ -43,9 +43,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -147,9 +147,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -351,9 +351,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -552,9 +552,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -656,9 +656,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -896,9 +896,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -1000,9 +1000,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -1240,9 +1240,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -1344,9 +1344,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -1584,9 +1584,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -1688,9 +1688,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -1928,9 +1928,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -2032,9 +2032,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -2272,9 +2272,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -2376,9 +2376,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -2616,9 +2616,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -2720,9 +2720,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -2960,9 +2960,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -3064,9 +3064,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -3304,9 +3304,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -3408,9 +3408,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -3648,9 +3648,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -3752,9 +3752,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -3992,9 +3992,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -4096,9 +4096,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -4336,9 +4336,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -4440,9 +4440,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -4680,9 +4680,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -4784,9 +4784,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -5024,9 +5024,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -5128,9 +5128,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -5368,9 +5368,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -5472,9 +5472,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -5712,9 +5712,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -5816,9 +5816,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -6056,9 +6056,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -6160,9 +6160,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -6400,9 +6400,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -6504,9 +6504,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -6744,9 +6744,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -6848,9 +6848,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -7088,9 +7088,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -7192,9 +7192,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -7432,9 +7432,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -7536,9 +7536,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -7776,9 +7776,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -7880,9 +7880,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -8120,9 +8120,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -8224,9 +8224,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -8464,9 +8464,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -8568,9 +8568,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -8808,9 +8808,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -8912,9 +8912,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -9152,9 +9152,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -9256,9 +9256,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -9496,9 +9496,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -9600,9 +9600,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -9840,9 +9840,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -9944,9 +9944,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -10184,9 +10184,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -10288,9 +10288,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -10528,9 +10528,9 @@ description: Variables in memory after executing ssi_pattern.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, @@ -10632,9 +10632,9 @@ description: Variables in memory after executing ssi_pattern.kcl -12.15 ], "tag": { - "commentStart": 264, - "end": 270, - "start": 264, + "commentStart": 273, + "end": 279, + "start": 273, "type": "TagDeclarator", "value": "seg01" }, diff --git a/rust/kcl-lib/tests/ssi_pattern/unparsed.snap b/rust/kcl-lib/tests/ssi_pattern/unparsed.snap index e3384349a..839db4aab 100644 --- a/rust/kcl-lib/tests/ssi_pattern/unparsed.snap +++ b/rust/kcl-lib/tests/ssi_pattern/unparsed.snap @@ -6,7 +6,7 @@ sketch001 = startSketchOn(XZ) |> startProfileAt([-4.35, -12.26], %) |> yLine(length = 10.2) |> line(end = [0.54, -0.03]) - |> tangentialArcTo([20.4, 14.61], %) + |> tangentialArc(endAbsolute = [20.4, 14.61]) |> yLine(length = -26.76) |> line(endAbsolute = [profileStartX(%), profileStartY(%)], tag = $seg01) |> close() diff --git a/rust/kcl-lib/tests/tan_arc_x_line/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/tan_arc_x_line/artifact_graph_flowchart.snap.md index 53ed80f9a..dec0874ad 100644 --- a/rust/kcl-lib/tests/tan_arc_x_line/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/tan_arc_x_line/artifact_graph_flowchart.snap.md @@ -3,10 +3,10 @@ flowchart LR subgraph path2 [Path] 2["Path
[89, 124, 0]"] 3["Segment
[130, 178, 0]"] - 4["Segment
[184, 245, 0]"] - 5["Segment
[251, 337, 0]"] - 6["Segment
[343, 430, 0]"] - 7["Segment
[436, 458, 0]"] + 4["Segment
[184, 243, 0]"] + 5["Segment
[249, 314, 0]"] + 6["Segment
[320, 386, 0]"] + 7["Segment
[392, 414, 0]"] end 1["Plane
[64, 83, 0]"] 1 --- 2 diff --git a/rust/kcl-lib/tests/tan_arc_x_line/ast.snap b/rust/kcl-lib/tests/tan_arc_x_line/ast.snap index df0069cf9..b4ee48d1e 100644 --- a/rust/kcl-lib/tests/tan_arc_x_line/ast.snap +++ b/rust/kcl-lib/tests/tan_arc_x_line/ast.snap @@ -356,86 +356,74 @@ description: Result of parsing tan_arc_x_line.kcl { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { "commentStart": 0, "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, + "name": "angleOffset", "start": 0, - "type": "ObjectProperty", - "value": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "angleOffset", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } + "type": "Identifier" }, - { + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { "commentStart": 0, "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, + "name": "r", "start": 0, - "type": "ObjectProperty", - "value": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "r", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "TagDeclarator", - "type": "TagDeclarator", - "value": "arc1" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tag", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "arc1" + } } ], "callee": { @@ -456,112 +444,101 @@ description: Result of parsing tan_arc_x_line.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { "commentStart": 0, "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, + "name": "angleOffset", "start": 0, - "type": "ObjectProperty", + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "raw": "0.5", + "start": 0, + "type": "Literal", + "type": "Literal", "value": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "angleOffset", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "value": 0.5, + "suffix": "None" } }, - { + "operator": "*", + "right": { + "abs_path": false, "commentStart": 0, "end": 0, - "key": { + "name": { "commentStart": 0, "end": 0, - "name": "radius", + "name": "r", "start": 0, "type": "Identifier" }, + "path": [], "start": 0, - "type": "ObjectProperty", - "value": { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "raw": "0.5", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.5, - "suffix": "None" - } - }, - "operator": "*", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "r", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } }, { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "TagDeclarator", - "type": "TagDeclarator", - "value": "arc2" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tag", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "arc2" + } } ], "callee": { @@ -582,120 +559,109 @@ description: Result of parsing tan_arc_x_line.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "abs_path": false, "commentStart": 0, "end": 0, - "key": { + "name": { "commentStart": 0, "end": 0, - "name": "offset", + "name": "angleOffset", "start": 0, "type": "Identifier" }, + "path": [], "start": 0, - "type": "ObjectProperty", + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "raw": "0.5", + "start": 0, + "type": "Literal", + "type": "Literal", "value": { - "argument": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "angleOffset", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" + "value": 0.5, + "suffix": "None" } }, - { + "operator": "*", + "right": { + "abs_path": false, "commentStart": 0, "end": 0, - "key": { + "name": { "commentStart": 0, "end": 0, - "name": "radius", + "name": "r", "start": 0, "type": "Identifier" }, + "path": [], "start": 0, - "type": "ObjectProperty", - "value": { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "raw": "0.5", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.5, - "suffix": "None" - } - }, - "operator": "*", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "r", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } }, { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "TagDeclarator", - "type": "TagDeclarator", - "value": "arc3" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tag", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "arc3" + } } ], "callee": { @@ -716,8 +682,9 @@ description: Result of parsing tan_arc_x_line.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ diff --git a/rust/kcl-lib/tests/tan_arc_x_line/input.kcl b/rust/kcl-lib/tests/tan_arc_x_line/input.kcl index 28075bff9..4ac9156f4 100644 --- a/rust/kcl-lib/tests/tan_arc_x_line/input.kcl +++ b/rust/kcl-lib/tests/tan_arc_x_line/input.kcl @@ -7,13 +7,7 @@ angleStart = 110 startSketchOn('XY') |> startProfileAt([startX, startY], %) |> angledLine(angle = angleStart, length = .000001) - |> tangentialArc({ offset = angleOffset, radius = r }, %, $arc1) - |> tangentialArc({ - offset = angleOffset, - radius = 0.5 * r - }, %, $arc2) - |> tangentialArc({ - offset = -angleOffset, - radius = 0.5 * r - }, %, $arc3) + |> tangentialArc(angle = angleOffset, radius = r, tag = $arc1) + |> tangentialArc(angle = angleOffset, radius = 0.5 * r, tag = $arc2) + |> tangentialArc(angle = -angleOffset, radius = 0.5 * r, tag = $arc3) |> xLine(endAbsolute = 1) diff --git a/rust/kcl-lib/tests/tan_arc_x_line/unparsed.snap b/rust/kcl-lib/tests/tan_arc_x_line/unparsed.snap index 0d84eb7f5..492dbea93 100644 --- a/rust/kcl-lib/tests/tan_arc_x_line/unparsed.snap +++ b/rust/kcl-lib/tests/tan_arc_x_line/unparsed.snap @@ -11,13 +11,7 @@ angleStart = 110 startSketchOn(XY) |> startProfileAt([startX, startY], %) |> angledLine(angle = angleStart, length = .000001) - |> tangentialArc({ offset = angleOffset, radius = r }, %, $arc1) - |> tangentialArc({ - offset = angleOffset, - radius = 0.5 * r - }, %, $arc2) - |> tangentialArc({ - offset = -angleOffset, - radius = 0.5 * r - }, %, $arc3) + |> tangentialArc(angle = angleOffset, radius = r, tag = $arc1) + |> tangentialArc(angle = angleOffset, radius = 0.5 * r, tag = $arc2) + |> tangentialArc(angle = -angleOffset, radius = 0.5 * r, tag = $arc3) |> xLine(endAbsolute = 1) diff --git a/rust/kcl-lib/tests/tangential_arc/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/tangential_arc/artifact_graph_flowchart.snap.md index 687524d86..5d1b4055d 100644 --- a/rust/kcl-lib/tests/tangential_arc/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/tangential_arc/artifact_graph_flowchart.snap.md @@ -3,11 +3,11 @@ flowchart LR subgraph path2 [Path] 2["Path
[35, 60, 0]"] 3["Segment
[66, 85, 0]"] - 4["Segment
[91, 136, 0]"] - 5["Segment
[142, 162, 0]"] + 4["Segment
[91, 128, 0]"] + 5["Segment
[134, 154, 0]"] end 1["Plane
[12, 29, 0]"] - 6["Sweep Extrusion
[168, 188, 0]"] + 6["Sweep Extrusion
[160, 180, 0]"] 7[Wall] 8[Wall] 9[Wall] diff --git a/rust/kcl-lib/tests/tangential_arc/ast.snap b/rust/kcl-lib/tests/tangential_arc/ast.snap index 99f342c5e..262f44ded 100644 --- a/rust/kcl-lib/tests/tangential_arc/ast.snap +++ b/rust/kcl-lib/tests/tangential_arc/ast.snap @@ -194,70 +194,48 @@ description: Result of parsing tangential_arc.kcl { "arguments": [ { - "commentStart": 0, - "end": 0, - "properties": [ - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "commentStart": 0, - "end": 0, - "raw": "5", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 5.0, - "suffix": "None" - } - } - }, - { - "commentStart": 0, - "end": 0, - "key": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, - "start": 0, - "type": "ObjectProperty", - "value": { - "commentStart": 0, - "end": 0, - "raw": "90", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 90.0, - "suffix": "None" - } - } + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "5", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 5.0, + "suffix": "None" } - ], - "start": 0, - "type": "ObjectExpression", - "type": "ObjectExpression" + } }, { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "90", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 90.0, + "suffix": "None" + } + } } ], "callee": { @@ -278,8 +256,9 @@ description: Result of parsing tangential_arc.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ diff --git a/rust/kcl-lib/tests/tangential_arc/input.kcl b/rust/kcl-lib/tests/tangential_arc/input.kcl index e441b1240..66b4c0090 100644 --- a/rust/kcl-lib/tests/tangential_arc/input.kcl +++ b/rust/kcl-lib/tests/tangential_arc/input.kcl @@ -1,6 +1,6 @@ boxSketch = startSketchOn(XY) |> startProfileAt([0, 0], %) |> line(end = [0, 10]) - |> tangentialArc({ radius = 5, offset = 90 }, %) + |> tangentialArc(radius = 5, angle = 90) |> line(end = [5, -15]) |> extrude(length = 10) diff --git a/rust/kcl-lib/tests/tangential_arc/unparsed.snap b/rust/kcl-lib/tests/tangential_arc/unparsed.snap index 71a1a6cdd..f9cdd612a 100644 --- a/rust/kcl-lib/tests/tangential_arc/unparsed.snap +++ b/rust/kcl-lib/tests/tangential_arc/unparsed.snap @@ -5,6 +5,6 @@ description: Result of unparsing tangential_arc.kcl boxSketch = startSketchOn(XY) |> startProfileAt([0, 0], %) |> line(end = [0, 10]) - |> tangentialArc({ radius = 5, offset = 90 }, %) + |> tangentialArc(radius = 5, angle = 90) |> line(end = [5, -15]) |> extrude(length = 10) diff --git a/src/clientSideScene/sceneEntities.ts b/src/clientSideScene/sceneEntities.ts index 5aaaa8968..c97f4cd73 100644 --- a/src/clientSideScene/sceneEntities.ts +++ b/src/clientSideScene/sceneEntities.ts @@ -95,7 +95,7 @@ import { } from '@src/clientSideScene/segments' import type EditorManager from '@src/editor/manager' import type CodeManager from '@src/lang/codeManager' -import { ARG_END_ABSOLUTE } from '@src/lang/constants' +import { ARG_END, ARG_END_ABSOLUTE } from '@src/lang/constants' import { createArrayExpression, createCallExpressionStdLib, @@ -164,7 +164,7 @@ import type { SketchTool, } from '@src/machines/modelingMachine' -type DraftSegment = 'line' | 'tangentialArcTo' +type DraftSegment = 'line' | 'tangentialArc' type Vec3Array = [number, number, number] @@ -235,7 +235,7 @@ export class SceneEntities { segment.userData.prevSegment && segment.userData.type === TANGENTIAL_ARC_TO_SEGMENT ) { - update = segmentUtils.tangentialArcTo.update + update = segmentUtils.tangentialArc.update } if ( segment.userData && @@ -758,7 +758,7 @@ export class SceneEntities { const initSegment = segment.type === 'TangentialArcTo' - ? segmentUtils.tangentialArcTo.init + ? segmentUtils.tangentialArc.init : segment.type === 'Circle' ? segmentUtils.circle.init : segment.type === 'Arc' @@ -903,7 +903,7 @@ export class SceneEntities { forward: [number, number, number], up: [number, number, number], origin: [number, number, number], - segmentName: 'line' | 'tangentialArcTo' = 'line', + segmentName: 'line' | 'tangentialArc' = 'line', shouldTearDown = true ) => { const _ast = structuredClone(this.kclManager.ast) @@ -999,10 +999,9 @@ export class SceneEntities { variables: this.kclManager.variables, pathToNode: sketchEntryNodePath, expressions: [ - segmentName === 'tangentialArcTo' - ? createCallExpressionStdLib('tangentialArcTo', [ - originCoords, - createPipeSubstitution(), + segmentName === 'tangentialArc' + ? createCallExpressionStdLibKw('tangentialArc', null, [ + createLabeledArg(ARG_END_ABSOLUTE, originCoords), ]) : createCallExpressionStdLibKw('line', null, [ createLabeledArg(ARG_END_ABSOLUTE, originCoords), @@ -1048,11 +1047,10 @@ export class SceneEntities { // This might need to become its own function if we want more // case-based logic for different segment types if ( - (lastSegment.type === 'TangentialArcTo' && - segmentName !== 'line') || - segmentName === 'tangentialArcTo' + (lastSegment.type === 'TangentialArc' && segmentName !== 'line') || + segmentName === 'tangentialArc' ) { - resolvedFunctionName = 'tangentialArcTo' + resolvedFunctionName = 'tangentialArc' } else if (isHorizontal) { // If the angle between is 0 or 180 degrees (+/- the snapping angle), make the line an xLine resolvedFunctionName = 'xLine' @@ -3003,7 +3001,7 @@ export class SceneEntities { } let update: SegmentUtils['update'] | null = null if (type === TANGENTIAL_ARC_TO_SEGMENT) { - update = segmentUtils.tangentialArcTo.update + update = segmentUtils.tangentialArc.update } else if (type === STRAIGHT_SEGMENT) { update = segmentUtils.straight.update } else if ( @@ -3182,7 +3180,7 @@ export class SceneEntities { if (parent.name === STRAIGHT_SEGMENT) { update = segmentUtils.straight.update } else if (parent.name === TANGENTIAL_ARC_TO_SEGMENT) { - update = segmentUtils.tangentialArcTo.update + update = segmentUtils.tangentialArc.update input = { type: 'arc-segment', from: parent.userData.from, @@ -3259,7 +3257,7 @@ export class SceneEntities { if (parent.name === STRAIGHT_SEGMENT) { update = segmentUtils.straight.update } else if (parent.name === TANGENTIAL_ARC_TO_SEGMENT) { - update = segmentUtils.tangentialArcTo.update + update = segmentUtils.tangentialArc.update input = { type: 'arc-segment', from: parent.userData.from, @@ -3533,17 +3531,19 @@ function prepareTruncatedAst( if (draftSegment === 'line') { newSegment = createCallExpressionStdLibKw('line', null, [ createLabeledArg( - 'end', + ARG_END, createArrayExpression([createLiteral(0), createLiteral(0)]) ), ]) } else { - newSegment = createCallExpressionStdLib('tangentialArcTo', [ - createArrayExpression([ - createLiteral(lastSeg.to[0]), - createLiteral(lastSeg.to[1]), - ]), - createPipeSubstitution(), + newSegment = createCallExpressionStdLibKw('tangentialArc', null, [ + createLabeledArg( + ARG_END_ABSOLUTE, + createArrayExpression([ + createLiteral(lastSeg.to[0]), + createLiteral(lastSeg.to[1]), + ]) + ), ]) } ;( diff --git a/src/clientSideScene/segments.ts b/src/clientSideScene/segments.ts index 35caceb37..0f8fc6f6b 100644 --- a/src/clientSideScene/segments.ts +++ b/src/clientSideScene/segments.ts @@ -505,19 +505,19 @@ class TangentialArcToSegment implements SegmentUtils { extraSegmentGroup.visible = isHandlesVisible } - const tangentialArcToSegmentBody = group.children.find( + const tangentialArcSegmentBody = group.children.find( (child) => child.userData.type === TANGENTIAL_ARC_TO_SEGMENT_BODY ) as Mesh - if (tangentialArcToSegmentBody) { + if (tangentialArcSegmentBody) { const newGeo = createArcGeometry({ ...arcInfo, scale }) - tangentialArcToSegmentBody.geometry = newGeo + tangentialArcSegmentBody.geometry = newGeo } - const tangentialArcToSegmentBodyDashed = group.getObjectByName( + const tangentialArcSegmentBodyDashed = group.getObjectByName( TANGENTIAL_ARC_TO__SEGMENT_DASH ) - if (tangentialArcToSegmentBodyDashed instanceof Mesh) { - tangentialArcToSegmentBodyDashed.geometry = createArcGeometry({ + if (tangentialArcSegmentBodyDashed instanceof Mesh) { + tangentialArcSegmentBodyDashed.geometry = createArcGeometry({ ...arcInfo, isDashed: true, scale, @@ -2091,7 +2091,7 @@ function updateAngleIndicator( export const segmentUtils = { straight: new StraightSegment(), - tangentialArcTo: new TangentialArcToSegment(), + tangentialArc: new TangentialArcToSegment(), circle: new CircleSegment(), circleThreePoint: new CircleThreePointSegment(), arc: new ArcSegment(), diff --git a/src/lang/langHelpers.ts b/src/lang/langHelpers.ts index b76ed1f22..bfa4b4aa7 100644 --- a/src/lang/langHelpers.ts +++ b/src/lang/langHelpers.ts @@ -22,7 +22,7 @@ export type ToolTip = | 'xLineTo' | 'yLineTo' | 'angledLineThatIntersects' - | 'tangentialArcTo' + | 'tangentialArc' | 'circle' | 'circleThreePoint' | 'arcTo' @@ -41,7 +41,7 @@ export const toolTips: Array = [ 'xLineTo', 'yLineTo', 'angledLineThatIntersects', - 'tangentialArcTo', + 'tangentialArc', 'circleThreePoint', 'arc', 'arcTo', diff --git a/src/lang/modifyAst.test.ts b/src/lang/modifyAst.test.ts index 7a75a0fcc..dbf26aecc 100644 --- a/src/lang/modifyAst.test.ts +++ b/src/lang/modifyAst.test.ts @@ -688,7 +688,7 @@ describe('Testing removeSingleConstraintInfo', () => { intersectTag = a, offset = 0 + 0 }, %) - |> tangentialArcTo([3.14 + 0, 13.14 + 0], %)` + |> tangentialArc(endAbsolute = [3.14 + 0, 13.14 + 0])` test.each([ [' line(end = [3 + 0, 4])', 'arrayIndex', 1, ''], [ @@ -736,7 +736,12 @@ describe('Testing removeSingleConstraintInfo', () => { 'offset', '', ], - ['tangentialArcTo([3.14 + 0, 13.14], %)', 'arrayIndex', 1, ''], + [ + 'tangentialArc(endAbsolute = [3.14 + 0, 13.14])', + 'labeledArg', + 'endAbsolute', + '', + ], ] as const)( 'stdlib fn: %s', async (expectedFinish, key, value, commentLabel) => { diff --git a/src/lang/std/sketch.test.ts b/src/lang/std/sketch.test.ts index 2f420cd5d..931c4c847 100644 --- a/src/lang/std/sketch.test.ts +++ b/src/lang/std/sketch.test.ts @@ -334,7 +334,7 @@ describe('testing getConstraintInfo', () => { intersectTag = a, offset = 0 }, %) - |> tangentialArcTo([3.14, 13.14], %)` + |> tangentialArc(endAbsolute = [3.14, 13.14])` test.each([ [ 'line', @@ -625,16 +625,16 @@ describe('testing getConstraintInfo', () => { ], ], [ - 'tangentialArcTo', + 'tangentialArc', [ { type: 'tangentialWithPrevious', isConstrained: true, - value: 'tangentialArcTo', + value: 'tangentialArc', sourceRange: [expect.any(Number), expect.any(Number), 0], argPosition: undefined, pathToNode: expect.any(Array), - stdLibFnName: 'tangentialArcTo', + stdLibFnName: 'tangentialArc', }, { type: 'xAbsolute', @@ -643,7 +643,7 @@ describe('testing getConstraintInfo', () => { sourceRange: [expect.any(Number), expect.any(Number), 0], argPosition: { type: 'arrayItem', index: 0 }, pathToNode: expect.any(Array), - stdLibFnName: 'tangentialArcTo', + stdLibFnName: 'tangentialArc', }, { type: 'yAbsolute', @@ -652,7 +652,7 @@ describe('testing getConstraintInfo', () => { sourceRange: [expect.any(Number), expect.any(Number), 0], argPosition: { type: 'arrayItem', index: 1 }, pathToNode: expect.any(Array), - stdLibFnName: 'tangentialArcTo', + stdLibFnName: 'tangentialArc', }, ], ], @@ -700,7 +700,7 @@ describe('testing getConstraintInfo', () => { intersectTag = a, offset = 0 }, %) - |> tangentialArcTo([3.14, 13.14], %)` + |> tangentialArc(endAbsolute = [3.14, 13.14])` test.each([ [ `angledLine.* length = `, @@ -861,7 +861,7 @@ describe('testing getConstraintInfo', () => { intersectTag = a, offset = 0 + 0 }, %) - |> tangentialArcTo([3.14 + 0, 13.14 + 0], %)` + |> tangentialArc(endAbsolute = [3.14 + 0, 13.14 + 0])` test.each([ [ 'line', @@ -1149,16 +1149,16 @@ describe('testing getConstraintInfo', () => { ], ], [ - 'tangentialArcTo', + 'tangentialArc', [ { type: 'tangentialWithPrevious', isConstrained: true, - value: 'tangentialArcTo', + value: 'tangentialArc', sourceRange: [expect.any(Number), expect.any(Number), 0], argPosition: undefined, pathToNode: expect.any(Array), - stdLibFnName: 'tangentialArcTo', + stdLibFnName: 'tangentialArc', }, { type: 'xAbsolute', @@ -1167,7 +1167,7 @@ describe('testing getConstraintInfo', () => { sourceRange: [expect.any(Number), expect.any(Number), 0], argPosition: { type: 'arrayItem', index: 0 }, pathToNode: expect.any(Array), - stdLibFnName: 'tangentialArcTo', + stdLibFnName: 'tangentialArc', }, { type: 'yAbsolute', @@ -1176,7 +1176,7 @@ describe('testing getConstraintInfo', () => { sourceRange: [expect.any(Number), expect.any(Number), 0], argPosition: { type: 'arrayItem', index: 1 }, pathToNode: expect.any(Array), - stdLibFnName: 'tangentialArcTo', + stdLibFnName: 'tangentialArc', }, ], ], diff --git a/src/lang/std/sketch.ts b/src/lang/std/sketch.ts index 4003f3e6c..b0847fab0 100644 --- a/src/lang/std/sketch.ts +++ b/src/lang/std/sketch.ts @@ -1017,13 +1017,13 @@ export const yLine: SketchLineHelperKw = { ), } -export const tangentialArcTo: SketchLineHelper = { +export const tangentialArc: SketchLineHelperKw = { add: ({ node, pathToNode, segmentInput, replaceExistingCallback }) => { if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR const { to } = segmentInput const _node = { ...node } const getNode = getNodeFromPathCurry(_node, pathToNode) - const _node1 = getNode('PipeExpression') + const _node1 = getNode('PipeExpression') if (err(_node1)) return _node1 const { node: pipe } = _node1 const _node2 = getNodeFromPath( @@ -1037,13 +1037,13 @@ export const tangentialArcTo: SketchLineHelper = { const toX = createLiteral(roundOff(to[0], 2)) const toY = createLiteral(roundOff(to[1], 2)) - if (replaceExistingCallback && pipe.type !== 'CallExpression') { + if (replaceExistingCallback && pipe.type !== 'CallExpressionKw') { const { index: callIndex } = splitPathAtPipeExpression(pathToNode) const result = replaceExistingCallback([ { type: 'arrayItem', index: 0, - argType: 'xRelative', + argType: 'xAbsolute', expr: toX, }, { @@ -1062,10 +1062,11 @@ export const tangentialArcTo: SketchLineHelper = { valueUsedInTransform, } } - const newLine = createCallExpression('tangentialArcTo', [ - createArrayExpression([toX, toY]), - createPipeSubstitution(), - ]) + const newLine = createCallExpressionStdLibKw( + 'tangentialArc', + null, // Assumes this is being called in a pipeline, so the first arg is optional and if not given, will become pipeline substitution. + [createLabeledArg(ARG_END_ABSOLUTE, createArrayExpression([toX, toY]))] + ) if (pipe.type === 'PipeExpression') { pipe.body = [...pipe.body, newLine] return { @@ -1091,69 +1092,134 @@ export const tangentialArcTo: SketchLineHelper = { if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR const { to } = input const _node = { ...node } - const nodeMeta = getNodeFromPath(_node, pathToNode) + const nodeMeta = getNodeFromPath(_node, pathToNode) if (err(nodeMeta)) return nodeMeta const { node: callExpression } = nodeMeta - const x = createLiteral(roundOff(to[0], 2)) - const y = createLiteral(roundOff(to[1], 2)) - const firstArg = callExpression.arguments?.[0] - if (!mutateArrExp(firstArg, createArrayExpression([x, y]))) { - mutateObjExpProp(firstArg, createArrayExpression([x, y]), 'to') + if (callExpression.type !== 'CallExpressionKw') { + return new Error( + `Expected CallExpressionKw, but found ${callExpression.type}` + ) } + + for (const arg of callExpression.arguments) { + if (arg.label.name !== ARG_END_ABSOLUTE && arg.label.name !== ARG_TAG) { + console.debug( + 'Trying to edit unsupported tangentialArc keyword arguments; skipping' + ) + return { + modifiedAst: _node, + pathToNode, + } + } + } + + const toArrExp = createArrayExpression([ + createLiteral(roundOff(to[0], 2)), + createLiteral(roundOff(to[1], 2)), + ]) + + mutateKwArg(ARG_END_ABSOLUTE, callExpression, toArrExp) return { modifiedAst: _node, pathToNode, } }, - getTag: getTag(), - addTag: addTag(), - getConstraintInfo: (callExp: CallExpression, code, pathToNode) => { - if (callExp.type !== 'CallExpression') return [] - const firstArg = callExp.arguments?.[0] - if (firstArg.type !== 'ArrayExpression') return [] + getTag: getTagKwArg(), + addTag: addTagKw(), + getConstraintInfo: (callExp: CallExpressionKw, code, pathToNode) => { + if (callExp.type !== 'CallExpressionKw') return [] + if (callExp.callee.name.name !== 'tangentialArc') return [] const callee = callExp.callee const pathToCallee: PathToNode = [ ...pathToNode, - ['callee', 'CallExpression'], + ['callee', 'CallExpressionKw'], ] - const pathToArrayExpression: PathToNode = [ - ...pathToNode, - ['arguments', 'CallExpression'], - [0, 'index'], - ['elements', 'ArrayExpression'], - ] - const pathToFirstArg: PathToNode = [...pathToArrayExpression, [0, 'index']] - const pathToSecondArg: PathToNode = [...pathToArrayExpression, [1, 'index']] - return [ + const endAbsoluteArg = findKwArgWithIndex(ARG_END_ABSOLUTE, callExp) + + const constraints: ConstrainInfo[] = [ constrainInfo( 'tangentialWithPrevious', true, callee.name.name, - 'tangentialArcTo', + 'tangentialArc', undefined, topLevelRange(callee.start, callee.end), pathToCallee ), - constrainInfo( - 'xAbsolute', - isNotLiteralArrayOrStatic(firstArg.elements[0]), - code.slice(firstArg.elements[0].start, firstArg.elements[0].end), - 'tangentialArcTo', - 0, - topLevelRange(firstArg.elements[0].start, firstArg.elements[0].end), - pathToFirstArg - ), - constrainInfo( - 'yAbsolute', - isNotLiteralArrayOrStatic(firstArg.elements[1]), - code.slice(firstArg.elements[1].start, firstArg.elements[1].end), - 'tangentialArcTo', - 1, - topLevelRange(firstArg.elements[1].start, firstArg.elements[1].end), - pathToSecondArg - ), ] + if (endAbsoluteArg) { + const { expr, argIndex } = endAbsoluteArg + const pathToArgs: PathToNode = [ + ...pathToNode, + ['arguments', 'CallExpressionKw'], + ] + const pathToArg: PathToNode = [ + ...pathToArgs, + [argIndex, ARG_INDEX_FIELD], + ['arg', LABELED_ARG_FIELD], + ] + if (expr.type !== 'ArrayExpression' || expr.elements.length < 2) { + constraints.push( + constrainInfo( + 'xAbsolute', + isNotLiteralArrayOrStatic(expr), + code.slice(expr.start, expr.end), + 'tangentialArc', + 0, + topLevelRange(expr.start, expr.end), + pathToArg + ) + ) + constraints.push( + constrainInfo( + 'yAbsolute', + isNotLiteralArrayOrStatic(expr), + code.slice(expr.start, expr.end), + 'tangentialArc', + 1, + topLevelRange(expr.start, expr.end), + pathToArg + ) + ) + return constraints + } + const pathToX: PathToNode = [ + ...pathToArg, + ['elements', 'ArrayExpression'], + [0, 'index'], + ] + const pathToY: PathToNode = [ + ...pathToArg, + ['elements', 'ArrayExpression'], + [1, 'index'], + ] + const exprX = expr.elements[0] + const exprY = expr.elements[1] + constraints.push( + constrainInfo( + 'xAbsolute', + isNotLiteralArrayOrStatic(exprX), + code.slice(exprX.start, exprX.end), + 'tangentialArc', + 0, + topLevelRange(exprX.start, exprX.end), + pathToX + ) + ) + constraints.push( + constrainInfo( + 'yAbsolute', + isNotLiteralArrayOrStatic(exprY), + code.slice(exprY.start, exprY.end), + 'tangentialArc', + 1, + topLevelRange(exprY.start, exprY.end), + pathToY + ) + ) + } + return constraints }, } export const circle: SketchLineHelperKw = { @@ -2999,7 +3065,6 @@ export const updateStartProfileAtArgs: SketchLineHelper['updateArgs'] = ({ export const sketchLineHelperMap: { [key: string]: SketchLineHelper } = { angledLineThatIntersects, - tangentialArcTo, arc, arcTo, } as const @@ -3018,6 +3083,7 @@ export const sketchLineHelperMapKw: { [key: string]: SketchLineHelperKw } = { angledLineOfYLength, angledLineToX, angledLineToY, + tangentialArc, } as const export function changeSketchArguments( @@ -3109,6 +3175,7 @@ export function fnNameToTooltip( return isAbsolute ? 'yLineTo' : 'yLine' case 'circleThreePoint': case 'circle': + case 'tangentialArc': return fnName case 'angledLine': { const argmap: Record = { @@ -3858,6 +3925,7 @@ export function isAbsoluteLine(lineCall: CallExpressionKw): boolean | Error { const name = lineCall?.callee?.name.name switch (name) { case 'line': + case 'tangentialArc': if (findKwArg(ARG_END, lineCall) !== undefined) { return false } @@ -3865,7 +3933,7 @@ export function isAbsoluteLine(lineCall: CallExpressionKw): boolean | Error { return true } return new Error( - `line call has neither ${ARG_END} nor ${ARG_END_ABSOLUTE} params` + `${name} call has neither ${ARG_END} nor ${ARG_END_ABSOLUTE} params` ) case 'xLine': case 'yLine': @@ -3974,7 +4042,7 @@ export function getFirstArg(callExp: CallExpression): if (['angledLineThatIntersects'].includes(name)) { return getAngledLineThatIntersects(callExp) } - if (['tangentialArcTo'].includes(name)) { + if (['tangentialArc'].includes(name)) { // TODO probably needs it's own implementation return getFirstArgValuesForXYFns(callExp) } diff --git a/src/lang/std/sketchcombos.test.ts b/src/lang/std/sketchcombos.test.ts index 59465d1cc..634dc8aee 100644 --- a/src/lang/std/sketchcombos.test.ts +++ b/src/lang/std/sketchcombos.test.ts @@ -624,7 +624,7 @@ async function helperThing( } describe('testing getConstraintLevelFromSourceRange', () => { - it('should divide up lines into free, partial and fully contrained', () => { + it('should divide up lines into free, partial and fully constrained', () => { const code = `baseLength = 3 baseThick = 1 armThick = 0.5 diff --git a/src/lang/std/sketchcombos.ts b/src/lang/std/sketchcombos.ts index 113fd4125..d436f7f99 100644 --- a/src/lang/std/sketchcombos.ts +++ b/src/lang/std/sketchcombos.ts @@ -74,7 +74,7 @@ import type { } from '@src/lang/wasm' import { sketchFromKclValue } from '@src/lang/wasm' import type { Selections } from '@src/lib/selections' -import { cleanErrs, err, isNotErr } from '@src/lib/trap' +import { cleanErrs, err, isErr, isNotErr } from '@src/lib/trap' import { allLabels, getAngle, @@ -1502,7 +1502,7 @@ export function removeSingleConstraint({ const toReplace = inputToReplace.key let argsPreFilter = inputs.map((arg) => { if (arg.type !== 'labeledArg') { - return undefined + return new Error(`arg isn't a labeled arg: ${arg.type}`) } const k = arg.key if (k !== toReplace) { @@ -1519,12 +1519,11 @@ export function removeSingleConstraint({ return createLabeledArg(k, rawArgVersion.expr) } }) - const args = argsPreFilter - .filter((arg) => arg !== undefined) - .filter(isNotErr) - if (args.length !== argsPreFilter.length) { + const args = argsPreFilter.filter(isNotErr) + const errorArgs = argsPreFilter.filter(isErr) + if (errorArgs.length > 0) { return new Error('Error while trying to remove constraint', { - cause: argsPreFilter, + cause: errorArgs, }) } const noncode = callExp.node.nonCodeMeta diff --git a/src/lang/std/stdTypes.ts b/src/lang/std/stdTypes.ts index fb0718b50..a72b2c16c 100644 --- a/src/lang/std/stdTypes.ts +++ b/src/lang/std/stdTypes.ts @@ -1,6 +1,7 @@ import type { Node } from '@rust/kcl-lib/bindings/Node' import type { + ARG_END_ABSOLUTE, ARG_END_ABSOLUTE_X, ARG_END_ABSOLUTE_Y, ARG_LENGTH, @@ -36,7 +37,7 @@ export interface AddTagInfo { /** Inputs for all straight segments, to and from are absolute values, as this gives a * consistent base that can be converted to all of the line, angledLine, etc segment types - * One notable exception to "straight segment" is that tangentialArcTo is included in this + * One notable exception to "straight segment" is that tangentialArc is included in this * Input type since it too only takes x-y values and is able to get extra info it needs * to be tangential from the previous segment */ interface StraightSegmentInput { @@ -45,8 +46,8 @@ interface StraightSegmentInput { to: [number, number] } -/** Inputs for arcs, excluding tangentialArcTo for reasons explain in - * the @straightSegmentInput comment */ +/** Inputs for arcs, excluding tangentialArc for reasons explain in the + * @straightSegmentInput comment */ interface ArcSegmentInput { type: 'arc-segment' from: [number, number] @@ -109,6 +110,7 @@ export type InputArgKeys = | 'p3' | 'end' | 'interior' + | typeof ARG_END_ABSOLUTE | typeof ARG_END_ABSOLUTE_X | typeof ARG_END_ABSOLUTE_Y | typeof ARG_LENGTH_X @@ -208,7 +210,7 @@ export type SimplifiedArgDetails = | Omit, 'expr' | 'argType'> /** - * Represents the result of creating a sketch expression (line, tangentialArcTo, angledLine, circle, etc.). + * Represents the result of creating a sketch expression (line, tangentialArc, angledLine, circle, etc.). * * @property {Expr} callExp - This is the main result; recasting the expression should give the user the new function call. * @property {number} [valueUsedInTransform] - Aside from `callExp`, we also return the number used in the transform, which is useful for constraints. diff --git a/src/lib/trap.ts b/src/lib/trap.ts index 13114fc76..963c8276f 100644 --- a/src/lib/trap.ts +++ b/src/lib/trap.ts @@ -25,10 +25,7 @@ export function isNotErr( return !(value instanceof Error) } -/** - * This is intentionally *not* exported due to misuse. We'd like to add a lint. - */ -function isErr(value: ExcludeErr | Error): value is Error { +export function isErr(value: ExcludeErr | Error): value is Error { return value instanceof Error } diff --git a/src/machines/modelingMachine.ts b/src/machines/modelingMachine.ts index 15e90f05b..f014a0d3a 100644 --- a/src/machines/modelingMachine.ts +++ b/src/machines/modelingMachine.ts @@ -829,7 +829,7 @@ export const modelingMachine = setup({ sketchDetails.zAxis, sketchDetails.yAxis, sketchDetails.origin, - 'tangentialArcTo' + 'tangentialArc' ) .then(() => { return codeManager.updateEditorWithAstAndWriteToFile(kclManager.ast)