diff --git a/docs/kcl/appearance.md b/docs/kcl/appearance.md index b6d1a4911..3d56d283a 100644 --- a/docs/kcl/appearance.md +++ b/docs/kcl/appearance.md @@ -198,7 +198,7 @@ pipeHole = startSketchOn(XY) sweepSketch = startSketchOn(XY) |> circle(center = [0, 0], radius = 2) - |> hole(pipeHole, %) + |> subtract2d(tool = pipeHole) |> sweep(path = sweepPath) |> appearance(color = "#ff0000", metalness = 50, roughness = 50) ``` diff --git a/docs/kcl/hole.md b/docs/kcl/hole.md deleted file mode 100644 index dcb940db2..000000000 --- a/docs/kcl/hole.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: "hole" -excerpt: "Use a 2-dimensional sketch to cut a hole in another 2-dimensional sketch." -layout: manual ---- - -Use a 2-dimensional sketch to cut a hole in another 2-dimensional sketch. - - - -```js -hole( - holeSketch: [Sketch], - sketch: Sketch, -): Sketch -``` - - -### Arguments - -| Name | Type | Description | Required | -|----------|------|-------------|----------| -| `holeSketch` | [`[Sketch]`](/docs/kcl/types/Sketch) | | Yes | -| `sketch` | [`Sketch`](/docs/kcl/types/Sketch) | | Yes | - -### Returns - -[`Sketch`](/docs/kcl/types/Sketch) - - -### Examples - -```js -exampleSketch = startSketchOn(XY) - |> startProfile(at = [0, 0]) - |> line(end = [0, 5]) - |> line(end = [5, 0]) - |> line(end = [0, -5]) - |> close() - |> hole(circle(center = [1, 1], radius = .25), %) - |> hole(circle(center = [1, 4], radius = .25), %) - -example = extrude(exampleSketch, length = 1) -``` - -![Rendered example of hole 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAFGDElEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+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+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVbzO67zOe3PVVVddddX/Of/wD//w2/fdd9+tXHXVVVddddX/X1Suuuqqq6666v+xF3uxF3vtd3qnd/qsF3uxF3ttrrrqqquu+j/nt37rt777vvvuu/VHf/RHP4errrrqqquu+v+JylVXXXXVVVf9P3XNNdc8+HM/93N/C+C7vuu7OH/+PFddddX/HLa56l9mm//rbPNv8ehHP5q3equ3eu/77rvv1t/+7d/+nvvuu+9Wrrrqqquuuur/HypXXXXVVVdd9f/Uh3/4h38XwBOf+ET+6I/+iKuu+vewzVX/s9jmqudlm/+rbPNAT3ziEzl9+jSv9mqv9uAP//AP/67P/MzPfB2uuuqqq6666v8fgquuuuqqq676f+h1Xud13vvFXuzFXhvgK77iK7jqqn8vSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQxFUvnCQkIQlJSEISkpCEJCQhCUlIQhKS+L9MEpKQhCQkIQlJSEISkpDE/zaSkIQkJCGJn/3ZnwXgxV7sxV77dV7ndd6bq6666qqrrvr/h3L8+HGuuuqqq6666v+br/iKr/grgC//8i/n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yYB4TgbEczIgnpMB8ZwMiOdkQDwnA+I5GRDPyYB4TgbEczIgnpMB8ZwMiOdkQDwnA+I5GRDPyYB4TgbEczIgnpMB8ZwMiOdkQDwnA+I5GRDPyYB4TgbEczIgnpMB8ZwMiOdkQDwnA+I5GRDPyYB4TgbEczIgnpMB8ZwMiOdkQDwnA+I5GRDPyYB4TgbEczIgnpMB8ZwMiOdkQDwnA+I5GRDPyYB4TgbEczIgnpMB8ZwMiOdkQDwnA+I5GRDPyYB4TgbEczIgnpMB8ZwMiOdkQDwnA+I5GRDPyYB4TgbEczIgnpMB8ZwMiOdkQDwnA+I5GRAPcN999z397Nmzz+Cqq6666qr/TOhBD3oQV1111VVXXXXVVVddddVVV1111VVXXXXV/0lUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/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/in8EH5x+45Z90OkAAAAASUVORK5CYII=) - -```js -fn squareHoleSketch() { - squareSketch = startSketchOn(-XZ) - |> startProfile(at = [-1, -1]) - |> line(end = [2, 0]) - |> line(end = [0, 2]) - |> line(end = [-2, 0]) - |> close() - return squareSketch -} - -exampleSketch = startSketchOn(-XZ) - |> circle(center = [0, 0], radius = 3) - |> hole(squareHoleSketch(), %) -example = extrude(exampleSketch, length = 1) -``` - -![Rendered example of hole 1](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAD0gUlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+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+r6Jy1VVXXXXVVVddddX/atdcc82DAc6cOfNgnumaa655MP8G9913360809mzZ28FuO+++27lqquuuuqqq6666qr/rahcddVVV1111VVXXfU/yjXXXPNggDNnzjz4mmuuefCZM2ceBPDiL/7irw1w5syZB19zzTUP5gW4ePEiL8ju7i7P7fjx49zvxIkT3O++++679Zprrnkwz3TffffdCnD27Nlb77vvvlsB7rvvvlvPnj37jPvuu+9WgH/4h3/4ba666qqrrrrqqquu+p8EPehBD+Kqq6666qqrrrrqqv9a11xzzYPPnDnz4Bd7sRd7LYAXf/EXf22AF3uxF3ttnulJT3rSrWfOnHnw7u4uFy9e5OLFiwDs7u5y8eJF7re7u8vFixf5z3DixAkAjh07xokTJwA4ceIEJ06cAOD48eMAnDhxghMnTgBw33333Qpw9uzZW++7775b/+Ef/uF37rvvvlvPnj1763333XcrV1111VVXXXXVVVf9V0IPetCDuOqqq6666qqrrrrqP8c111zz4DNnzjz4xV7sxV7rmmuuefA111zz4Bd7sRd7bYCLFy8C8PSnP52LFy+yu7vLxYsX2d3d5eLFi/xPZpvnduLECQCOHz/OiRMneOhDHwrA8ePHeehDHwrAfffddyvAb/3Wb303wNmzZ5/xD//wD79933333cpVV1111VVXXXXVVf8Z0IMe9CCuuuqqq6666qqrrvr3u+aaax78Yi/2Yq995syZB734i7/4a7/Yi73YawNcvHiRixcv8vSnPx2Apz/96Tz96U/n/xLb/EtOnDjB8ePHOXHiBA996EM5fvw4D33oQwG47777bj179uyt9913363/8A//8Dv33Xffrf/wD//w21x11VVXXXXVVVdd9e+FHvSgB3HVVVddddVVV1111b/ONddc8+AzZ848+MVe7MVe68Vf/MVf+8Ve7MVeG+DixYtcvHiRpz/96TztaU/j6U9/OpL4/8Q2/xonTpzg+PHjnDhxgoc85CGcOHGChz70odx33323nj179tb77rvv1t/6rd/6nn/4h3/4ba666qqrrrrqqquu+tdCD3rQg7jqqquuuuqqq6666oW75pprHnzmzJkHv9iLvdhrvfiLv/hrv9iLvdhrX7x4kYsXL/L0pz+dpz3taTz96U/nfpL4rySJF4Vt/ivZ5l/LNidOnOChD30ox48f56EPfSgPfehDAbjvvvtu/Yd/+Iff/od/+Iff+a3f+q3v5qqrrrrqqquuuuqqfwl60IMexFVXXXXVVVddddVVz+uaa6558Gu/9mu/14u/+Iu/9ou92Iu99sWLF7l48SJPf/rTedrTnsbTn/50npsk/qNJ4r+Sbf6j2eZfwzYPdOLECQA2NjZ4lVd5FU6cOMFDH/pQ7rvvvlv/4R/+4bd/67d+63v+4R/+4be56qqrrrrqqquuuuq5oQc96EFcddVVV1111VVXXQXXXHPNg1/7tV/7vV78xV/8tV/sxV7stS9evMjFixd5+tOfztOe9jSe/vSn8/xI4j+CJP6nss1/FNu8qGzzgpw4cYKHPvShvOzLviwPfehDue+++249e/bsrb/1W7/1Pffdd9+t//AP//DbXHXVVVddddVVV12FHvSgB3HVVVddddVVV131/9U111zz4Nd+7dd+r9d5ndd572uuuebBFy9e5C//8i952tOextOf/nReGEn8e0jifyvb/HvZ5kVlmxfmxIkTHD9+nIc+9KE89KEP5aEPfSj33Xffrb/1W7/13f/wD//wO//wD//w21x11VVXXXXVVVf9/4Qe9KAHcdVVV1111VVXXfX/yTXXXPPg137t136vd3qnd/psgIsXL/IXf/EX/NVf/RUXL17kXyKJfytJ/F9km38r27yobPPC2AbgxIkTPPShD+WhD30oL/dyL8d999136z/8wz/89m/91m99zz/8wz/8NlddddVVV1111VX/f6AHPehBXHXVVVddddVVV/1fd8011zz4tV/7td/rnd7pnT774sWL/MVf/AUAv/Ebv4EkXhSS+LeQxP8ntvm3sM2Lwjb/Etvc78SJEzz0oQ/loQ99KC/3ci/Hfffdd+s//MM//PZv/dZvfc8//MM//DZXXXXVVVddddVV/7ehBz3oQVx11VVXXXXVVVf9X3TNNdc8+LVf+7Xf653e6Z0+G+BpT3saf/mXf8lf/MVfACCJF4Uk/rUk8V9JEi8K2/xXss2/lm1eFLZ5YWzz3E6cOMFDH/pQHvrQh/JyL/dy3Hfffbf+1m/91nf/wz/8w+/8wz/8w29z1VVXXXXVVVdd9X8PetCDHsRVV1111VVXXXXV/xXXXHPNg1/7tV/7vV7ndV7nva+55poHX7x4kb/4i7/gN37jN3ggSfxLJPGvIYn/aJL4r2ab/wy2+dewzYvCNi+MbZ6f48eP89CHPpSHPexhvNzLvRz33Xffrb/1W7/13T/6oz/6OVx11VVXXXXVVVf934Ee9KAHcdVVV1111VVXXfW/3TXXXPPg137t136vd3qnd/rsixcv8hd/8Rf85V/+JRcvXuSBJPEvkcS/hiT+I0jifzLb/Eewzb+Gbf4ltnlhbPP82AbgxIkTvNzLvRwv//IvzziOt/7DP/zDb//Wb/3W9/zDP/zDb3PVVVddddVVV131vxt60IMexFVXXXXVVVddddX/Rtdcc82DX/u1X/u9Xud1Xue9u6578F/8xV/wl3/5l1y8eJHnRxL/Ekm8KCTx7yWJ/81s8+9lmxeVbf4ltnlBbPOC2OZ+D33oQ3n5l395Xu7lXo777rvv1t/6rd/67h/90R/9HK666qqrrrrqqqv+d0IPetCDuOqqq6666qqrrvrf5Jprrnnwa7/2a7/XO73TO332xYsX+Yu/+At+/dd/HUm8IJJ4YSTxopDEv5Uk/q2OHz8OwIkTJwA4fvw4x48f534nTpwA4Pjx4zw/J06c4AW5ePEiD7S7u8sDXbx4kd3dXe63u7vLxYsX2d3d5YFs829lmxeVbV4Y27wgtnlBbPNAJ06c4KEPfSgv93Ivx/b29q3/8A//8Nu/9Vu/9T3/8A//8NtcddVVV1111VVX/e+BHvSgB3HVVVddddVVV131v8GLvdiLvfaHf/iHf9c111zz4IsXL/Lrv/7r/MVf/AWSeEEk8cJI4kUhiX8LSfxLjh8/zokTJzh+/DjHjx8H4CEPeQgAJ06c4Pjx4/xPtru7C8DFixfZ3d3l4sWLXLx4kd3dXS5evMju7i4vKtu8KGzzL7HNC2Kb58c2z8/x48d5gzd4A17+5V+e++6779Yf/dEf/Zzf+q3f+m6uuuqqq6666qqr/udDD3rQg7jqqquuuuqqq676n+wd3/EdP+t1Xud13rvrugf/xV/8BX/xF3/BxYsXAZDECyKJF0YS/xJJ/GtJ4rkdP36cEydO8OAHPxiAhzzkITzkIQ/hRTUMAwDjOAIwDAPjOHK/YRgAGMeR5zYMAy9M3/c8UNd1PFDf93RdB0Df9wB0XUff97yoLl68yO7uLhcvXuTpT386u7u7XLx4kd3dXZ4f27wobPPC2OYFsc3zY5vnxzYnTpzg5V/+5XmDN3gD7rvvvlt/67d+67t/9Ed/9HO46qqrrrrqqquu+p8LPehBD+Kqq6666qqrrrrqf5prrrnmwa/92q/9Xu/0Tu/02RcvXuQv/uIv+PVf/3UeSBLPjyReGEn8SyTxryWJ48ePc+LECR784Adz4sQJjh8/zkMe8hBemGEYGMeRYRgYhgGAw8NDAMZxZBgG/r0k8Z+l6zoANjc3Aei6jr7v6fueruvo+54X5OLFiwA8/elP5+lPfzq7u7tcvHiR3d1dAGzzorDNC2Ob58c2z49tnh/bAJw4cYKXf/mX5+Vf/uUZx/HW3/qt3/ruH/3RH/0crrrqqquuuuqqq/7nQQ960IO46qqrrrrqqquu+p/immuuefCLvdiLvfaHf/iHf9fFixf5i7/4C37913+d5yaJ50cSL4wk/iWSeFEcP36chz70oRw/fpyHPOQhPOQhD+EFGYaBYRg4PDwE4ODggHEcGYaBF0YS/9v1fQ9A13X0fc/m5iZ939N1HX3f8/xcvHiR3d1dLl68yNOf/nSe/vSnc/HiRV4Y27wwtnlBbPPcbPP82OZ+J06c4KEPfSgv//Ivz/b29q2/9Vu/9d2//du//T333XffrVx11VVXXXXVVVf9z4Ae9KAHcdVVV1111VVXXfXf7Zprrnnwa7/2a7/XO73TO332xYsX+bVf+zX+8i//kudHEs+PJF4QSfxLJPHCHD9+nJd92ZflIQ95CA95yEN4foZhYBgGDg4OADg8POTg4IDnJon/CJL436zve2yzubnJ1tYWXdextbXF83Px4kWe/vSn8/SnP52LFy/y9Kc/nefHNi+IbV4Q2zw/tnlutnkg25w4cYJ3eqd3Ynt7+9bf+q3f+u7f/u3f/p777rvvVq666qqrrrrqqqv+e6EHPehBXHXVVVddddVVV/13ueaaax782q/92u/1Tu/0Tp998eJFfu3Xfo2/+Iu/QBLPTRIviCReEEm8MJJ4fh7ykIfwkIc8hIc85CE85CEP4bkNw8AwDBwcHHBwcMDBwQH3k8S/hST+M0jiv5Jt/j36vmdzc5O+79nc3GRra4vndvHiRXZ3d7l48SJ/+Zd/ydOf/nTuZ5sXxjbPj22eH9s8N9s8kG0ATpw4wTu90zuxvb1962/91m9994/+6I9+DlddddVVV1111VX/fdCDHvQgrrrqqquuuuqqq/6rXXPNNQ9+7dd+7fd6p3d6p8++ePEiP/qjP8rTnvY0ACTx3CTx/EjiBZHECyOJBzp+/Dgv+7Ivy0Me8hAe8pCH8NyGYeD8+fMAXLhwgXEc+deQxL+VJP6/sg1A3/dsbW2xublJ3/dsbW3xQBcvXmR3d5enPe1pPP3pT+fpT386tnlBbPP82Ob5sc1zs80D2eZ+L//yL8/Lv/zLs729fetv/dZvffeP/uiPfg5XXXXVVVddddVV//XQgx70IK666qqrrrrqqqv+K73jO77jZ73TO73TZ1+8eJEf/dEf5WlPexr3k8Rzk8TzI4kXRBIvjCSOHz/Oy77sywLwuq/7ujy3YRg4f/48BwcHHBwc8C+RxL+GJP4jSOJ/M9v8W/R9T9/3bG5usrW1xdbWFg908eJFnv70p/O0pz2Npz/96Vy8eJHnZpvnxzbPj22em20eyDYP9HIv93K8wiu8Atvb27f+1m/91nf/6I/+6Odw1VVXXXXVVVdd9V8HPehBD+Kqq6666qqrrrrqv8KLvdiLvfaHf/iHf1fXdQ/+8z//c37913+dB5LEc5PE8yOJ50cSL8yJEyd42Zd9WR7ykIfwkIc8hAcahoHz58+zv7/PwcEBz48kXlSS+LeQxH8mSfxns81/Nts8UN/3bG1tsbW1Rd/3bG1t8UAXL17kL//yL3na057G05/+dO5nmxfENs/NNs/NNg9kmweyzcu//Mvzhm/4hkzTdOtv/dZvffeP/uiPfg5XXXXVVVddddVV//nQgx70IK666qqrrrrqqqv+M11zzTUP/vAP//DvuuGGG177z//8z/n1X/91npsknpsknh9JPD+SeH5OnDjBy7zMy/B6r/d6PNAwDKzXa/b397n77rt5IEn8SyTxryGJfw9J/H9km3+Lvu/Z2tpia2uLkydP8kAXL17k6U9/On/xF3/B05/+dABs8/zY5rnZ5rnZ5oFs80C2OXHiBK/wCq/AG77hG3Lffffd+vVf//Xv8w//8A+/zVVXXXXVVVddddV/HvSgBz2Iq6666qqrrrrqqv8M11xzzYNf+7Vf+73e6Z3e6bN/7dd+jV/7tV9DEs9NEs9NEs9NEi+IJB7oxIkTvMzLvAyv93qvxwOt12vOnz/P/v4++/v7SOJfIokXhST+tSTxH0US/1vZ5j+SbR6o73v6vufUqVNsbW3R9z33u3jxIk9/+tP5i7/4C572tKfx/NjmudnmudnmgWzzQLYBOHHiBK/wCq/AG77hG/IjP/Ijn/3bv/3b33PffffdylVXXXXVVVddddV/PPSgBz2Iq6666qqrrrrqqv9o7/iO7/hZ7/RO7/TZT33qU/nRH/1RLl68CIAkHkgSz00Sz00Sz48k7nfixAle5mVehtd7vdfjgdbrNefPn2d/f5/9/X2eH0m8KCTxopLEv4Uk/itI4j+Lbf6r2OZfq+97Tp48yfb2NltbW9zv4sWLPO1pT+Mv//IvedrTnsYD2ea52ea52eaBbPNAtrnfiRMneOd3fme2t7dv/a3f+q3v/tEf/dHP4aqrrrrqqquuuuo/FnrQgx7EVVddddVVV1111X+Ua6655sEf/uEf/l033HDDa//Ij/wIT3va07ifJB5IEs9NEs9NEs+PJE6cOMHLvMzL8LIv+7KcOHGC+63Xa86dO8f58+dZr9fcTxL/Ekm8KCTxryGJfw9J/H9mm/8Itnmgvu85deoUW1tbbG9vc7+LFy/yF3/xF/zlX/4lFy9eBMA2z802z802D2SbB7LNA738y788b/iGb8g0Tbd+/dd//fv8wz/8w29z1VVXXXXVVVdd9R8DPehBD+Kqq6666qqrrrrq3+uaa6558Gu/9mu/1zu90zt99q/+6q/y67/+6zyQJB5IEs9NEs9NEs/P673e6/HQhz6UhzzkIdxvvV5z7tw5zp07x3q9RhIvjCReFJJ4UUjiX0sS/1Ek8b+Zbf6j2eZfo+97Tp06xalTp+j7nvs97WlP4y//8i/5i7/4C2zz3Gzz3GzzQLZ5INvczzYnT57k5V/+5XmjN3ojfuRHfuSzf/RHf/RzuOqqq6666qqrrvr3Qw960IO46qqrrrrqqquu+vd4sRd7sdf+3M/93N+6ePEiP/IjP8LTnvY0HkgSDySJ5yaJ5yaJBzpx4gQv+7Ivy+u93uvxQHfeeSd7e3vs7+/z/EjiXyKJF4UkXlSS+LeQxH8FSfxnss1/Jdv8e9jmfn3fM5vNOHXqFKdOneJ+Fy9e5GlPexp/8Rd/wdOe9jQeyDbPzTYPZJsHss39bANw8uRJ3umd3omdnZ1bf+u3fuu7f/RHf/RzuOqqq6666qqrrvq3Qw960IO46qqrrrrqqquu+re45pprHvzhH/7h33XDDTe89p/92Z/xa7/2a0jigSTxQJJ4bpJ4bpK43+u93uvxsi/7spw4cYL7rddrzp49y5133skDSeKFkcS/RBIvCkn8a0ji30sS/9/Z5j+CbV4Ufd+zvb3NqVOn2N7e5n4XL17k13/91/mLv/gL7meb52abB7LNA9nmfra53xu+4RvyRm/0RvzDP/zDb3/913/9+9x33323ctVVV1111VVXXfWvhx70oAdx1VVXXXXVVVdd9a/1Oq/zOu/94R/+4d/153/+5/zIj/wIAJJ4IEk8kCSemySemyROnDjBy77sy/J6r/d63G+9XnP27FnOnj3LMAy8MJL4l0jiXyKJF5Uk/rUk8R9FEv8X2OY/g23+rWwD0Pc9p0+f5oYbbuB+Fy9e5C/+4i/4i7/4Cy5evIhtnpttHsg297PNA9nmfidOnOAVXuEVeJmXeZlbf+u3fuu7f/RHf/RzuOqqq6666qqrrvrXQQ960IO46qqrrrrqqquuelFdc801D/7wD//w77r++utf+0d/9Ed56lOfCoAkHkgSDySJ5yaJ53by5Ele9mVfltd7vdfjfuv1mrNnz3LHHXfw/EjihZHEv0QS/xJJ/GtI4t9CEv8VJPFfxTb/lWzz72GbF6bve7a3tzl9+jTb29sAXLx4kac97Wn8xV/8BU996lN5brZ5INvczzYPZJv72eaN3uiNeKM3eiP+4R/+4be//uu//n3uu+++W7nqqquuuuqqq6560aAHPehBXHXVVVddddVVV70oXuzFXuy1P/dzP/e3nvrUp/LN3/zNPJAk7ieJB5LEc5PEAz30oQ/l7d/+7Tlx4gT3O3v2LLfffjvr9RoASbwwknhhJPGikMSLQhL/GpL495DEVc/JNv8RbPNv1fc9N9xwA6dPn+Z+Fy9e5Nd+7df4i7/4Cx7INvezzQPZ5oFscz/bnDx5kpd/+ZfnZV/2ZW/9rd/6re/+0R/90c/hqquuuuqqq6666l9GOX78OFddddVVV1111VX/knd8x3f8rI/4iI/47l/91V/lR37kR5DE/SRxP0k8kCSemyTu93qv93q8wzu8A6/2aq/GYrFgvV5z991387jHPY4LFy7QWuO5SeKFkcS/RBIvCkm8qCTxryWJ/yiS+L/GNv8ZbPPvYZv7tdbY3d3l/PnzTNPEzs4Oi8WCF3uxF+PlX/7lWS6X3H333Tw3STyQJF6Y5XLJU5/6VNbr9fF3fud3fm2Af/iHf/gdrrrqqquuuuqqq1449KAHPYirrrrqqquuuuqqF+Saa6558Od8zuf8Vq31wd/0Td/ExYsXkcT9JHE/STyQJJ6bJABe7/Vej9d//dfnfuv1mvvuu4/bb7+dB5LECyOJF0YS/xJJvCgk8aKSxL+VJP4zSeK/m23+q9jm38s2L6rZbMapU6c4ffo0s9kMgIsXL/Lnf/7n/Pqv/zq2eSDbPJBt7meb+9nmfidOnOBd3uVd2NnZufWzPuuzXue+++67lauuuuqqq6666qrnDz3oQQ/iqquuuuqqq6666vl5x3d8x896p3d6p8/+1V/9VX71V38VAEncTxIPJIn7SeK5SeL1Xu/1eP3Xf33ut16vuffee7njjjt4YSTxwkjiXyKJf4kkXhSS+NeSxL+HJK56wWzzH8U2/1a2AZjNZmxvb3P69Gl2dnYAuHjxIn/+53/Or/3ar/FAtnkg29zPNvezzf1OnDjBK7zCK/CyL/uyt/7Wb/3Wd//oj/7o53DVVVddddVVV131vNCDHvQgrrrqqquuuuqqqx7ommuuefCHf/iHf9f111//2j/yIz/CU5/6VAAkcT9JPJAk7ieJ5/b6r//6vP7rvz73W6/X3Hbbbdx33308kCReGEm8MJL4l0jiRSGJF5Uk/rUk8R9FEv8f2OY/g23+PWzzwpw+fZrTp0+zs7MDwMWLF/nzP/9zfu3Xfo372eZ+tnkg29zPNgC2AXj4wx/Ou7zLu3D33Xf/9md+5me+DlddddVVV1111VXPCT3oQQ/iqquuuuqqq6666n7XXHPNgz/ncz7nt/b39x/8Td/0TdxPEveTxANJ4oEkcb/Xf/3X5/Vf//W532q14rbbbuO+++5DEi+MJF4YSbwwkviXSOJFIYl/DUn8W0jiP4sk/iezzX8F2/x72ebf4vTp05w+fZqdnR0ALl68yJ//+Z/za7/2awDY5n62eSDbANjmfrYBOHnyJG/0Rm/Egx/84Fs/67M+63Xuu+++W7nqqquuuuqqq666gnL8+HGuuuqqq6666qqrAF7ndV7nvT/3cz/3t37/93//+A//8A8jiftJ4n6SuJ8kHkgSAA996EP5wA/8QF7sxV4MgNVqxdOe9jSe/OQnc3h4yANJ4oWRxAsjiRdGEi8KSbwoJPGvJYl/D0lc9a9jm/8otvn3sA3A0dER586dYxgGSikcP36chz3sYbz8y788i8WCpz3tadxPEs+PJO4nCYDlcsmdd95JRBx/13d917fe3Nw8/g//8A+/w1VXXXXVVVdddRWgBz3oQVx11VVXXXXVVVd9+Id/+He91Eu91Hv/8A//ME996lORxP0kcT9J3E8SDySJEydO8IEf+IGcOHECgNVqxW233ca9994LgCReEEm8MJJ4YSTxL5HEi0ISLypJ/GtJ4j+CJP6/s81/NNv8e9nmX3LmzBluvPFGZrMZABcvXuRHfuRHeOpTn8r9bHM/29zPNvezDYBtTp48yYd/+Ifza7/2a5/9oz/6o5/DVVddddVVV131/x160IMexFVXXXXVVVdd9f/XNddc8+AP//AP/67rr7/+tb/pm76JCxcuIIn7SeJ+krifJB7o5MmTvP7rvz4v93IvB8BqteLee+/ltttu4/mRxAsiiRdGEv8SSfxLJPGikMS/hiT+LSTxn0ES/1vZ5r+Cbf69bPNvMZvN2NnZ4cYbb2Q2mwHw53/+5/zqr/4qFy9eBMA297PN/WwDYJv72ebkyZN8+Id/ONM03fpZn/VZr3PffffdylVXXXXVVVdd9f8V5fjx41x11VVXXXXVVf8/vdiLvdhrf8VXfMVfPeMZz3jwN33TN7FcLpHE/SRxP0ncTxL3O3HiBK/xGq/Be77ne3LDDTewWq248847edzjHselS5eQxAsjiRdEEv8SSbwwknhRSOJFIYl/LUn8W0niv4sk/qPY5n8C2/xHss2/h22maeLw8JCLFy/SWmNnZ4cbbriBF3/xF2c+n/O0pz0NSdxPEveTBIAkHmi5XPJ3f/d3SDr+ru/6rm/9Z3/2Zz9zeHi4y1VXXXXVVVdd9f8R5fjx41x11VVXXXXVVf//vM7rvM57f9InfdJP/cqv/Ao/8zM/w/0kASCJ+0nigSQB8Pqv//q813u9Fw996EMBeMYznsHjHvc4Ll26xANJ4l8iiRdEEv8SSfxLJPGikMSLShL/WpL4jyCJq54/2/xnsM2/l22en9Yae3t7nD17ltYa1157LQ972MN4hVd4BebzOU996lO5nySemyQAJAGwXC55ylOewubm5vF3fdd3fevNzc3j//AP//A7XHXVVVddddVV/99Qjh8/zlVXXXXVVVdd9f/LO77jO37W+77v+371N3zDN/Bnf/ZnSAJAEveTxP0kcT9JnDhxgvd6r/fi5V/+5QFYrVb8xV/8BefOnUMSL4gk/iWSeGEk8cJI4kUhiReFJF5Ukvi3ksR/JEn8X2eb/0y2+Y9gm3+N1hp7e3ucPXuWzc1Njh8/zsMe9jBe4RVegbvuuouLFy/yQJK4nyQAJAEgiac85Sms1+vj7/Iu7/LaAP/wD//wO1x11VVXXXXVVf+foAc96EFcddVVV1111VX/f3zu537ub11//fWv/UM/9EM89alPRRIAkrifJO4nifudPHmSl3u5l+MN3uANAFitVjzjGc/gnnvu4blJ4gWRxL9EEi+MJP4lkviXSOJFJYl/DUn8e0jiv4Ik/iexzX812/xHss2/l20Azpw5w80338xsNuPixYv82Z/9Gb/6q78KgG3uZxsA29zPNgC2OXnyJB/xER/B3/zN33z313/9178PV1111VVXXXXV/xfoQQ96EFddddVVV1111f9911xzzYM//MM//Luuv/761/78z/98ACQBIIn7SeJ+krjfwx72MD7ogz6I+916663ceuutSOKFkcQLIol/iSReGEn8SyTxopDEi0oS/1qS+PeSxFX/Prb5j2abfy/bvCCz2YwzZ85w8803A3DhwgX+/M//nF/91V/FNvezDYBtAGwDYBuAEydO8CZv8iY85CEPufVDPuRDHsJVV1111VVXXfX/AeX48eNcddVVV1111VX/t11zzTUP/vAP//Dvms1mr/0VX/EVAEjifpIAkMT9JAFw4sQJ3vu935s3eIM3AGB3d5e//uu/5ty5czyQJF4QSbwwkviXSOJfIol/iSReFJL415DEv4Uk/qNI4qorbPOfyTb/EWzzomitsbe3x9mzZ9nc3OT48eM87GEP42EPexhPfepTWS6XPJAkACQBIAmA1WrFHXfcQUQc/4AP+ID3/rM/+7OfOTw83OWqq6666qqrrvq/jHL8+HGuuuqqq6666qr/u6655poHf9M3fdPTb7311gd/53d+J5IAkASAJO4nCQBJALzBG7wB7/Ve78WJEydYrVbcfvvtPPGJT2SaJl4QSbwgknhhJPEvkcS/RBIvCkm8KCTxryWJfytJ/GeRxP8FtvmvYpv/SLb5t2qtcfbsWQCOHTvGyZMnefEXf3EWiwVPfepTkcRzkwSAJABWqxXnz59H0vF3e7d3e+s/+7M/+5nDw8Ndrrrqqquuuuqq/6sox48f56qrrrrqqquu+r/pmmuuefA3fdM3Pf2Xf/mX+emf/mkkASAJAEncTxL3O3nyJO/1Xu/Fy7/8ywOwu7vLn/3Zn7G7u8v9JPHCSOIFkcQLI4kXhST+JZJ4UUjiRSWJfw1J/HtJ4r+TJP4z2OZ/Etv8R7PNfxTbAOzt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s2c5PDzk7NmzvDCSeFFI4l8iiX+JJP4lknhhJPHCSOIFkcQLI4kXRBKLxYJTp06xWCw4deoUp06d4rndd999t549e/bWv//7v//t3/7t3/6e++6771auuuqqq6666qqrrnog9KAHPYirrrrqqquuuuqqq164a6655sEv9mIv9tov9mIv9lrXXHPNg1/sxV7stXkuh4eHHB0dcXh4yNmzZzk8POTs2bPcTxIvCkn8SyTxL5HEv0QSL4wkXhhJvCCSeGEkAbBYLAC4+eabATh16hSnTp3i+fmHf/iH3/77v//73wb47d/+7e+57777buWqq6666qqrrrrqqhcGPehBD+Kqq6666qqrrrrqqn+da6655sFnzpx58DXXXPPgF3uxF3utF3uxF3vta6655sE8H4eHhxwdHXF4eMjZs2c5Ojri8PCQo6Mjnh9JvCgk8cJI4l8iiRdGEi+MJF4QSTzQxsYGi8WCU6dOAXD69GlOnTrFC3Lffffdevbs2Vv//u///rf/4R/+4Xf+4R/+4be56qqrrrrqqquuuupfCz3oQQ/iqquuuuqqq6666qp/v2uuuebBZ86cefA111zz4Bd7sRd7rWuuuebBL/ZiL/bavACHh4cAHB0dcXh4yNHREYeHhyyXSw4PDzk6OuKFkcS/RBIvjCReGEm8MJK438bGBovFgo2NDTY2NgA4ffo0i8WCjY0NXpj77rvv1n/4h3/47fvuu+/Wf/iHf/idf/iHf/htrrrqqquuuuqqq676j4Ae9KAHcdVVV1111VVXXXXVf55rrrnmwWfOnHnwNddc8+AXe7EXe61rrrnmwWfOnHnwNddc82D+BUdHRwAcHh5ydHTE/Q4PD1kulwAcHh5yv6OjI+53dHSEJF4YSQBsbGzw3DY2NpDExsYGAIvFAoCNjQ02NzexzcbGBhsbG7wo7rvvvlvPnj1769///d//NsA//MM//M7Zs2dvve+++27lqquuuuqqq6666qr/LOhBD3oQV1111VVXXXXVVVf917vmmmseDHDmzJkHXXPNNQ95sRd7sdcCuOaaax585syZB19zzTUP5n+R++6779azZ8/eet99991633333QrwD//wD78N6B/+4R9+m6uuuuqqq6666qqr/jugBz3oQVx11VVXXXXVVVdd9T/TNddc82CAM2fOPPiaa655EKAzZ848COCaa655MMA111zzYJ7pzJkzD+aZrrnmmgfzIvqHf/iH3z5z5syDeYCzZ8/eCnDffffdCnDffffdCnD27NlnAL7vvvuecfbs2Vvvu+++W7nqqquuuuqqq6666n8q9KAHPYirrrrqqquuuuqqq6666qqrrrrqqquuuur/JCpXXXXVVVddddVVV1111VVXXXXVVVddddX/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/V/FPwIVTzJ69BM+9gAAAABJRU5ErkJggg==) - - diff --git a/docs/kcl/index.md b/docs/kcl/index.md index dbd0c10eb..949e23bf7 100644 --- a/docs/kcl/index.md +++ b/docs/kcl/index.md @@ -55,7 +55,6 @@ layout: manual * [`getOppositeEdge`](kcl/getOppositeEdge) * [`getPreviousAdjacentEdge`](kcl/getPreviousAdjacentEdge) * [`helix`](kcl/std-helix) - * [`hole`](kcl/hole) * [`hollow`](kcl/hollow) * [`intersect`](kcl/intersect) * [`involuteCircular`](kcl/involuteCircular) @@ -106,6 +105,7 @@ layout: manual * [`startProfile`](kcl/startProfile) * [`startSketchOn`](kcl/startSketchOn) * [`subtract`](kcl/subtract) + * [`subtract2d`](kcl/subtract2d) * [`sweep`](kcl/sweep) * [`tangentToEnd`](kcl/tangentToEnd) * [`tangentialArc`](kcl/tangentialArc) diff --git a/docs/kcl/rotate.md b/docs/kcl/rotate.md index 778b0c70d..3f72e4760 100644 --- a/docs/kcl/rotate.md +++ b/docs/kcl/rotate.md @@ -76,7 +76,7 @@ pipeHole = startSketchOn(XY) sweepSketch = startSketchOn(XY) |> circle(center = [0, 0], radius = 2) - |> hole(pipeHole, %) + |> subtract2d(tool = pipeHole) |> sweep(path = sweepPath) |> rotate(roll = 10, pitch = 10, yaw = 90) ``` @@ -101,7 +101,7 @@ pipeHole = startSketchOn(XY) sweepSketch = startSketchOn(XY) |> circle(center = [0, 0], radius = 2) - |> hole(pipeHole, %) + |> subtract2d(tool = pipeHole) |> sweep(path = sweepPath) |> rotate(roll = 10) ``` @@ -126,7 +126,7 @@ pipeHole = startSketchOn(XY) sweepSketch = startSketchOn(XY) |> circle(center = [0, 0], radius = 2) - |> hole(pipeHole, %) + |> subtract2d(tool = pipeHole) |> sweep(path = sweepPath) |> rotate(axis = [0, 0, 1.0], angle = 90) ``` diff --git a/docs/kcl/scale.md b/docs/kcl/scale.md index c8be9dceb..ee1003c4f 100644 --- a/docs/kcl/scale.md +++ b/docs/kcl/scale.md @@ -60,7 +60,7 @@ pipeHole = startSketchOn(XY) sweepSketch = startSketchOn(XY) |> circle(center = [0, 0], radius = 2) - |> hole(pipeHole, %) + |> subtract2d(tool = pipeHole) |> sweep(path = sweepPath) |> scale(z = 2.5) ``` diff --git a/docs/kcl/std-sketch-circle.md b/docs/kcl/std-sketch-circle.md index 9c47159ee..4528e1813 100644 --- a/docs/kcl/std-sketch-circle.md +++ b/docs/kcl/std-sketch-circle.md @@ -51,7 +51,7 @@ exampleSketch = startSketchOn(XZ) |> line(end = [0, 30]) |> line(end = [-30, 0]) |> close() - |> hole(circle(center = [0, 15], radius = 5), %) + |> subtract2d(tool = circle(center = [0, 15], radius = 5)) example = extrude(exampleSketch, length = 5) ``` diff --git a/docs/kcl/std.json b/docs/kcl/std.json index d8171e7d2..405eb146d 100644 --- a/docs/kcl/std.json +++ b/docs/kcl/std.json @@ -32597,7 +32597,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 |> startProfile(at = [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 |> startProfile(at = [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 |> startProfile(at = [.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 |> startProfile(at = [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)", + "// Color the result of a sweep.\n\n// Create a path for the sweep.\nsweepPath = startSketchOn(XZ)\n |> startProfile(at = [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 |> subtract2d(tool = pipeHole)\n |> sweep(path = sweepPath)\n |> appearance(color = \"#ff0000\", metalness = 50, roughness = 50)", "// Change the appearance of an imported model.\n\n\nimport \"tests/inputs/cube.sldprt\" as cube\n\ncube\n |> appearance(color = \"#ff0000\", metalness = 50, roughness = 50)" ] }, @@ -103957,4955 +103957,6 @@ "exampleSketch = startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> line(end = [10, 0])\n |> angledLine(angle = 60, length = 10)\n |> angledLine(angle = 120, length = 10)\n |> line(end = [-10, 0])\n |> angledLine(angle = 240, length = 10, tag = $referenceEdge)\n |> close()\n\nexample = extrude(exampleSketch, length = 5)\n |> fillet(radius = 3, tags = [getPreviousAdjacentEdge(referenceEdge)])" ] }, - { - "name": "hole", - "summary": "Use a 2-dimensional sketch to cut a hole in another 2-dimensional sketch.", - "description": "", - "tags": [], - "keywordArguments": false, - "args": [ - { - "name": "holeSketch", - "type": "[Sketch]", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Array_of_Sketch", - "type": "array", - "items": { - "$ref": "#/components/schemas/Sketch" - }, - "definitions": { - "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" - } - } - }, - "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 (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute 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" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "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", - "value", - "xAxis", - "yAxis" - ], - "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" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "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" - } - ] - }, - "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": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "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": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "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" - } - ] - } - } - } - ] - }, - "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": { - "$ref": "#/components/schemas/TyF64" - }, - "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": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "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" - } - } - } - } - }, - "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": { - "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" - } - } - }, - "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 (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute 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" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "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", - "value", - "xAxis", - "yAxis" - ], - "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" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "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" - } - ] - }, - "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": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "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": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "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" - } - ] - } - } - } - ] - }, - "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": { - "$ref": "#/components/schemas/TyF64" - }, - "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": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "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" - } - } - } - } - }, - "required": true, - "includeInSnippet": true, - "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 (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute 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" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "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", - "value", - "xAxis", - "yAxis" - ], - "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" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "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" - } - ] - }, - "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": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "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": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "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": { - "$ref": "#/components/schemas/TyF64" - }, - "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": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - "exampleSketch = startSketchOn(XY)\n |> startProfile(at = [0, 0])\n |> line(end = [0, 5])\n |> line(end = [5, 0])\n |> line(end = [0, -5])\n |> close()\n |> hole(circle(center = [1, 1], radius = .25), %)\n |> hole(circle(center = [1, 4], radius = .25), %)\n\nexample = extrude(exampleSketch, length = 1)", - "fn squareHoleSketch() {\n squareSketch = startSketchOn(-XZ)\n |> startProfile(at = [-1, -1])\n |> line(end = [2, 0])\n |> line(end = [0, 2])\n |> line(end = [-2, 0])\n |> close()\n return squareSketch\n}\n\nexampleSketch = startSketchOn(-XZ)\n |> circle(center = [0, 0], radius = 3)\n |> hole(squareHoleSketch(), %)\nexample = extrude(exampleSketch, length = 1)" - ] - }, { "name": "hollow", "summary": "Make the inside of a 3D object hollow.", @@ -274258,9 +269309,9 @@ "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 |> startProfile(at = [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 |> startProfile(at = [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 |> startProfile(at = [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 a pipe with roll, pitch, and yaw.\n\n// Create a path for the sweep.\nsweepPath = startSketchOn(XZ)\n |> startProfile(at = [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 |> subtract2d(tool = 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 |> startProfile(at = [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 |> subtract2d(tool = 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 |> startProfile(at = [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 |> subtract2d(tool = 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 = startProfile(sketch001, at = [-200, 23.86])\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 = startProfile(sketch002, at = [0, 0])\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 startProfile(sketch001, at = [-10, 10])\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])" @@ -284090,7 +279141,7 @@ "unpublished": false, "deprecated": false, "examples": [ - "// Scale a pipe.\n\n// Create a path for the sweep.\nsweepPath = startSketchOn(XZ)\n |> startProfile(at = [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 a pipe.\n\n// Create a path for the sweep.\nsweepPath = startSketchOn(XZ)\n |> startProfile(at = [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 |> subtract2d(tool = 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 = startProfile(sketch001, at = [-200, 23.86])\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 = startProfile(sketch002, at = [0, 0])\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)" ] @@ -309387,6 +304438,4957 @@ "// Subtract a cylinder from a cube using operators.\n// NOTE: This will not work when using codemods through the UI.\n// Codemods will generate the stdlib function call instead.\n\n\nfn cube(center, size) {\n return startSketchOn(XY)\n |> startProfile(at = [center[0] - size, center[1] - size])\n |> line(endAbsolute = [center[0] + size, center[1] - size])\n |> line(endAbsolute = [center[0] + size, center[1] + size])\n |> line(endAbsolute = [center[0] - size, center[1] + size])\n |> close()\n |> extrude(length = 10)\n}\n\npart001 = cube([0, 0], 10)\npart002 = cube([7, 3], 5)\n |> translate(z = 1)\n\n// This is the equivalent of: subtract([part001], tools=[part002])\nsubtractedPart = part001 - part002" ] }, + { + "name": "subtract2d", + "summary": "Use a 2-dimensional sketch to cut a hole in another 2-dimensional sketch.", + "description": "", + "tags": [], + "keywordArguments": true, + "args": [ + { + "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 (interiorAbsolute kwarg)", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "p3": { + "description": "Point 3 of the arc (endAbsolute 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" + ] + } + } + }, + { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Unknown" + ] + } + } + } + ] + }, + "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", + "value", + "xAxis", + "yAxis" + ], + "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" + } + ] + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "artifactId", + "id", + "solid", + "type", + "units", + "value", + "xAxis", + "yAxis" + ], + "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" + } + ] + }, + "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": [ + "units", + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + } + } + }, + "Solid": { + "type": "object", + "required": [ + "artifactId", + "height", + "id", + "sectional", + "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": { + "description": "The units of the solid.", + "allOf": [ + { + "$ref": "#/components/schemas/UnitLen" + } + ] + }, + "sectional": { + "description": "Is this a sectional solid?", + "type": "boolean" + } + } + }, + "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": { + "$ref": "#/components/schemas/TyF64" + }, + "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": { + "$ref": "#/components/schemas/TyF64" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + }, + "TyF64": { + "type": "number", + "format": "double" + } + } + }, + "required": true, + "includeInSnippet": true, + "description": "Which sketch should this path be added to?", + "labelRequired": false + }, + { + "name": "tool", + "type": "[Sketch]", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Array_of_Sketch", + "type": "array", + "items": { + "$ref": "#/components/schemas/Sketch" + }, + "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 (interiorAbsolute kwarg)", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "p3": { + "description": "Point 3 of the arc (endAbsolute 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" + ] + } + } + }, + { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Unknown" + ] + } + } + } + ] + }, + "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", + "value", + "xAxis", + "yAxis" + ], + "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" + } + ] + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "artifactId", + "id", + "solid", + "type", + "units", + "value", + "xAxis", + "yAxis" + ], + "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" + } + ] + }, + "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": [ + "units", + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + } + } + }, + "Solid": { + "type": "object", + "required": [ + "artifactId", + "height", + "id", + "sectional", + "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": { + "description": "The units of the solid.", + "allOf": [ + { + "$ref": "#/components/schemas/UnitLen" + } + ] + }, + "sectional": { + "description": "Is this a sectional solid?", + "type": "boolean" + } + } + }, + "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": { + "$ref": "#/components/schemas/TyF64" + }, + "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": { + "$ref": "#/components/schemas/TyF64" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + }, + "TyF64": { + "type": "number", + "format": "double" + } + } + }, + "required": true, + "includeInSnippet": true, + "description": "The shape(s) which should be cut out of the sketch.", + "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 (interiorAbsolute kwarg)", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "p3": { + "description": "Point 3 of the arc (endAbsolute 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" + ] + } + } + }, + { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Unknown" + ] + } + } + } + ] + }, + "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", + "value", + "xAxis", + "yAxis" + ], + "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" + } + ] + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "artifactId", + "id", + "solid", + "type", + "units", + "value", + "xAxis", + "yAxis" + ], + "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" + } + ] + }, + "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": [ + "units", + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + }, + "units": { + "$ref": "#/components/schemas/UnitLen" + } + } + }, + "Solid": { + "type": "object", + "required": [ + "artifactId", + "height", + "id", + "sectional", + "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": { + "description": "The units of the solid.", + "allOf": [ + { + "$ref": "#/components/schemas/UnitLen" + } + ] + }, + "sectional": { + "description": "Is this a sectional solid?", + "type": "boolean" + } + } + }, + "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": { + "$ref": "#/components/schemas/TyF64" + }, + "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": { + "$ref": "#/components/schemas/TyF64" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + }, + "TyF64": { + "type": "number", + "format": "double" + } + } + }, + "required": true, + "includeInSnippet": true, + "labelRequired": true + }, + "unpublished": false, + "deprecated": false, + "examples": [ + "exampleSketch = startSketchOn(XY)\n |> startProfile(at = [0, 0])\n |> line(end = [0, 5])\n |> line(end = [5, 0])\n |> line(end = [0, -5])\n |> close()\n |> subtract2d(tool = circle(center = [1, 1], radius = .25))\n |> subtract2d(tool = circle(center = [1, 4], radius = .25))\n\nexample = extrude(exampleSketch, length = 1)", + "fn squareHoleSketch() {\n squareSketch = startSketchOn(-XZ)\n |> startProfile(at = [-1, -1])\n |> line(end = [2, 0])\n |> line(end = [0, 2])\n |> line(end = [-2, 0])\n |> close()\n return squareSketch\n}\n\nexampleSketch = startSketchOn(-XZ)\n |> circle(center = [0, 0], radius = 3)\n |> subtract2d(tool = squareHoleSketch())\nexample = extrude(exampleSketch, length = 1)" + ] + }, { "name": "sweep", "summary": "Extrude a sketch along a path.", @@ -320901,7 +320903,7 @@ "unpublished": false, "deprecated": false, "examples": [ - "// Create a pipe using a sweep.\n\n// Create a path for the sweep.\nsweepPath = startSketchOn(XZ)\n |> startProfile(at = [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 pipe using a sweep.\n\n// Create a path for the sweep.\nsweepPath = startSketchOn(XZ)\n |> startProfile(at = [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 |> subtract2d(tool = 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 = startProfile(sketch001, at = [-200, 23.86])\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 = startProfile(sketch002, at = [0, 0])\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 = startProfile(sketch002, at = [0, 0])\n |> yLine(length = 231.81)\n |> tangentialArc(radius = 80, angle = -90)\n |> xLine(length = 384.93)\n\nsweep(circleSketch, path = sweepPath, sectional = true)" @@ -342166,7 +342168,7 @@ "unpublished": false, "deprecated": false, "examples": [ - "// Move a pipe.\n\n// Create a path for the sweep.\nsweepPath = startSketchOn(XZ)\n |> startProfile(at = [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 a pipe.\n\n// Create a path for the sweep.\nsweepPath = startSketchOn(XZ)\n |> startProfile(at = [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 |> subtract2d(tool = 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 = startProfile(sketch001, at = [-200, 23.86])\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 = startProfile(sketch002, at = [0, 0])\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 |> startProfile(at = 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)", diff --git a/docs/kcl/subtract2d.md b/docs/kcl/subtract2d.md new file mode 100644 index 000000000..a42926c80 --- /dev/null +++ b/docs/kcl/subtract2d.md @@ -0,0 +1,67 @@ +--- +title: "subtract2d" +excerpt: "Use a 2-dimensional sketch to cut a hole in another 2-dimensional sketch." +layout: manual +--- + +Use a 2-dimensional sketch to cut a hole in another 2-dimensional sketch. + + + +```js +subtract2d( + sketch: Sketch, + tool: [Sketch], +): Sketch +``` + + +### Arguments + +| Name | Type | Description | Required | +|----------|------|-------------|----------| +| `sketch` | [`Sketch`](/docs/kcl/types/Sketch) | Which sketch should this path be added to? | Yes | +| `tool` | [`[Sketch]`](/docs/kcl/types/Sketch) | The shape(s) which should be cut out of the sketch. | Yes | + +### Returns + +[`Sketch`](/docs/kcl/types/Sketch) + + +### Examples + +```js +exampleSketch = startSketchOn(XY) + |> startProfile(at = [0, 0]) + |> line(end = [0, 5]) + |> line(end = [5, 0]) + |> line(end = [0, -5]) + |> close() + |> subtract2d(tool = circle(center = [1, 1], radius = .25)) + |> subtract2d(tool = circle(center = [1, 4], radius = .25)) + +example = extrude(exampleSketch, length = 1) +``` + +![Rendered example of subtract2d 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAFGDElEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+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+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVbzO67zOe3PVVVddddX/Of/wD//w2/fdd9+tXHXVVVddddX/X1Suuuqqq6666v+xF3uxF3vtd3qnd/qsF3uxF3ttrrrqqquu+j/nt37rt777vvvuu/VHf/RHP4errrrqqquu+v+JylVXXXXVVVf9P3XNNdc8+HM/93N/C+C7vuu7OH/+PFddddX/HLa56l9mm//rbPNv8ehHP5q3equ3eu/77rvv1t/+7d/+nvvuu+9Wrrrqqquuuur/HypXXXXVVVdd9f/Uh3/4h38XwBOf+ET+6I/+iKuu+vewzVX/s9jmqudlm/+rbPNAT3ziEzl9+jSv9mqv9uAP//AP/67P/MzPfB2uuuqqq6666v8fgquuuuqqq676f+h1Xud13vvFXuzFXhvgK77iK7jqqn8vSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQxFUvnCQkIQlJSEISkpCEJCQhCUlIQhKS+L9MEpKQhCQkIQlJSEISkpDE/zaSkIQkJCGJn/3ZnwXgxV7sxV77dV7ndd6bq6666qqrrvr/h3L8+HGuuuqqq6666v+br/iKr/grgC//8i/n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yYB4TgbEczIgnpMB8ZwMiOdkQDwnA+I5GRDPyYB4TgbEczIgnpMB8ZwMiOdkQDwnA+I5GRDPyYB4TgbEczIgnpMB8ZwMiOdkQDwnA+I5GRDPyYB4TgbEczIgnpMB8ZwMiOdkQDwnA+I5GRDPyYB4TgbEczIgnpMB8ZwMiOdkQDwnA+I5GRDPyYB4TgbEczIgnpMB8ZwMiOdkQDwnA+I5GRDPyYB4TgbEczIgnpMB8ZwMiOdkQDwnA+I5GRDPyYB4TgbEczIgnpMB8ZwMiOdkQDwnA+I5GRDPyYB4TgbEczIgnpMB8ZwMiOdkQDwnA+I5GRAPcN999z397Nmzz+Cqq6666qr/TOhBD3oQV1111VVXXXXVVVddddVVV1111VVXXXXV/0lUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/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/in8EH5x+45Z90OkAAAAASUVORK5CYII=) + +```js +fn squareHoleSketch() { + squareSketch = startSketchOn(-XZ) + |> startProfile(at = [-1, -1]) + |> line(end = [2, 0]) + |> line(end = [0, 2]) + |> line(end = [-2, 0]) + |> close() + return squareSketch +} + +exampleSketch = startSketchOn(-XZ) + |> circle(center = [0, 0], radius = 3) + |> subtract2d(tool = squareHoleSketch()) +example = extrude(exampleSketch, length = 1) +``` + +![Rendered example of subtract2d 1](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAD0gUlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+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+r6Jy1VVXXXXVVVddddX/atdcc82DAc6cOfNgnumaa655MP8G9913360809mzZ28FuO+++27lqquuuuqqq6666qr/rahcddVVV1111VVXXfU/yjXXXPNggDNnzjz4mmuuefCZM2ceBPDiL/7irw1w5syZB19zzTUP5gW4ePEiL8ju7i7P7fjx49zvxIkT3O++++679Zprrnkwz3TffffdCnD27Nlb77vvvlsB7rvvvlvPnj37jPvuu+9WgH/4h3/4ba666qqrrrrqqquu+p8EPehBD+Kqq6666qqrrrrqqv9a11xzzYPPnDnz4Bd7sRd7LYAXf/EXf22AF3uxF3ttnulJT3rSrWfOnHnw7u4uFy9e5OLFiwDs7u5y8eJF7re7u8vFixf5z3DixAkAjh07xokTJwA4ceIEJ06cAOD48eMAnDhxghMnTgBw33333Qpw9uzZW++7775b/+Ef/uF37rvvvlvPnj1763333XcrV1111VVXXXXVVVf9V0IPetCDuOqqq6666qqrrrrqP8c111zz4DNnzjz4xV7sxV7rmmuuefA111zz4Bd7sRd7bYCLFy8C8PSnP52LFy+yu7vLxYsX2d3d5eLFi/xPZpvnduLECQCOHz/OiRMneOhDHwrA8ePHeehDHwrAfffddyvAb/3Wb303wNmzZ5/xD//wD79933333cpVV1111VVXXXXVVf8Z0IMe9CCuuuqqq6666qqrrvr3u+aaax78Yi/2Yq995syZB734i7/4a7/Yi73YawNcvHiRixcv8vSnPx2Apz/96Tz96U/n/xLb/EtOnDjB8ePHOXHiBA996EM5fvw4D33oQwG47777bj179uyt9913363/8A//8Dv33Xffrf/wD//w21x11VVXXXXVVVdd9e+FHvSgB3HVVVddddVVV1111b/ONddc8+AzZ848+MVe7MVe68Vf/MVf+8Ve7MVeG+DixYtcvHiRpz/96TztaU/j6U9/OpL4/8Q2/xonTpzg+PHjnDhxgoc85CGcOHGChz70odx33323nj179tb77rvv1t/6rd/6nn/4h3/4ba666qqrrrrqqquu+tdCD3rQg7jqqquuuuqqq6666oW75pprHnzmzJkHv9iLvdhrvfiLv/hrv9iLvdhrX7x4kYsXL/L0pz+dpz3taTz96U/nfpL4rySJF4Vt/ivZ5l/LNidOnOChD30ox48f56EPfSgPfehDAbjvvvtu/Yd/+Iff/od/+Iff+a3f+q3v5qqrrrrqqquuuuqqfwl60IMexFVXXXXVVVddddVVz+uaa6558Gu/9mu/14u/+Iu/9ou9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7/Iu7/LaAP/wD//wO1x11VVXXXXVVf+foAc96EFcddVVV1111VX/f3zu537ub11//fWv/UM/9EM89alPRRIAkrifJO4nifudPHmSl3u5l+MN3uANAFitVjzjGc/gnnvu4blJ4gWRxL9EEi+MJP4lkviXSOJFJYl/DUn8e0jiv4Ik/iexzX812/xHss2/l20Azpw5w80338xsNuPixYv82Z/9Gb/6q78KgG3uZxsA29zPNgC2OXnyJB/xER/B3/zN33z313/9178PV1111VVXXXXV/xfoQQ96EFddddVVV1111f9911xzzYM//MM//Luuv/761/78z/98ACQBIIn7SeJ+krjfwx72MD7ogz6I+916663ceuutSOKFkcQLIol/iSReGEn8SyTxopDEi0oS/1qS+PeSxFX/Prb5j2abfy/bvCCz2YwzZ85w8803A3DhwgX+/M//nF/91V/FNvezDYBtAGwDYBuAEydO8CZv8iY85CEPufVDPuRDHsJVV1111VVXXfX/AeX48eNcddVVV1111VX/t11zzTUP/vAP//Dvms1mr/0VX/EVAEjifpIAkMT9JAFw4sQJ3vu935s3eIM3AGB3d5e//uu/5ty5czyQJF4QSbwwkviXSOJfIol/iSReFJL415DEv4Uk/qNI4qorbPOfyTb/EWzzomitsbe3x9mzZ9nc3OT48eM87GEP42EPexhPfepTWS6XPJAkACQBIAmA1WrFHXfcQUQc/4AP+ID3/rM/+7OfOTw83OWqq6666qqrrvq/jHL8+HGuuuqqq6666qr/u6655poHf9M3fdPTb7311gd/53d+J5IAkASAJO4nCQBJALzBG7wB7/Ve78WJEydYrVbcfvvtPPGJT2SaJl4QSbwgknhhJPEvkcS/RBIvCkm8KCTxryWJfytJ/GeRxP8FtvmvYpv/SLb5t2qtcfbsWQCOHTvGyZMnefEXf3EWiwVPfepTkcRzkwSAJABWqxXnz59H0vF3e7d3e+s/+7M/+5nDw8Ndrrrqqquuuuqq/6sox48f56qrrrrqqquu+r/pmmuuefA3fdM3Pf2Xf/mX+emf/mkkASAJAEncTxL3O3nyJO/1Xu/Fy7/8ywOwu7vLn/3Zn7G7u8v9JPHCSOIFkcQLI4kXhST+JZJ4UUjiRSWJfw1J/HtJ4r+TJP4z2OZ/Etv8R7PNfxTbAOzt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s2c5PDzk7NmzvDCSeFFI4l8iiX+JJP4lknhhJPHCSOIFkcQLI4kXRBKLxYJTp06xWCw4deoUp06d4rndd999t549e/bWv//7v//t3/7t3/6e++6771auuuqqq6666qqrrnog9KAHPYirrrrqqquuuuqqq164a6655sEv9mIv9tov9mIv9lrXXHPNg1/sxV7stXkuh4eHHB0dcXh4yNmzZzk8POTs2bPcTxIvCkn8SyTxL5HEv0QSL4wkXhhJvCCSeGEkAbBYLAC4+eabATh16hSnTp3i+fmHf/iH3/77v//73wb47d/+7e+57777buWqq6666qqrrrrqqhcGPehBD+Kqq6666qqrrrrqqn+da6655sFnzpx58DXXXPPgF3uxF3utF3uxF3vta6655sE8H4eHhxwdHXF4eMjZs2c5Ojri8PCQo6Mjnh9JvCgk8cJI4l8iiRdGEi+MJF4QSTzQxsYGi8WCU6dOAXD69GlOnTrFC3Lffffdevbs2Vv//u///rf/4R/+4Xf+4R/+4be56qqrrrrqqquuuupfCz3oQQ/iqquuuuqqq6666qp/v2uuuebBZ86cefA111zz4Bd7sRd7rWuuuebBL/ZiL/bavACHh4cAHB0dcXh4yNHREYeHhyyXSw4PDzk6OuKFkcS/RBIvjCReGEm8MJK438bGBovFgo2NDTY2NgA4ffo0i8WCjY0NXpj77rvv1n/4h3/47fvuu+/Wf/iHf/idf/iHf/htrrrqqquuuuqqq676j4Ae9KAHcdVVV1111VVXXXXVf55rrrnmwWfOnHnwNddc8+AXe7EXe61rrrnmwWfOnHnwNddc82D+BUdHRwAcHh5ydHTE/Q4PD1kulwAcHh5yv6OjI+53dHSEJF4YSQBsbGzw3DY2NpDExsYGAIvFAoCNjQ02NzexzcbGBhsbG7wo7rvvvlvPnj1769///d//NsA//MM//M7Zs2dvve+++27lqquuuuqqq6666qr/LOhBD3oQV1111VVXXXXVVVf917vmmmseDHDmzJkHXXPNNQ95sRd7sdcCuOaaax585syZB19zzTUP5n+R++6779azZ8/eet99991633333QrwD//wD78N6B/+4R9+m6uuuuqqq6666qqr/jugBz3oQVx11VVXXXXVVVdd9T/TNddc82CAM2fOPPiaa655EKAzZ848COCaa655MMA111zzYJ7pzJkzD+aZrrnmmgfzIvqHf/iH3z5z5syDeYCzZ8/eCnDffffdCnDffffdCnD27NlnAL7vvvuecfbs2Vvvu+++W7nqqquuuuqqq6666n8q9KAHPYirrrrqqquuuuqqq6666qqrrrrqqquuuur/JCpXXXXVVVddddVVV1111VVXXXXVVVddddX/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/V/FPwIVTzJ69BM+9gAAAABJRU5ErkJggg==) + + diff --git a/docs/kcl/sweep.md b/docs/kcl/sweep.md index a0f3746f6..354bf2ec8 100644 --- a/docs/kcl/sweep.md +++ b/docs/kcl/sweep.md @@ -58,7 +58,7 @@ pipeHole = startSketchOn(XY) sweepSketch = startSketchOn(XY) |> circle(center = [0, 0], radius = 2) - |> hole(pipeHole, %) + |> subtract2d(tool = pipeHole) |> sweep(path = sweepPath) ``` diff --git a/docs/kcl/translate.md b/docs/kcl/translate.md index 14419ae2e..b4da00b86 100644 --- a/docs/kcl/translate.md +++ b/docs/kcl/translate.md @@ -56,7 +56,7 @@ pipeHole = startSketchOn(XY) sweepSketch = startSketchOn(XY) |> circle(center = [0, 0], radius = 2) - |> hole(pipeHole, %) + |> subtract2d(tool = pipeHole) |> sweep(path = sweepPath) |> translate(x = 1.0, y = 1.0, z = 2.5) ``` diff --git a/e2e/playwright/editor-tests.spec.ts b/e2e/playwright/editor-tests.spec.ts index ba7dc4ab1..0e522f921 100644 --- a/e2e/playwright/editor-tests.spec.ts +++ b/e2e/playwright/editor-tests.spec.ts @@ -702,7 +702,7 @@ sketch_001 = startSketchOn(XY) await page.keyboard.press('Enter') await page.keyboard.type(`extrusion = startSketchOn(XY) |> circle(center: [0, 0], radius: dia/2) - |> hole(squareHole(length, width, height), %) + |> subtract2d(tool = squareHole(length, width, height)) |> extrude(length = height)`) // error in gutter diff --git a/e2e/playwright/sketch-tests.spec.ts b/e2e/playwright/sketch-tests.spec.ts index c62e3feab..fac6a274a 100644 --- a/e2e/playwright/sketch-tests.spec.ts +++ b/e2e/playwright/sketch-tests.spec.ts @@ -52,7 +52,7 @@ test.describe('Sketch tests', () => { |> yLine(length = height) |> xLine(length = -width * .5) |> close() - |> hole(screwHole, %) + |> subtract2d(tool = screwHole) |> extrude(length = thickness) part002 = startSketchOn(-XZ) diff --git a/public/kcl-samples/80-20-rail/main.kcl b/public/kcl-samples/80-20-rail/main.kcl index 4ee58a6d1..89d9fde94 100644 --- a/public/kcl-samples/80-20-rail/main.kcl +++ b/public/kcl-samples/80-20-rail/main.kcl @@ -85,13 +85,13 @@ fn rail8020(originStart, railHeight, railLength) { |> close() // Sketch center hole of profile - |> hole(circle( + |> subtract2d(tool = circle( center = [ .5 * railHeight + originStart[0], .5 * railHeight + originStart[1] ], radius = .205 * railHeight / 2, - ), %) + )) |> extrude(length = railLength) |> fillet( radius = 0.06, diff --git a/public/kcl-samples/axial-fan/fan-housing.kcl b/public/kcl-samples/axial-fan/fan-housing.kcl index bd7e02bc6..060c239a5 100644 --- a/public/kcl-samples/axial-fan/fan-housing.kcl +++ b/public/kcl-samples/axial-fan/fan-housing.kcl @@ -16,35 +16,35 @@ bottomFaceSketch = startSketchOn(XY) |> angledLine(angle = segAng(rectangleSegmentA001), length = -segLen(rectangleSegmentA001), tag = $rectangleSegmentC001) |> line(endAbsolute = [profileStartX(%), profileStartY(%)], tag = $rectangleSegmentD001) |> close() - |> hole(circle(center = [0, 0], radius = 4), %) - |> hole(circle( + |> subtract2d(tool = circle(center = [0, 0], radius = 4)) + |> subtract2d(tool = circle( center = [ mountingHoleSpacing / 2, mountingHoleSpacing / 2 ], radius = mountingHoleSize / 2, - ), %) - |> hole(circle( + )) + |> subtract2d(tool = circle( center = [ -mountingHoleSpacing / 2, mountingHoleSpacing / 2 ], radius = mountingHoleSize / 2, - ), %) - |> hole(circle( + )) + |> subtract2d(tool = circle( center = [ mountingHoleSpacing / 2, -mountingHoleSpacing / 2 ], radius = mountingHoleSize / 2, - ), %) - |> hole(circle( + )) + |> subtract2d(tool = circle( center = [ -mountingHoleSpacing / 2, -mountingHoleSpacing / 2 ], radius = mountingHoleSize / 2, - ), %) + )) |> extrude(length = 4) // Add large openings to the bottom face to allow airflow through the fan @@ -98,35 +98,35 @@ topHoles = startProfile(topFaceSketch, at = [-fanSize / 2, -fanSize / 2]) |> angledLine(angle = segAng(rectangleSegmentA002), length = -segLen(rectangleSegmentA002), tag = $rectangleSegmentC002) |> line(endAbsolute = [profileStartX(%), profileStartY(%)], tag = $rectangleSegmentD002) |> close() - |> hole(circle(center = [0, 0], radius = fanSize * 23 / 50), %) - |> hole(circle( + |> subtract2d(tool = circle(center = [0, 0], radius = fanSize * 23 / 50)) + |> subtract2d(tool = circle( center = [ mountingHoleSpacing / 2, mountingHoleSpacing / 2 ], radius = mountingHoleSize / 2, - ), %) - |> hole(circle( + )) + |> subtract2d(tool = circle( center = [ -mountingHoleSpacing / 2, mountingHoleSpacing / 2 ], radius = mountingHoleSize / 2, - ), %) - |> hole(circle( + )) + |> subtract2d(tool = circle( center = [ mountingHoleSpacing / 2, -mountingHoleSpacing / 2 ], radius = mountingHoleSize / 2, - ), %) - |> hole(circle( + )) + |> subtract2d(tool = circle( center = [ -mountingHoleSpacing / 2, -mountingHoleSpacing / 2 ], radius = mountingHoleSize / 2, - ), %) + )) |> extrude(length = 4) // Create a housing for the electric motor to sit diff --git a/public/kcl-samples/ball-bearing/main.kcl b/public/kcl-samples/ball-bearing/main.kcl index 3019f3e5c..f50f975d0 100644 --- a/public/kcl-samples/ball-bearing/main.kcl +++ b/public/kcl-samples/ball-bearing/main.kcl @@ -19,7 +19,7 @@ linkDiameter = sphereDia / 4 // Sketch the inside bearing piece insideWallSketch = startSketchOn(offsetPlane(XY, offset = -overallThickness / 2)) |> circle(center = [0, 0], radius = shaftDia / 2 + wallThickness) - |> hole(circle(center = [0, 0], radius = shaftDia / 2), %) + |> subtract2d(tool = circle(center = [0, 0], radius = shaftDia / 2)) // Extrude the inside bearing piece insideWall = extrude(insideWallSketch, length = overallThickness) @@ -84,6 +84,6 @@ linkRevolve = revolve(linkSketch, axis = Y, angle = 360 / nBalls) // Create the sketch for the outside walls outsideWallSketch = startSketchOn(offsetPlane(XY, offset = -overallThickness / 2)) |> circle(center = [0, 0], radius = outsideDiameter / 2) - |> hole(circle(center = [0, 0], radius = shaftDia / 2 + wallThickness + sphereDia), %) + |> subtract2d(tool = circle(center = [0, 0], radius = shaftDia / 2 + wallThickness + sphereDia)) outsideWall = extrude(outsideWallSketch, length = overallThickness) diff --git a/public/kcl-samples/car-wheel-assembly/car-wheel.kcl b/public/kcl-samples/car-wheel-assembly/car-wheel.kcl index c113cfc9b..04ebe9960 100644 --- a/public/kcl-samples/car-wheel-assembly/car-wheel.kcl +++ b/public/kcl-samples/car-wheel-assembly/car-wheel.kcl @@ -10,13 +10,13 @@ import lugCount, lugSpacing, offset, backSpacing, wheelWidth, wheelDiameter, spo // Create the wheel center lugBase = startSketchOn(XZ) |> circle(center = [0, 0], radius = (lugSpacing + 1.5) / 2) - |> hole(circle(center = [0, 0], radius = (lugSpacing - 1.5) / 2), %) + |> subtract2d(tool = circle(center = [0, 0], radius = (lugSpacing - 1.5) / 2)) |> extrude(length = wheelWidth / 20) // Extend the wheel center and bore holes to accomidate the lug heads lugExtrusion = startSketchOn(lugBase, face = END) |> circle(center = [0, 0], radius = (lugSpacing + 1.5) / 2) - |> hole(circle(center = [0, 0], radius = (lugSpacing - 1.5) / 2), %) + |> subtract2d(tool = circle(center = [0, 0], radius = (lugSpacing - 1.5) / 2)) |> extrude(length = wheelWidth / 10) // Create the circular pattern for the lugs diff --git a/public/kcl-samples/cycloidal-gear/main.kcl b/public/kcl-samples/cycloidal-gear/main.kcl index 7d121d3d2..ab175eb90 100644 --- a/public/kcl-samples/cycloidal-gear/main.kcl +++ b/public/kcl-samples/cycloidal-gear/main.kcl @@ -21,7 +21,7 @@ fn cycloidalGear(gearPitch, gearHeight, holeDiameter, helixAngle) { |> tangentialArc(radius = gearPitch, angle = -180) |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close(%) - |> hole(circle(center = [0, 0], radius = holeDiameter / 2), %) + |> subtract2d(tool = circle(center = [0, 0], radius = holeDiameter / 2)) return gearProfile } diff --git a/public/kcl-samples/enclosure/main.kcl b/public/kcl-samples/enclosure/main.kcl index 76a4dc32e..113ddfb24 100644 --- a/public/kcl-samples/enclosure/main.kcl +++ b/public/kcl-samples/enclosure/main.kcl @@ -46,7 +46,7 @@ fn function001(originStart) { // Create a pillar with a fasterner hole at the center sketch002 = startSketchOn(plane001) |> circle(center = [originStart[0], originStart[1]], radius = holeDia + wallThickness) - |> hole(circle(center = [originStart[0], originStart[1]], radius = holeDia), %) + |> subtract2d(tool = circle(center = [originStart[0], originStart[1]], radius = holeDia)) extrude002 = extrude(sketch002, length = height - wallThickness) return extrude002 @@ -78,34 +78,34 @@ sketch003 = startSketchOn(XY) |> angledLine(angle = segAng(rectangleSegmentA001), length = -segLen(rectangleSegmentA001), tag = $rectangleSegmentC002) |> line(endAbsolute = [profileStartX(%), profileStartY(%)], tag = $rectangleSegmentD002) |> close() - |> hole(circle( + |> subtract2d(tool = circle( center = [ width * 1.2 + wallThickness * 3 + holeDia, wallThickness * 3 + holeDia ], radius = holeDia, - ), %) - |> hole(circle( + )) + |> subtract2d(tool = circle( center = [ width * 1.2 + wallThickness * 3 + holeDia, length - (wallThickness * 3 + holeDia) ], radius = holeDia, - ), %) - |> hole(circle( + )) + |> subtract2d(tool = circle( center = [ width * 2.2 - (wallThickness * 3 + holeDia), wallThickness * 3 + holeDia ], radius = holeDia, - ), %) - |> hole(circle( + )) + |> subtract2d(tool = circle( center = [ width * 2.2 - (wallThickness * 3 + holeDia), length - (wallThickness * 3 + holeDia) ], radius = holeDia, - ), %) + )) extrude003 = extrude(sketch003, length = wallThickness) |> fillet( radius = wallThickness * 4, @@ -128,34 +128,34 @@ sketch004 = startSketchOn(extrude003, face = END) |> angledLine(angle = segAng(rectangleSegmentA003), length = -segLen(rectangleSegmentA003), tag = $rectangleSegmentC003) |> line(endAbsolute = [profileStartX(%), profileStartY(%)], tag = $rectangleSegmentD003) |> close() - |> hole(circle( + |> subtract2d(tool = circle( center = [ width * 1.2 + wallThickness * 3 + holeDia, wallThickness * 3 + holeDia ], radius = holeDia + wallThickness, - ), %) - |> hole(circle( + )) + |> subtract2d(tool = circle( center = [ width * 1.2 + wallThickness * 3 + holeDia, length - (wallThickness * 3 + holeDia) ], radius = holeDia + wallThickness, - ), %) - |> hole(circle( + )) + |> subtract2d(tool = circle( center = [ width * 2.2 - (wallThickness * 3 + holeDia), wallThickness * 3 + holeDia ], radius = holeDia + wallThickness, - ), %) - |> hole(circle( + )) + |> subtract2d(tool = circle( center = [ width * 2.2 - (wallThickness * 3 + holeDia), length - (wallThickness * 3 + holeDia) ], radius = holeDia + wallThickness, - ), %) + )) extrude004 = extrude(sketch004, length = wallThickness) |> fillet( radius = wallThickness * 3, diff --git a/public/kcl-samples/exhaust-manifold/main.kcl b/public/kcl-samples/exhaust-manifold/main.kcl index 2fd228a37..64742a29f 100644 --- a/public/kcl-samples/exhaust-manifold/main.kcl +++ b/public/kcl-samples/exhaust-manifold/main.kcl @@ -39,7 +39,7 @@ fn primaryTube(n, angle001, length001, length002, length003) { // Create the cross section of each tube and sweep them sweepProfile = startSketchOn(XY) |> circle(center = [pos001, 0], radius = primaryTubeDiameter / 2) - |> hole(circle(center = [pos001, 0], radius = primaryTubeDiameter / 2 - wallThickness), %) + |> subtract2d(tool = circle(center = [pos001, 0], radius = primaryTubeDiameter / 2 - wallThickness)) |> sweep(path = sweepPath) return { } @@ -73,40 +73,40 @@ flangeSketch = startSketchOn(XY) |> close() // Create openings in the flange to accommodate each tube - |> hole(circle(center = [0, 0], radius = primaryTubeDiameter / 2 - wallThickness), %) - |> hole(circle(center = [2, 0], radius = primaryTubeDiameter / 2 - wallThickness), %) - |> hole(circle(center = [4, 0], radius = primaryTubeDiameter / 2 - wallThickness), %) - |> hole(circle(center = [6, 0], radius = primaryTubeDiameter / 2 - wallThickness), %) + |> subtract2d(tool = circle(center = [0, 0], radius = primaryTubeDiameter / 2 - wallThickness)) + |> subtract2d(tool = circle(center = [2, 0], radius = primaryTubeDiameter / 2 - wallThickness)) + |> subtract2d(tool = circle(center = [4, 0], radius = primaryTubeDiameter / 2 - wallThickness)) + |> subtract2d(tool = circle(center = [6, 0], radius = primaryTubeDiameter / 2 - wallThickness)) // Add mounting holes to the flange - |> hole(circle( + |> subtract2d(tool = circle( center = [ -primaryTubeDiameter * .6, -primaryTubeDiameter * .6 ], radius = 0.25 / 2, - ), %) - |> hole(circle( + )) + |> subtract2d(tool = circle( center = [ primaryTubeDiameter * .6, primaryTubeDiameter * .6 ], radius = 0.25 / 2, - ), %) - |> hole(circle( + )) + |> subtract2d(tool = circle( center = [ 3 * 2 - (primaryTubeDiameter * .6), primaryTubeDiameter * .6 ], radius = 0.25 / 2, - ), %) - |> hole(circle( + )) + |> subtract2d(tool = circle( center = [ 3 * 2 + primaryTubeDiameter * .6, -primaryTubeDiameter * .6 ], radius = 0.25 / 2, - ), %) + )) // Extrude the flange and fillet the edges |> extrude(length = plateHeight) diff --git a/public/kcl-samples/flange/main.kcl b/public/kcl-samples/flange/main.kcl index 5304a1688..6ad3fa2c4 100644 --- a/public/kcl-samples/flange/main.kcl +++ b/public/kcl-samples/flange/main.kcl @@ -33,7 +33,7 @@ circles = startSketchOn(XY) // Create the base of the flange and add the mounting holes flangeBase = startSketchOn(XY) |> circle(center = [0, 0], radius = baseDia / 2) - |> hole(circles, %) + |> subtract2d(tool = circles) |> extrude(length = baseThickness) // Create the extrusion on the top of the flange base diff --git a/public/kcl-samples/focusrite-scarlett-mounting-bracket/main.kcl b/public/kcl-samples/focusrite-scarlett-mounting-bracket/main.kcl index 33f3b023f..6f1c1189a 100644 --- a/public/kcl-samples/focusrite-scarlett-mounting-bracket/main.kcl +++ b/public/kcl-samples/focusrite-scarlett-mounting-bracket/main.kcl @@ -78,13 +78,13 @@ tabsR = startSketchOn(tabPlane) |> line(end = [0, -tabLength / 3 * 2], tag = $edge12) |> line(end = [-tabWidth, -tabLength / 3], tag = $edge13) |> close(tag = $edge14) - |> hole(circle( + |> subtract2d(tool = circle( center = [ width / 2 + thk + tabWidth / 2, length / 2 + thk - (tabLength / (3 / 2)) ], radius = holeDiam / 2, - ), %) + )) |> extrude(length = -tabThk) |> fillet( radius = holeDiam / 2, @@ -102,13 +102,13 @@ tabsL = startSketchOn(tabPlane) |> line(end = [0, -tabLength / 3 * 2], tag = $edge22) |> line(end = [tabWidth, -tabLength / 3], tag = $edge23) |> close(tag = $edge24) - |> hole(circle( + |> subtract2d(tool = circle( center = [ -width / 2 - thk - (tabWidth / 2), length / 2 + thk - (tabLength / (3 / 2)) ], radius = holeDiam / 2, - ), %) + )) |> extrude(length = -tabThk) |> fillet( radius = holeDiam / 2, diff --git a/public/kcl-samples/food-service-spatula/main.kcl b/public/kcl-samples/food-service-spatula/main.kcl index 9056546f2..3be1ab72f 100644 --- a/public/kcl-samples/food-service-spatula/main.kcl +++ b/public/kcl-samples/food-service-spatula/main.kcl @@ -65,9 +65,9 @@ slotProfile002 = slot(flipperSketch, [-25, -18], [-55, -19], flipperSlotWidth) // Create a profile with slots for the spatula spatulaProfile = flipperProfile - |> hole(slotProfile000, %) - |> hole(slotProfile001, %) - |> hole(slotProfile002, %) + |> subtract2d(tool = slotProfile000) + |> subtract2d(tool = slotProfile001) + |> subtract2d(tool = slotProfile002) // Extrude the profile to create the spatula flipper flipper = extrude(spatulaProfile, length = flipperThickness) diff --git a/public/kcl-samples/french-press/main.kcl b/public/kcl-samples/french-press/main.kcl index 5a0a7cd5a..8b166ee5b 100644 --- a/public/kcl-samples/french-press/main.kcl +++ b/public/kcl-samples/french-press/main.kcl @@ -105,7 +105,7 @@ sketch006 = startSketchOn(XZ) // Spiral plate sketch007 = startSketchOn(offsetPlane(XY, offset = 1.12)) |> circle(center = [0, 0], radius = carafeDiameter / 2 - 0.24) - |> hole(circle(center = [0, 0], radius = .15), %) + |> subtract2d(tool = circle(center = [0, 0], radius = .15)) extrude003 = extrude(sketch007, length = 0.050) diff --git a/public/kcl-samples/gridfinity-baseplate-magnets/main.kcl b/public/kcl-samples/gridfinity-baseplate-magnets/main.kcl index 91b9fc062..9be98dff7 100644 --- a/public/kcl-samples/gridfinity-baseplate-magnets/main.kcl +++ b/public/kcl-samples/gridfinity-baseplate-magnets/main.kcl @@ -118,7 +118,7 @@ fn magnetBase(plane) { |> yLine(length = binLength, tag = $line002) |> xLine(endAbsolute = profileStartX(%), tag = $line003) |> close(tag = $line004) - |> hole(magnetCenterCutout(plane), %) + |> subtract2d(tool = magnetCenterCutout(plane)) return magnetBaseSketch } @@ -134,7 +134,7 @@ magnetsSketch = startSketchOn(XY) // Create a profile with holes for the magnets magnetProfile = magnetBase(XY) - |> hole(magnetsSketch, %) + |> subtract2d(tool = magnetsSketch) // Create an extrusion of the magnet cutout with holes magnetHolesExtrude = extrude(magnetProfile, length = -magDepth) diff --git a/public/kcl-samples/hex-nut/main.kcl b/public/kcl-samples/hex-nut/main.kcl index 7b4abb294..9d5432e71 100644 --- a/public/kcl-samples/hex-nut/main.kcl +++ b/public/kcl-samples/hex-nut/main.kcl @@ -19,7 +19,7 @@ fn hexNut(start, thk, innerDia) { |> angledLine(angle = 60, length = innerDia) |> angledLine(angle = 0, length = innerDia * .90) |> close() - |> hole(circle(center = [start[0], start[1]], radius = innerDia / 2), %) + |> subtract2d(tool = circle(center = [start[0], start[1]], radius = innerDia / 2)) |> extrude(length = thk) return hexNutSketch } diff --git a/public/kcl-samples/mounting-plate/main.kcl b/public/kcl-samples/mounting-plate/main.kcl index 4f4005fa1..b4a323481 100644 --- a/public/kcl-samples/mounting-plate/main.kcl +++ b/public/kcl-samples/mounting-plate/main.kcl @@ -29,35 +29,35 @@ holeIndex = .75 // Create the mounting plate extrusion, holes, and fillets rs = rectShape([0, 0], plateWidth, plateLength) part = rs - |> hole(circle( + |> subtract2d(tool = circle( center = [ -plateWidth / 2 + holeIndex, plateLength / 2 - holeIndex ], radius = holeRadius, - ), %) - |> hole(circle( + )) + |> subtract2d(tool = circle( center = [ plateWidth / 2 - holeIndex, plateLength / 2 - holeIndex ], radius = holeRadius, - ), %) - |> hole(circle( + )) + |> subtract2d(tool = circle( center = [ -plateWidth / 2 + holeIndex, -plateLength / 2 + holeIndex ], radius = holeRadius, - ), %) - |> hole(circle( + )) + |> subtract2d(tool = circle( center = [ plateWidth / 2 - holeIndex, -plateLength / 2 + holeIndex ], radius = holeRadius, - ), %) - |> hole(circle(center = [0, 0], radius = centerHoleDiameter), %) + )) + |> subtract2d(tool = circle(center = [0, 0], radius = centerHoleDiameter)) |> extrude(length = plateThickness) |> fillet( radius = filletRadius, diff --git a/public/kcl-samples/pipe-flange-assembly/68095k348-flange.kcl b/public/kcl-samples/pipe-flange-assembly/68095k348-flange.kcl index 4e4d3afbe..3bcaf8936 100644 --- a/public/kcl-samples/pipe-flange-assembly/68095k348-flange.kcl +++ b/public/kcl-samples/pipe-flange-assembly/68095k348-flange.kcl @@ -23,7 +23,7 @@ export fn flange() { // Create the flange base flangeBase = startSketchOn(XY) |> circle(%, center = [0, 0], radius = flangeDiameter / 2) - |> hole(mountingHoles, %) + |> subtract2d(tool = mountingHoles) |> extrude(%, length = flangeBaseThickness) // Create both the raised portions on the front and back of the flange base diff --git a/public/kcl-samples/pipe-with-bend/main.kcl b/public/kcl-samples/pipe-with-bend/main.kcl index a308557f4..38ea1f729 100644 --- a/public/kcl-samples/pipe-with-bend/main.kcl +++ b/public/kcl-samples/pipe-with-bend/main.kcl @@ -21,7 +21,7 @@ innerProfile = circle(sketch000, center = [bendRadius, 0], radius = innerDiamete // Create the profile of the pipe pipeProfile = outerProfile - |> hole(innerProfile, %) + |> subtract2d(tool = innerProfile) // Revolve the pipe profile at the desired angle pipe = revolve(pipeProfile, axis = Y, angle = bendAngle) diff --git a/public/kcl-samples/walkie-talkie/case.kcl b/public/kcl-samples/walkie-talkie/case.kcl index fa727315f..af4a00b30 100644 --- a/public/kcl-samples/walkie-talkie/case.kcl +++ b/public/kcl-samples/walkie-talkie/case.kcl @@ -58,14 +58,14 @@ case = startSketchOn(XZ) ]) |> angledLine(angle = -225, endAbsoluteX = -width / 2 + offset + caseTolerance) |> close() - |> hole(screenSketch, %) - |> hole(squareHolePatternSketch, %) + |> subtract2d(tool = screenSketch) + |> subtract2d(tool = squareHolePatternSketch) // Create the Zoo logo - |> hole(zLogo(startSketchOn(XZ), [-.30, -1.825], .20), %) - |> hole(oLogo(startSketchOn(XZ), [-.075, -1.825], .20), %) - |> hole(oLogo2(startSketchOn(XZ), [-.075, -1.825], .20), %) - |> hole(oLogo(startSketchOn(XZ), [.175, -1.825], .20), %) - |> hole(oLogo2(startSketchOn(XZ), [.175, -1.825], .20), %) + |> subtract2d(tool = zLogo(startSketchOn(XZ), [-.30, -1.825], .20)) + |> subtract2d(tool = oLogo(startSketchOn(XZ), [-.075, -1.825], .20)) + |> subtract2d(tool = oLogo2(startSketchOn(XZ), [-.075, -1.825], .20)) + |> subtract2d(tool = oLogo(startSketchOn(XZ), [.175, -1.825], .20)) + |> subtract2d(tool = oLogo2(startSketchOn(XZ), [.175, -1.825], .20)) extrude(case, length = -0.0625) |> appearance(color = '#D0FF01', metalness = 0, roughness = 50) diff --git a/public/kcl-samples/washer/main.kcl b/public/kcl-samples/washer/main.kcl index 85ed0409c..a56dc14fc 100644 --- a/public/kcl-samples/washer/main.kcl +++ b/public/kcl-samples/washer/main.kcl @@ -14,6 +14,6 @@ thicknessMin = 0.024 // Define the sketch of the washer washerSketch = startSketchOn(XY) |> circle(center = [0, 0], radius = outerDiameter / 2) - |> hole(circle(center = [0, 0], radius = innerDiameter / 2), %) + |> subtract2d(tool = circle(center = [0, 0], radius = innerDiameter / 2)) washer = extrude(washerSketch, length = thicknessNom) diff --git a/rust/kcl-lib/e2e/executor/inputs/fillet-and-shell.kcl b/rust/kcl-lib/e2e/executor/inputs/fillet-and-shell.kcl index d91defe0d..83e1ae498 100644 --- a/rust/kcl-lib/e2e/executor/inputs/fillet-and-shell.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/fillet-and-shell.kcl @@ -60,7 +60,7 @@ fn m25Screw = (x, y, height) => { screw = startSketchOn(XY) |> startProfile(at = [0, 0]) |> circle(center= [x, y], radius=2.5) - |> hole(circle(center= [x, y], radius = 1.25), %) + |> subtract2d(tool = circle(center= [x, y], radius = 1.25)) |> extrude(length = height) return screw } diff --git a/rust/kcl-lib/e2e/executor/inputs/focusrite_scarlett_mounting_braket.kcl b/rust/kcl-lib/e2e/executor/inputs/focusrite_scarlett_mounting_braket.kcl index d2f0be6d9..8c097b421 100644 --- a/rust/kcl-lib/e2e/executor/inputs/focusrite_scarlett_mounting_braket.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/focusrite_scarlett_mounting_braket.kcl @@ -76,13 +76,13 @@ const tabsR = startSketchOn(tabPlane) |> line(end = [0, -tabLength / 3 * 2], tag = $edge12) |> line(end = [-tabWidth, -tabLength / 3], tag = $edge13) |> close(tag = $edge14) - |> hole(circle( + |> subtract2d(tool = circle( center = [ width / 2 + thk + tabWidth / 2, length / 2 + thk - (tabLength / (3 / 2)) ], radius = holeDiam / 2 - ), %) + )) |> extrude(length = -tabThk) |> fillet( radius = holeDiam / 2, @@ -104,13 +104,13 @@ const tabsL = startSketchOn(tabPlane) |> line(end = [0, -tabLength / 3 * 2], tag = $edge22) |> line(end = [tabWidth, -tabLength / 3], tag = $edge23) |> close(tag = $edge24) - |> hole(circle( + |> subtract2d(tool = circle( center= [ -width / 2 - thk - (tabWidth / 2), length / 2 + thk - (tabLength / (3 / 2)) ], radius= holeDiam / 2 - ), %) + )) |> extrude(length = -tabThk) |> fillet( radius = holeDiam / 2, diff --git a/rust/kcl-lib/e2e/executor/inputs/global-tags.kcl b/rust/kcl-lib/e2e/executor/inputs/global-tags.kcl index f8a1c3fb0..52e4002c4 100644 --- a/rust/kcl-lib/e2e/executor/inputs/global-tags.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/global-tags.kcl @@ -76,13 +76,13 @@ const tabsR = startSketchOn(tabPlane) |> line(end = [0, -tabLength / 3 * 2], tag = $edge12) |> line(end = [-tabWidth, -tabLength / 3], tag = $edge13) |> close(tag = $edge14) - |> hole(circle( + |> subtract2d(tool = circle( center= [ width / 2 + thk + tabWidth / 2, length / 2 + thk - (tabLength / (3 / 2)) ], radius= holeDiam / 2 - ), %) + )) |> extrude(length = -tabThk) |> fillet( radius = holeDiam / 2, @@ -104,13 +104,13 @@ const tabsL = startSketchOn(tabPlane) |> line(end = [0, -tabLength / 3 * 2], tag = $edge22) |> line(end = [tabWidth, -tabLength / 3], tag = $edge23) |> close(tag = $edge24) - |> hole(circle( + |> subtract2d(tool = circle( center= [ -width / 2 - thk - (tabWidth / 2), length / 2 + thk - (tabLength / (3 / 2)) ], radius= holeDiam / 2 - ), %) + )) |> extrude(length = -tabThk) |> fillet( radius = holeDiam / 2, diff --git a/rust/kcl-lib/e2e/executor/inputs/i_shape.kcl b/rust/kcl-lib/e2e/executor/inputs/i_shape.kcl index 092469446..0a872d44d 100644 --- a/rust/kcl-lib/e2e/executor/inputs/i_shape.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/i_shape.kcl @@ -48,6 +48,6 @@ let inner = startSketchOn(XY) |> close() let final = brace_base - |> hole(inner, %) + |> subtract2d(tool = inner) |> extrude(length = 3.0) 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 5b65e7ef1..ce66de969 100644 --- a/rust/kcl-lib/e2e/executor/inputs/server-rack-heavy.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/server-rack-heavy.kcl @@ -28,19 +28,19 @@ fn caster = (originStart) => { |> xLine(length = -3.543) |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() - |> hole(circle(center = [ + |> subtract2d(tool = circle(center = [ (3.543 - 2.756) / 2, (3.543 - 2.756) / 2 ], radius = 8.8 / 2 / 25.4), %) - |> hole(circle(center = [ + |> subtract2d(tool = circle(center = [ (3.543 - 2.756) / 2 + 2.756, (3.543 - 2.756) / 2 ], radius = 8.8 / 2 / 25.4 ), %) - |> hole(circle(center = [ + |> subtract2d(tool = circle(center = [ (3.543 - 2.756) / 2, (3.543 - 2.756) / 2 + 2.756 ], radius = 8.8 / 2 / 25.4 ), %) - |> hole(circle(center = [ + |> subtract2d(tool = circle(center = [ (3.543 - 2.756) / 2 + 2.756, (3.543 - 2.756) / 2 + 2.756 ], radius = 8.8 / 2 / 25.4 ), %) 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 98847445f..3e27d8f26 100644 --- a/rust/kcl-lib/e2e/executor/inputs/server-rack-lite.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/server-rack-lite.kcl @@ -26,19 +26,19 @@ fn caster = (originStart) => { |> xLine(length = -3.543) |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() - |> hole(circle(center = [ + |> subtract2d(tool = circle(center = [ (3.543 - 2.756) / 2, (3.543 - 2.756) / 2 ], radius= 8.8 / 2 / 25.4), %) - |> hole(circle(center = [ + |> subtract2d(tool = circle(center = [ (3.543 - 2.756) / 2 + 2.756, (3.543 - 2.756) / 2 ], radius= 8.8 / 2 / 25.4), %) - |> hole(circle(center = [ + |> subtract2d(tool = circle(center = [ (3.543 - 2.756) / 2, (3.543 - 2.756) / 2 + 2.756 ], radius= 8.8 / 2 / 25.4), %) - |> hole(circle(center = [ + |> subtract2d(tool = circle(center = [ (3.543 - 2.756) / 2 + 2.756, (3.543 - 2.756) / 2 + 2.756 ], radius= 8.8 / 2 / 25.4), %) diff --git a/rust/kcl-lib/e2e/executor/main.rs b/rust/kcl-lib/e2e/executor/main.rs index bc78e1bc6..7f5e9550a 100644 --- a/rust/kcl-lib/e2e/executor/main.rs +++ b/rust/kcl-lib/e2e/executor/main.rs @@ -49,11 +49,9 @@ async fn kcl_test_execute_engine_error_return() { "#; let result = execute_and_snapshot(code, None).await; - assert!(result.is_err()); - assert_eq!( - result.err().unwrap().to_string(), - r#"engine: KclErrorDetails { source_ranges: [SourceRange([226, 245, 0])], message: "Modeling command failed: [ApiError { error_code: BadRequest, message: \"The path is not closed. Solid2D construction requires a closed path!\" }]" }"#, - ); + let expected_msg = "engine: Modeling command failed: [ApiError { error_code: BadRequest, message: \"The path is not closed. Solid2D construction requires a closed path!\" }]"; + let err = result.unwrap_err().as_kcl_error().unwrap().get_message(); + assert_eq!(err, expected_msg); } #[tokio::test(flavor = "multi_thread")] @@ -275,8 +273,8 @@ async fn kcl_test_holes() { |> line(end = [10, 0]) |> line(end = [0, -10]) |> close() - |> hole(circle(center = [2, 2], radius= .5), %) - |> hole(circle(center = [2, 8], radius= .5), %) + |> subtract2d(tool = circle(center = [2, 2], radius= .5)) + |> subtract2d(tool = circle(center = [2, 8], radius= .5)) |> extrude(length = 2) "#; @@ -328,10 +326,10 @@ holeRadius = 1 holeIndex = 6 part = roundedRectangle([0, 0], 20, 20, 4) - |> hole(circle(center = [-holeIndex, holeIndex], radius= holeRadius), %) - |> hole(circle(center = [holeIndex, holeIndex], radius= holeRadius), %) - |> hole(circle(center = [-holeIndex, -holeIndex], radius= holeRadius), %) - |> hole(circle(center = [holeIndex, -holeIndex], radius= holeRadius), %) + |> subtract2d(tool = circle(center = [-holeIndex, holeIndex], radius= holeRadius)) + |> subtract2d(tool = circle(center = [holeIndex, holeIndex], radius= holeRadius)) + |> subtract2d(tool = circle(center = [-holeIndex, -holeIndex], radius= holeRadius)) + |> subtract2d(tool = circle(center = [holeIndex, -holeIndex], radius= holeRadius)) |> extrude(length = 2) "#; @@ -425,7 +423,7 @@ rectangle = startSketchOn(XY) |> line(end = [50, 0]) |> line(end = [0, -50]) |> close() - |> hole(circles, %) + |> subtract2d(tool = circles) |> extrude(length = 10) "#; @@ -780,8 +778,8 @@ async fn kcl_test_stdlib_kcl_error_right_code_path() { |> line(end = [10, 0]) |> line(end = [0, -10]) |> close() - |> hole(circle(), %) - |> hole(circle(center = [2, 8], radius= .5), %) + |> subtract2d(tool = circle()) + |> subtract2d(tool = circle(center = [2, 8], radius= .5)) |> extrude(length = 2) "#; @@ -842,10 +840,10 @@ holeIndex = 6 // Create the mounting plate extrusion, holes, and fillets part = rectShape([0, 0], 20, 20) - |> hole(circle('XY', center = [-holeIndex, holeIndex], radius = holeRadius)) - |> hole(circle('XY', center = [holeIndex, holeIndex], radius = holeRadius)) - |> hole(circle('XY', center = [-holeIndex, -holeIndex], radius = holeRadius)) - |> hole(circle('XY', center = [holeIndex, -holeIndex], radius = holeRadius)) + |> subtract2d(tool = circle('XY', center = [-holeIndex, holeIndex], radius = holeRadius)) + |> subtract2d(tool = circle('XY', center = [holeIndex, holeIndex], radius = holeRadius)) + |> subtract2d(tool = circle('XY', center = [-holeIndex, -holeIndex], radius = holeRadius)) + |> subtract2d(tool = circle('XY', center = [holeIndex, -holeIndex], radius = holeRadius)) |> extrude(length = 2) |> fillet( radius = 4, @@ -1378,16 +1376,15 @@ fn squareHole = (l, w) => { extrusion = startSketchOn(XY) |> circle(center = [0, 0], radius= dia/2 ) - |> hole(squareHole(length, width, height), %) + |> subtract2d(tool = squareHole(length, width, height)) |> extrude(length = height) "#; let result = execute_and_snapshot(code, None).await; assert!(result.is_err()); - assert_eq!( - result.err().unwrap().to_string(), - r#"semantic: KclErrorDetails { source_ranges: [SourceRange([68, 358, 0]), SourceRange([445, 478, 0])], message: "Expected 2 arguments, got 3" }"# - ); + let expected_msg = "semantic: Expected 2 arguments, got 3"; + let err = result.unwrap_err().as_kcl_error().unwrap().get_message(); + assert_eq!(err, expected_msg); } #[tokio::test(flavor = "multi_thread")] diff --git a/rust/kcl-lib/src/docs/mod.rs b/rust/kcl-lib/src/docs/mod.rs index f43284aec..0a385ab3a 100644 --- a/rust/kcl-lib/src/docs/mod.rs +++ b/rust/kcl-lib/src/docs/mod.rs @@ -512,8 +512,8 @@ pub trait StdLibFn: std::fmt::Debug + Send + Sync { return Ok("subtract([${0:extrude001}], tools = [${1:extrude002}])".to_string()); } else if self.name() == "intersect" { return Ok("intersect([${0:extrude001}, ${1:extrude002}])".to_string()); - } else if self.name() == "hole" { - return Ok("hole(${0:holeSketch}, ${1:%})".to_string()); + } else if self.name() == "subtract2D" { + return Ok("subtract2d(${0:%}, tool = ${1:%})".to_string()); } let in_keyword_fn = self.keyword_arguments(); let mut args = Vec::new(); @@ -1015,9 +1015,9 @@ mod tests { #[test] fn get_autocomplete_snippet_hole() { - let hole_fn: Box = Box::new(crate::std::sketch::Hole); - let snippet = hole_fn.to_autocomplete_snippet().unwrap(); - assert_eq!(snippet, r#"hole(${0:holeSketch}, ${1:%})"#); + let f: Box = Box::new(crate::std::sketch::Subtract2D); + let snippet = f.to_autocomplete_snippet().unwrap(); + assert_eq!(snippet, r#"subtract2d(${0:%}, tool = ${1:%})"#); } #[test] diff --git a/rust/kcl-lib/src/std/appearance.rs b/rust/kcl-lib/src/std/appearance.rs index 641417e16..c40e1f179 100644 --- a/rust/kcl-lib/src/std/appearance.rs +++ b/rust/kcl-lib/src/std/appearance.rs @@ -262,7 +262,7 @@ pub async fn appearance(exec_state: &mut ExecState, args: Args) -> Result hole(pipeHole, %) +/// |> subtract2d(tool = pipeHole) /// |> sweep(path = sweepPath) /// |> appearance( /// color = "#ff0000", diff --git a/rust/kcl-lib/src/std/args.rs b/rust/kcl-lib/src/std/args.rs index 906dd7a8d..e16f25fd3 100644 --- a/rust/kcl-lib/src/std/args.rs +++ b/rust/kcl-lib/src/std/args.rs @@ -615,50 +615,6 @@ impl Args { Ok(numbers) } - pub(crate) fn get_sketches(&self, exec_state: &mut ExecState) -> Result<(Vec, Sketch), KclError> { - let Some(arg0) = self.args.first() else { - return Err(KclError::Semantic(KclErrorDetails { - message: "Expected a sketch argument".to_owned(), - source_ranges: vec![self.source_range], - })); - }; - let sarg = arg0.value.coerce(&RuntimeType::sketches(), exec_state).map_err(|_| { - KclError::Type(KclErrorDetails { - message: format!( - "Expected an array of sketches, found {}", - arg0.value.human_friendly_type() - ), - source_ranges: vec![self.source_range], - }) - })?; - let sketches = match sarg { - KclValue::HomArray { value, .. } => value.iter().map(|v| v.as_sketch().unwrap().clone()).collect(), - _ => unreachable!(), - }; - - let Some(arg1) = self.args.get(1) else { - return Err(KclError::Semantic(KclErrorDetails { - message: "Expected a second sketch argument".to_owned(), - source_ranges: vec![self.source_range], - })); - }; - let sarg = arg1 - .value - .coerce(&RuntimeType::Primitive(PrimitiveType::Sketch), exec_state) - .map_err(|_| { - KclError::Type(KclErrorDetails { - message: format!("Expected a sketch, found {}", arg1.value.human_friendly_type()), - source_ranges: vec![self.source_range], - }) - })?; - let sketch = match sarg { - KclValue::Sketch { value } => *value, - _ => unreachable!(), - }; - - Ok((sketches, sketch)) - } - pub(crate) async fn get_adjacent_face_to_tag( &self, exec_state: &mut ExecState, diff --git a/rust/kcl-lib/src/std/mod.rs b/rust/kcl-lib/src/std/mod.rs index 7b6e79449..b76d932fa 100644 --- a/rust/kcl-lib/src/std/mod.rs +++ b/rust/kcl-lib/src/std/mod.rs @@ -89,7 +89,7 @@ lazy_static! { Box::new(crate::std::sketch::Arc), Box::new(crate::std::sketch::TangentialArc), Box::new(crate::std::sketch::BezierCurve), - Box::new(crate::std::sketch::Hole), + Box::new(crate::std::sketch::Subtract2D), Box::new(crate::std::clone::Clone), Box::new(crate::std::patterns::PatternLinear2D), Box::new(crate::std::patterns::PatternLinear3D), diff --git a/rust/kcl-lib/src/std/sketch.rs b/rust/kcl-lib/src/std/sketch.rs index 4f101e5f6..fa9e62351 100644 --- a/rust/kcl-lib/src/std/sketch.rs +++ b/rust/kcl-lib/src/std/sketch.rs @@ -13,6 +13,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use super::utils::{point_to_len_unit, point_to_mm, untype_point, untyped_point_to_mm}; +use crate::execution::types::ArrayLen; use crate::{ errors::{KclError, KclErrorDetails}, execution::{ @@ -2253,10 +2254,20 @@ async fn inner_bezier_curve( } /// Use a sketch to cut a hole in another sketch. -pub async fn hole(exec_state: &mut ExecState, args: Args) -> Result { - let (hole_sketch, sketch): (Vec, Sketch) = args.get_sketches(exec_state)?; +pub async fn subtract_2d(exec_state: &mut ExecState, args: Args) -> Result { + let sketch = + args.get_unlabeled_kw_arg_typed("sketch", &RuntimeType::Primitive(PrimitiveType::Sketch), exec_state)?; - let new_sketch = inner_hole(hole_sketch, sketch, exec_state, args).await?; + let tool: Vec = args.get_kw_arg_typed( + "tool", + &RuntimeType::Array( + Box::new(RuntimeType::Primitive(PrimitiveType::Sketch)), + ArrayLen::NonEmpty, + ), + exec_state, + )?; + + let new_sketch = inner_subtract_2d(sketch, tool, exec_state, args).await?; Ok(KclValue::Sketch { value: Box::new(new_sketch), }) @@ -2271,8 +2282,8 @@ pub async fn hole(exec_state: &mut ExecState, args: Args) -> Result line(end = [5, 0]) /// |> line(end = [0, -5]) /// |> close() -/// |> hole(circle( center = [1, 1], radius = .25 ), %) -/// |> hole(circle( center = [1, 4], radius = .25 ), %) +/// |> subtract2d(tool =circle( center = [1, 1], radius = .25 )) +/// |> subtract2d(tool =circle( center = [1, 4], radius = .25 )) /// /// example = extrude(exampleSketch, length = 1) /// ``` @@ -2290,20 +2301,26 @@ pub async fn hole(exec_state: &mut ExecState, args: Args) -> Result circle( center = [0, 0], radius = 3 ) -/// |> hole(squareHoleSketch(), %) +/// |> subtract2d(tool = squareHoleSketch()) /// example = extrude(exampleSketch, length = 1) /// ``` #[stdlib { - name = "hole", + name = "subtract2d", feature_tree_operation = true, + keywords = true, + unlabeled_first = true, + args = { + sketch = { docs = "Which sketch should this path be added to?" }, + tool = { docs = "The shape(s) which should be cut out of the sketch." }, + } }] -async fn inner_hole( - hole_sketch: Vec, +async fn inner_subtract_2d( sketch: Sketch, + tool: Vec, exec_state: &mut ExecState, args: Args, ) -> Result { - for hole_sketch in hole_sketch { + for hole_sketch in tool { args.batch_modeling_cmd( exec_state.next_uuid(), ModelingCmd::from(mcmd::Solid2dAddHole { diff --git a/rust/kcl-lib/src/std/sweep.rs b/rust/kcl-lib/src/std/sweep.rs index 97c6da89e..882140cd8 100644 --- a/rust/kcl-lib/src/std/sweep.rs +++ b/rust/kcl-lib/src/std/sweep.rs @@ -82,7 +82,7 @@ pub async fn sweep(exec_state: &mut ExecState, args: Args) -> Result hole(pipeHole, %) +/// |> subtract2d(tool = pipeHole) /// |> sweep(path = sweepPath) /// ``` /// diff --git a/rust/kcl-lib/src/std/transform.rs b/rust/kcl-lib/src/std/transform.rs index ca1ae8117..a4e21ce1e 100644 --- a/rust/kcl-lib/src/std/transform.rs +++ b/rust/kcl-lib/src/std/transform.rs @@ -95,7 +95,7 @@ pub async fn scale(exec_state: &mut ExecState, args: Args) -> Result hole(pipeHole, %) +/// |> subtract2d(tool = pipeHole) /// |> sweep(path = sweepPath) /// |> scale( /// z = 2.5, @@ -261,7 +261,7 @@ pub async fn translate(exec_state: &mut ExecState, args: Args) -> Result hole(pipeHole, %) +/// |> subtract2d(tool = pipeHole) /// |> sweep(path = sweepPath) /// |> translate( /// x = 1.0, @@ -600,7 +600,7 @@ pub async fn rotate(exec_state: &mut ExecState, args: Args) -> Result hole(pipeHole, %) +/// |> subtract2d(tool = pipeHole) /// |> sweep(path = sweepPath) /// |> rotate( /// roll = 10, @@ -633,7 +633,7 @@ pub async fn rotate(exec_state: &mut ExecState, args: Args) -> Result hole(pipeHole, %) +/// |> subtract2d(tool = pipeHole) /// |> sweep(path = sweepPath) /// |> rotate( /// roll = 10, @@ -664,7 +664,7 @@ pub async fn rotate(exec_state: &mut ExecState, args: Args) -> Result hole(pipeHole, %) +/// |> subtract2d(tool = pipeHole) /// |> sweep(path = sweepPath) /// |> rotate( /// axis = [0, 0, 1.0], @@ -850,7 +850,7 @@ sweepSketch = startSketchOn('XY') center = [0, 0], radius = 2, ) - |> hole(pipeHole, %) + |> subtract2d(tool = pipeHole) |> sweep( path = sweepPath, )"#; diff --git a/rust/kcl-lib/std/sketch.kcl b/rust/kcl-lib/std/sketch.kcl index f0bf2f72d..1805b8285 100644 --- a/rust/kcl-lib/std/sketch.kcl +++ b/rust/kcl-lib/std/sketch.kcl @@ -18,7 +18,7 @@ /// |> line(end = [0, 30]) /// |> line(end = [-30, 0]) /// |> close() -/// |> hole(circle(center = [0, 15], radius = 5), %) +/// |> subtract2d(tool = circle(center = [0, 15], radius = 5)) /// /// example = extrude(exampleSketch, length = 5) /// ``` diff --git a/rust/kcl-lib/tests/fillet-and-shell/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/fillet-and-shell/artifact_graph_flowchart.snap.md index cc6977d32..5fbc26f39 100644 --- a/rust/kcl-lib/tests/fillet-and-shell/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/fillet-and-shell/artifact_graph_flowchart.snap.md @@ -25,8 +25,8 @@ flowchart LR 30[Solid2d] end subgraph path31 [Path] - 31["Path
[1426, 1464, 0]"] - 32["Segment
[1426, 1464, 0]"] + 31["Path
[1439, 1477, 0]"] + 32["Segment
[1439, 1477, 0]"] 33[Solid2d] end subgraph path39 [Path] @@ -38,8 +38,8 @@ flowchart LR 42[Solid2d] end subgraph path43 [Path] - 43["Path
[1426, 1464, 0]"] - 44["Segment
[1426, 1464, 0]"] + 43["Path
[1439, 1477, 0]"] + 44["Segment
[1439, 1477, 0]"] 45[Solid2d] end subgraph path51 [Path] @@ -51,8 +51,8 @@ flowchart LR 54[Solid2d] end subgraph path55 [Path] - 55["Path
[1426, 1464, 0]"] - 56["Segment
[1426, 1464, 0]"] + 55["Path
[1439, 1477, 0]"] + 56["Segment
[1439, 1477, 0]"] 57[Solid2d] end subgraph path63 [Path] @@ -64,8 +64,8 @@ flowchart LR 66[Solid2d] end subgraph path67 [Path] - 67["Path
[1426, 1464, 0]"] - 68["Segment
[1426, 1464, 0]"] + 67["Path
[1439, 1477, 0]"] + 68["Segment
[1439, 1477, 0]"] 69[Solid2d] end 1["Plane
[373, 390, 0]"] @@ -82,22 +82,22 @@ flowchart LR 24["SweepEdge Opposite"] 25["SweepEdge Adjacent"] 26["Plane
[1316, 1335, 0]"] - 34["Sweep Extrusion
[1476, 1500, 0]"] + 34["Sweep Extrusion
[1486, 1510, 0]"] 35[Wall] 36["Cap Start"] 37["Cap End"] 38["Plane
[1316, 1335, 0]"] - 46["Sweep Extrusion
[1476, 1500, 0]"] + 46["Sweep Extrusion
[1486, 1510, 0]"] 47[Wall] 48["Cap Start"] 49["Cap End"] 50["Plane
[1316, 1335, 0]"] - 58["Sweep Extrusion
[1476, 1500, 0]"] + 58["Sweep Extrusion
[1486, 1510, 0]"] 59[Wall] 60["Cap Start"] 61["Cap End"] 62["Plane
[1316, 1335, 0]"] - 70["Sweep Extrusion
[1476, 1500, 0]"] + 70["Sweep Extrusion
[1486, 1510, 0]"] 71[Wall] 72["Cap Start"] 73["Cap End"] diff --git a/rust/kcl-lib/tests/fillet-and-shell/ast.snap b/rust/kcl-lib/tests/fillet-and-shell/ast.snap index 275eb2056..29806e3f6 100644 --- a/rust/kcl-lib/tests/fillet-and-shell/ast.snap +++ b/rust/kcl-lib/tests/fillet-and-shell/ast.snap @@ -2266,109 +2266,112 @@ description: Result of parsing fillet-and-shell.kcl { "arguments": [ { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "x", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "y", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "end": 0, - "raw": "1.25", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.25, - "suffix": "None" - } - } - } - ], - "callee": { - "abs_path": false, + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": { + "name": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "x", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "y", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "1.25", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.25, + "suffix": "None" + } + } + } + ], + "callee": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "circle", + "name": { + "commentStart": 0, + "end": 0, + "name": "circle", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name" }, - "path": [], + "commentStart": 0, + "end": 0, "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } } ], "callee": { @@ -2378,7 +2381,7 @@ description: Result of parsing fillet-and-shell.kcl "name": { "commentStart": 0, "end": 0, - "name": "hole", + "name": "subtract2d", "start": 0, "type": "Identifier" }, @@ -2389,8 +2392,9 @@ description: Result of parsing fillet-and-shell.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/fillet-and-shell/input.kcl b/rust/kcl-lib/tests/fillet-and-shell/input.kcl index 6368d5bd6..3932d404a 100644 --- a/rust/kcl-lib/tests/fillet-and-shell/input.kcl +++ b/rust/kcl-lib/tests/fillet-and-shell/input.kcl @@ -59,7 +59,7 @@ fn m25Screw(x, y, height) { screw = startSketchOn("XY") |> startProfile(at = [0, 0]) |> circle(center = [x, y], radius = 2.5) - |> hole(circle(center = [x, y], radius = 1.25), %) + |> subtract2d(tool = circle(center = [x, y], radius = 1.25)) |> extrude(length = height) return screw } diff --git a/rust/kcl-lib/tests/fillet-and-shell/ops.snap b/rust/kcl-lib/tests/fillet-and-shell/ops.snap index 5fa401692..4d0ef055e 100644 --- a/rust/kcl-lib/tests/fillet-and-shell/ops.snap +++ b/rust/kcl-lib/tests/fillet-and-shell/ops.snap @@ -128,7 +128,7 @@ description: Operations executed fillet-and-shell.kcl "name": "m25Screw", "functionSourceRange": [ 1289, - 1517, + 1527, 0 ], "unlabeledArg": null, @@ -153,16 +153,7 @@ description: Operations executed fillet-and-shell.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -172,10 +163,18 @@ description: Operations executed fillet-and-shell.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { @@ -219,7 +218,7 @@ description: Operations executed fillet-and-shell.kcl "name": "m25Screw", "functionSourceRange": [ 1289, - 1517, + 1527, 0 ], "unlabeledArg": null, @@ -244,16 +243,7 @@ description: Operations executed fillet-and-shell.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -263,10 +253,18 @@ description: Operations executed fillet-and-shell.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { @@ -310,7 +308,7 @@ description: Operations executed fillet-and-shell.kcl "name": "m25Screw", "functionSourceRange": [ 1289, - 1517, + 1527, 0 ], "unlabeledArg": null, @@ -335,16 +333,7 @@ description: Operations executed fillet-and-shell.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -354,10 +343,18 @@ description: Operations executed fillet-and-shell.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { @@ -401,7 +398,7 @@ description: Operations executed fillet-and-shell.kcl "name": "m25Screw", "functionSourceRange": [ 1289, - 1517, + 1527, 0 ], "unlabeledArg": null, @@ -426,16 +423,7 @@ description: Operations executed fillet-and-shell.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -445,10 +433,18 @@ description: Operations executed fillet-and-shell.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { diff --git a/rust/kcl-lib/tests/fillet-and-shell/unparsed.snap b/rust/kcl-lib/tests/fillet-and-shell/unparsed.snap index 526654168..c8ff7b04b 100644 --- a/rust/kcl-lib/tests/fillet-and-shell/unparsed.snap +++ b/rust/kcl-lib/tests/fillet-and-shell/unparsed.snap @@ -66,7 +66,7 @@ fn m25Screw(x, y, height) { screw = startSketchOn(XY) |> startProfile(at = [0, 0]) |> circle(center = [x, y], radius = 2.5) - |> hole(circle(center = [x, y], radius = 1.25), %) + |> subtract2d(tool = circle(center = [x, y], radius = 1.25)) |> extrude(length = height) return screw } diff --git a/rust/kcl-lib/tests/flush_batch_on_end/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/flush_batch_on_end/artifact_graph_flowchart.snap.md index 68a7d764d..3f43ed0ad 100644 --- a/rust/kcl-lib/tests/flush_batch_on_end/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/flush_batch_on_end/artifact_graph_flowchart.snap.md @@ -11,7 +11,7 @@ flowchart LR 7[Solid2d] end 1["Plane
[199, 218, 0]"] - 8["Sweep Extrusion
[696, 733, 0]"] + 8["Sweep Extrusion
[706, 743, 0]"] 9[Wall] 10["Cap Start"] 11["Cap End"] diff --git a/rust/kcl-lib/tests/flush_batch_on_end/ast.snap b/rust/kcl-lib/tests/flush_batch_on_end/ast.snap index d71b644b9..76bbc4168 100644 --- a/rust/kcl-lib/tests/flush_batch_on_end/ast.snap +++ b/rust/kcl-lib/tests/flush_batch_on_end/ast.snap @@ -608,27 +608,30 @@ description: Result of parsing flush_batch_on_end.kcl { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "innerProfile", + "name": "tool", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "innerProfile", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -638,7 +641,7 @@ description: Result of parsing flush_batch_on_end.kcl "name": { "commentStart": 0, "end": 0, - "name": "hole", + "name": "subtract2d", "start": 0, "type": "Identifier" }, @@ -649,8 +652,9 @@ description: Result of parsing flush_batch_on_end.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null } ], "commentStart": 0, diff --git a/rust/kcl-lib/tests/flush_batch_on_end/input.kcl b/rust/kcl-lib/tests/flush_batch_on_end/input.kcl index e147a1715..a304a0252 100644 --- a/rust/kcl-lib/tests/flush_batch_on_end/input.kcl +++ b/rust/kcl-lib/tests/flush_batch_on_end/input.kcl @@ -28,7 +28,7 @@ innerProfile = circle( // create a profile with holes sketch000Profile000Holes pipeProfile = outerProfile - |> hole(innerProfile, %) + |> subtract2d(tool = innerProfile) // extrude the pipe profile to create the pipe pipe = extrude(pipeProfile, length = length) diff --git a/rust/kcl-lib/tests/flush_batch_on_end/ops.snap b/rust/kcl-lib/tests/flush_batch_on_end/ops.snap index 286995c4b..dfb08727a 100644 --- a/rust/kcl-lib/tests/flush_batch_on_end/ops.snap +++ b/rust/kcl-lib/tests/flush_batch_on_end/ops.snap @@ -20,16 +20,7 @@ description: Operations executed flush_batch_on_end.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -39,10 +30,18 @@ description: Operations executed flush_batch_on_end.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { diff --git a/rust/kcl-lib/tests/flush_batch_on_end/unparsed.snap b/rust/kcl-lib/tests/flush_batch_on_end/unparsed.snap index 45b88fe14..058992b10 100644 --- a/rust/kcl-lib/tests/flush_batch_on_end/unparsed.snap +++ b/rust/kcl-lib/tests/flush_batch_on_end/unparsed.snap @@ -32,7 +32,7 @@ innerProfile = circle( // create a profile with holes sketch000Profile000Holes pipeProfile = outerProfile - |> hole(innerProfile, %) + |> subtract2d(tool = innerProfile) // extrude the pipe profile to create the pipe pipe = extrude(pipeProfile, length = length) 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 e9c04a0cc..62af0563a 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 @@ -44,7 +44,7 @@ flowchart LR end 1["Plane
[399, 416, 0]"] 29["Plane
[1908, 1925, 0]"] - 41["Sweep Extrusion
[2398, 2419, 0]"] + 41["Sweep Extrusion
[2408, 2429, 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 ab243b990..b971de72f 100644 --- a/rust/kcl-lib/tests/i_shape/ast.snap +++ b/rust/kcl-lib/tests/i_shape/ast.snap @@ -3662,27 +3662,30 @@ description: Result of parsing i_shape.kcl { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "inner", + "name": "tool", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "inner", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -3692,7 +3695,7 @@ description: Result of parsing i_shape.kcl "name": { "commentStart": 0, "end": 0, - "name": "hole", + "name": "subtract2d", "start": 0, "type": "Identifier" }, @@ -3703,8 +3706,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 717f8c091..32d1f7efd 100644 --- a/rust/kcl-lib/tests/i_shape/input.kcl +++ b/rust/kcl-lib/tests/i_shape/input.kcl @@ -48,5 +48,5 @@ inner = startSketchOn(XY) |> close(%) final = brace_base - |> hole(inner, %) + |> subtract2d(tool = inner) |> extrude(length = 3.0) diff --git a/rust/kcl-lib/tests/i_shape/ops.snap b/rust/kcl-lib/tests/i_shape/ops.snap index 82cf8925e..97250f037 100644 --- a/rust/kcl-lib/tests/i_shape/ops.snap +++ b/rust/kcl-lib/tests/i_shape/ops.snap @@ -35,16 +35,7 @@ description: Operations executed i_shape.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -54,10 +45,18 @@ description: Operations executed i_shape.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { diff --git a/rust/kcl-lib/tests/i_shape/unparsed.snap b/rust/kcl-lib/tests/i_shape/unparsed.snap index f560ca860..5c4559747 100644 --- a/rust/kcl-lib/tests/i_shape/unparsed.snap +++ b/rust/kcl-lib/tests/i_shape/unparsed.snap @@ -52,5 +52,5 @@ inner = startSketchOn(XY) |> close(%) final = brace_base - |> hole(inner, %) + |> subtract2d(tool = inner) |> extrude(length = 3.0) diff --git a/rust/kcl-lib/tests/kcl_samples/80-20-rail/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/80-20-rail/artifact_graph_flowchart.snap.md index 986011bbd..824cbf033 100644 --- a/rust/kcl-lib/tests/kcl_samples/80-20-rail/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/80-20-rail/artifact_graph_flowchart.snap.md @@ -70,12 +70,12 @@ flowchart LR 68[Solid2d] end subgraph path69 [Path] - 69["Path
[4868, 5046, 0]"] - 70["Segment
[4868, 5046, 0]"] + 69["Path
[4881, 5059, 0]"] + 70["Segment
[4881, 5059, 0]"] 71[Solid2d] end 1["Plane
[323, 341, 0]"] - 72["Sweep Extrusion
[5058, 5086, 0]"] + 72["Sweep Extrusion
[5068, 5096, 0]"] 73[Wall] 74[Wall] 75[Wall] @@ -206,38 +206,38 @@ flowchart LR 200["SweepEdge Opposite"] 201["SweepEdge Opposite"] 202["SweepEdge Adjacent"] - 203["EdgeCut Fillet
[5094, 5799, 0]"] - 204["EdgeCut Fillet
[5094, 5799, 0]"] - 205["EdgeCut Fillet
[5094, 5799, 0]"] - 206["EdgeCut Fillet
[5094, 5799, 0]"] - 207["EdgeCut Fillet
[5094, 5799, 0]"] - 208["EdgeCut Fillet
[5094, 5799, 0]"] - 209["EdgeCut Fillet
[5094, 5799, 0]"] - 210["EdgeCut Fillet
[5094, 5799, 0]"] - 211["EdgeCut Fillet
[5094, 5799, 0]"] - 212["EdgeCut Fillet
[5094, 5799, 0]"] - 213["EdgeCut Fillet
[5094, 5799, 0]"] - 214["EdgeCut Fillet
[5094, 5799, 0]"] - 215["EdgeCut Fillet
[5094, 5799, 0]"] - 216["EdgeCut Fillet
[5094, 5799, 0]"] - 217["EdgeCut Fillet
[5094, 5799, 0]"] - 218["EdgeCut Fillet
[5094, 5799, 0]"] - 219["EdgeCut Fillet
[5807, 6511, 0]"] - 220["EdgeCut Fillet
[5807, 6511, 0]"] - 221["EdgeCut Fillet
[5807, 6511, 0]"] - 222["EdgeCut Fillet
[5807, 6511, 0]"] - 223["EdgeCut Fillet
[5807, 6511, 0]"] - 224["EdgeCut Fillet
[5807, 6511, 0]"] - 225["EdgeCut Fillet
[5807, 6511, 0]"] - 226["EdgeCut Fillet
[5807, 6511, 0]"] - 227["EdgeCut Fillet
[5807, 6511, 0]"] - 228["EdgeCut Fillet
[5807, 6511, 0]"] - 229["EdgeCut Fillet
[5807, 6511, 0]"] - 230["EdgeCut Fillet
[5807, 6511, 0]"] - 231["EdgeCut Fillet
[5807, 6511, 0]"] - 232["EdgeCut Fillet
[5807, 6511, 0]"] - 233["EdgeCut Fillet
[5807, 6511, 0]"] - 234["EdgeCut Fillet
[5807, 6511, 0]"] + 203["EdgeCut Fillet
[5104, 5809, 0]"] + 204["EdgeCut Fillet
[5104, 5809, 0]"] + 205["EdgeCut Fillet
[5104, 5809, 0]"] + 206["EdgeCut Fillet
[5104, 5809, 0]"] + 207["EdgeCut Fillet
[5104, 5809, 0]"] + 208["EdgeCut Fillet
[5104, 5809, 0]"] + 209["EdgeCut Fillet
[5104, 5809, 0]"] + 210["EdgeCut Fillet
[5104, 5809, 0]"] + 211["EdgeCut Fillet
[5104, 5809, 0]"] + 212["EdgeCut Fillet
[5104, 5809, 0]"] + 213["EdgeCut Fillet
[5104, 5809, 0]"] + 214["EdgeCut Fillet
[5104, 5809, 0]"] + 215["EdgeCut Fillet
[5104, 5809, 0]"] + 216["EdgeCut Fillet
[5104, 5809, 0]"] + 217["EdgeCut Fillet
[5104, 5809, 0]"] + 218["EdgeCut Fillet
[5104, 5809, 0]"] + 219["EdgeCut Fillet
[5817, 6521, 0]"] + 220["EdgeCut Fillet
[5817, 6521, 0]"] + 221["EdgeCut Fillet
[5817, 6521, 0]"] + 222["EdgeCut Fillet
[5817, 6521, 0]"] + 223["EdgeCut Fillet
[5817, 6521, 0]"] + 224["EdgeCut Fillet
[5817, 6521, 0]"] + 225["EdgeCut Fillet
[5817, 6521, 0]"] + 226["EdgeCut Fillet
[5817, 6521, 0]"] + 227["EdgeCut Fillet
[5817, 6521, 0]"] + 228["EdgeCut Fillet
[5817, 6521, 0]"] + 229["EdgeCut Fillet
[5817, 6521, 0]"] + 230["EdgeCut Fillet
[5817, 6521, 0]"] + 231["EdgeCut Fillet
[5817, 6521, 0]"] + 232["EdgeCut Fillet
[5817, 6521, 0]"] + 233["EdgeCut Fillet
[5817, 6521, 0]"] + 234["EdgeCut Fillet
[5817, 6521, 0]"] 1 --- 2 1 --- 69 2 --- 3 diff --git a/rust/kcl-lib/tests/kcl_samples/80-20-rail/ast.snap b/rust/kcl-lib/tests/kcl_samples/80-20-rail/ast.snap index 479785b2a..e3f073482 100644 --- a/rust/kcl-lib/tests/kcl_samples/80-20-rail/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/80-20-rail/ast.snap @@ -7500,265 +7500,268 @@ description: Result of parsing 80-20-rail.kcl { "arguments": [ { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { "commentStart": 0, "end": 0, "left": { "commentStart": 0, "end": 0, - "raw": ".5", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.5, - "suffix": "None" - } - }, - "operator": "*", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "left": { "commentStart": 0, "end": 0, - "name": "railHeight", + "raw": ".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": "railHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "computed": false, + "end": 0, + "object": { + "commentStart": 0, + "end": 0, + "name": "originStart", + "start": 0, + "type": "Identifier", "type": "Identifier" }, - "path": [], + "property": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, "start": 0, - "type": "Name", - "type": "Name" + "type": "MemberExpression", + "type": "MemberExpression" }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" }, - "operator": "+", - "right": { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "end": 0, - "name": "originStart", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "property": { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { + { "commentStart": 0, "end": 0, "left": { "commentStart": 0, "end": 0, - "raw": ".5", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.5, - "suffix": "None" - } - }, - "operator": "*", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "left": { "commentStart": 0, "end": 0, - "name": "railHeight", + "raw": ".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": "railHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "computed": false, + "end": 0, + "object": { + "commentStart": 0, + "end": 0, + "name": "originStart", + "start": 0, + "type": "Identifier", "type": "Identifier" }, - "path": [], + "property": { + "commentStart": 0, + "end": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + }, "start": 0, - "type": "Name", - "type": "Name" + "type": "MemberExpression", + "type": "MemberExpression" }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" - }, - "operator": "+", - "right": { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "end": 0, - "name": "originStart", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "property": { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" - } - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, - "arg": { - "commentStart": 0, - "end": 0, - "left": { + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { "commentStart": 0, "end": 0, "left": { "commentStart": 0, "end": 0, - "raw": ".205", + "left": { + "commentStart": 0, + "end": 0, + "raw": ".205", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.205, + "suffix": "None" + } + }, + "operator": "*", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "railHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", "start": 0, "type": "Literal", "type": "Literal", "value": { - "value": 0.205, + "value": 2.0, "suffix": "None" } }, - "operator": "*", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "railHeight", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, "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" + } } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + ], + "callee": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "circle", + "name": { + "commentStart": 0, + "end": 0, + "name": "circle", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name" }, - "path": [], + "commentStart": 0, + "end": 0, "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } } ], "callee": { @@ -7768,7 +7771,7 @@ description: Result of parsing 80-20-rail.kcl "name": { "commentStart": 0, "end": 0, - "name": "hole", + "name": "subtract2d", "start": 0, "type": "Identifier" }, @@ -7779,8 +7782,9 @@ description: Result of parsing 80-20-rail.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/80-20-rail/ops.snap b/rust/kcl-lib/tests/kcl_samples/80-20-rail/ops.snap index e9d4c12fe..12ffaa3a2 100644 --- a/rust/kcl-lib/tests/kcl_samples/80-20-rail/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/80-20-rail/ops.snap @@ -10,7 +10,7 @@ description: Operations executed 80-20-rail.kcl "name": "rail8020", "functionSourceRange": [ 239, - 6532, + 6542, 0 ], "unlabeledArg": null, @@ -35,16 +35,7 @@ description: Operations executed 80-20-rail.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -54,10 +45,18 @@ description: Operations executed 80-20-rail.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { diff --git a/rust/kcl-lib/tests/kcl_samples/axial-fan/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/axial-fan/artifact_graph_flowchart.snap.md index 738d87893..6a013ebf3 100644 --- a/rust/kcl-lib/tests/kcl_samples/axial-fan/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/axial-fan/artifact_graph_flowchart.snap.md @@ -10,101 +10,101 @@ flowchart LR 8[Solid2d] end subgraph path9 [Path] - 9["Path
[788, 823, 6]"] - 10["Segment
[788, 823, 6]"] + 9["Path
[801, 836, 6]"] + 10["Segment
[801, 836, 6]"] 11[Solid2d] end subgraph path12 [Path] - 12["Path
[838, 985, 6]"] - 13["Segment
[838, 985, 6]"] + 12["Path
[861, 1008, 6]"] + 13["Segment
[861, 1008, 6]"] 14[Solid2d] end subgraph path15 [Path] - 15["Path
[1000, 1148, 6]"] - 16["Segment
[1000, 1148, 6]"] + 15["Path
[1033, 1181, 6]"] + 16["Segment
[1033, 1181, 6]"] 17[Solid2d] end subgraph path18 [Path] - 18["Path
[1163, 1311, 6]"] - 19["Segment
[1163, 1311, 6]"] + 18["Path
[1206, 1354, 6]"] + 19["Segment
[1206, 1354, 6]"] 20[Solid2d] end subgraph path21 [Path] - 21["Path
[1326, 1475, 6]"] - 22["Segment
[1326, 1475, 6]"] + 21["Path
[1379, 1528, 6]"] + 22["Segment
[1379, 1528, 6]"] 23[Solid2d] end subgraph path34 [Path] - 34["Path
[1646, 1702, 6]"] - 35["Segment
[1708, 1773, 6]"] - 36["Segment
[1779, 1831, 6]"] - 37["Segment
[1837, 1888, 6]"] - 38["Segment
[1894, 1946, 6]"] - 39["Segment
[1952, 2018, 6]"] - 40["Segment
[2024, 2076, 6]"] - 41["Segment
[2082, 2114, 6]"] - 42["Segment
[2120, 2185, 6]"] - 43["Segment
[2191, 2198, 6]"] + 34["Path
[1696, 1752, 6]"] + 35["Segment
[1758, 1823, 6]"] + 36["Segment
[1829, 1881, 6]"] + 37["Segment
[1887, 1938, 6]"] + 38["Segment
[1944, 1996, 6]"] + 39["Segment
[2002, 2068, 6]"] + 40["Segment
[2074, 2126, 6]"] + 41["Segment
[2132, 2164, 6]"] + 42["Segment
[2170, 2235, 6]"] + 43["Segment
[2241, 2248, 6]"] 44[Solid2d] end subgraph path64 [Path] - 64["Path
[2547, 2660, 6]"] - 65["Segment
[2666, 2721, 6]"] - 66["Segment
[2727, 2762, 6]"] - 67["Segment
[2768, 2823, 6]"] - 68["Segment
[2829, 2865, 6]"] - 69["Segment
[2871, 2926, 6]"] - 70["Segment
[2932, 2968, 6]"] - 71["Segment
[2974, 3029, 6]"] - 72["Segment
[3035, 3091, 6]"] + 64["Path
[2597, 2710, 6]"] + 65["Segment
[2716, 2771, 6]"] + 66["Segment
[2777, 2812, 6]"] + 67["Segment
[2818, 2873, 6]"] + 68["Segment
[2879, 2915, 6]"] + 69["Segment
[2921, 2976, 6]"] + 70["Segment
[2982, 3018, 6]"] + 71["Segment
[3024, 3079, 6]"] + 72["Segment
[3085, 3141, 6]"] end subgraph path90 [Path] - 90["Path
[3240, 3291, 6]"] - 91["Segment
[3240, 3291, 6]"] + 90["Path
[3290, 3341, 6]"] + 91["Segment
[3290, 3341, 6]"] 92[Solid2d] end subgraph path95 [Path] - 95["Path
[3470, 3532, 6]"] - 96["Segment
[3538, 3606, 6]"] - 97["Segment
[3612, 3712, 6]"] - 98["Segment
[3718, 3835, 6]"] - 99["Segment
[3841, 3926, 6]"] - 100["Segment
[3932, 3939, 6]"] + 95["Path
[3520, 3582, 6]"] + 96["Segment
[3588, 3656, 6]"] + 97["Segment
[3662, 3762, 6]"] + 98["Segment
[3768, 3885, 6]"] + 99["Segment
[3891, 3976, 6]"] + 100["Segment
[3982, 3989, 6]"] 101[Solid2d] end subgraph path102 [Path] - 102["Path
[3950, 4001, 6]"] - 103["Segment
[3950, 4001, 6]"] + 102["Path
[4013, 4064, 6]"] + 103["Segment
[4013, 4064, 6]"] 104[Solid2d] end subgraph path105 [Path] - 105["Path
[4016, 4163, 6]"] - 106["Segment
[4016, 4163, 6]"] + 105["Path
[4089, 4236, 6]"] + 106["Segment
[4089, 4236, 6]"] 107[Solid2d] end subgraph path108 [Path] - 108["Path
[4178, 4326, 6]"] - 109["Segment
[4178, 4326, 6]"] + 108["Path
[4261, 4409, 6]"] + 109["Segment
[4261, 4409, 6]"] 110[Solid2d] end subgraph path111 [Path] - 111["Path
[4341, 4489, 6]"] - 112["Segment
[4341, 4489, 6]"] + 111["Path
[4434, 4582, 6]"] + 112["Segment
[4434, 4582, 6]"] 113[Solid2d] end subgraph path114 [Path] - 114["Path
[4504, 4653, 6]"] - 115["Segment
[4504, 4653, 6]"] + 114["Path
[4607, 4756, 6]"] + 115["Segment
[4607, 4756, 6]"] 116[Solid2d] end subgraph path127 [Path] - 127["Path
[4798, 4836, 6]"] - 128["Segment
[4798, 4836, 6]"] + 127["Path
[4898, 4936, 6]"] + 128["Segment
[4898, 4936, 6]"] 129[Solid2d] end subgraph path133 [Path] - 133["Path
[4909, 4945, 6]"] - 134["Segment
[4909, 4945, 6]"] + 133["Path
[5009, 5045, 6]"] + 134["Segment
[5009, 5045, 6]"] 135[Solid2d] end subgraph path148 [Path] @@ -159,7 +159,7 @@ flowchart LR 218[Solid2d] end 1["Plane
[300, 317, 6]"] - 24["Sweep Extrusion
[1485, 1504, 6]"] + 24["Sweep Extrusion
[1535, 1554, 6]"] 25[Wall] 26[Wall] 27[Wall] @@ -169,7 +169,7 @@ flowchart LR 31["SweepEdge Opposite"] 32["SweepEdge Opposite"] 33["SweepEdge Opposite"] - 45["Sweep Extrusion
[2338, 2358, 6]"] + 45["Sweep Extrusion
[2388, 2408, 6]"] 46[Wall] 47[Wall] 48[Wall] @@ -185,10 +185,10 @@ flowchart LR 58["SweepEdge Opposite"] 59["SweepEdge Opposite"] 60["SweepEdge Opposite"] - 61["Sweep Extrusion
[2338, 2358, 6]"] - 62["Sweep Extrusion
[2338, 2358, 6]"] - 63["Sweep Extrusion
[2338, 2358, 6]"] - 73["Sweep Extrusion
[3097, 3132, 6]"] + 61["Sweep Extrusion
[2388, 2408, 6]"] + 62["Sweep Extrusion
[2388, 2408, 6]"] + 63["Sweep Extrusion
[2388, 2408, 6]"] + 73["Sweep Extrusion
[3147, 3182, 6]"] 74[Wall] 75[Wall] 76[Wall] @@ -205,9 +205,9 @@ flowchart LR 87["SweepEdge Opposite"] 88["SweepEdge Opposite"] 89["SweepEdge Opposite"] - 93["Sweep Extrusion
[3297, 3335, 6]"] + 93["Sweep Extrusion
[3347, 3385, 6]"] 94[Wall] - 117["Sweep Extrusion
[4663, 4682, 6]"] + 117["Sweep Extrusion
[4763, 4782, 6]"] 118[Wall] 119[Wall] 120[Wall] @@ -217,20 +217,20 @@ flowchart LR 124["SweepEdge Opposite"] 125["SweepEdge Opposite"] 126["SweepEdge Opposite"] - 130["Sweep Extrusion
[4842, 4862, 6]"] + 130["Sweep Extrusion
[4942, 4962, 6]"] 131[Wall] 132["Cap End"] - 136["Sweep Extrusion
[4951, 4972, 6]"] + 136["Sweep Extrusion
[5051, 5072, 6]"] 137[Wall] 138["SweepEdge Adjacent"] - 139["EdgeCut Fillet
[5013, 5524, 6]"] - 140["EdgeCut Fillet
[5013, 5524, 6]"] - 141["EdgeCut Fillet
[5013, 5524, 6]"] - 142["EdgeCut Fillet
[5013, 5524, 6]"] - 143["EdgeCut Fillet
[5013, 5524, 6]"] - 144["EdgeCut Fillet
[5013, 5524, 6]"] - 145["EdgeCut Fillet
[5013, 5524, 6]"] - 146["EdgeCut Fillet
[5013, 5524, 6]"] + 139["EdgeCut Fillet
[5113, 5624, 6]"] + 140["EdgeCut Fillet
[5113, 5624, 6]"] + 141["EdgeCut Fillet
[5113, 5624, 6]"] + 142["EdgeCut Fillet
[5113, 5624, 6]"] + 143["EdgeCut Fillet
[5113, 5624, 6]"] + 144["EdgeCut Fillet
[5113, 5624, 6]"] + 145["EdgeCut Fillet
[5113, 5624, 6]"] + 146["EdgeCut Fillet
[5113, 5624, 6]"] 147["Plane
[204, 231, 7]"] 151["Sweep Extrusion
[333, 353, 7]"] 152[Wall] @@ -271,12 +271,12 @@ flowchart LR 223[Wall] 224["Cap End"] 225["Cap End"] - 226["StartSketchOnFace
[1597, 1640, 6]"] - 227["StartSketchOnFace
[2498, 2541, 6]"] - 228["StartSketchOnFace
[3197, 3234, 6]"] - 229["StartSketchOnFace
[3421, 3458, 6]"] - 230["StartSketchOnFace
[4749, 4792, 6]"] - 231["StartSketchOnFace
[4864, 4903, 6]"] + 226["StartSketchOnFace
[1647, 1690, 6]"] + 227["StartSketchOnFace
[2548, 2591, 6]"] + 228["StartSketchOnFace
[3247, 3284, 6]"] + 229["StartSketchOnFace
[3471, 3508, 6]"] + 230["StartSketchOnFace
[4849, 4892, 6]"] + 231["StartSketchOnFace
[4964, 5003, 6]"] 232["StartSketchOnPlane
[244, 271, 7]"] 233["StartSketchOnPlane
[453, 496, 7]"] 234["StartSketchOnPlane
[1039, 1092, 8]"] diff --git a/rust/kcl-lib/tests/kcl_samples/axial-fan/ops.snap b/rust/kcl-lib/tests/kcl_samples/axial-fan/ops.snap index 3e75ba245..b0d69912e 100644 --- a/rust/kcl-lib/tests/kcl_samples/axial-fan/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/axial-fan/ops.snap @@ -29,16 +29,7 @@ description: Operations executed axial-fan.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -48,23 +39,22 @@ description: Operations executed axial-fan.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -74,23 +64,22 @@ description: Operations executed axial-fan.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -100,23 +89,22 @@ description: Operations executed axial-fan.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -126,23 +114,22 @@ description: Operations executed axial-fan.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -152,10 +139,18 @@ description: Operations executed axial-fan.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { @@ -402,16 +397,7 @@ description: Operations executed axial-fan.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -421,23 +407,22 @@ description: Operations executed axial-fan.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -447,23 +432,22 @@ description: Operations executed axial-fan.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -473,23 +457,22 @@ description: Operations executed axial-fan.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -499,23 +482,22 @@ description: Operations executed axial-fan.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -525,10 +507,18 @@ description: Operations executed axial-fan.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { diff --git a/rust/kcl-lib/tests/kcl_samples/ball-bearing/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/ball-bearing/artifact_graph_flowchart.snap.md index 81f6200f8..04c958d0b 100644 --- a/rust/kcl-lib/tests/kcl_samples/ball-bearing/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/ball-bearing/artifact_graph_flowchart.snap.md @@ -6,66 +6,66 @@ flowchart LR 4[Solid2d] end subgraph path5 [Path] - 5["Path
[737, 783, 0]"] - 6["Segment
[737, 783, 0]"] + 5["Path
[750, 796, 0]"] + 6["Segment
[750, 796, 0]"] 7[Solid2d] end subgraph path13 [Path] - 13["Path
[970, 1026, 0]"] - 14["Segment
[1032, 1091, 0]"] - 15["Segment
[1097, 1104, 0]"] + 13["Path
[980, 1036, 0]"] + 14["Segment
[1042, 1101, 0]"] + 15["Segment
[1107, 1114, 0]"] 16[Solid2d] end subgraph path21 [Path] - 21["Path
[1474, 1607, 0]"] - 22["Segment
[1613, 1673, 0]"] - 23["Segment
[1679, 1710, 0]"] - 24["Segment
[1716, 1744, 0]"] - 25["Segment
[1750, 1757, 0]"] + 21["Path
[1484, 1617, 0]"] + 22["Segment
[1623, 1683, 0]"] + 23["Segment
[1689, 1720, 0]"] + 24["Segment
[1726, 1754, 0]"] + 25["Segment
[1760, 1767, 0]"] 26[Solid2d] end subgraph path33 [Path] - 33["Path
[2091, 2233, 0]"] - 34["Segment
[2091, 2233, 0]"] + 33["Path
[2101, 2243, 0]"] + 34["Segment
[2101, 2243, 0]"] 35[Solid2d] end subgraph path41 [Path] - 41["Path
[2627, 2680, 0]"] - 42["Segment
[2627, 2680, 0]"] + 41["Path
[2637, 2690, 0]"] + 42["Segment
[2637, 2690, 0]"] 43[Solid2d] end subgraph path44 [Path] - 44["Path
[2691, 2765, 0]"] - 45["Segment
[2691, 2765, 0]"] + 44["Path
[2714, 2788, 0]"] + 45["Segment
[2714, 2788, 0]"] 46[Solid2d] end 1["Plane
[610, 657, 0]"] - 8["Sweep Extrusion
[838, 890, 0]"] + 8["Sweep Extrusion
[848, 900, 0]"] 9[Wall] 10["Cap Start"] 11["Cap End"] - 12["Plane
[947, 964, 0]"] - 17["Sweep Revolve
[1186, 1216, 0]"] + 12["Plane
[957, 974, 0]"] + 17["Sweep Revolve
[1196, 1226, 0]"] 18[Wall] 19[Wall] - 20["Plane
[1451, 1468, 0]"] - 27["Sweep Revolve
[1799, 1829, 0]"] + 20["Plane
[1461, 1478, 0]"] + 27["Sweep Revolve
[1809, 1839, 0]"] 28[Wall] 29[Wall] 30[Wall] 31[Wall] - 32["Plane
[2068, 2085, 0]"] - 36["Sweep Revolve
[2276, 2327, 0]"] + 32["Plane
[2078, 2095, 0]"] + 36["Sweep Revolve
[2286, 2337, 0]"] 37[Wall] 38["Cap Start"] 39["Cap End"] - 40["Plane
[2573, 2620, 0]"] - 47["Sweep Extrusion
[2785, 2838, 0]"] + 40["Plane
[2583, 2630, 0]"] + 47["Sweep Extrusion
[2805, 2858, 0]"] 48[Wall] 49["Cap Start"] 50["Cap End"] 51["StartSketchOnPlane
[596, 658, 0]"] - 52["StartSketchOnPlane
[2559, 2621, 0]"] + 52["StartSketchOnPlane
[2569, 2631, 0]"] 1 --- 2 1 --- 5 2 --- 3 diff --git a/rust/kcl-lib/tests/kcl_samples/ball-bearing/ast.snap b/rust/kcl-lib/tests/kcl_samples/ball-bearing/ast.snap index 0d0681c92..a479ced45 100644 --- a/rust/kcl-lib/tests/kcl_samples/ball-bearing/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/ball-bearing/ast.snap @@ -683,125 +683,128 @@ description: Result of parsing ball-bearing.kcl { "arguments": [ { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "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" - } - }, - { - "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, - "name": "shaftDia", - "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" - } - } - ], - "callee": { - "abs_path": false, + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": { + "name": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "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" + } + }, + { + "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, + "name": "shaftDia", + "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" + } + } + ], + "callee": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "circle", + "name": { + "commentStart": 0, + "end": 0, + "name": "circle", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name" }, - "path": [], + "commentStart": 0, + "end": 0, "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } } ], "callee": { @@ -811,7 +814,7 @@ description: Result of parsing ball-bearing.kcl "name": { "commentStart": 0, "end": 0, - "name": "hole", + "name": "subtract2d", "start": 0, "type": "Identifier" }, @@ -822,8 +825,9 @@ description: Result of parsing ball-bearing.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null } ], "commentStart": 0, @@ -3485,76 +3489,119 @@ description: Result of parsing ball-bearing.kcl { "arguments": [ { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "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" + } } - }, - { - "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" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, - "arg": { - "commentStart": 0, - "end": 0, - "left": { + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { "commentStart": 0, "end": 0, "left": { "commentStart": 0, "end": 0, "left": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "shaftDia", + "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" + }, + "operator": "+", + "right": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "shaftDia", + "name": "wallThickness", "start": 0, "type": "Identifier" }, @@ -3563,19 +3610,6 @@ description: Result of parsing ball-bearing.kcl "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" @@ -3588,7 +3622,7 @@ description: Result of parsing ball-bearing.kcl "name": { "commentStart": 0, "end": 0, - "name": "wallThickness", + "name": "sphereDia", "start": 0, "type": "Identifier" }, @@ -3600,58 +3634,31 @@ description: Result of parsing ball-bearing.kcl "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" - }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "sphereDia", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + } } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + ], + "callee": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "circle", + "name": { + "commentStart": 0, + "end": 0, + "name": "circle", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name" }, - "path": [], + "commentStart": 0, + "end": 0, "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } } ], "callee": { @@ -3661,7 +3668,7 @@ description: Result of parsing ball-bearing.kcl "name": { "commentStart": 0, "end": 0, - "name": "hole", + "name": "subtract2d", "start": 0, "type": "Identifier" }, @@ -3672,8 +3679,9 @@ description: Result of parsing ball-bearing.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null } ], "commentStart": 0, diff --git a/rust/kcl-lib/tests/kcl_samples/ball-bearing/ops.snap b/rust/kcl-lib/tests/kcl_samples/ball-bearing/ops.snap index 9a4755a5c..f90748ff6 100644 --- a/rust/kcl-lib/tests/kcl_samples/ball-bearing/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/ball-bearing/ops.snap @@ -50,16 +50,7 @@ description: Operations executed ball-bearing.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -69,10 +60,18 @@ description: Operations executed ball-bearing.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { @@ -970,16 +969,7 @@ description: Operations executed ball-bearing.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -989,10 +979,18 @@ description: Operations executed ball-bearing.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { 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 fa1c9a0e8..759346b45 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 @@ -59,92 +59,92 @@ flowchart LR 110[Solid2d] end subgraph path111 [Path] - 111["Path
[421, 477, 6]"] - 112["Segment
[421, 477, 6]"] + 111["Path
[434, 490, 6]"] + 112["Segment
[434, 490, 6]"] 113[Solid2d] end subgraph path118 [Path] - 118["Path
[647, 703, 6]"] - 119["Segment
[647, 703, 6]"] + 118["Path
[657, 713, 6]"] + 119["Segment
[657, 713, 6]"] 120[Solid2d] end subgraph path121 [Path] - 121["Path
[714, 770, 6]"] - 122["Segment
[714, 770, 6]"] + 121["Path
[737, 793, 6]"] + 122["Segment
[737, 793, 6]"] 123[Solid2d] end subgraph path128 [Path] - 128["Path
[919, 973, 6]"] - 129["Segment
[919, 973, 6]"] + 128["Path
[939, 993, 6]"] + 129["Segment
[939, 993, 6]"] 130[Solid2d] end subgraph path137 [Path] - 137["Path
[1256, 1317, 6]"] - 138["Segment
[1256, 1317, 6]"] + 137["Path
[1276, 1337, 6]"] + 138["Segment
[1276, 1337, 6]"] 139[Solid2d] end subgraph path147 [Path] - 147["Path
[1675, 1721, 6]"] - 148["Segment
[1727, 1779, 6]"] - 149["Segment
[1785, 1858, 6]"] - 150["Segment
[1864, 1886, 6]"] - 151["Segment
[1892, 1948, 6]"] - 152["Segment
[1954, 1961, 6]"] + 147["Path
[1695, 1741, 6]"] + 148["Segment
[1747, 1799, 6]"] + 149["Segment
[1805, 1878, 6]"] + 150["Segment
[1884, 1906, 6]"] + 151["Segment
[1912, 1968, 6]"] + 152["Segment
[1974, 1981, 6]"] 153[Solid2d] end subgraph path160 [Path] - 160["Path
[2093, 2139, 6]"] - 161["Segment
[2145, 2197, 6]"] - 162["Segment
[2203, 2278, 6]"] - 163["Segment
[2284, 2321, 6]"] - 164["Segment
[2327, 2383, 6]"] - 165["Segment
[2389, 2396, 6]"] + 160["Path
[2113, 2159, 6]"] + 161["Segment
[2165, 2217, 6]"] + 162["Segment
[2223, 2298, 6]"] + 163["Segment
[2304, 2341, 6]"] + 164["Segment
[2347, 2403, 6]"] + 165["Segment
[2409, 2416, 6]"] 166[Solid2d] end subgraph path173 [Path] - 173["Path
[2877, 2924, 6]"] - 174["Segment
[2932, 3269, 6]"] - 175["Segment
[3277, 3309, 6]"] - 176["Segment
[3317, 3658, 6]"] - 177["Segment
[3666, 3722, 6]"] - 178["Segment
[3730, 3737, 6]"] + 173["Path
[2897, 2944, 6]"] + 174["Segment
[2952, 3289, 6]"] + 175["Segment
[3297, 3329, 6]"] + 176["Segment
[3337, 3678, 6]"] + 177["Segment
[3686, 3742, 6]"] + 178["Segment
[3750, 3757, 6]"] 179[Solid2d] end subgraph path191 [Path] - 191["Path
[2877, 2924, 6]"] - 192["Segment
[2932, 3269, 6]"] - 193["Segment
[3277, 3309, 6]"] - 194["Segment
[3317, 3658, 6]"] - 195["Segment
[3666, 3722, 6]"] - 196["Segment
[3730, 3737, 6]"] + 191["Path
[2897, 2944, 6]"] + 192["Segment
[2952, 3289, 6]"] + 193["Segment
[3297, 3329, 6]"] + 194["Segment
[3337, 3678, 6]"] + 195["Segment
[3686, 3742, 6]"] + 196["Segment
[3750, 3757, 6]"] 197[Solid2d] end subgraph path209 [Path] - 209["Path
[4265, 4360, 6]"] - 210["Segment
[4366, 4399, 6]"] - 211["Segment
[4405, 4456, 6]"] - 212["Segment
[4462, 4495, 6]"] - 213["Segment
[4501, 4551, 6]"] - 214["Segment
[4557, 4598, 6]"] - 215["Segment
[4604, 4653, 6]"] - 216["Segment
[4659, 4692, 6]"] - 217["Segment
[4698, 4732, 6]"] - 218["Segment
[4738, 4772, 6]"] - 219["Segment
[4778, 4830, 6]"] - 220["Segment
[4836, 4870, 6]"] - 221["Segment
[4876, 4952, 6]"] - 222["Segment
[4958, 4991, 6]"] - 223["Segment
[4997, 5073, 6]"] - 224["Segment
[5079, 5113, 6]"] - 225["Segment
[5119, 5193, 6]"] - 226["Segment
[5199, 5233, 6]"] - 227["Segment
[5239, 5290, 6]"] - 228["Segment
[5296, 5358, 6]"] - 229["Segment
[5364, 5415, 6]"] - 230["Segment
[5421, 5455, 6]"] - 231["Segment
[5461, 5494, 6]"] - 232["Segment
[5500, 5533, 6]"] - 233["Segment
[5539, 5546, 6]"] + 209["Path
[4285, 4380, 6]"] + 210["Segment
[4386, 4419, 6]"] + 211["Segment
[4425, 4476, 6]"] + 212["Segment
[4482, 4515, 6]"] + 213["Segment
[4521, 4571, 6]"] + 214["Segment
[4577, 4618, 6]"] + 215["Segment
[4624, 4673, 6]"] + 216["Segment
[4679, 4712, 6]"] + 217["Segment
[4718, 4752, 6]"] + 218["Segment
[4758, 4792, 6]"] + 219["Segment
[4798, 4850, 6]"] + 220["Segment
[4856, 4890, 6]"] + 221["Segment
[4896, 4972, 6]"] + 222["Segment
[4978, 5011, 6]"] + 223["Segment
[5017, 5093, 6]"] + 224["Segment
[5099, 5133, 6]"] + 225["Segment
[5139, 5213, 6]"] + 226["Segment
[5219, 5253, 6]"] + 227["Segment
[5259, 5310, 6]"] + 228["Segment
[5316, 5378, 6]"] + 229["Segment
[5384, 5435, 6]"] + 230["Segment
[5441, 5475, 6]"] + 231["Segment
[5481, 5514, 6]"] + 232["Segment
[5520, 5553, 6]"] + 233["Segment
[5559, 5566, 6]"] 234[Solid2d] end subgraph path261 [Path] @@ -271,40 +271,40 @@ flowchart LR 105["Sweep Extrusion
[3253, 3327, 7]"] 106["Sweep Extrusion
[3253, 3327, 7]"] 107["Plane
[331, 348, 6]"] - 114["Sweep Extrusion
[487, 520, 6]"] + 114["Sweep Extrusion
[497, 530, 6]"] 115[Wall] 116["Cap Start"] 117["Cap End"] - 124["Sweep Extrusion
[780, 813, 6]"] + 124["Sweep Extrusion
[800, 833, 6]"] 125[Wall] 126["Cap Start"] 127["Cap End"] - 131["Sweep Extrusion
[1120, 1154, 6]"] + 131["Sweep Extrusion
[1140, 1174, 6]"] 132[Wall] - 133["Sweep Extrusion
[1120, 1154, 6]"] - 134["Sweep Extrusion
[1120, 1154, 6]"] - 135["Sweep Extrusion
[1120, 1154, 6]"] - 136["Sweep Extrusion
[1120, 1154, 6]"] - 140["Sweep Extrusion
[1464, 1498, 6]"] + 133["Sweep Extrusion
[1140, 1174, 6]"] + 134["Sweep Extrusion
[1140, 1174, 6]"] + 135["Sweep Extrusion
[1140, 1174, 6]"] + 136["Sweep Extrusion
[1140, 1174, 6]"] + 140["Sweep Extrusion
[1484, 1518, 6]"] 141[Wall] - 142["Sweep Extrusion
[1464, 1498, 6]"] - 143["Sweep Extrusion
[1464, 1498, 6]"] - 144["Sweep Extrusion
[1464, 1498, 6]"] - 145["Sweep Extrusion
[1464, 1498, 6]"] - 146["Plane
[1652, 1669, 6]"] - 154["Sweep Revolve
[1967, 1984, 6]"] + 142["Sweep Extrusion
[1484, 1518, 6]"] + 143["Sweep Extrusion
[1484, 1518, 6]"] + 144["Sweep Extrusion
[1484, 1518, 6]"] + 145["Sweep Extrusion
[1484, 1518, 6]"] + 146["Plane
[1672, 1689, 6]"] + 154["Sweep Revolve
[1987, 2004, 6]"] 155[Wall] 156[Wall] 157[Wall] 158[Wall] - 159["Plane
[2070, 2087, 6]"] - 167["Sweep Revolve
[2402, 2419, 6]"] + 159["Plane
[2090, 2107, 6]"] + 167["Sweep Revolve
[2422, 2439, 6]"] 168[Wall] 169[Wall] 170[Wall] 171[Wall] - 172["Plane
[2846, 2869, 6]"] - 180["Sweep Extrusion
[3785, 3831, 6]"] + 172["Plane
[2866, 2889, 6]"] + 180["Sweep Extrusion
[3805, 3851, 6]"] 181[Wall] 182[Wall] 183[Wall] @@ -314,8 +314,8 @@ flowchart LR 187["SweepEdge Opposite"] 188["SweepEdge Opposite"] 189["SweepEdge Opposite"] - 190["Plane
[2846, 2869, 6]"] - 198["Sweep Extrusion
[3785, 3831, 6]"] + 190["Plane
[2866, 2889, 6]"] + 198["Sweep Extrusion
[3805, 3851, 6]"] 199[Wall] 200[Wall] 201[Wall] @@ -325,8 +325,8 @@ flowchart LR 205["SweepEdge Opposite"] 206["SweepEdge Opposite"] 207["SweepEdge Opposite"] - 208["Plane
[4242, 4259, 6]"] - 235["Sweep Revolve
[5552, 5569, 6]"] + 208["Plane
[4262, 4279, 6]"] + 235["Sweep Revolve
[5572, 5589, 6]"] 236[Wall] 237[Wall] 238[Wall] @@ -423,9 +423,9 @@ flowchart LR 375["StartSketchOnFace
[2038, 2072, 7]"] 376["StartSketchOnFace
[2372, 2406, 7]"] 377["StartSketchOnFace
[2860, 2898, 7]"] - 378["StartSketchOnFace
[607, 641, 6]"] - 379["StartSketchOnFace
[874, 913, 6]"] - 380["StartSketchOnFace
[1216, 1250, 6]"] + 378["StartSketchOnFace
[617, 651, 6]"] + 379["StartSketchOnFace
[894, 933, 6]"] + 380["StartSketchOnFace
[1236, 1270, 6]"] 1 --- 2 2 --- 3 2 ---- 5 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 3d8266636..e3cdf9d94 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 @@ -739,16 +739,7 @@ description: Operations executed car-wheel-assembly.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -758,10 +749,18 @@ description: Operations executed car-wheel-assembly.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { @@ -820,16 +819,7 @@ description: Operations executed car-wheel-assembly.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -839,10 +829,18 @@ description: Operations executed car-wheel-assembly.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { @@ -1252,8 +1250,8 @@ description: Operations executed car-wheel-assembly.kcl "type": "FunctionCall", "name": "spoke", "functionSourceRange": [ - 2572, - 4111, + 2592, + 4131, 6 ], "unlabeledArg": null, @@ -1643,8 +1641,8 @@ description: Operations executed car-wheel-assembly.kcl "type": "FunctionCall", "name": "spoke", "functionSourceRange": [ - 2572, - 4111, + 2592, + 4131, 6 ], "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 4716968bd..1fd77f16e 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 @@ -12,8 +12,8 @@ flowchart LR 10[Solid2d] end subgraph path11 [Path] - 11["Path
[1305, 1355, 0]"] - 12["Segment
[1305, 1355, 0]"] + 11["Path
[1318, 1368, 0]"] + 12["Segment
[1318, 1368, 0]"] 13[Solid2d] end subgraph path15 [Path] @@ -28,8 +28,8 @@ flowchart LR 23[Solid2d] end subgraph path24 [Path] - 24["Path
[1305, 1355, 0]"] - 25["Segment
[1305, 1355, 0]"] + 24["Path
[1318, 1368, 0]"] + 25["Segment
[1318, 1368, 0]"] 26[Solid2d] end subgraph path28 [Path] @@ -39,8 +39,8 @@ flowchart LR 36[Solid2d] end subgraph path37 [Path] - 37["Path
[1305, 1355, 0]"] - 38["Segment
[1305, 1355, 0]"] + 37["Path
[1318, 1368, 0]"] + 38["Segment
[1318, 1368, 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
[1485, 1574, 0]"] + 40["Sweep Loft
[1495, 1584, 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 5c8e782e9..e70920182 100644 --- a/rust/kcl-lib/tests/kcl_samples/cycloidal-gear/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/cycloidal-gear/ast.snap @@ -1331,125 +1331,128 @@ description: Result of parsing cycloidal-gear.kcl { "arguments": [ { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "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" - } - }, - { - "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, - "name": "holeDiameter", - "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" - } - } - ], - "callee": { - "abs_path": false, + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": { + "name": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "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" + } + }, + { + "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, + "name": "holeDiameter", + "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" + } + } + ], + "callee": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "circle", + "name": { + "commentStart": 0, + "end": 0, + "name": "circle", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name" }, - "path": [], + "commentStart": 0, + "end": 0, "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } } ], "callee": { @@ -1459,7 +1462,7 @@ description: Result of parsing cycloidal-gear.kcl "name": { "commentStart": 0, "end": 0, - "name": "hole", + "name": "subtract2d", "start": 0, "type": "Identifier" }, @@ -1470,8 +1473,9 @@ description: Result of parsing cycloidal-gear.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null } ], "commentStart": 0, 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 ca12f1b27..50195f4a6 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, - 1595, + 1605, 0 ], "unlabeledArg": null, @@ -25,7 +25,7 @@ description: Operations executed cycloidal-gear.kcl "name": "gearSketch", "functionSourceRange": [ 491, - 1386, + 1396, 0 ], "unlabeledArg": null, @@ -224,16 +224,7 @@ description: Operations executed cycloidal-gear.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -243,10 +234,18 @@ description: Operations executed cycloidal-gear.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "type": "GroupEnd" @@ -258,7 +257,7 @@ description: Operations executed cycloidal-gear.kcl "name": "gearSketch", "functionSourceRange": [ 491, - 1386, + 1396, 0 ], "unlabeledArg": null, @@ -457,16 +456,7 @@ description: Operations executed cycloidal-gear.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -476,10 +466,18 @@ description: Operations executed cycloidal-gear.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "type": "GroupEnd" @@ -491,7 +489,7 @@ description: Operations executed cycloidal-gear.kcl "name": "gearSketch", "functionSourceRange": [ 491, - 1386, + 1396, 0 ], "unlabeledArg": null, @@ -690,16 +688,7 @@ description: Operations executed cycloidal-gear.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -709,10 +698,18 @@ description: Operations executed cycloidal-gear.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "type": "GroupEnd" diff --git a/rust/kcl-lib/tests/kcl_samples/enclosure/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/enclosure/artifact_graph_flowchart.snap.md index 1c1147a6c..c570fbfc2 100644 --- a/rust/kcl-lib/tests/kcl_samples/enclosure/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/enclosure/artifact_graph_flowchart.snap.md @@ -15,8 +15,8 @@ flowchart LR 27[Solid2d] end subgraph path28 [Path] - 28["Path
[1693, 1760, 0]"] - 29["Segment
[1693, 1760, 0]"] + 28["Path
[1706, 1773, 0]"] + 29["Segment
[1706, 1773, 0]"] 30[Solid2d] end subgraph path36 [Path] @@ -25,8 +25,8 @@ flowchart LR 38[Solid2d] end subgraph path39 [Path] - 39["Path
[1693, 1760, 0]"] - 40["Segment
[1693, 1760, 0]"] + 39["Path
[1706, 1773, 0]"] + 40["Segment
[1706, 1773, 0]"] 41[Solid2d] end subgraph path47 [Path] @@ -35,8 +35,8 @@ flowchart LR 49[Solid2d] end subgraph path50 [Path] - 50["Path
[1693, 1760, 0]"] - 51["Segment
[1693, 1760, 0]"] + 50["Path
[1706, 1773, 0]"] + 51["Segment
[1706, 1773, 0]"] 52[Solid2d] end subgraph path58 [Path] @@ -45,66 +45,66 @@ flowchart LR 60[Solid2d] end subgraph path61 [Path] - 61["Path
[1693, 1760, 0]"] - 62["Segment
[1693, 1760, 0]"] + 61["Path
[1706, 1773, 0]"] + 62["Segment
[1706, 1773, 0]"] 63[Solid2d] end subgraph path69 [Path] - 69["Path
[2331, 2366, 0]"] - 70["Segment
[2372, 2438, 0]"] - 71["Segment
[2444, 2543, 0]"] - 72["Segment
[2549, 2666, 0]"] - 73["Segment
[2672, 2757, 0]"] - 74["Segment
[2763, 2770, 0]"] + 69["Path
[2341, 2376, 0]"] + 70["Segment
[2382, 2448, 0]"] + 71["Segment
[2454, 2553, 0]"] + 72["Segment
[2559, 2676, 0]"] + 73["Segment
[2682, 2767, 0]"] + 74["Segment
[2773, 2780, 0]"] 75[Solid2d] end subgraph path76 [Path] - 76["Path
[2781, 2937, 0]"] - 77["Segment
[2781, 2937, 0]"] + 76["Path
[2804, 2960, 0]"] + 77["Segment
[2804, 2960, 0]"] 78[Solid2d] end subgraph path79 [Path] - 79["Path
[2952, 3119, 0]"] - 80["Segment
[2952, 3119, 0]"] + 79["Path
[2985, 3152, 0]"] + 80["Segment
[2985, 3152, 0]"] 81[Solid2d] end subgraph path82 [Path] - 82["Path
[3134, 3292, 0]"] - 83["Segment
[3134, 3292, 0]"] + 82["Path
[3177, 3335, 0]"] + 83["Segment
[3177, 3335, 0]"] 84[Solid2d] end subgraph path85 [Path] - 85["Path
[3307, 3476, 0]"] - 86["Segment
[3307, 3476, 0]"] + 85["Path
[3360, 3529, 0]"] + 86["Segment
[3360, 3529, 0]"] 87[Solid2d] end subgraph path103 [Path] - 103["Path
[3922, 4006, 0]"] - 104["Segment
[4012, 4100, 0]"] - 105["Segment
[4106, 4227, 0]"] - 106["Segment
[4233, 4350, 0]"] - 107["Segment
[4356, 4441, 0]"] - 108["Segment
[4447, 4454, 0]"] + 103["Path
[3972, 4056, 0]"] + 104["Segment
[4062, 4150, 0]"] + 105["Segment
[4156, 4277, 0]"] + 106["Segment
[4283, 4400, 0]"] + 107["Segment
[4406, 4491, 0]"] + 108["Segment
[4497, 4504, 0]"] 109[Solid2d] end subgraph path110 [Path] - 110["Path
[4465, 4637, 0]"] - 111["Segment
[4465, 4637, 0]"] + 110["Path
[4528, 4700, 0]"] + 111["Segment
[4528, 4700, 0]"] 112[Solid2d] end subgraph path113 [Path] - 113["Path
[4652, 4835, 0]"] - 114["Segment
[4652, 4835, 0]"] + 113["Path
[4725, 4908, 0]"] + 114["Segment
[4725, 4908, 0]"] 115[Solid2d] end subgraph path116 [Path] - 116["Path
[4850, 5024, 0]"] - 117["Segment
[4850, 5024, 0]"] + 116["Path
[4933, 5107, 0]"] + 117["Segment
[4933, 5107, 0]"] 118[Solid2d] end subgraph path119 [Path] - 119["Path
[5039, 5224, 0]"] - 120["Segment
[5039, 5224, 0]"] + 119["Path
[5132, 5317, 0]"] + 120["Segment
[5132, 5317, 0]"] 121[Solid2d] end 1["Plane
[264, 281, 0]"] @@ -124,27 +124,27 @@ flowchart LR 22["EdgeCut Fillet
[771, 1053, 0]"] 23["EdgeCut Fillet
[771, 1053, 0]"] 24["Plane
[1566, 1589, 0]"] - 31["Sweep Extrusion
[1780, 1831, 0]"] + 31["Sweep Extrusion
[1790, 1841, 0]"] 32[Wall] 33["Cap Start"] 34["Cap End"] 35["Plane
[1566, 1589, 0]"] - 42["Sweep Extrusion
[1780, 1831, 0]"] + 42["Sweep Extrusion
[1790, 1841, 0]"] 43[Wall] 44["Cap Start"] 45["Cap End"] 46["Plane
[1566, 1589, 0]"] - 53["Sweep Extrusion
[1780, 1831, 0]"] + 53["Sweep Extrusion
[1790, 1841, 0]"] 54[Wall] 55["Cap Start"] 56["Cap End"] 57["Plane
[1566, 1589, 0]"] - 64["Sweep Extrusion
[1780, 1831, 0]"] + 64["Sweep Extrusion
[1790, 1841, 0]"] 65[Wall] 66["Cap Start"] 67["Cap End"] - 68["Plane
[2308, 2325, 0]"] - 88["Sweep Extrusion
[3494, 3536, 0]"] + 68["Plane
[2318, 2335, 0]"] + 88["Sweep Extrusion
[3544, 3586, 0]"] 89[Wall] 90[Wall] 91[Wall] @@ -155,11 +155,11 @@ flowchart LR 96["SweepEdge Opposite"] 97["SweepEdge Opposite"] 98["SweepEdge Adjacent"] - 99["EdgeCut Fillet
[3542, 3824, 0]"] - 100["EdgeCut Fillet
[3542, 3824, 0]"] - 101["EdgeCut Fillet
[3542, 3824, 0]"] - 102["EdgeCut Fillet
[3542, 3824, 0]"] - 122["Sweep Extrusion
[5242, 5284, 0]"] + 99["EdgeCut Fillet
[3592, 3874, 0]"] + 100["EdgeCut Fillet
[3592, 3874, 0]"] + 101["EdgeCut Fillet
[3592, 3874, 0]"] + 102["EdgeCut Fillet
[3592, 3874, 0]"] + 122["Sweep Extrusion
[5332, 5374, 0]"] 123[Wall] 124[Wall] 125[Wall] @@ -170,11 +170,11 @@ flowchart LR 130["SweepEdge Opposite"] 131["SweepEdge Opposite"] 132["SweepEdge Adjacent"] - 133["EdgeCut Fillet
[5290, 5572, 0]"] - 134["EdgeCut Fillet
[5290, 5572, 0]"] - 135["EdgeCut Fillet
[5290, 5572, 0]"] - 136["EdgeCut Fillet
[5290, 5572, 0]"] - 137["StartSketchOnFace
[3879, 3916, 0]"] + 133["EdgeCut Fillet
[5380, 5662, 0]"] + 134["EdgeCut Fillet
[5380, 5662, 0]"] + 135["EdgeCut Fillet
[5380, 5662, 0]"] + 136["EdgeCut Fillet
[5380, 5662, 0]"] + 137["StartSketchOnFace
[3929, 3966, 0]"] 1 --- 2 2 --- 3 2 --- 4 diff --git a/rust/kcl-lib/tests/kcl_samples/enclosure/ast.snap b/rust/kcl-lib/tests/kcl_samples/enclosure/ast.snap index 05f66210b..ca6cbd65a 100644 --- a/rust/kcl-lib/tests/kcl_samples/enclosure/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/enclosure/ast.snap @@ -1798,137 +1798,140 @@ description: Result of parsing enclosure.kcl { "arguments": [ { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "end": 0, - "name": "originStart", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "property": { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - }, - { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "end": 0, - "name": "originStart", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "property": { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" - } - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "arg": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "holeDia", + "name": "center", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "computed": false, + "end": 0, + "object": { + "commentStart": 0, + "end": 0, + "name": "originStart", + "start": 0, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + "start": 0, + "type": "MemberExpression", + "type": "MemberExpression" + }, + { + "commentStart": 0, + "computed": false, + "end": 0, + "object": { + "commentStart": 0, + "end": 0, + "name": "originStart", + "start": 0, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "commentStart": 0, + "end": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + }, + "start": 0, + "type": "MemberExpression", + "type": "MemberExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "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": "holeDia", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + ], + "callee": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "circle", + "name": { + "commentStart": 0, + "end": 0, + "name": "circle", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name" }, - "path": [], + "commentStart": 0, + "end": 0, "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } } ], "callee": { @@ -1938,7 +1941,7 @@ description: Result of parsing enclosure.kcl "name": { "commentStart": 0, "end": 0, - "name": "hole", + "name": "subtract2d", "start": 0, "type": "Identifier" }, @@ -1949,8 +1952,9 @@ description: Result of parsing enclosure.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null } ], "commentStart": 0, @@ -3573,23 +3577,591 @@ description: Result of parsing enclosure.kcl { "arguments": [ { - "arguments": [ - { - "type": "LabeledArg", - "label": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "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": "1.2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.2, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "wallThickness", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "holeDia", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "wallThickness", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "holeDia", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "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": "holeDia", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { "commentStart": 0, "end": 0, - "name": "center", + "name": "circle", "start": 0, "type": "Identifier" }, - "arg": { - "commentStart": 0, - "elements": [ - { + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "subtract2d", + "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": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "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": "1.2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.2, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "wallThickness", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "holeDia", + "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": "length", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "-", + "right": { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "wallThickness", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "holeDia", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "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, - "left": { + "name": "holeDia", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "circle", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "subtract2d", + "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": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { "commentStart": 0, "end": 0, "left": { @@ -3615,12 +4187,12 @@ description: Result of parsing enclosure.kcl "right": { "commentStart": 0, "end": 0, - "raw": "1.2", + "raw": "2.2", "start": 0, "type": "Literal", "type": "Literal", "value": { - "value": 1.2, + "value": 2.2, "suffix": "None" } }, @@ -3628,8 +4200,75 @@ description: Result of parsing enclosure.kcl "type": "BinaryExpression", "type": "BinaryExpression" }, - "operator": "+", + "operator": "-", "right": { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "wallThickness", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "holeDia", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "commentStart": 0, + "end": 0, + "left": { "commentStart": 0, "end": 0, "left": { @@ -3665,45 +4304,15 @@ description: Result of parsing enclosure.kcl "type": "BinaryExpression", "type": "BinaryExpression" }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "holeDia", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { + "operator": "+", + "right": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "wallThickness", + "name": "holeDia", "start": 0, "type": "Identifier" }, @@ -3712,106 +4321,66 @@ description: Result of parsing enclosure.kcl "type": "Name", "type": "Name" }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } - }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" - }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "holeDia", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, - "arg": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "holeDia", + "name": "radius", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "holeDia", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + ], + "callee": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "circle", + "name": { + "commentStart": 0, + "end": 0, + "name": "circle", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name" }, - "path": [], + "commentStart": 0, + "end": 0, "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } } ], "callee": { @@ -3821,7 +4390,7 @@ description: Result of parsing enclosure.kcl "name": { "commentStart": 0, "end": 0, - "name": "hole", + "name": "subtract2d", "start": 0, "type": "Identifier" }, @@ -3832,29 +4401,36 @@ description: Result of parsing enclosure.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { "commentStart": 0, "end": 0, "left": { @@ -3880,12 +4456,12 @@ description: Result of parsing enclosure.kcl "right": { "commentStart": 0, "end": 0, - "raw": "1.2", + "raw": "2.2", "start": 0, "type": "Literal", "type": "Literal", "value": { - "value": 1.2, + "value": 2.2, "suffix": "None" } }, @@ -3893,18 +4469,55 @@ description: Result of parsing enclosure.kcl "type": "BinaryExpression", "type": "BinaryExpression" }, - "operator": "+", + "operator": "-", "right": { "commentStart": 0, "end": 0, "left": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "wallThickness", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "wallThickness", + "name": "holeDia", "start": 0, "type": "Identifier" }, @@ -3913,19 +4526,6 @@ description: Result of parsing enclosure.kcl "type": "Name", "type": "Name" }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } - }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" @@ -3934,95 +4534,17 @@ description: Result of parsing enclosure.kcl "type": "BinaryExpression", "type": "BinaryExpression" }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "holeDia", - "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": "length", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "-", - "right": { + { "commentStart": 0, "end": 0, "left": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "wallThickness", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "+", - "right": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "holeDia", + "name": "length", "start": 0, "type": "Identifier" }, @@ -4031,76 +4553,127 @@ description: Result of parsing enclosure.kcl "type": "Name", "type": "Name" }, + "operator": "-", + "right": { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "wallThickness", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "holeDia", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, - "arg": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "holeDia", + "name": "radius", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "holeDia", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + ], + "callee": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "circle", + "name": { + "commentStart": 0, + "end": 0, + "name": "circle", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name" }, - "path": [], + "commentStart": 0, + "end": 0, "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } } ], "callee": { @@ -4110,7 +4683,7 @@ description: Result of parsing enclosure.kcl "name": { "commentStart": 0, "end": 0, - "name": "hole", + "name": "subtract2d", "start": 0, "type": "Identifier" }, @@ -4121,562 +4694,9 @@ description: Result of parsing enclosure.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - { - "arguments": [ - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "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": { - "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.2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.2, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "-", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "wallThickness", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "holeDia", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "wallThickness", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "holeDia", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "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": "holeDia", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "circle", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "hole", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - { - "arguments": [ - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "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": { - "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.2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.2, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "-", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "wallThickness", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "holeDia", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "length", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "-", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "wallThickness", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "holeDia", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "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": "holeDia", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "circle", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "hole", - "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 } ], "commentStart": 0, @@ -5882,23 +5902,639 @@ description: Result of parsing enclosure.kcl { "arguments": [ { - "arguments": [ - { - "type": "LabeledArg", - "label": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "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": "1.2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.2, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "wallThickness", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "holeDia", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "wallThickness", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "holeDia", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "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, + "name": "holeDia", + "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": "wallThickness", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { "commentStart": 0, "end": 0, - "name": "center", + "name": "circle", "start": 0, "type": "Identifier" }, - "arg": { - "commentStart": 0, - "elements": [ - { + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "subtract2d", + "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": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "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": "1.2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.2, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "wallThickness", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "holeDia", + "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": "length", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "-", + "right": { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "wallThickness", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "holeDia", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "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, - "left": { + "name": { + "commentStart": 0, + "end": 0, + "name": "holeDia", + "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": "wallThickness", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "circle", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "subtract2d", + "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": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { "commentStart": 0, "end": 0, "left": { @@ -5924,12 +6560,12 @@ description: Result of parsing enclosure.kcl "right": { "commentStart": 0, "end": 0, - "raw": "1.2", + "raw": "2.2", "start": 0, "type": "Literal", "type": "Literal", "value": { - "value": 1.2, + "value": 2.2, "suffix": "None" } }, @@ -5937,8 +6573,75 @@ description: Result of parsing enclosure.kcl "type": "BinaryExpression", "type": "BinaryExpression" }, - "operator": "+", + "operator": "-", "right": { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "wallThickness", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "holeDia", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "commentStart": 0, + "end": 0, + "left": { "commentStart": 0, "end": 0, "left": { @@ -5974,45 +6677,15 @@ description: Result of parsing enclosure.kcl "type": "BinaryExpression", "type": "BinaryExpression" }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "holeDia", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { + "operator": "+", + "right": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "wallThickness", + "name": "holeDia", "start": 0, "type": "Identifier" }, @@ -6021,130 +6694,90 @@ description: Result of parsing enclosure.kcl "type": "Name", "type": "Name" }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } - }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" - }, - "operator": "+", - "right": { - "abs_path": false, + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "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, - "name": { - "commentStart": 0, - "end": 0, - "name": "holeDia", - "start": 0, - "type": "Identifier" - }, - "path": [], + "name": "holeDia", "start": 0, - "type": "Name", - "type": "Name" + "type": "Identifier" }, + "path": [], "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" + "type": "Name", + "type": "Name" + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "wallThickness", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } } - }, - { - "type": "LabeledArg", - "label": { + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { "commentStart": 0, "end": 0, - "name": "radius", + "name": "circle", "start": 0, "type": "Identifier" }, - "arg": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "holeDia", - "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": "wallThickness", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - } - ], - "callee": { - "abs_path": false, + "path": [], + "start": 0, + "type": "Name" + }, "commentStart": 0, "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "circle", - "start": 0, - "type": "Identifier" - }, - "path": [], "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } } ], "callee": { @@ -6154,7 +6787,7 @@ description: Result of parsing enclosure.kcl "name": { "commentStart": 0, "end": 0, - "name": "hole", + "name": "subtract2d", "start": 0, "type": "Identifier" }, @@ -6165,29 +6798,36 @@ description: Result of parsing enclosure.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { "commentStart": 0, "end": 0, "left": { @@ -6213,12 +6853,12 @@ description: Result of parsing enclosure.kcl "right": { "commentStart": 0, "end": 0, - "raw": "1.2", + "raw": "2.2", "start": 0, "type": "Literal", "type": "Literal", "value": { - "value": 1.2, + "value": 2.2, "suffix": "None" } }, @@ -6226,18 +6866,55 @@ description: Result of parsing enclosure.kcl "type": "BinaryExpression", "type": "BinaryExpression" }, - "operator": "+", + "operator": "-", "right": { "commentStart": 0, "end": 0, "left": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "wallThickness", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "wallThickness", + "name": "holeDia", "start": 0, "type": "Identifier" }, @@ -6246,19 +6923,6 @@ description: Result of parsing enclosure.kcl "type": "Name", "type": "Name" }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } - }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" @@ -6267,95 +6931,17 @@ description: Result of parsing enclosure.kcl "type": "BinaryExpression", "type": "BinaryExpression" }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "holeDia", - "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": "length", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "-", - "right": { + { "commentStart": 0, "end": 0, "left": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "wallThickness", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "+", - "right": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "holeDia", + "name": "length", "start": 0, "type": "Identifier" }, @@ -6364,100 +6950,151 @@ description: Result of parsing enclosure.kcl "type": "Name", "type": "Name" }, + "operator": "-", + "right": { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "wallThickness", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "holeDia", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "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, + "name": "holeDia", + "start": 0, + "type": "Identifier" }, + "path": [], "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" + "type": "Name", + "type": "Name" + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "wallThickness", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } } - }, - { - "type": "LabeledArg", - "label": { + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { "commentStart": 0, "end": 0, - "name": "radius", + "name": "circle", "start": 0, "type": "Identifier" }, - "arg": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "holeDia", - "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": "wallThickness", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - } - ], - "callee": { - "abs_path": false, + "path": [], + "start": 0, + "type": "Name" + }, "commentStart": 0, "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "circle", - "start": 0, - "type": "Identifier" - }, - "path": [], "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } } ], "callee": { @@ -6467,7 +7104,7 @@ description: Result of parsing enclosure.kcl "name": { "commentStart": 0, "end": 0, - "name": "hole", + "name": "subtract2d", "start": 0, "type": "Identifier" }, @@ -6478,610 +7115,9 @@ description: Result of parsing enclosure.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - { - "arguments": [ - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "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": { - "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.2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.2, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "-", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "wallThickness", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "holeDia", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "wallThickness", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "holeDia", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "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, - "name": "holeDia", - "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": "wallThickness", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "circle", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "hole", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - { - "arguments": [ - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "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": { - "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.2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.2, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "-", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "wallThickness", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "holeDia", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "length", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "-", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "wallThickness", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "holeDia", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "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, - "name": "holeDia", - "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": "wallThickness", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "circle", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "hole", - "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 } ], "commentStart": 0, diff --git a/rust/kcl-lib/tests/kcl_samples/enclosure/ops.snap b/rust/kcl-lib/tests/kcl_samples/enclosure/ops.snap index 704849f51..e13465d3c 100644 --- a/rust/kcl-lib/tests/kcl_samples/enclosure/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/enclosure/ops.snap @@ -157,7 +157,7 @@ description: Operations executed enclosure.kcl "name": "function001", "functionSourceRange": [ 1285, - 1854, + 1864, 0 ], "unlabeledArg": null, @@ -359,16 +359,7 @@ description: Operations executed enclosure.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -378,10 +369,18 @@ description: Operations executed enclosure.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { @@ -425,7 +424,7 @@ description: Operations executed enclosure.kcl "name": "function001", "functionSourceRange": [ 1285, - 1854, + 1864, 0 ], "unlabeledArg": null, @@ -627,16 +626,7 @@ description: Operations executed enclosure.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -646,10 +636,18 @@ description: Operations executed enclosure.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { @@ -693,7 +691,7 @@ description: Operations executed enclosure.kcl "name": "function001", "functionSourceRange": [ 1285, - 1854, + 1864, 0 ], "unlabeledArg": null, @@ -895,16 +893,7 @@ description: Operations executed enclosure.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -914,10 +903,18 @@ description: Operations executed enclosure.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { @@ -961,7 +958,7 @@ description: Operations executed enclosure.kcl "name": "function001", "functionSourceRange": [ 1285, - 1854, + 1864, 0 ], "unlabeledArg": null, @@ -1163,16 +1160,7 @@ description: Operations executed enclosure.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -1182,10 +1170,18 @@ description: Operations executed enclosure.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { @@ -1239,16 +1235,7 @@ description: Operations executed enclosure.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -1258,23 +1245,22 @@ description: Operations executed enclosure.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -1284,23 +1270,22 @@ description: Operations executed enclosure.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -1310,23 +1295,22 @@ description: Operations executed enclosure.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -1336,10 +1320,18 @@ description: Operations executed enclosure.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { @@ -1454,16 +1446,7 @@ description: Operations executed enclosure.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -1473,23 +1456,22 @@ description: Operations executed enclosure.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -1499,23 +1481,22 @@ description: Operations executed enclosure.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -1525,23 +1506,22 @@ description: Operations executed enclosure.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -1551,10 +1531,18 @@ description: Operations executed enclosure.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { diff --git a/rust/kcl-lib/tests/kcl_samples/enclosure/program_memory.snap b/rust/kcl-lib/tests/kcl_samples/enclosure/program_memory.snap index eeed0f69b..0e4b54862 100644 --- a/rust/kcl-lib/tests/kcl_samples/enclosure/program_memory.snap +++ b/rust/kcl-lib/tests/kcl_samples/enclosure/program_memory.snap @@ -354,9 +354,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2416, - "end": 2437, - "start": 2416, + "commentStart": 2426, + "end": 2447, + "start": 2426, "type": "TagDeclarator", "value": "rectangleSegmentA002" }, @@ -367,9 +367,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2521, - "end": 2542, - "start": 2521, + "commentStart": 2531, + "end": 2552, + "start": 2531, "type": "TagDeclarator", "value": "rectangleSegmentB002" }, @@ -380,9 +380,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2644, - "end": 2665, - "start": 2644, + "commentStart": 2654, + "end": 2675, + "start": 2654, "type": "TagDeclarator", "value": "rectangleSegmentC002" }, @@ -393,9 +393,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2735, - "end": 2756, - "start": 2735, + "commentStart": 2745, + "end": 2766, + "start": 2745, "type": "TagDeclarator", "value": "rectangleSegmentD002" }, @@ -416,9 +416,9 @@ description: Variables in memory after executing enclosure.kcl 0.0 ], "tag": { - "commentStart": 2416, - "end": 2437, - "start": 2416, + "commentStart": 2426, + "end": 2447, + "start": 2426, "type": "TagDeclarator", "value": "rectangleSegmentA002" }, @@ -441,9 +441,9 @@ description: Variables in memory after executing enclosure.kcl 0.0 ], "tag": { - "commentStart": 2521, - "end": 2542, - "start": 2521, + "commentStart": 2531, + "end": 2552, + "start": 2531, "type": "TagDeclarator", "value": "rectangleSegmentB002" }, @@ -466,9 +466,9 @@ description: Variables in memory after executing enclosure.kcl 175.0 ], "tag": { - "commentStart": 2644, - "end": 2665, - "start": 2644, + "commentStart": 2654, + "end": 2675, + "start": 2654, "type": "TagDeclarator", "value": "rectangleSegmentC002" }, @@ -491,9 +491,9 @@ description: Variables in memory after executing enclosure.kcl 175.0 ], "tag": { - "commentStart": 2735, - "end": 2756, - "start": 2735, + "commentStart": 2745, + "end": 2766, + "start": 2745, "type": "TagDeclarator", "value": "rectangleSegmentD002" }, @@ -693,9 +693,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4078, - "end": 4099, - "start": 4078, + "commentStart": 4128, + "end": 4149, + "start": 4128, "type": "TagDeclarator", "value": "rectangleSegmentA003" }, @@ -706,9 +706,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4205, - "end": 4226, - "start": 4205, + "commentStart": 4255, + "end": 4276, + "start": 4255, "type": "TagDeclarator", "value": "rectangleSegmentB003" }, @@ -719,9 +719,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4328, - "end": 4349, - "start": 4328, + "commentStart": 4378, + "end": 4399, + "start": 4378, "type": "TagDeclarator", "value": "rectangleSegmentC003" }, @@ -732,9 +732,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4419, - "end": 4440, - "start": 4419, + "commentStart": 4469, + "end": 4490, + "start": 4469, "type": "TagDeclarator", "value": "rectangleSegmentD003" }, @@ -755,9 +755,9 @@ description: Variables in memory after executing enclosure.kcl 3.0 ], "tag": { - "commentStart": 4078, - "end": 4099, - "start": 4078, + "commentStart": 4128, + "end": 4149, + "start": 4128, "type": "TagDeclarator", "value": "rectangleSegmentA003" }, @@ -780,9 +780,9 @@ description: Variables in memory after executing enclosure.kcl 3.0 ], "tag": { - "commentStart": 4205, - "end": 4226, - "start": 4205, + "commentStart": 4255, + "end": 4276, + "start": 4255, "type": "TagDeclarator", "value": "rectangleSegmentB003" }, @@ -805,9 +805,9 @@ description: Variables in memory after executing enclosure.kcl 172.0 ], "tag": { - "commentStart": 4328, - "end": 4349, - "start": 4328, + "commentStart": 4378, + "end": 4399, + "start": 4378, "type": "TagDeclarator", "value": "rectangleSegmentC003" }, @@ -830,9 +830,9 @@ description: Variables in memory after executing enclosure.kcl 172.0 ], "tag": { - "commentStart": 4419, - "end": 4440, - "start": 4419, + "commentStart": 4469, + "end": 4490, + "start": 4469, "type": "TagDeclarator", "value": "rectangleSegmentD003" }, @@ -896,9 +896,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2416, - "end": 2437, - "start": 2416, + "commentStart": 2426, + "end": 2447, + "start": 2426, "type": "TagDeclarator", "value": "rectangleSegmentA002" }, @@ -909,9 +909,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2521, - "end": 2542, - "start": 2521, + "commentStart": 2531, + "end": 2552, + "start": 2531, "type": "TagDeclarator", "value": "rectangleSegmentB002" }, @@ -922,9 +922,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2644, - "end": 2665, - "start": 2644, + "commentStart": 2654, + "end": 2675, + "start": 2654, "type": "TagDeclarator", "value": "rectangleSegmentC002" }, @@ -935,9 +935,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2735, - "end": 2756, - "start": 2735, + "commentStart": 2745, + "end": 2766, + "start": 2745, "type": "TagDeclarator", "value": "rectangleSegmentD002" }, @@ -958,9 +958,9 @@ description: Variables in memory after executing enclosure.kcl 0.0 ], "tag": { - "commentStart": 2416, - "end": 2437, - "start": 2416, + "commentStart": 2426, + "end": 2447, + "start": 2426, "type": "TagDeclarator", "value": "rectangleSegmentA002" }, @@ -983,9 +983,9 @@ description: Variables in memory after executing enclosure.kcl 0.0 ], "tag": { - "commentStart": 2521, - "end": 2542, - "start": 2521, + "commentStart": 2531, + "end": 2552, + "start": 2531, "type": "TagDeclarator", "value": "rectangleSegmentB002" }, @@ -1008,9 +1008,9 @@ description: Variables in memory after executing enclosure.kcl 175.0 ], "tag": { - "commentStart": 2644, - "end": 2665, - "start": 2644, + "commentStart": 2654, + "end": 2675, + "start": 2654, "type": "TagDeclarator", "value": "rectangleSegmentC002" }, @@ -1033,9 +1033,9 @@ description: Variables in memory after executing enclosure.kcl 175.0 ], "tag": { - "commentStart": 2735, - "end": 2756, - "start": 2735, + "commentStart": 2745, + "end": 2766, + "start": 2745, "type": "TagDeclarator", "value": "rectangleSegmentD002" }, @@ -1668,9 +1668,9 @@ description: Variables in memory after executing enclosure.kcl 0.0 ], "tag": { - "commentStart": 2416, - "end": 2437, - "start": 2416, + "commentStart": 2426, + "end": 2447, + "start": 2426, "type": "TagDeclarator", "value": "rectangleSegmentA002" }, @@ -1693,9 +1693,9 @@ description: Variables in memory after executing enclosure.kcl 0.0 ], "tag": { - "commentStart": 2521, - "end": 2542, - "start": 2521, + "commentStart": 2531, + "end": 2552, + "start": 2531, "type": "TagDeclarator", "value": "rectangleSegmentB002" }, @@ -1718,9 +1718,9 @@ description: Variables in memory after executing enclosure.kcl 175.0 ], "tag": { - "commentStart": 2644, - "end": 2665, - "start": 2644, + "commentStart": 2654, + "end": 2675, + "start": 2654, "type": "TagDeclarator", "value": "rectangleSegmentC002" }, @@ -1743,9 +1743,9 @@ description: Variables in memory after executing enclosure.kcl 175.0 ], "tag": { - "commentStart": 2735, - "end": 2756, - "start": 2735, + "commentStart": 2745, + "end": 2766, + "start": 2745, "type": "TagDeclarator", "value": "rectangleSegmentD002" }, @@ -1867,9 +1867,9 @@ description: Variables in memory after executing enclosure.kcl 3.0 ], "tag": { - "commentStart": 4078, - "end": 4099, - "start": 4078, + "commentStart": 4128, + "end": 4149, + "start": 4128, "type": "TagDeclarator", "value": "rectangleSegmentA003" }, @@ -1892,9 +1892,9 @@ description: Variables in memory after executing enclosure.kcl 3.0 ], "tag": { - "commentStart": 4205, - "end": 4226, - "start": 4205, + "commentStart": 4255, + "end": 4276, + "start": 4255, "type": "TagDeclarator", "value": "rectangleSegmentB003" }, @@ -1917,9 +1917,9 @@ description: Variables in memory after executing enclosure.kcl 172.0 ], "tag": { - "commentStart": 4328, - "end": 4349, - "start": 4328, + "commentStart": 4378, + "end": 4399, + "start": 4378, "type": "TagDeclarator", "value": "rectangleSegmentC003" }, @@ -1942,9 +1942,9 @@ description: Variables in memory after executing enclosure.kcl 172.0 ], "tag": { - "commentStart": 4419, - "end": 4440, - "start": 4419, + "commentStart": 4469, + "end": 4490, + "start": 4469, "type": "TagDeclarator", "value": "rectangleSegmentD003" }, @@ -2008,9 +2008,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2416, - "end": 2437, - "start": 2416, + "commentStart": 2426, + "end": 2447, + "start": 2426, "type": "TagDeclarator", "value": "rectangleSegmentA002" }, @@ -2021,9 +2021,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2521, - "end": 2542, - "start": 2521, + "commentStart": 2531, + "end": 2552, + "start": 2531, "type": "TagDeclarator", "value": "rectangleSegmentB002" }, @@ -2034,9 +2034,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2644, - "end": 2665, - "start": 2644, + "commentStart": 2654, + "end": 2675, + "start": 2654, "type": "TagDeclarator", "value": "rectangleSegmentC002" }, @@ -2047,9 +2047,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2735, - "end": 2756, - "start": 2735, + "commentStart": 2745, + "end": 2766, + "start": 2745, "type": "TagDeclarator", "value": "rectangleSegmentD002" }, @@ -2070,9 +2070,9 @@ description: Variables in memory after executing enclosure.kcl 0.0 ], "tag": { - "commentStart": 2416, - "end": 2437, - "start": 2416, + "commentStart": 2426, + "end": 2447, + "start": 2426, "type": "TagDeclarator", "value": "rectangleSegmentA002" }, @@ -2095,9 +2095,9 @@ description: Variables in memory after executing enclosure.kcl 0.0 ], "tag": { - "commentStart": 2521, - "end": 2542, - "start": 2521, + "commentStart": 2531, + "end": 2552, + "start": 2531, "type": "TagDeclarator", "value": "rectangleSegmentB002" }, @@ -2120,9 +2120,9 @@ description: Variables in memory after executing enclosure.kcl 175.0 ], "tag": { - "commentStart": 2644, - "end": 2665, - "start": 2644, + "commentStart": 2654, + "end": 2675, + "start": 2654, "type": "TagDeclarator", "value": "rectangleSegmentC002" }, @@ -2145,9 +2145,9 @@ description: Variables in memory after executing enclosure.kcl 175.0 ], "tag": { - "commentStart": 2735, - "end": 2756, - "start": 2735, + "commentStart": 2745, + "end": 2766, + "start": 2745, "type": "TagDeclarator", "value": "rectangleSegmentD002" }, 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 e8e49b142..9d87d0b84 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 @@ -14,8 +14,8 @@ flowchart LR 11[Solid2d] end subgraph path12 [Path] - 12["Path
[1298, 1376, 0]"] - 13["Segment
[1298, 1376, 0]"] + 12["Path
[1311, 1389, 0]"] + 13["Segment
[1311, 1389, 0]"] 14[Solid2d] end subgraph path20 [Path] @@ -32,8 +32,8 @@ flowchart LR 29[Solid2d] end subgraph path30 [Path] - 30["Path
[1298, 1376, 0]"] - 31["Segment
[1298, 1376, 0]"] + 30["Path
[1311, 1389, 0]"] + 31["Segment
[1311, 1389, 0]"] 32[Solid2d] end subgraph path38 [Path] @@ -50,8 +50,8 @@ flowchart LR 47[Solid2d] end subgraph path48 [Path] - 48["Path
[1298, 1376, 0]"] - 49["Segment
[1298, 1376, 0]"] + 48["Path
[1311, 1389, 0]"] + 49["Segment
[1311, 1389, 0]"] 50[Solid2d] end subgraph path56 [Path] @@ -68,97 +68,97 @@ flowchart LR 65[Solid2d] end subgraph path66 [Path] - 66["Path
[1298, 1376, 0]"] - 67["Segment
[1298, 1376, 0]"] + 66["Path
[1311, 1389, 0]"] + 67["Segment
[1311, 1389, 0]"] 68[Solid2d] end subgraph path74 [Path] - 74["Path
[1703, 1738, 0]"] - 75["Segment
[1744, 1778, 0]"] - 76["Segment
[1784, 1823, 0]"] - 77["Segment
[1829, 1867, 0]"] - 78["Segment
[1873, 1912, 0]"] - 79["Segment
[1918, 1952, 0]"] - 80["Segment
[1958, 2001, 0]"] - 81["Segment
[2007, 2040, 0]"] - 82["Segment
[2046, 2085, 0]"] - 83["Segment
[2091, 2130, 0]"] - 84["Segment
[2136, 2175, 0]"] - 85["Segment
[2181, 2224, 0]"] - 86["Segment
[2230, 2281, 0]"] - 87["Segment
[2287, 2331, 0]"] - 88["Segment
[2337, 2376, 0]"] - 89["Segment
[2382, 2420, 0]"] - 90["Segment
[2426, 2491, 0]"] - 91["Segment
[2497, 2504, 0]"] + 74["Path
[1713, 1748, 0]"] + 75["Segment
[1754, 1788, 0]"] + 76["Segment
[1794, 1833, 0]"] + 77["Segment
[1839, 1877, 0]"] + 78["Segment
[1883, 1922, 0]"] + 79["Segment
[1928, 1962, 0]"] + 80["Segment
[1968, 2011, 0]"] + 81["Segment
[2017, 2050, 0]"] + 82["Segment
[2056, 2095, 0]"] + 83["Segment
[2101, 2140, 0]"] + 84["Segment
[2146, 2185, 0]"] + 85["Segment
[2191, 2234, 0]"] + 86["Segment
[2240, 2291, 0]"] + 87["Segment
[2297, 2341, 0]"] + 88["Segment
[2347, 2386, 0]"] + 89["Segment
[2392, 2430, 0]"] + 90["Segment
[2436, 2501, 0]"] + 91["Segment
[2507, 2514, 0]"] 92[Solid2d] end subgraph path93 [Path] - 93["Path
[2576, 2649, 0]"] - 94["Segment
[2576, 2649, 0]"] + 93["Path
[2599, 2672, 0]"] + 94["Segment
[2599, 2672, 0]"] 95[Solid2d] end subgraph path96 [Path] - 96["Path
[2664, 2737, 0]"] - 97["Segment
[2664, 2737, 0]"] + 96["Path
[2697, 2770, 0]"] + 97["Segment
[2697, 2770, 0]"] 98[Solid2d] end subgraph path99 [Path] - 99["Path
[2752, 2825, 0]"] - 100["Segment
[2752, 2825, 0]"] + 99["Path
[2795, 2868, 0]"] + 100["Segment
[2795, 2868, 0]"] 101[Solid2d] end subgraph path102 [Path] - 102["Path
[2840, 2913, 0]"] - 103["Segment
[2840, 2913, 0]"] + 102["Path
[2893, 2966, 0]"] + 103["Segment
[2893, 2966, 0]"] 104[Solid2d] end subgraph path105 [Path] - 105["Path
[2967, 3106, 0]"] - 106["Segment
[2967, 3106, 0]"] + 105["Path
[3030, 3169, 0]"] + 106["Segment
[3030, 3169, 0]"] 107[Solid2d] end subgraph path108 [Path] - 108["Path
[3121, 3258, 0]"] - 109["Segment
[3121, 3258, 0]"] + 108["Path
[3194, 3331, 0]"] + 109["Segment
[3194, 3331, 0]"] 110[Solid2d] end subgraph path111 [Path] - 111["Path
[3273, 3420, 0]"] - 112["Segment
[3273, 3420, 0]"] + 111["Path
[3356, 3503, 0]"] + 112["Segment
[3356, 3503, 0]"] 113[Solid2d] end subgraph path114 [Path] - 114["Path
[3435, 3581, 0]"] - 115["Segment
[3435, 3581, 0]"] + 114["Path
[3528, 3674, 0]"] + 115["Segment
[3528, 3674, 0]"] 116[Solid2d] end 1["Plane
[748, 773, 0]"] 8["Plane
[1198, 1215, 0]"] - 15["Sweep Sweep
[1388, 1411, 0]"] + 15["Sweep Sweep
[1398, 1421, 0]"] 16[Wall] 17["Cap Start"] 18["Cap End"] 19["Plane
[748, 773, 0]"] 26["Plane
[1198, 1215, 0]"] - 33["Sweep Sweep
[1388, 1411, 0]"] + 33["Sweep Sweep
[1398, 1421, 0]"] 34[Wall] 35["Cap Start"] 36["Cap End"] 37["Plane
[748, 773, 0]"] 44["Plane
[1198, 1215, 0]"] - 51["Sweep Sweep
[1388, 1411, 0]"] + 51["Sweep Sweep
[1398, 1421, 0]"] 52[Wall] 53["Cap Start"] 54["Cap End"] 55["Plane
[748, 773, 0]"] 62["Plane
[1198, 1215, 0]"] - 69["Sweep Sweep
[1388, 1411, 0]"] + 69["Sweep Sweep
[1398, 1421, 0]"] 70[Wall] 71["Cap Start"] 72["Cap End"] - 73["Plane
[1680, 1697, 0]"] - 117["Sweep Extrusion
[3637, 3666, 0]"] + 73["Plane
[1690, 1707, 0]"] + 117["Sweep Extrusion
[3727, 3756, 0]"] 118[Wall] 119[Wall] 120[Wall] @@ -193,10 +193,10 @@ flowchart LR 149["SweepEdge Opposite"] 150["SweepEdge Opposite"] 151["SweepEdge Adjacent"] - 152["EdgeCut Fillet
[3672, 3806, 0]"] - 153["EdgeCut Fillet
[3672, 3806, 0]"] - 154["EdgeCut Fillet
[3812, 3946, 0]"] - 155["EdgeCut Fillet
[3812, 3946, 0]"] + 152["EdgeCut Fillet
[3762, 3896, 0]"] + 153["EdgeCut Fillet
[3762, 3896, 0]"] + 154["EdgeCut Fillet
[3902, 4036, 0]"] + 155["EdgeCut Fillet
[3902, 4036, 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 3e4a6f2c0..065d03b97 100644 --- a/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/ast.snap @@ -1410,77 +1410,120 @@ description: Result of parsing exhaust-manifold.kcl { "arguments": [ { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "pos001", + "name": { + "commentStart": 0, + "end": 0, + "name": "pos001", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "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" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, - "arg": { - "commentStart": 0, - "end": 0, - "left": { + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { "commentStart": 0, "end": 0, "left": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "primaryTubeDiameter", + "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" + }, + "operator": "-", + "right": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "primaryTubeDiameter", + "name": "wallThickness", "start": 0, "type": "Identifier" }, @@ -1489,74 +1532,34 @@ description: Result of parsing exhaust-manifold.kcl "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" - }, - "operator": "-", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "wallThickness", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + } } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + ], + "callee": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "circle", + "name": { + "commentStart": 0, + "end": 0, + "name": "circle", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name" }, - "path": [], + "commentStart": 0, + "end": 0, "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } } ], "callee": { @@ -1566,7 +1569,7 @@ description: Result of parsing exhaust-manifold.kcl "name": { "commentStart": 0, "end": 0, - "name": "hole", + "name": "subtract2d", "start": 0, "type": "Identifier" }, @@ -1577,8 +1580,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": [ @@ -3580,901 +3584,72 @@ description: Result of parsing exhaust-manifold.kcl { "arguments": [ { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "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" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "primaryTubeDiameter", - "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" - }, - "operator": "-", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "wallThickness", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - } - ], - "callee": { - "abs_path": false, + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "circle", - "start": 0, - "type": "Identifier" - }, - "path": [], + "name": "tool", "start": 0, - "type": "Name" + "type": "Identifier" }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "hole", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - { - "arguments": [ - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.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" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "end": 0, - "left": { + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { "commentStart": 0, "end": 0, - "name": "primaryTubeDiameter", - "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" - }, - "operator": "-", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "wallThickness", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "circle", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "hole", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - { - "arguments": [ - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "4", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 4.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" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "primaryTubeDiameter", - "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" - }, - "operator": "-", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "wallThickness", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "circle", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "hole", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - { - "arguments": [ - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "6", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 6.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" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "primaryTubeDiameter", - "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" - }, - "operator": "-", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "wallThickness", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "circle", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "hole", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - { - "arguments": [ - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { - "argument": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "primaryTubeDiameter", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": ".6", + "raw": "0", "start": 0, "type": "Literal", "type": "Literal", "value": { - "value": 0.6, + "value": 0.0, "suffix": "None" } }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "argument": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "primaryTubeDiameter", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, + { "commentStart": 0, "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": ".6", + "raw": "0", "start": 0, "type": "Literal", "type": "Literal", "value": { - "value": 0.6, + "value": 0.0, "suffix": "None" } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, - "arg": { - "commentStart": 0, - "end": 0, - "left": { + { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "raw": "0.25", + "name": "radius", "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.25, - "suffix": "None" - } + "type": "Identifier" }, - "operator": "/", - "right": { + "arg": { "commentStart": 0, "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "circle", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "hole", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - { - "arguments": [ - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { + "left": { "commentStart": 0, "end": 0, "left": { @@ -4493,16 +3668,16 @@ description: Result of parsing exhaust-manifold.kcl "type": "Name", "type": "Name" }, - "operator": "*", + "operator": "/", "right": { "commentStart": 0, "end": 0, - "raw": ".6", + "raw": "2", "start": 0, "type": "Literal", "type": "Literal", "value": { - "value": 0.6, + "value": 2.0, "suffix": "None" } }, @@ -4510,7 +3685,144 @@ description: Result of parsing exhaust-manifold.kcl "type": "BinaryExpression", "type": "BinaryExpression" }, - { + "operator": "-", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "wallThickness", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "circle", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "subtract2d", + "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": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.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" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { "commentStart": 0, "end": 0, "left": { @@ -4529,101 +3841,68 @@ description: Result of parsing exhaust-manifold.kcl "type": "Name", "type": "Name" }, - "operator": "*", + "operator": "/", "right": { "commentStart": 0, "end": 0, - "raw": ".6", + "raw": "2", "start": 0, "type": "Literal", "type": "Literal", "value": { - "value": 0.6, + "value": 2.0, "suffix": "None" } }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" + }, + "operator": "-", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "wallThickness", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } } - }, - { - "type": "LabeledArg", - "label": { + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { "commentStart": 0, "end": 0, - "name": "radius", + "name": "circle", "start": 0, "type": "Identifier" }, - "arg": { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "raw": "0.25", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.25, - "suffix": "None" - } - }, - "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" - } - } - ], - "callee": { - "abs_path": false, + "path": [], + "start": 0, + "type": "Name" + }, "commentStart": 0, "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "circle", - "start": 0, - "type": "Identifier" - }, - "path": [], "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } } ], "callee": { @@ -4633,7 +3912,7 @@ description: Result of parsing exhaust-manifold.kcl "name": { "commentStart": 0, "end": 0, - "name": "hole", + "name": "subtract2d", "start": 0, "type": "Identifier" }, @@ -4644,53 +3923,418 @@ description: Result of parsing exhaust-manifold.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "4", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 4.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" + } }, - "arg": { - "commentStart": 0, - "elements": [ - { + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { "commentStart": 0, "end": 0, "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "primaryTubeDiameter", + "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" + }, + "operator": "-", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "wallThickness", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "circle", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "subtract2d", + "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": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "6", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 6.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" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "primaryTubeDiameter", + "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" + }, + "operator": "-", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "wallThickness", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "circle", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "subtract2d", + "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": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { "commentStart": 0, "end": 0, "left": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "primaryTubeDiameter", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, "commentStart": 0, "end": 0, - "raw": "3", + "operator": "-", "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } + "type": "UnaryExpression", + "type": "UnaryExpression" }, "operator": "*", "right": { "commentStart": 0, "end": 0, - "raw": "2", + "raw": ".6", "start": 0, "type": "Literal", "type": "Literal", "value": { - "value": 2.0, + "value": 0.6, "suffix": "None" } }, @@ -4698,8 +4342,172 @@ description: Result of parsing exhaust-manifold.kcl "type": "BinaryExpression", "type": "BinaryExpression" }, - "operator": "-", - "right": { + { + "commentStart": 0, + "end": 0, + "left": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "primaryTubeDiameter", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": ".6", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.6, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "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.25", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.25, + "suffix": "None" + } + }, + "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" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "circle", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "subtract2d", + "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": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { "commentStart": 0, "end": 0, "left": { @@ -4735,200 +4543,7 @@ description: Result of parsing exhaust-manifold.kcl "type": "BinaryExpression", "type": "BinaryExpression" }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "primaryTubeDiameter", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": ".6", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.6, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "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.25", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.25, - "suffix": "None" - } - }, - "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" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "circle", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "hole", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - { - "arguments": [ - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } - }, - "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" - }, - "operator": "+", - "right": { + { "commentStart": 0, "end": 0, "left": { @@ -4963,16 +4578,208 @@ description: Result of parsing exhaust-manifold.kcl "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { "commentStart": 0, "end": 0, - "left": { - "argument": { + "raw": "0.25", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.25, + "suffix": "None" + } + }, + "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" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "circle", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "subtract2d", + "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": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + }, + "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" + }, + "operator": "-", + "right": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "primaryTubeDiameter", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": ".6", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.6, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "commentStart": 0, + "end": 0, + "left": { "abs_path": false, "commentStart": 0, "end": 0, @@ -4988,108 +4795,95 @@ description: Result of parsing exhaust-manifold.kcl "type": "Name", "type": "Name" }, - "commentStart": 0, - "end": 0, - "operator": "-", + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": ".6", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.6, + "suffix": "None" + } + }, "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": ".6", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.6, - "suffix": "None" - } - }, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "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.25", "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.25, + "suffix": "None" + } + }, + "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" + } } - }, - { - "type": "LabeledArg", - "label": { + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { "commentStart": 0, "end": 0, - "name": "radius", + "name": "circle", "start": 0, "type": "Identifier" }, - "arg": { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "raw": "0.25", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.25, - "suffix": "None" - } - }, - "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" - } - } - ], - "callee": { - "abs_path": false, + "path": [], + "start": 0, + "type": "Name" + }, "commentStart": 0, "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "circle", - "start": 0, - "type": "Identifier" - }, - "path": [], "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } } ], "callee": { @@ -5099,7 +4893,7 @@ description: Result of parsing exhaust-manifold.kcl "name": { "commentStart": 0, "end": 0, - "name": "hole", + "name": "subtract2d", "start": 0, "type": "Identifier" }, @@ -5110,8 +4904,250 @@ description: Result of parsing exhaust-manifold.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": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + }, + "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" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "primaryTubeDiameter", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": ".6", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.6, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "commentStart": 0, + "end": 0, + "left": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "primaryTubeDiameter", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": ".6", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.6, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "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.25", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.25, + "suffix": "None" + } + }, + "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" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "circle", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "subtract2d", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "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 25f9ce025..80ff20347 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, - 1428, + 1438, 0 ], "unlabeledArg": null, @@ -289,16 +289,7 @@ description: Operations executed exhaust-manifold.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -308,10 +299,18 @@ description: Operations executed exhaust-manifold.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { @@ -348,7 +347,7 @@ description: Operations executed exhaust-manifold.kcl "name": "primaryTube", "functionSourceRange": [ 330, - 1428, + 1438, 0 ], "unlabeledArg": null, @@ -627,16 +626,7 @@ description: Operations executed exhaust-manifold.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -646,10 +636,18 @@ description: Operations executed exhaust-manifold.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { @@ -686,7 +684,7 @@ description: Operations executed exhaust-manifold.kcl "name": "primaryTube", "functionSourceRange": [ 330, - 1428, + 1438, 0 ], "unlabeledArg": null, @@ -965,16 +963,7 @@ description: Operations executed exhaust-manifold.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -984,10 +973,18 @@ description: Operations executed exhaust-manifold.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { @@ -1024,7 +1021,7 @@ description: Operations executed exhaust-manifold.kcl "name": "primaryTube", "functionSourceRange": [ 330, - 1428, + 1438, 0 ], "unlabeledArg": null, @@ -1303,16 +1300,7 @@ description: Operations executed exhaust-manifold.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -1322,10 +1310,18 @@ description: Operations executed exhaust-manifold.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { @@ -1372,16 +1368,7 @@ description: Operations executed exhaust-manifold.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -1391,23 +1378,22 @@ description: Operations executed exhaust-manifold.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -1417,23 +1403,22 @@ description: Operations executed exhaust-manifold.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -1443,23 +1428,22 @@ description: Operations executed exhaust-manifold.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -1469,23 +1453,22 @@ description: Operations executed exhaust-manifold.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -1495,23 +1478,22 @@ description: Operations executed exhaust-manifold.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -1521,23 +1503,22 @@ description: Operations executed exhaust-manifold.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -1547,23 +1528,22 @@ description: Operations executed exhaust-manifold.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -1573,10 +1553,18 @@ description: Operations executed exhaust-manifold.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { 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 2309281bf..1c0f68c4a 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": 1771, - "end": 1777, - "start": 1771, + "commentStart": 1781, + "end": 1787, + "start": 1781, "type": "TagDeclarator", "value": "seg01" }, @@ -62,9 +62,9 @@ description: Variables in memory after executing exhaust-manifold.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1945, - "end": 1951, - "start": 1945, + "commentStart": 1955, + "end": 1961, + "start": 1955, "type": "TagDeclarator", "value": "seg03" }, @@ -75,9 +75,9 @@ description: Variables in memory after executing exhaust-manifold.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1994, - "end": 2000, - "start": 1994, + "commentStart": 2004, + "end": 2010, + "start": 2004, "type": "TagDeclarator", "value": "seg04" }, @@ -88,9 +88,9 @@ description: Variables in memory after executing exhaust-manifold.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2033, - "end": 2039, - "start": 2033, + "commentStart": 2043, + "end": 2049, + "start": 2043, "type": "TagDeclarator", "value": "seg05" }, @@ -122,9 +122,9 @@ description: Variables in memory after executing exhaust-manifold.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2217, - "end": 2223, - "start": 2217, + "commentStart": 2227, + "end": 2233, + "start": 2227, "type": "TagDeclarator", "value": "seg07" }, @@ -135,9 +135,9 @@ description: Variables in memory after executing exhaust-manifold.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2274, - "end": 2280, - "start": 2274, + "commentStart": 2284, + "end": 2290, + "start": 2284, "type": "TagDeclarator", "value": "seg08" }, @@ -148,9 +148,9 @@ description: Variables in memory after executing exhaust-manifold.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2324, - "end": 2330, - "start": 2324, + "commentStart": 2334, + "end": 2340, + "start": 2334, "type": "TagDeclarator", "value": "seg09" }, @@ -192,9 +192,9 @@ description: Variables in memory after executing exhaust-manifold.kcl -1.25 ], "tag": { - "commentStart": 1771, - "end": 1777, - "start": 1771, + "commentStart": 1781, + "end": 1787, + "start": 1781, "type": "TagDeclarator", "value": "seg01" }, @@ -289,9 +289,9 @@ description: Variables in memory after executing exhaust-manifold.kcl -1.25 ], "tag": { - "commentStart": 1945, - "end": 1951, - "start": 1945, + "commentStart": 1955, + "end": 1961, + "start": 1955, "type": "TagDeclarator", "value": "seg03" }, @@ -314,9 +314,9 @@ description: Variables in memory after executing exhaust-manifold.kcl -1.25 ], "tag": { - "commentStart": 1994, - "end": 2000, - "start": 1994, + "commentStart": 2004, + "end": 2010, + "start": 2004, "type": "TagDeclarator", "value": "seg04" }, @@ -339,9 +339,9 @@ description: Variables in memory after executing exhaust-manifold.kcl 1.35 ], "tag": { - "commentStart": 2033, - "end": 2039, - "start": 2033, + "commentStart": 2043, + "end": 2049, + "start": 2043, "type": "TagDeclarator", "value": "seg05" }, @@ -436,9 +436,9 @@ description: Variables in memory after executing exhaust-manifold.kcl 1.35 ], "tag": { - "commentStart": 2217, - "end": 2223, - "start": 2217, + "commentStart": 2227, + "end": 2233, + "start": 2227, "type": "TagDeclarator", "value": "seg07" }, @@ -461,9 +461,9 @@ description: Variables in memory after executing exhaust-manifold.kcl 1.35 ], "tag": { - "commentStart": 2274, - "end": 2280, - "start": 2274, + "commentStart": 2284, + "end": 2290, + "start": 2284, "type": "TagDeclarator", "value": "seg08" }, @@ -486,9 +486,9 @@ description: Variables in memory after executing exhaust-manifold.kcl -1.25 ], "tag": { - "commentStart": 2324, - "end": 2330, - "start": 2324, + "commentStart": 2334, + "end": 2340, + "start": 2334, "type": "TagDeclarator", "value": "seg09" }, diff --git a/rust/kcl-lib/tests/kcl_samples/flange/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/flange/artifact_graph_flowchart.snap.md index 2d54bbedf..0da99bacd 100644 --- a/rust/kcl-lib/tests/kcl_samples/flange/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/flange/artifact_graph_flowchart.snap.md @@ -11,37 +11,37 @@ flowchart LR 8[Solid2d] end subgraph path13 [Path] - 13["Path
[1403, 1457, 0]"] - 14["Segment
[1403, 1457, 0]"] + 13["Path
[1413, 1467, 0]"] + 14["Segment
[1413, 1467, 0]"] 15[Solid2d] end subgraph path19 [Path] - 19["Path
[1620, 1677, 0]"] - 20["Segment
[1620, 1677, 0]"] + 19["Path
[1630, 1687, 0]"] + 20["Segment
[1630, 1687, 0]"] 21[Solid2d] end subgraph path25 [Path] - 25["Path
[1812, 1857, 0]"] - 26["Segment
[1812, 1857, 0]"] + 25["Path
[1822, 1867, 0]"] + 26["Segment
[1822, 1867, 0]"] 27[Solid2d] end 1["Plane
[840, 857, 0]"] 5["Plane
[1162, 1179, 0]"] - 9["Sweep Extrusion
[1258, 1289, 0]"] + 9["Sweep Extrusion
[1268, 1299, 0]"] 10[Wall] 11["Cap Start"] 12["Cap End"] - 16["Sweep Extrusion
[1463, 1498, 0]"] + 16["Sweep Extrusion
[1473, 1508, 0]"] 17[Wall] 18["Cap End"] - 22["Sweep Extrusion
[1683, 1716, 0]"] + 22["Sweep Extrusion
[1693, 1726, 0]"] 23[Wall] 24["Cap End"] - 28["Sweep Extrusion
[1863, 1938, 0]"] + 28["Sweep Extrusion
[1873, 1948, 0]"] 29[Wall] - 30["StartSketchOnFace
[1360, 1397, 0]"] - 31["StartSketchOnFace
[1575, 1614, 0]"] - 32["StartSketchOnFace
[1767, 1806, 0]"] + 30["StartSketchOnFace
[1370, 1407, 0]"] + 31["StartSketchOnFace
[1585, 1624, 0]"] + 32["StartSketchOnFace
[1777, 1816, 0]"] 1 --- 2 2 --- 3 2 --- 4 diff --git a/rust/kcl-lib/tests/kcl_samples/flange/ast.snap b/rust/kcl-lib/tests/kcl_samples/flange/ast.snap index 96a17d5be..9b65d3847 100644 --- a/rust/kcl-lib/tests/kcl_samples/flange/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/flange/ast.snap @@ -1053,27 +1053,30 @@ description: Result of parsing flange.kcl { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "circles", + "name": "tool", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "circles", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -1083,7 +1086,7 @@ description: Result of parsing flange.kcl "name": { "commentStart": 0, "end": 0, - "name": "hole", + "name": "subtract2d", "start": 0, "type": "Identifier" }, @@ -1094,8 +1097,9 @@ description: Result of parsing flange.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/flange/ops.snap b/rust/kcl-lib/tests/kcl_samples/flange/ops.snap index 37ee3f992..3b2ff009b 100644 --- a/rust/kcl-lib/tests/kcl_samples/flange/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/flange/ops.snap @@ -35,7 +35,7 @@ description: Operations executed flange.kcl }, { "labeledArgs": { - "holeSketch": { + "tool": { "value": { "type": "Array", "value": [ @@ -66,21 +66,20 @@ description: Operations executed flange.kcl ] }, "sourceRange": [] - }, - "sketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { diff --git a/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/artifact_graph_flowchart.snap.md index eb07fff9f..725909083 100644 --- a/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/artifact_graph_flowchart.snap.md @@ -21,36 +21,36 @@ flowchart LR 36[Solid2d] end subgraph path37 [Path] - 37["Path
[2649, 2812, 0]"] - 38["Segment
[2649, 2812, 0]"] + 37["Path
[2662, 2825, 0]"] + 38["Segment
[2662, 2825, 0]"] 39[Solid2d] end subgraph path54 [Path] - 54["Path
[3197, 3252, 0]"] - 55["Segment
[3258, 3312, 0]"] - 56["Segment
[3318, 3368, 0]"] - 57["Segment
[3374, 3427, 0]"] - 58["Segment
[3433, 3453, 0]"] + 54["Path
[3207, 3262, 0]"] + 55["Segment
[3268, 3322, 0]"] + 56["Segment
[3328, 3378, 0]"] + 57["Segment
[3384, 3437, 0]"] + 58["Segment
[3443, 3463, 0]"] 59[Solid2d] end subgraph path60 [Path] - 60["Path
[3464, 3630, 0]"] - 61["Segment
[3464, 3630, 0]"] + 60["Path
[3487, 3653, 0]"] + 61["Segment
[3487, 3653, 0]"] 62[Solid2d] end subgraph path77 [Path] - 77["Path
[4213, 4254, 0]"] - 78["Segment
[4260, 4280, 0]"] - 79["Segment
[4286, 4309, 0]"] - 80["Segment
[4315, 4322, 0]"] + 77["Path
[4233, 4274, 0]"] + 78["Segment
[4280, 4300, 0]"] + 79["Segment
[4306, 4329, 0]"] + 80["Segment
[4335, 4342, 0]"] 81[Solid2d] end subgraph path91 [Path] - 91["Path
[4437, 4477, 0]"] - 92["Segment
[4483, 4503, 0]"] - 93["Segment
[4509, 4530, 0]"] - 94["Segment
[4536, 4557, 0]"] - 95["Segment
[4563, 4570, 0]"] + 91["Path
[4457, 4497, 0]"] + 92["Segment
[4503, 4523, 0]"] + 93["Segment
[4529, 4550, 0]"] + 94["Segment
[4556, 4577, 0]"] + 95["Segment
[4583, 4590, 0]"] 96[Solid2d] end 1["Plane
[1199, 1226, 0]"] @@ -73,7 +73,7 @@ flowchart LR 28["SweepEdge Opposite"] 29["SweepEdge Opposite"] 30["Plane
[2354, 2377, 0]"] - 40["Sweep Extrusion
[2822, 2847, 0]"] + 40["Sweep Extrusion
[2832, 2857, 0]"] 41[Wall] 42[Wall] 43[Wall] @@ -84,10 +84,10 @@ flowchart LR 48["SweepEdge Opposite"] 49["SweepEdge Opposite"] 50["SweepEdge Adjacent"] - 51["EdgeCut Fillet
[2853, 2998, 0]"] - 52["EdgeCut Fillet
[2853, 2998, 0]"] - 53["Plane
[3168, 3191, 0]"] - 63["Sweep Extrusion
[3640, 3665, 0]"] + 51["EdgeCut Fillet
[2863, 3008, 0]"] + 52["EdgeCut Fillet
[2863, 3008, 0]"] + 53["Plane
[3178, 3201, 0]"] + 63["Sweep Extrusion
[3660, 3685, 0]"] 64[Wall] 65[Wall] 66[Wall] @@ -98,10 +98,10 @@ flowchart LR 71["SweepEdge Opposite"] 72["SweepEdge Opposite"] 73["SweepEdge Adjacent"] - 74["EdgeCut Fillet
[3671, 3816, 0]"] - 75["EdgeCut Fillet
[3671, 3816, 0]"] - 76["Plane
[4184, 4207, 0]"] - 82["Sweep Extrusion
[4328, 4356, 0]"] + 74["EdgeCut Fillet
[3691, 3836, 0]"] + 75["EdgeCut Fillet
[3691, 3836, 0]"] + 76["Plane
[4204, 4227, 0]"] + 82["Sweep Extrusion
[4348, 4376, 0]"] 83[Wall] 84[Wall] 85[Wall] @@ -109,8 +109,8 @@ flowchart LR 87["Cap End"] 88["SweepEdge Opposite"] 89["SweepEdge Opposite"] - 90["Plane
[4408, 4431, 0]"] - 97["Sweep Extrusion
[4576, 4604, 0]"] + 90["Plane
[4428, 4451, 0]"] + 97["Sweep Extrusion
[4596, 4624, 0]"] 98[Wall] 99[Wall] 100[Wall] diff --git a/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/ast.snap b/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/ast.snap index 7dfba3014..6126a74e1 100644 --- a/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/ast.snap @@ -4815,329 +4815,332 @@ description: Result of parsing focusrite-scarlett-mounting-bracket.kcl { "arguments": [ { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { - "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" - }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "thk", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "tabWidth", - "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" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "length", - "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" - }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "thk", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "-", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "tabLength", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } - }, - "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" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "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, - "name": "holeDiam", - "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" - } - } - ], - "callee": { - "abs_path": false, + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": { + "name": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "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" + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "thk", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "tabWidth", + "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" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "length", + "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" + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "thk", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "-", + "right": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "tabLength", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + }, + "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" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "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, + "name": "holeDiam", + "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" + } + } + ], + "callee": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "circle", + "name": { + "commentStart": 0, + "end": 0, + "name": "circle", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name" }, - "path": [], + "commentStart": 0, + "end": 0, "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } } ], "callee": { @@ -5147,7 +5150,7 @@ description: Result of parsing focusrite-scarlett-mounting-bracket.kcl "name": { "commentStart": 0, "end": 0, - "name": "hole", + "name": "subtract2d", "start": 0, "type": "Identifier" }, @@ -5158,8 +5161,9 @@ description: Result of parsing focusrite-scarlett-mounting-bracket.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ @@ -6335,64 +6339,94 @@ description: Result of parsing focusrite-scarlett-mounting-bracket.kcl { "arguments": [ { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { "commentStart": 0, "end": 0, "left": { "commentStart": 0, "end": 0, "left": { - "argument": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "commentStart": 0, + "end": 0, + "left": { + "argument": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "width", + "name": { + "commentStart": 0, + "end": 0, + "name": "width", + "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" + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } }, - "commentStart": 0, - "end": 0, - "operator": "-", "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" + "type": "BinaryExpression", + "type": "BinaryExpression" }, - "operator": "/", + "operator": "-", "right": { + "abs_path": false, "commentStart": 0, "end": 0, - "raw": "2", + "name": { + "commentStart": 0, + "end": 0, + "name": "thk", + "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", @@ -6400,73 +6434,6 @@ description: Result of parsing focusrite-scarlett-mounting-bracket.kcl }, "operator": "-", "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "thk", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "-", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "tabWidth", - "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" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { "commentStart": 0, "end": 0, "left": { @@ -6476,7 +6443,7 @@ description: Result of parsing focusrite-scarlett-mounting-bracket.kcl "name": { "commentStart": 0, "end": 0, - "name": "length", + "name": "tabWidth", "start": 0, "type": "Identifier" }, @@ -6502,75 +6469,125 @@ description: Result of parsing focusrite-scarlett-mounting-bracket.kcl "type": "BinaryExpression", "type": "BinaryExpression" }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "thk", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" }, - "operator": "-", - "right": { + { "commentStart": 0, "end": 0, "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "tabLength", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { "commentStart": 0, "end": 0, "left": { "commentStart": 0, "end": 0, - "raw": "3", + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "length", + "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": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "thk", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "-", + "right": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "tabLength", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" }, "operator": "/", "right": { "commentStart": 0, "end": 0, - "raw": "2", + "left": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } + "type": "BinaryExpression", + "type": "BinaryExpression" }, "start": 0, "type": "BinaryExpression", @@ -6579,93 +6596,83 @@ description: Result of parsing focusrite-scarlett-mounting-bracket.kcl "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "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, + "name": "holeDiam", + "start": 0, + "type": "Identifier" }, + "path": [], "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" + "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" + } } - }, - { - "type": "LabeledArg", - "label": { + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { "commentStart": 0, "end": 0, - "name": "radius", + "name": "circle", "start": 0, "type": "Identifier" }, - "arg": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "holeDiam", - "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" - } - } - ], - "callee": { - "abs_path": false, + "path": [], + "start": 0, + "type": "Name" + }, "commentStart": 0, "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "circle", - "start": 0, - "type": "Identifier" - }, - "path": [], "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } } ], "callee": { @@ -6675,7 +6682,7 @@ description: Result of parsing focusrite-scarlett-mounting-bracket.kcl "name": { "commentStart": 0, "end": 0, - "name": "hole", + "name": "subtract2d", "start": 0, "type": "Identifier" }, @@ -6686,8 +6693,9 @@ description: Result of parsing focusrite-scarlett-mounting-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/focusrite-scarlett-mounting-bracket/ops.snap b/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/ops.snap index 294bb456a..3ef7216e8 100644 --- a/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/ops.snap @@ -495,16 +495,7 @@ description: Operations executed focusrite-scarlett-mounting-bracket.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -514,10 +505,18 @@ description: Operations executed focusrite-scarlett-mounting-bracket.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { @@ -888,16 +887,7 @@ description: Operations executed focusrite-scarlett-mounting-bracket.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -907,10 +897,18 @@ description: Operations executed focusrite-scarlett-mounting-bracket.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { diff --git a/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/program_memory.snap b/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/program_memory.snap index c29ac49c6..915c12bb4 100644 --- a/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/program_memory.snap +++ b/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/program_memory.snap @@ -1856,9 +1856,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 3304, - "end": 3311, - "start": 3304, + "commentStart": 3314, + "end": 3321, + "start": 3314, "type": "TagDeclarator", "value": "edge21" }, @@ -1869,9 +1869,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 3360, - "end": 3367, - "start": 3360, + "commentStart": 3370, + "end": 3377, + "start": 3370, "type": "TagDeclarator", "value": "edge22" }, @@ -1882,9 +1882,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 3419, - "end": 3426, - "start": 3419, + "commentStart": 3429, + "end": 3436, + "start": 3429, "type": "TagDeclarator", "value": "edge23" }, @@ -1895,9 +1895,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 3445, - "end": 3452, - "start": 3445, + "commentStart": 3455, + "end": 3462, + "start": 3455, "type": "TagDeclarator", "value": "edge24" }, @@ -1918,9 +1918,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 44.0 ], "tag": { - "commentStart": 3304, - "end": 3311, - "start": 3304, + "commentStart": 3314, + "end": 3321, + "start": 3314, "type": "TagDeclarator", "value": "edge21" }, @@ -1943,9 +1943,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 35.6667 ], "tag": { - "commentStart": 3360, - "end": 3367, - "start": 3360, + "commentStart": 3370, + "end": 3377, + "start": 3370, "type": "TagDeclarator", "value": "edge22" }, @@ -1968,9 +1968,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 19.0 ], "tag": { - "commentStart": 3419, - "end": 3426, - "start": 3419, + "commentStart": 3429, + "end": 3436, + "start": 3429, "type": "TagDeclarator", "value": "edge23" }, @@ -1993,9 +1993,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 10.6667 ], "tag": { - "commentStart": 3445, - "end": 3452, - "start": 3445, + "commentStart": 3455, + "end": 3462, + "start": 3455, "type": "TagDeclarator", "value": "edge24" }, @@ -2140,9 +2140,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 3304, - "end": 3311, - "start": 3304, + "commentStart": 3314, + "end": 3321, + "start": 3314, "type": "TagDeclarator", "value": "edge21" }, @@ -2153,9 +2153,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 3360, - "end": 3367, - "start": 3360, + "commentStart": 3370, + "end": 3377, + "start": 3370, "type": "TagDeclarator", "value": "edge22" }, @@ -2166,9 +2166,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 3419, - "end": 3426, - "start": 3419, + "commentStart": 3429, + "end": 3436, + "start": 3429, "type": "TagDeclarator", "value": "edge23" }, @@ -2179,9 +2179,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 3445, - "end": 3452, - "start": 3445, + "commentStart": 3455, + "end": 3462, + "start": 3455, "type": "TagDeclarator", "value": "edge24" }, @@ -2202,9 +2202,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 44.0 ], "tag": { - "commentStart": 3304, - "end": 3311, - "start": 3304, + "commentStart": 3314, + "end": 3321, + "start": 3314, "type": "TagDeclarator", "value": "edge21" }, @@ -2227,9 +2227,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 35.6667 ], "tag": { - "commentStart": 3360, - "end": 3367, - "start": 3360, + "commentStart": 3370, + "end": 3377, + "start": 3370, "type": "TagDeclarator", "value": "edge22" }, @@ -2252,9 +2252,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 19.0 ], "tag": { - "commentStart": 3419, - "end": 3426, - "start": 3419, + "commentStart": 3429, + "end": 3436, + "start": 3429, "type": "TagDeclarator", "value": "edge23" }, @@ -2277,9 +2277,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 10.6667 ], "tag": { - "commentStart": 3445, - "end": 3452, - "start": 3445, + "commentStart": 3455, + "end": 3462, + "start": 3455, "type": "TagDeclarator", "value": "edge24" }, 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 2aff4b2e2..b185b1b02 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 @@ -37,27 +37,27 @@ flowchart LR 29[Solid2d] end subgraph path44 [Path] - 44["Path
[2714, 2770, 0]"] - 45["Segment
[2776, 2835, 0]"] - 46["Segment
[2841, 2876, 0]"] - 47["Segment
[2882, 2915, 0]"] - 48["Segment
[2921, 2980, 0]"] - 49["Segment
[2986, 3022, 0]"] - 50["Segment
[3028, 3052, 0]"] - 51["Segment
[3058, 3065, 0]"] + 44["Path
[2744, 2800, 0]"] + 45["Segment
[2806, 2865, 0]"] + 46["Segment
[2871, 2906, 0]"] + 47["Segment
[2912, 2945, 0]"] + 48["Segment
[2951, 3010, 0]"] + 49["Segment
[3016, 3052, 0]"] + 50["Segment
[3058, 3082, 0]"] + 51["Segment
[3088, 3095, 0]"] 52[Solid2d] end subgraph path71 [Path] - 71["Path
[3660, 3710, 0]"] - 72["Segment
[3716, 3766, 0]"] - 73["Segment
[3772, 3838, 0]"] - 74["Segment
[3844, 3895, 0]"] - 75["Segment
[3901, 3966, 0]"] - 76["Segment
[3972, 4025, 0]"] - 77["Segment
[4031, 4098, 0]"] - 78["Segment
[4104, 4178, 0]"] - 79["Segment
[4184, 4252, 0]"] - 80["Segment
[4258, 4265, 0]"] + 71["Path
[3690, 3740, 0]"] + 72["Segment
[3746, 3796, 0]"] + 73["Segment
[3802, 3868, 0]"] + 74["Segment
[3874, 3925, 0]"] + 75["Segment
[3931, 3996, 0]"] + 76["Segment
[4002, 4055, 0]"] + 77["Segment
[4061, 4128, 0]"] + 78["Segment
[4134, 4208, 0]"] + 79["Segment
[4214, 4282, 0]"] + 80["Segment
[4288, 4295, 0]"] 81[Solid2d] end subgraph path100 [Path] @@ -70,7 +70,7 @@ flowchart LR 106[Solid2d] end 1["Plane
[1377, 1394, 0]"] - 30["Sweep Extrusion
[2286, 2336, 0]"] + 30["Sweep Extrusion
[2316, 2366, 0]"] 31[Wall] 32[Wall] 33[Wall] @@ -83,8 +83,8 @@ flowchart LR 40["SweepEdge Opposite"] 41["SweepEdge Opposite"] 42["SweepEdge Adjacent"] - 43["Plane
[2611, 2653, 0]"] - 53["Sweep Extrusion
[3099, 3143, 0]"] + 43["Plane
[2641, 2683, 0]"] + 53["Sweep Extrusion
[3129, 3173, 0]"] 54[Wall] 55[Wall] 56[Wall] @@ -101,8 +101,8 @@ flowchart LR 67["SweepEdge Opposite"] 68["SweepEdge Opposite"] 69["SweepEdge Adjacent"] - 70["Plane
[3586, 3612, 0]"] - 82["Sweep Extrusion
[4321, 4363, 0]"] + 70["Plane
[3616, 3642, 0]"] + 82["Sweep Extrusion
[4351, 4393, 0]"] 83[Wall] 84[Wall] 85[Wall] @@ -120,7 +120,7 @@ flowchart LR 97["SweepEdge Opposite"] 98["SweepEdge Opposite"] 99["SweepEdge Opposite"] - 107["Sweep Extrusion
[4598, 4648, 0]"] + 107["Sweep Extrusion
[4628, 4678, 0]"] 108[Wall] 109[Wall] 110[Wall] @@ -128,12 +128,12 @@ flowchart LR 112["SweepEdge Opposite"] 113["SweepEdge Opposite"] 114["SweepEdge Opposite"] - 115["EdgeCut Fillet
[2373, 2514, 0]"] - 116["EdgeCut Fillet
[2373, 2514, 0]"] - 117["EdgeCut Fillet
[3186, 3317, 0]"] - 118["EdgeCut Fillet
[3186, 3317, 0]"] - 119["StartSketchOnPlane
[2597, 2654, 0]"] - 120["StartSketchOnFace
[4422, 4461, 0]"] + 115["EdgeCut Fillet
[2403, 2544, 0]"] + 116["EdgeCut Fillet
[2403, 2544, 0]"] + 117["EdgeCut Fillet
[3216, 3347, 0]"] + 118["EdgeCut Fillet
[3216, 3347, 0]"] + 119["StartSketchOnPlane
[2627, 2684, 0]"] + 120["StartSketchOnFace
[4452, 4491, 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 e0923d5db..fd8371014 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 @@ -3396,27 +3396,30 @@ description: Result of parsing food-service-spatula.kcl { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "slotProfile000", + "name": "tool", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "slotProfile000", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -3426,7 +3429,7 @@ description: Result of parsing food-service-spatula.kcl "name": { "commentStart": 0, "end": 0, - "name": "hole", + "name": "subtract2d", "start": 0, "type": "Identifier" }, @@ -3437,33 +3440,37 @@ 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": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "slotProfile001", + "name": "tool", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "slotProfile001", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -3473,7 +3480,7 @@ description: Result of parsing food-service-spatula.kcl "name": { "commentStart": 0, "end": 0, - "name": "hole", + "name": "subtract2d", "start": 0, "type": "Identifier" }, @@ -3484,33 +3491,37 @@ 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": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "slotProfile002", + "name": "tool", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "slotProfile002", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -3520,7 +3531,7 @@ description: Result of parsing food-service-spatula.kcl "name": { "commentStart": 0, "end": 0, - "name": "hole", + "name": "subtract2d", "start": 0, "type": "Identifier" }, @@ -3531,8 +3542,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 } ], "commentStart": 0, 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 26e090f39..2898ce8d4 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 @@ -344,16 +344,7 @@ description: Operations executed food-service-spatula.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -363,23 +354,22 @@ description: Operations executed food-service-spatula.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -389,23 +379,22 @@ description: Operations executed food-service-spatula.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -415,10 +404,18 @@ description: Operations executed food-service-spatula.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { 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 7802ea61f..301d74e0b 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 @@ -551,9 +551,9 @@ description: Variables in memory after executing food-service-spatula.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4165, - "end": 4177, - "start": 4165, + "commentStart": 4195, + "end": 4207, + "start": 4195, "type": "TagDeclarator", "value": "gripEdgeTop" }, @@ -713,9 +713,9 @@ description: Variables in memory after executing food-service-spatula.kcl 7.0 ], "tag": { - "commentStart": 4165, - "end": 4177, - "start": 4165, + "commentStart": 4195, + "end": 4207, + "start": 4195, "type": "TagDeclarator", "value": "gripEdgeTop" }, @@ -1058,9 +1058,9 @@ description: Variables in memory after executing food-service-spatula.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4165, - "end": 4177, - "start": 4165, + "commentStart": 4195, + "end": 4207, + "start": 4195, "type": "TagDeclarator", "value": "gripEdgeTop" }, @@ -1220,9 +1220,9 @@ description: Variables in memory after executing food-service-spatula.kcl 7.0 ], "tag": { - "commentStart": 4165, - "end": 4177, - "start": 4165, + "commentStart": 4195, + "end": 4207, + "start": 4195, "type": "TagDeclarator", "value": "gripEdgeTop" }, @@ -1538,9 +1538,9 @@ description: Variables in memory after executing food-service-spatula.kcl 7.0 ], "tag": { - "commentStart": 4165, - "end": 4177, - "start": 4165, + "commentStart": 4195, + "end": 4207, + "start": 4195, "type": "TagDeclarator", "value": "gripEdgeTop" }, @@ -1729,9 +1729,9 @@ description: Variables in memory after executing food-service-spatula.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2817, - "end": 2834, - "start": 2817, + "commentStart": 2847, + "end": 2864, + "start": 2847, "type": "TagDeclarator", "value": "handleBottomEdge" }, @@ -1756,9 +1756,9 @@ description: Variables in memory after executing food-service-spatula.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2965, - "end": 2979, - "start": 2965, + "commentStart": 2995, + "end": 3009, + "start": 2995, "type": "TagDeclarator", "value": "handleTopEdge" }, @@ -1800,9 +1800,9 @@ description: Variables in memory after executing food-service-spatula.kcl 3.5 ], "tag": { - "commentStart": 2817, - "end": 2834, - "start": 2817, + "commentStart": 2847, + "end": 2864, + "start": 2847, "type": "TagDeclarator", "value": "handleBottomEdge" }, @@ -1863,9 +1863,9 @@ description: Variables in memory after executing food-service-spatula.kcl 91.3213 ], "tag": { - "commentStart": 2965, - "end": 2979, - "start": 2965, + "commentStart": 2995, + "end": 3009, + "start": 2995, "type": "TagDeclarator", "value": "handleTopEdge" }, @@ -2211,9 +2211,9 @@ description: Variables in memory after executing food-service-spatula.kcl 3.5 ], "tag": { - "commentStart": 2817, - "end": 2834, - "start": 2817, + "commentStart": 2847, + "end": 2864, + "start": 2847, "type": "TagDeclarator", "value": "handleBottomEdge" }, @@ -2274,9 +2274,9 @@ description: Variables in memory after executing food-service-spatula.kcl 91.3213 ], "tag": { - "commentStart": 2965, - "end": 2979, - "start": 2965, + "commentStart": 2995, + "end": 3009, + "start": 2995, "type": "TagDeclarator", "value": "handleTopEdge" }, @@ -2536,9 +2536,9 @@ description: Variables in memory after executing food-service-spatula.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4165, - "end": 4177, - "start": 4165, + "commentStart": 4195, + "end": 4207, + "start": 4195, "type": "TagDeclarator", "value": "gripEdgeTop" }, @@ -2698,9 +2698,9 @@ description: Variables in memory after executing food-service-spatula.kcl 7.0 ], "tag": { - "commentStart": 4165, - "end": 4177, - "start": 4165, + "commentStart": 4195, + "end": 4207, + "start": 4195, "type": "TagDeclarator", "value": "gripEdgeTop" }, 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 7eccf8306..b3f7ff8e9 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 @@ -72,52 +72,52 @@ flowchart LR 129[Solid2d] end subgraph path130 [Path] - 130["Path
[3673, 3710, 0]"] - 131["Segment
[3673, 3710, 0]"] + 130["Path
[3686, 3723, 0]"] + 131["Segment
[3686, 3723, 0]"] 132[Solid2d] end subgraph path137 [Path] - 137["Path
[3857, 3895, 0]"] - 138["Segment
[3857, 3895, 0]"] + 137["Path
[3867, 3905, 0]"] + 138["Segment
[3867, 3905, 0]"] 139[Solid2d] end subgraph path149 [Path] - 149["Path
[4173, 4211, 0]"] - 150["Segment
[4173, 4211, 0]"] + 149["Path
[4183, 4221, 0]"] + 150["Segment
[4183, 4221, 0]"] 151[Solid2d] end subgraph path158 [Path] - 158["Path
[4463, 4515, 0]"] - 159["Segment
[4463, 4515, 0]"] + 158["Path
[4473, 4525, 0]"] + 159["Segment
[4473, 4525, 0]"] 160[Solid2d] end subgraph path166 [Path] - 166["Path
[4760, 4804, 0]"] - 167["Segment
[4810, 4850, 0]"] - 168["Segment
[4856, 4875, 0]"] - 169["Segment
[4881, 4900, 0]"] - 170["Segment
[4906, 4925, 0]"] - 171["Segment
[4931, 4956, 0]"] - 172["Segment
[4962, 5070, 0]"] - 173["Segment
[5076, 5132, 0]"] - 174["Segment
[5138, 5145, 0]"] + 166["Path
[4770, 4814, 0]"] + 167["Segment
[4820, 4860, 0]"] + 168["Segment
[4866, 4885, 0]"] + 169["Segment
[4891, 4910, 0]"] + 170["Segment
[4916, 4935, 0]"] + 171["Segment
[4941, 4966, 0]"] + 172["Segment
[4972, 5080, 0]"] + 173["Segment
[5086, 5142, 0]"] + 174["Segment
[5148, 5155, 0]"] 175[Solid2d] end subgraph path185 [Path] - 185["Path
[5275, 5304, 0]"] - 186["Segment
[5310, 5331, 0]"] - 187["Segment
[5337, 5377, 0]"] - 188["Segment
[5383, 5423, 0]"] - 189["Segment
[5429, 5470, 0]"] - 190["Segment
[5476, 5498, 0]"] - 191["Segment
[5504, 5525, 0]"] - 192["Segment
[5531, 5556, 0]"] - 193["Segment
[5562, 5602, 0]"] - 194["Segment
[5608, 5649, 0]"] - 195["Segment
[5655, 5696, 0]"] - 196["Segment
[5702, 5723, 0]"] - 197["Segment
[5729, 5785, 0]"] - 198["Segment
[5791, 5798, 0]"] + 185["Path
[5285, 5314, 0]"] + 186["Segment
[5320, 5341, 0]"] + 187["Segment
[5347, 5387, 0]"] + 188["Segment
[5393, 5433, 0]"] + 189["Segment
[5439, 5480, 0]"] + 190["Segment
[5486, 5508, 0]"] + 191["Segment
[5514, 5535, 0]"] + 192["Segment
[5541, 5566, 0]"] + 193["Segment
[5572, 5612, 0]"] + 194["Segment
[5618, 5659, 0]"] + 195["Segment
[5665, 5706, 0]"] + 196["Segment
[5712, 5733, 0]"] + 197["Segment
[5739, 5795, 0]"] + 198["Segment
[5801, 5808, 0]"] 199[Solid2d] end 1["Plane
[242, 259, 0]"] @@ -192,31 +192,31 @@ flowchart LR 124[Wall] 125[Wall] 126["Plane
[3566, 3596, 0]"] - 133["Sweep Extrusion
[3729, 3763, 0]"] + 133["Sweep Extrusion
[3739, 3773, 0]"] 134[Wall] 135["Cap Start"] 136["Cap End"] - 140["Sweep Extrusion
[4044, 4079, 0]"] + 140["Sweep Extrusion
[4054, 4089, 0]"] 141[Wall] - 142["Sweep Extrusion
[4044, 4079, 0]"] - 143["Sweep Extrusion
[4044, 4079, 0]"] - 144["Sweep Extrusion
[4044, 4079, 0]"] - 145["Sweep Extrusion
[4044, 4079, 0]"] - 146["Sweep Extrusion
[4044, 4079, 0]"] - 147["Sweep Extrusion
[4044, 4079, 0]"] - 148["Sweep Extrusion
[4044, 4079, 0]"] - 152["Sweep Extrusion
[4360, 4395, 0]"] + 142["Sweep Extrusion
[4054, 4089, 0]"] + 143["Sweep Extrusion
[4054, 4089, 0]"] + 144["Sweep Extrusion
[4054, 4089, 0]"] + 145["Sweep Extrusion
[4054, 4089, 0]"] + 146["Sweep Extrusion
[4054, 4089, 0]"] + 147["Sweep Extrusion
[4054, 4089, 0]"] + 148["Sweep Extrusion
[4054, 4089, 0]"] + 152["Sweep Extrusion
[4370, 4405, 0]"] 153[Wall] - 154["Sweep Extrusion
[4360, 4395, 0]"] - 155["Sweep Extrusion
[4360, 4395, 0]"] - 156["Sweep Extrusion
[4360, 4395, 0]"] - 157["Plane
[4440, 4457, 0]"] - 161["Sweep Extrusion
[4611, 4652, 0]"] + 154["Sweep Extrusion
[4370, 4405, 0]"] + 155["Sweep Extrusion
[4370, 4405, 0]"] + 156["Sweep Extrusion
[4370, 4405, 0]"] + 157["Plane
[4450, 4467, 0]"] + 161["Sweep Extrusion
[4621, 4662, 0]"] 162[Wall] 163["Cap Start"] 164["Cap End"] - 165["Plane
[4737, 4754, 0]"] - 176["Sweep Revolve
[5151, 5168, 0]"] + 165["Plane
[4747, 4764, 0]"] + 176["Sweep Revolve
[5161, 5178, 0]"] 177[Wall] 178[Wall] 179[Wall] @@ -224,8 +224,8 @@ flowchart LR 181[Wall] 182[Wall] 183[Wall] - 184["Plane
[5223, 5268, 0]"] - 200["Sweep Extrusion
[5812, 5857, 0]"] + 184["Plane
[5233, 5278, 0]"] + 200["Sweep Extrusion
[5822, 5867, 0]"] 201[Wall] 202[Wall] 203[Wall] @@ -254,9 +254,9 @@ flowchart LR 226["StartSketchOnPlane
[2115, 2157, 0]"] 227["StartSketchOnFace
[2285, 2322, 0]"] 228["StartSketchOnPlane
[3552, 3597, 0]"] - 229["StartSketchOnFace
[3814, 3851, 0]"] - 230["StartSketchOnFace
[4130, 4167, 0]"] - 231["StartSketchOnPlane
[5209, 5269, 0]"] + 229["StartSketchOnFace
[3824, 3861, 0]"] + 230["StartSketchOnFace
[4140, 4177, 0]"] + 231["StartSketchOnPlane
[5219, 5279, 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 74a94f223..1c9985d74 100644 --- a/rust/kcl-lib/tests/kcl_samples/french-press/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/french-press/ast.snap @@ -5838,101 +5838,104 @@ description: Result of parsing french-press.kcl { "arguments": [ { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "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" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "end": 0, - "raw": ".15", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.15, - "suffix": "None" - } - } - } - ], - "callee": { - "abs_path": false, + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": { + "name": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "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" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": ".15", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.15, + "suffix": "None" + } + } + } + ], + "callee": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "circle", + "name": { + "commentStart": 0, + "end": 0, + "name": "circle", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name" }, - "path": [], + "commentStart": 0, + "end": 0, "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } } ], "callee": { @@ -5942,7 +5945,7 @@ description: Result of parsing french-press.kcl "name": { "commentStart": 0, "end": 0, - "name": "hole", + "name": "subtract2d", "start": 0, "type": "Identifier" }, @@ -5953,8 +5956,9 @@ description: Result of parsing french-press.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null } ], "commentStart": 0, diff --git a/rust/kcl-lib/tests/kcl_samples/french-press/ops.snap b/rust/kcl-lib/tests/kcl_samples/french-press/ops.snap index cf6851da5..13d139bf7 100644 --- a/rust/kcl-lib/tests/kcl_samples/french-press/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/french-press/ops.snap @@ -891,16 +891,7 @@ description: Operations executed french-press.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -910,10 +901,18 @@ description: Operations executed french-press.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { diff --git a/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate-magnets/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate-magnets/artifact_graph_flowchart.snap.md index 167e5f51b..f93d008d5 100644 --- a/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate-magnets/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate-magnets/artifact_graph_flowchart.snap.md @@ -19,8 +19,8 @@ flowchart LR 28[Solid2d] end subgraph path42 [Path] - 42["Path
[4583, 4663, 0]"] - 43["Segment
[4583, 4663, 0]"] + 42["Path
[4593, 4673, 0]"] + 43["Segment
[4593, 4673, 0]"] 44[Solid2d] end subgraph path46 [Path] @@ -107,10 +107,10 @@ flowchart LR 38["SweepEdge Opposite"] 39["SweepEdge Opposite"] 40["SweepEdge Opposite"] - 41["Plane
[4560, 4577, 0]"] + 41["Plane
[4570, 4587, 0]"] 45["Plane
[4186, 4206, 0]"] 52["Plane
[2695, 2715, 0]"] - 72["Sweep Extrusion
[5006, 5048, 0]"] + 72["Sweep Extrusion
[5026, 5068, 0]"] 73[Wall] 74[Wall] 75[Wall] @@ -121,8 +121,8 @@ flowchart LR 80["SweepEdge Opposite"] 81["SweepEdge Opposite"] 82["SweepEdge Adjacent"] - 83["Plane
[5542, 5577, 0]"] - 109["Sweep Extrusion
[5660, 5711, 0]"] + 83["Plane
[5562, 5597, 0]"] + 109["Sweep Extrusion
[5680, 5731, 0]"] 110[Wall] 111[Wall] 112[Wall] @@ -133,14 +133,14 @@ flowchart LR 117["SweepEdge Opposite"] 118["SweepEdge Opposite"] 119["SweepEdge Adjacent"] - 120["EdgeCut Fillet
[5111, 5450, 0]"] - 121["EdgeCut Fillet
[5111, 5450, 0]"] - 122["EdgeCut Fillet
[5111, 5450, 0]"] - 123["EdgeCut Fillet
[5111, 5450, 0]"] - 124["EdgeCut Fillet
[5775, 6119, 0]"] - 125["EdgeCut Fillet
[5775, 6119, 0]"] - 126["EdgeCut Fillet
[5775, 6119, 0]"] - 127["EdgeCut Fillet
[5775, 6119, 0]"] + 120["EdgeCut Fillet
[5131, 5470, 0]"] + 121["EdgeCut Fillet
[5131, 5470, 0]"] + 122["EdgeCut Fillet
[5131, 5470, 0]"] + 123["EdgeCut Fillet
[5131, 5470, 0]"] + 124["EdgeCut Fillet
[5795, 6139, 0]"] + 125["EdgeCut Fillet
[5795, 6139, 0]"] + 126["EdgeCut Fillet
[5795, 6139, 0]"] + 127["EdgeCut Fillet
[5795, 6139, 0]"] 128["StartSketchOnPlane
[894, 914, 0]"] 129["StartSketchOnPlane
[894, 914, 0]"] 130["StartSketchOnPlane
[4186, 4206, 0]"] diff --git a/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate-magnets/ast.snap b/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate-magnets/ast.snap index 6791e081a..88bdae3e5 100644 --- a/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate-magnets/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate-magnets/ast.snap @@ -5613,51 +5613,54 @@ description: Result of parsing gridfinity-baseplate-magnets.kcl { "arguments": [ { - "arguments": [ - { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "plane", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + ], + "callee": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "plane", + "name": "magnetCenterCutout", "start": 0, "type": "Identifier" }, "path": [], "start": 0, - "type": "Name", "type": "Name" - } - ], - "callee": { - "abs_path": false, + }, "commentStart": 0, "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "magnetCenterCutout", - "start": 0, - "type": "Identifier" - }, - "path": [], "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "CallExpression", + "type": "CallExpression" + } } ], "callee": { @@ -5667,7 +5670,7 @@ description: Result of parsing gridfinity-baseplate-magnets.kcl "name": { "commentStart": 0, "end": 0, - "name": "hole", + "name": "subtract2d", "start": 0, "type": "Identifier" }, @@ -5678,8 +5681,9 @@ description: Result of parsing gridfinity-baseplate-magnets.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null } ], "commentStart": 0, @@ -6248,27 +6252,30 @@ description: Result of parsing gridfinity-baseplate-magnets.kcl { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "magnetsSketch", + "name": "tool", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "magnetsSketch", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -6278,7 +6285,7 @@ description: Result of parsing gridfinity-baseplate-magnets.kcl "name": { "commentStart": 0, "end": 0, - "name": "hole", + "name": "subtract2d", "start": 0, "type": "Identifier" }, @@ -6289,8 +6296,9 @@ description: Result of parsing gridfinity-baseplate-magnets.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null } ], "commentStart": 0, diff --git a/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate-magnets/ops.snap b/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate-magnets/ops.snap index f1d67b113..44090d855 100644 --- a/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate-magnets/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate-magnets/ops.snap @@ -1108,7 +1108,7 @@ description: Operations executed gridfinity-baseplate-magnets.kcl "name": "magnetBase", "functionSourceRange": [ 4155, - 4497, + 4507, 0 ], "unlabeledArg": null, @@ -1166,16 +1166,7 @@ description: Operations executed gridfinity-baseplate-magnets.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -1185,17 +1176,25 @@ description: Operations executed gridfinity-baseplate-magnets.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "type": "GroupEnd" }, { "labeledArgs": { - "holeSketch": { + "tool": { "value": { "type": "Array", "value": [ @@ -1226,21 +1225,20 @@ description: Operations executed gridfinity-baseplate-magnets.kcl ] }, "sourceRange": [] - }, - "sketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { @@ -1367,7 +1365,7 @@ description: Operations executed gridfinity-baseplate-magnets.kcl "name": "magnetBase", "functionSourceRange": [ 4155, - 4497, + 4507, 0 ], "unlabeledArg": null, @@ -1425,16 +1423,7 @@ description: Operations executed gridfinity-baseplate-magnets.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -1444,10 +1433,18 @@ description: Operations executed gridfinity-baseplate-magnets.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "type": "GroupEnd" diff --git a/rust/kcl-lib/tests/kcl_samples/hex-nut/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/hex-nut/artifact_graph_flowchart.snap.md index a3fdeb98c..a15ffd280 100644 --- a/rust/kcl-lib/tests/kcl_samples/hex-nut/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/hex-nut/artifact_graph_flowchart.snap.md @@ -11,12 +11,12 @@ flowchart LR 9[Solid2d] end subgraph path10 [Path] - 10["Path
[903, 963, 0]"] - 11["Segment
[903, 963, 0]"] + 10["Path
[916, 976, 0]"] + 11["Segment
[916, 976, 0]"] 12[Solid2d] end 1["Plane
[546, 564, 0]"] - 13["Sweep Extrusion
[975, 996, 0]"] + 13["Sweep Extrusion
[985, 1006, 0]"] 14[Wall] 15[Wall] 16[Wall] diff --git a/rust/kcl-lib/tests/kcl_samples/hex-nut/ast.snap b/rust/kcl-lib/tests/kcl_samples/hex-nut/ast.snap index 5d4ff81a6..1c4d95584 100644 --- a/rust/kcl-lib/tests/kcl_samples/hex-nut/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/hex-nut/ast.snap @@ -719,157 +719,160 @@ description: Result of parsing hex-nut.kcl { "arguments": [ { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "end": 0, - "name": "start", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "property": { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - }, - { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "end": 0, - "name": "start", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "property": { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" - } - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "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, - "name": "innerDia", - "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" - } - } - ], - "callee": { - "abs_path": false, + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": { + "name": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "computed": false, + "end": 0, + "object": { + "commentStart": 0, + "end": 0, + "name": "start", + "start": 0, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + "start": 0, + "type": "MemberExpression", + "type": "MemberExpression" + }, + { + "commentStart": 0, + "computed": false, + "end": 0, + "object": { + "commentStart": 0, + "end": 0, + "name": "start", + "start": 0, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "commentStart": 0, + "end": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + }, + "start": 0, + "type": "MemberExpression", + "type": "MemberExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "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, + "name": "innerDia", + "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" + } + } + ], + "callee": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "circle", + "name": { + "commentStart": 0, + "end": 0, + "name": "circle", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name" }, - "path": [], + "commentStart": 0, + "end": 0, "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } } ], "callee": { @@ -879,7 +882,7 @@ description: Result of parsing hex-nut.kcl "name": { "commentStart": 0, "end": 0, - "name": "hole", + "name": "subtract2d", "start": 0, "type": "Identifier" }, @@ -890,8 +893,9 @@ description: Result of parsing hex-nut.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/hex-nut/ops.snap b/rust/kcl-lib/tests/kcl_samples/hex-nut/ops.snap index eaa34747c..bd586fdfd 100644 --- a/rust/kcl-lib/tests/kcl_samples/hex-nut/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/hex-nut/ops.snap @@ -10,7 +10,7 @@ description: Operations executed hex-nut.kcl "name": "hexNut", "functionSourceRange": [ 504, - 1020, + 1030, 0 ], "unlabeledArg": null, @@ -35,16 +35,7 @@ description: Operations executed hex-nut.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -54,10 +45,18 @@ description: Operations executed hex-nut.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { diff --git a/rust/kcl-lib/tests/kcl_samples/mounting-plate/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/mounting-plate/artifact_graph_flowchart.snap.md index 8f2e9900d..0220861b8 100644 --- a/rust/kcl-lib/tests/kcl_samples/mounting-plate/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/mounting-plate/artifact_graph_flowchart.snap.md @@ -9,32 +9,32 @@ flowchart LR 7[Solid2d] end subgraph path8 [Path] - 8["Path
[1105, 1250, 0]"] - 9["Segment
[1105, 1250, 0]"] + 8["Path
[1118, 1263, 0]"] + 9["Segment
[1118, 1263, 0]"] 10[Solid2d] end subgraph path11 [Path] - 11["Path
[1265, 1409, 0]"] - 12["Segment
[1265, 1409, 0]"] + 11["Path
[1288, 1432, 0]"] + 12["Segment
[1288, 1432, 0]"] 13[Solid2d] end subgraph path14 [Path] - 14["Path
[1424, 1570, 0]"] - 15["Segment
[1424, 1570, 0]"] + 14["Path
[1457, 1603, 0]"] + 15["Segment
[1457, 1603, 0]"] 16[Solid2d] end subgraph path17 [Path] - 17["Path
[1585, 1730, 0]"] - 18["Segment
[1585, 1730, 0]"] + 17["Path
[1628, 1773, 0]"] + 18["Segment
[1628, 1773, 0]"] 19[Solid2d] end subgraph path20 [Path] - 20["Path
[1745, 1797, 0]"] - 21["Segment
[1745, 1797, 0]"] + 20["Path
[1798, 1850, 0]"] + 21["Segment
[1798, 1850, 0]"] 22[Solid2d] end 1["Plane
[541, 558, 0]"] - 23["Sweep Extrusion
[1807, 1839, 0]"] + 23["Sweep Extrusion
[1857, 1889, 0]"] 24[Wall] 25[Wall] 26[Wall] @@ -44,10 +44,10 @@ flowchart LR 30["SweepEdge Opposite"] 31["SweepEdge Opposite"] 32["SweepEdge Opposite"] - 33["EdgeCut Fillet
[1845, 2110, 0]"] - 34["EdgeCut Fillet
[1845, 2110, 0]"] - 35["EdgeCut Fillet
[1845, 2110, 0]"] - 36["EdgeCut Fillet
[1845, 2110, 0]"] + 33["EdgeCut Fillet
[1895, 2160, 0]"] + 34["EdgeCut Fillet
[1895, 2160, 0]"] + 35["EdgeCut Fillet
[1895, 2160, 0]"] + 36["EdgeCut Fillet
[1895, 2160, 0]"] 1 --- 2 1 --- 8 1 --- 11 diff --git a/rust/kcl-lib/tests/kcl_samples/mounting-plate/ast.snap b/rust/kcl-lib/tests/kcl_samples/mounting-plate/ast.snap index b8533145e..dbca783eb 100644 --- a/rust/kcl-lib/tests/kcl_samples/mounting-plate/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/mounting-plate/ast.snap @@ -1406,545 +1406,103 @@ description: Result of parsing mounting-plate.kcl { "arguments": [ { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { - "argument": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "plateWidth", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - "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" - }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "holeIndex", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "plateLength", - "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" - }, - "operator": "-", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "holeIndex", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "arg": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "holeRadius", + "name": "center", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "circle", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "hole", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - { - "arguments": [ - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "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": { - "commentStart": 0, - "end": 0, - "name": "plateWidth", - "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" - }, - "operator": "-", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "holeIndex", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "plateLength", - "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" - }, - "operator": "-", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "holeIndex", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "arg": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { "commentStart": 0, - "end": 0, - "name": "holeRadius", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "circle", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "hole", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - { - "arguments": [ - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { + "elements": [ + { "commentStart": 0, "end": 0, "left": { - "argument": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "commentStart": 0, + "end": 0, + "left": { + "argument": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "plateWidth", + "name": { + "commentStart": 0, + "end": 0, + "name": "plateWidth", + "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" + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } }, - "commentStart": 0, - "end": 0, - "operator": "-", "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" + "type": "BinaryExpression", + "type": "BinaryExpression" }, - "operator": "/", + "operator": "+", "right": { + "abs_path": false, "commentStart": 0, "end": 0, - "raw": "2", + "name": { + "commentStart": 0, + "end": 0, + "name": "holeIndex", + "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": "holeIndex", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { + { "commentStart": 0, "end": 0, "left": { - "argument": { + "commentStart": 0, + "end": 0, + "left": { "abs_path": false, "commentStart": 0, "end": 0, @@ -1960,113 +1518,100 @@ description: Result of parsing mounting-plate.kcl "type": "Name", "type": "Name" }, - "commentStart": 0, - "end": 0, - "operator": "-", + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" + "type": "BinaryExpression", + "type": "BinaryExpression" }, - "operator": "/", + "operator": "-", "right": { + "abs_path": false, "commentStart": 0, "end": 0, - "raw": "2", + "name": { + "commentStart": 0, + "end": 0, + "name": "holeIndex", + "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": "holeIndex", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, - "arg": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "holeRadius", + "name": "radius", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "holeRadius", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + ], + "callee": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "circle", + "name": { + "commentStart": 0, + "end": 0, + "name": "circle", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name" }, - "path": [], + "commentStart": 0, + "end": 0, "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } } ], "callee": { @@ -2076,7 +1621,7 @@ description: Result of parsing mounting-plate.kcl "name": { "commentStart": 0, "end": 0, - "name": "hole", + "name": "subtract2d", "start": 0, "type": "Identifier" }, @@ -2087,39 +1632,83 @@ description: Result of parsing mounting-plate.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "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": { + "commentStart": 0, + "end": 0, + "name": "plateWidth", + "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" + }, + "operator": "-", + "right": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "plateWidth", + "name": "holeIndex", "start": 0, "type": "Identifier" }, @@ -2128,52 +1717,17 @@ description: Result of parsing mounting-plate.kcl "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" }, - "operator": "-", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "holeIndex", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { + { "commentStart": 0, "end": 0, "left": { - "argument": { + "commentStart": 0, + "end": 0, + "left": { "abs_path": false, "commentStart": 0, "end": 0, @@ -2189,113 +1743,341 @@ description: Result of parsing mounting-plate.kcl "type": "Name", "type": "Name" }, - "commentStart": 0, - "end": 0, - "operator": "-", + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" + "type": "BinaryExpression", + "type": "BinaryExpression" }, - "operator": "/", + "operator": "-", "right": { + "abs_path": false, "commentStart": 0, "end": 0, - "raw": "2", + "name": { + "commentStart": 0, + "end": 0, + "name": "holeIndex", + "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" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "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": "holeRadius", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "circle", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "subtract2d", + "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": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "plateWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "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" + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "holeIndex", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" }, - "operator": "+", - "right": { - "abs_path": false, + { "commentStart": 0, "end": 0, - "name": { + "left": { "commentStart": 0, "end": 0, - "name": "holeIndex", + "left": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "plateLength", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, "start": 0, - "type": "Identifier" + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "holeIndex", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" }, - "path": [], "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, - "arg": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "holeRadius", + "name": "radius", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "holeRadius", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + ], + "callee": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "circle", + "name": { + "commentStart": 0, + "end": 0, + "name": "circle", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name" }, - "path": [], + "commentStart": 0, + "end": 0, "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } } ], "callee": { @@ -2305,7 +2087,7 @@ description: Result of parsing mounting-plate.kcl "name": { "commentStart": 0, "end": 0, - "name": "hole", + "name": "subtract2d", "start": 0, "type": "Identifier" }, @@ -2316,111 +2098,219 @@ description: Result of parsing mounting-plate.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "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" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "arg": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "centerHoleDiameter", + "name": "center", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "plateWidth", + "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" + }, + "operator": "-", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "holeIndex", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "plateLength", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "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" + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "holeIndex", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "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": "holeRadius", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + ], + "callee": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "circle", + "name": { + "commentStart": 0, + "end": 0, + "name": "circle", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name" }, - "path": [], + "commentStart": 0, + "end": 0, "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } } ], "callee": { @@ -2430,7 +2320,7 @@ description: Result of parsing mounting-plate.kcl "name": { "commentStart": 0, "end": 0, - "name": "hole", + "name": "subtract2d", "start": 0, "type": "Identifier" }, @@ -2441,8 +2331,138 @@ description: Result of parsing mounting-plate.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": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "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" + } + }, + { + "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": "centerHoleDiameter", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "circle", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "subtract2d", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ diff --git a/rust/kcl-lib/tests/kcl_samples/mounting-plate/ops.snap b/rust/kcl-lib/tests/kcl_samples/mounting-plate/ops.snap index 546639cd9..dd3d4d6ee 100644 --- a/rust/kcl-lib/tests/kcl_samples/mounting-plate/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/mounting-plate/ops.snap @@ -38,16 +38,7 @@ description: Operations executed mounting-plate.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -57,23 +48,22 @@ description: Operations executed mounting-plate.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -83,23 +73,22 @@ description: Operations executed mounting-plate.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -109,23 +98,22 @@ description: Operations executed mounting-plate.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -135,23 +123,22 @@ description: Operations executed mounting-plate.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -161,10 +148,18 @@ description: Operations executed mounting-plate.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { diff --git a/rust/kcl-lib/tests/kcl_samples/pipe-flange-assembly/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/pipe-flange-assembly/artifact_graph_flowchart.snap.md index e70358999..13b6c3399 100644 --- a/rust/kcl-lib/tests/kcl_samples/pipe-flange-assembly/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/pipe-flange-assembly/artifact_graph_flowchart.snap.md @@ -11,18 +11,18 @@ flowchart LR 8[Solid2d] end subgraph path13 [Path] - 13["Path
[1192, 1251, 8]"] - 14["Segment
[1192, 1251, 8]"] + 13["Path
[1202, 1261, 8]"] + 14["Segment
[1202, 1261, 8]"] 15[Solid2d] end subgraph path19 [Path] - 19["Path
[1358, 1418, 8]"] - 20["Segment
[1358, 1418, 8]"] + 19["Path
[1368, 1428, 8]"] + 20["Segment
[1368, 1428, 8]"] 21[Solid2d] end subgraph path25 [Path] - 25["Path
[1580, 1633, 8]"] - 26["Segment
[1580, 1633, 8]"] + 25["Path
[1590, 1643, 8]"] + 26["Segment
[1590, 1643, 8]"] 27[Solid2d] end subgraph path31 [Path] @@ -36,18 +36,18 @@ flowchart LR 37[Solid2d] end subgraph path42 [Path] - 42["Path
[1192, 1251, 8]"] - 43["Segment
[1192, 1251, 8]"] + 42["Path
[1202, 1261, 8]"] + 43["Segment
[1202, 1261, 8]"] 44[Solid2d] end subgraph path48 [Path] - 48["Path
[1358, 1418, 8]"] - 49["Segment
[1358, 1418, 8]"] + 48["Path
[1368, 1428, 8]"] + 49["Segment
[1368, 1428, 8]"] 50[Solid2d] end subgraph path54 [Path] - 54["Path
[1580, 1633, 8]"] - 55["Segment
[1580, 1633, 8]"] + 54["Path
[1590, 1643, 8]"] + 55["Segment
[1590, 1643, 8]"] 56[Solid2d] end subgraph path60 [Path] @@ -127,31 +127,31 @@ flowchart LR end 1["Plane
[570, 587, 8]"] 5["Plane
[892, 909, 8]"] - 9["Sweep Extrusion
[1010, 1050, 8]"] + 9["Sweep Extrusion
[1020, 1060, 8]"] 10[Wall] 11["Cap Start"] 12["Cap End"] - 16["Sweep Extrusion
[1259, 1296, 8]"] + 16["Sweep Extrusion
[1269, 1306, 8]"] 17[Wall] 18["Cap End"] - 22["Sweep Extrusion
[1426, 1464, 8]"] + 22["Sweep Extrusion
[1436, 1474, 8]"] 23[Wall] 24["Cap End"] - 28["Sweep Extrusion
[1641, 1683, 8]"] + 28["Sweep Extrusion
[1651, 1693, 8]"] 29[Wall] 30["Plane
[570, 587, 8]"] 34["Plane
[892, 909, 8]"] - 38["Sweep Extrusion
[1010, 1050, 8]"] + 38["Sweep Extrusion
[1020, 1060, 8]"] 39[Wall] 40["Cap Start"] 41["Cap End"] - 45["Sweep Extrusion
[1259, 1296, 8]"] + 45["Sweep Extrusion
[1269, 1306, 8]"] 46[Wall] 47["Cap End"] - 51["Sweep Extrusion
[1426, 1464, 8]"] + 51["Sweep Extrusion
[1436, 1474, 8]"] 52[Wall] 53["Cap End"] - 57["Sweep Extrusion
[1641, 1683, 8]"] + 57["Sweep Extrusion
[1651, 1693, 8]"] 58[Wall] 59["Plane
[399, 416, 7]"] 63["Sweep Extrusion
[490, 526, 7]"] @@ -222,12 +222,12 @@ flowchart LR 171["Cap End"] 175["Sweep Extrusion
[590, 622, 12]"] 176[Wall] - 177["StartSketchOnFace
[1145, 1184, 8]"] - 178["StartSketchOnFace
[1313, 1350, 8]"] - 179["StartSketchOnFace
[1534, 1572, 8]"] - 180["StartSketchOnFace
[1145, 1184, 8]"] - 181["StartSketchOnFace
[1313, 1350, 8]"] - 182["StartSketchOnFace
[1534, 1572, 8]"] + 177["StartSketchOnFace
[1155, 1194, 8]"] + 178["StartSketchOnFace
[1323, 1360, 8]"] + 179["StartSketchOnFace
[1544, 1582, 8]"] + 180["StartSketchOnFace
[1155, 1194, 8]"] + 181["StartSketchOnFace
[1323, 1360, 8]"] + 182["StartSketchOnFace
[1544, 1582, 8]"] 183["StartSketchOnFace
[579, 616, 7]"] 184["StartSketchOnFace
[556, 593, 9]"] 185["StartSketchOnFace
[733, 770, 10]"] diff --git a/rust/kcl-lib/tests/kcl_samples/pipe-flange-assembly/ops.snap b/rust/kcl-lib/tests/kcl_samples/pipe-flange-assembly/ops.snap index 6da1732d0..78dce63b7 100644 --- a/rust/kcl-lib/tests/kcl_samples/pipe-flange-assembly/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/pipe-flange-assembly/ops.snap @@ -82,7 +82,7 @@ description: Operations executed pipe-flange-assembly.kcl "name": "flange", "functionSourceRange": [ 509, - 1743, + 1753, 8 ], "unlabeledArg": null, @@ -122,7 +122,7 @@ description: Operations executed pipe-flange-assembly.kcl }, { "labeledArgs": { - "holeSketch": { + "tool": { "value": { "type": "Array", "value": [ @@ -153,21 +153,20 @@ description: Operations executed pipe-flange-assembly.kcl ] }, "sourceRange": [] - }, - "sketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { @@ -376,7 +375,7 @@ description: Operations executed pipe-flange-assembly.kcl "name": "flange", "functionSourceRange": [ 509, - 1743, + 1753, 8 ], "unlabeledArg": null, @@ -416,7 +415,7 @@ description: Operations executed pipe-flange-assembly.kcl }, { "labeledArgs": { - "holeSketch": { + "tool": { "value": { "type": "Array", "value": [ @@ -447,21 +446,20 @@ description: Operations executed pipe-flange-assembly.kcl ] }, "sourceRange": [] - }, - "sketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { diff --git a/rust/kcl-lib/tests/kcl_samples/pipe-with-bend/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/pipe-with-bend/artifact_graph_flowchart.snap.md index 5ba203730..07057ab42 100644 --- a/rust/kcl-lib/tests/kcl_samples/pipe-with-bend/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/pipe-with-bend/artifact_graph_flowchart.snap.md @@ -11,7 +11,7 @@ flowchart LR 7[Solid2d] end 1["Plane
[351, 368, 0]"] - 8["Sweep Revolve
[777, 826, 0]"] + 8["Sweep Revolve
[787, 836, 0]"] 9[Wall] 10["Cap Start"] 11["Cap End"] diff --git a/rust/kcl-lib/tests/kcl_samples/pipe-with-bend/ast.snap b/rust/kcl-lib/tests/kcl_samples/pipe-with-bend/ast.snap index 9ff3c70d3..2aee4a128 100644 --- a/rust/kcl-lib/tests/kcl_samples/pipe-with-bend/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/pipe-with-bend/ast.snap @@ -557,27 +557,30 @@ description: Result of parsing pipe-with-bend.kcl { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "innerProfile", + "name": "tool", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "innerProfile", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -587,7 +590,7 @@ description: Result of parsing pipe-with-bend.kcl "name": { "commentStart": 0, "end": 0, - "name": "hole", + "name": "subtract2d", "start": 0, "type": "Identifier" }, @@ -598,8 +601,9 @@ description: Result of parsing pipe-with-bend.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null } ], "commentStart": 0, diff --git a/rust/kcl-lib/tests/kcl_samples/pipe-with-bend/ops.snap b/rust/kcl-lib/tests/kcl_samples/pipe-with-bend/ops.snap index e61671785..8ce67a959 100644 --- a/rust/kcl-lib/tests/kcl_samples/pipe-with-bend/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/pipe-with-bend/ops.snap @@ -20,16 +20,7 @@ description: Operations executed pipe-with-bend.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -39,10 +30,18 @@ description: Operations executed pipe-with-bend.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "type": "KclStdLibCall", diff --git a/rust/kcl-lib/tests/kcl_samples/walkie-talkie/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/walkie-talkie/artifact_graph_flowchart.snap.md index 4121c3a07..bfbabd92f 100644 --- a/rust/kcl-lib/tests/kcl_samples/walkie-talkie/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/walkie-talkie/artifact_graph_flowchart.snap.md @@ -246,12 +246,12 @@ flowchart LR 102["Plane
[455, 472, 8]"] 110["Plane
[957, 974, 8]"] 117["Plane
[1418, 1435, 8]"] - 128["Plane
[2556, 2573, 8]"] - 147["Plane
[2616, 2633, 8]"] - 154["Plane
[2678, 2695, 8]"] - 161["Plane
[2739, 2756, 8]"] - 168["Plane
[2800, 2817, 8]"] - 175["Sweep Extrusion
[2844, 2875, 8]"] + 128["Plane
[2589, 2606, 8]"] + 147["Plane
[2659, 2676, 8]"] + 154["Plane
[2731, 2748, 8]"] + 161["Plane
[2802, 2819, 8]"] + 168["Plane
[2873, 2890, 8]"] + 175["Sweep Extrusion
[2914, 2945, 8]"] 176[Wall] 177[Wall] 178[Wall] diff --git a/rust/kcl-lib/tests/kcl_samples/walkie-talkie/ops.snap b/rust/kcl-lib/tests/kcl_samples/walkie-talkie/ops.snap index 0306c86fc..277376891 100644 --- a/rust/kcl-lib/tests/kcl_samples/walkie-talkie/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/walkie-talkie/ops.snap @@ -727,16 +727,7 @@ description: Operations executed walkie-talkie.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -746,14 +737,22 @@ description: Operations executed walkie-talkie.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { - "holeSketch": { + "tool": { "value": { "type": "Array", "value": [ @@ -1618,21 +1617,20 @@ description: Operations executed walkie-talkie.kcl ] }, "sourceRange": [] - }, - "sketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { @@ -1669,16 +1667,7 @@ description: Operations executed walkie-talkie.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -1688,10 +1677,18 @@ description: Operations executed walkie-talkie.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { @@ -1728,16 +1725,7 @@ description: Operations executed walkie-talkie.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -1747,10 +1735,18 @@ description: Operations executed walkie-talkie.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { @@ -1787,16 +1783,7 @@ description: Operations executed walkie-talkie.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -1806,10 +1793,18 @@ description: Operations executed walkie-talkie.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { @@ -1846,16 +1841,7 @@ description: Operations executed walkie-talkie.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -1865,10 +1851,18 @@ description: Operations executed walkie-talkie.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { @@ -1905,16 +1899,7 @@ description: Operations executed walkie-talkie.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -1924,10 +1909,18 @@ description: Operations executed walkie-talkie.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { diff --git a/rust/kcl-lib/tests/kcl_samples/washer/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/washer/artifact_graph_flowchart.snap.md index 86f357db6..1338efc4e 100644 --- a/rust/kcl-lib/tests/kcl_samples/washer/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/washer/artifact_graph_flowchart.snap.md @@ -6,12 +6,12 @@ flowchart LR 4[Solid2d] end subgraph path5 [Path] - 5["Path
[784, 835, 0]"] - 6["Segment
[784, 835, 0]"] + 5["Path
[797, 848, 0]"] + 6["Segment
[797, 848, 0]"] 7[Solid2d] end 1["Plane
[699, 716, 0]"] - 8["Sweep Extrusion
[850, 894, 0]"] + 8["Sweep Extrusion
[860, 904, 0]"] 9[Wall] 10["Cap Start"] 11["Cap End"] diff --git a/rust/kcl-lib/tests/kcl_samples/washer/ast.snap b/rust/kcl-lib/tests/kcl_samples/washer/ast.snap index b525dd617..812b5baaa 100644 --- a/rust/kcl-lib/tests/kcl_samples/washer/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/washer/ast.snap @@ -344,125 +344,128 @@ description: Result of parsing washer.kcl { "arguments": [ { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "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" - } - }, - { - "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, - "name": "innerDiameter", - "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" - } - } - ], - "callee": { - "abs_path": false, + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": { + "name": "tool", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "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" + } + }, + { + "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, + "name": "innerDiameter", + "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" + } + } + ], + "callee": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "circle", + "name": { + "commentStart": 0, + "end": 0, + "name": "circle", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name" }, - "path": [], + "commentStart": 0, + "end": 0, "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } } ], "callee": { @@ -472,7 +475,7 @@ description: Result of parsing washer.kcl "name": { "commentStart": 0, "end": 0, - "name": "hole", + "name": "subtract2d", "start": 0, "type": "Identifier" }, @@ -483,8 +486,9 @@ description: Result of parsing washer.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null } ], "commentStart": 0, diff --git a/rust/kcl-lib/tests/kcl_samples/washer/ops.snap b/rust/kcl-lib/tests/kcl_samples/washer/ops.snap index 7bf11febc..7f5d351b0 100644 --- a/rust/kcl-lib/tests/kcl_samples/washer/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/washer/ops.snap @@ -20,16 +20,7 @@ description: Operations executed washer.kcl }, { "labeledArgs": { - "holeSketch": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - }, - "sketch": { + "tool": { "value": { "type": "Sketch", "value": { @@ -39,10 +30,18 @@ description: Operations executed washer.kcl "sourceRange": [] } }, - "name": "hole", + "name": "subtract2d", "sourceRange": [], "type": "StdLibCall", - "unlabeledArg": null + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } }, { "labeledArgs": { diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_subtract_2d0.png b/rust/kcl-lib/tests/outputs/serial_test_example_subtract_2d0.png new file mode 100644 index 000000000..29c490844 Binary files /dev/null and b/rust/kcl-lib/tests/outputs/serial_test_example_subtract_2d0.png differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_subtract_2d1.png b/rust/kcl-lib/tests/outputs/serial_test_example_subtract_2d1.png new file mode 100644 index 000000000..399c5e7c4 Binary files /dev/null and b/rust/kcl-lib/tests/outputs/serial_test_example_subtract_2d1.png differ