From 24bc4fcd8cf834f21ab130b40f19b84df21e7795 Mon Sep 17 00:00:00 2001 From: Frank Noirot Date: Mon, 18 Nov 2024 16:25:25 -0500 Subject: [PATCH] Show offset planes in the scene, let user select them (#4481) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update offset_plane to actually create and show the plane in-engine * Fix broken ability to use offsetPlanes in startSketchOn * Make the newly-visible offset planes usable for sketching via UI * Add a playwright test for sketching on an offset plane via point-and-click * cargo clippy & cargo fmt * Make `PlaneData` the first item of `SketchData` so autocomplete continues to work well for `startSketchOn` * @nadr0 feedback re: `offsetIndex` * From @jtran: "Need to call the ID generator so that IDs are stable." * More feedback from @jtran and fix incomplete use of `id_generator` in last commit * Oops I missed saving `isPathToNodeNumber` earlier šŸ¤¦šŸ» * Make the distinction between `Plane` and `PlaneOrientationData` more clear per @nadr0 and @lf94's feedback * Make `newPathToNode` less hardcoded, per @lf94's feedback * Don't need to unbox and rebox `plane` * A snapshot a day keeps the bugs away! šŸ“·šŸ› (OS: ubuntu-latest-8-cores) * A snapshot a day keeps the bugs away! šŸ“·šŸ› (OS: windows-latest-8-cores) * Rearranging of enums and structs, but the offsetPlanes are still not used by their sketches * A snapshot a day keeps the bugs away! šŸ“·šŸ› (OS: ubuntu-latest-8-cores) * A snapshot a day keeps the bugs away! šŸ“·šŸ› (OS: windows-latest-8-cores) * Revert all my little newtype fiddling it's a waste of time. * Update docs * cargo fmt * Remove log * Print the unexpected diagnostics * Undo renaming of `PlaneData` * Remove generated PlaneRientationData docs page * Redo doc generation after undoing `PlaneData` rename * Impl FromKclValue for the new plane datatypes * Clippy lint * When starting a sketch, only hide the plane if it's a custom plane * Fix FromKclValue and macro use since merge * Fix to not convert Plane to PlaneData * Make sure offset planes are `Custom` type * SketchData actually doesn't need to be in a certain order This avoids the autocompletion issue I was having. --------- Co-authored-by: github-actions[bot] Co-authored-by: Adam Chalmers Co-authored-by: Jonathan Tran --- docs/kcl/offsetPlane.md | 4 +- docs/kcl/std.json | 523 +++++++++++------- docs/kcl/types/KclValue.md | 2 +- docs/kcl/types/Plane.md | 27 + docs/kcl/types/PlaneData.md | 4 +- docs/kcl/types/SketchData.md | 12 + e2e/playwright/sketch-tests.spec.ts | 41 ++ ...-load---solid-2d-1-Google-Chrome-win32.png | Bin 48006 -> 48015 bytes ...-load---solid-3d-1-Google-Chrome-linux.png | Bin 66255 -> 66247 bytes src/components/ModelingMachineProvider.tsx | 25 +- src/hooks/useEngineConnectionSubscriptions.ts | 40 +- src/lang/modifyAst.ts | 55 ++ src/lang/std/artifactGraph.test.ts | 56 ++ src/lang/std/artifactGraph.ts | 15 +- src/lang/wasm.ts | 6 + src/machines/modelingMachine.ts | 13 +- src/wasm-lib/kcl/src/executor.rs | 19 + src/wasm-lib/kcl/src/lsp/tests.rs | 11 +- src/wasm-lib/kcl/src/std/args.rs | 49 +- src/wasm-lib/kcl/src/std/planes.rs | 62 ++- src/wasm-lib/kcl/src/std/sketch.rs | 41 +- 21 files changed, 762 insertions(+), 243 deletions(-) create mode 100644 docs/kcl/types/Plane.md diff --git a/docs/kcl/offsetPlane.md b/docs/kcl/offsetPlane.md index c5e87f655..2ead03d87 100644 --- a/docs/kcl/offsetPlane.md +++ b/docs/kcl/offsetPlane.md @@ -9,7 +9,7 @@ Offset a plane by a distance along its normal. For example, if you offset the 'XZ' plane by 10, the new plane will be parallel to the 'XZ' plane and 10 units away from it. ```js -offsetPlane(std_plane: StandardPlane, offset: number) -> PlaneData +offsetPlane(std_plane: StandardPlane, offset: number) -> Plane ``` @@ -22,7 +22,7 @@ offsetPlane(std_plane: StandardPlane, offset: number) -> PlaneData ### Returns -[`PlaneData`](/docs/kcl/types/PlaneData) - Data for a plane. +[`Plane`](/docs/kcl/types/Plane) - A plane. ### Examples diff --git a/docs/kcl/std.json b/docs/kcl/std.json index 79c44ecf5..7fdde7c26 100644 --- a/docs/kcl/std.json +++ b/docs/kcl/std.json @@ -105747,109 +105747,90 @@ ], "returnValue": { "name": "", - "type": "PlaneData", + "type": "Plane", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "PlaneData", - "description": "Data for a plane.", - "oneOf": [ - { - "description": "The XY plane.", - "type": "string", - "enum": [ - "XY" - ] - }, - { - "description": "The opposite side of the XY plane.", - "type": "string", - "enum": [ - "-XY" - ] - }, - { - "description": "The XZ plane.", - "type": "string", - "enum": [ - "XZ" - ] - }, - { - "description": "The opposite side of the XZ plane.", - "type": "string", - "enum": [ - "-XZ" - ] - }, - { - "description": "The YZ plane.", - "type": "string", - "enum": [ - "YZ" - ] - }, - { - "description": "The opposite side of the YZ plane.", - "type": "string", - "enum": [ - "-YZ" - ] - }, - { - "description": "A defined plane.", - "type": "object", - "required": [ - "plane" - ], - "properties": { - "plane": { - "type": "object", - "required": [ - "origin", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane’s X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane’s Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "zAxis": { - "description": "The z-axis (normal).", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - } - }, - "additionalProperties": false - } + "title": "Plane", + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "value", + "xAxis", + "yAxis", + "zAxis" ], + "properties": { + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + }, "definitions": { + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, "Point3d": { "type": "object", "required": [ @@ -105871,6 +105852,33 @@ "format": "double" } } + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 } } }, @@ -179036,13 +179044,16 @@ { "$ref": "#/components/schemas/PlaneData" }, + { + "$ref": "#/components/schemas/Plane" + }, { "$ref": "#/components/schemas/Solid" } ], "definitions": { "PlaneData": { - "description": "Data for a plane.", + "description": "Orientation data that can be used to construct a plane, not a plane in itself.", "oneOf": [ { "description": "The XY plane.", @@ -179163,6 +179174,114 @@ } } }, + "Plane": { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, "Solid": { "description": "An solid is a collection of extrude surfaces.", "type": "object", @@ -179444,16 +179563,6 @@ } } }, - "SourceRange": { - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, "Sketch": { "description": "A sketch is a collection of paths.", "type": "object", @@ -180208,43 +180317,6 @@ } ] }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - } - ] - }, - "Metadata": { - "description": "Metadata.", - "type": "object", - "required": [ - "sourceRange" - ], - "properties": { - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, "BasePath": { "description": "A base path.", "type": "object", @@ -180460,7 +180532,7 @@ "nullable": true, "definitions": { "PlaneData": { - "description": "Data for a plane.", + "description": "Orientation data that can be used to construct a plane, not a plane in itself.", "oneOf": [ { "description": "The XY plane.", @@ -180581,6 +180653,114 @@ } } }, + "Plane": { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 3, + "minItems": 3 + }, "Solid": { "description": "An solid is a collection of extrude surfaces.", "type": "object", @@ -180862,16 +181042,6 @@ } } }, - "SourceRange": { - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, "Sketch": { "description": "A sketch is a collection of paths.", "type": "object", @@ -181626,43 +181796,6 @@ } ] }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - } - ] - }, - "Metadata": { - "description": "Metadata.", - "type": "object", - "required": [ - "sourceRange" - ], - "properties": { - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, "BasePath": { "description": "A base path.", "type": "object", diff --git a/docs/kcl/types/KclValue.md b/docs/kcl/types/KclValue.md index 6cfeac72e..61eb5236f 100644 --- a/docs/kcl/types/KclValue.md +++ b/docs/kcl/types/KclValue.md @@ -180,7 +180,7 @@ A plane. | Property | Type | Description | Required | |----------|------|-------------|----------| -| `type` |enum: `Plane`| | No | +| `type` |enum: [`Plane`](/docs/kcl/types/Plane)| | No | | `id` |`string`| The id of the plane. | No | | `value` |[`PlaneType`](/docs/kcl/types/PlaneType)| Any KCL value. | No | | `origin` |[`Point3d`](/docs/kcl/types/Point3d)| Origin of the plane. | No | diff --git a/docs/kcl/types/Plane.md b/docs/kcl/types/Plane.md new file mode 100644 index 000000000..f1aa17aba --- /dev/null +++ b/docs/kcl/types/Plane.md @@ -0,0 +1,27 @@ +--- +title: "Plane" +excerpt: "A plane." +layout: manual +--- + +A plane. + +**Type:** `object` + + + + + +## Properties + +| Property | Type | Description | Required | +|----------|------|-------------|----------| +| `id` |`string`| The id of the plane. | No | +| `value` |[`PlaneType`](/docs/kcl/types/PlaneType)| A plane. | No | +| `origin` |[`Point3d`](/docs/kcl/types/Point3d)| Origin of the plane. | No | +| `xAxis` |[`Point3d`](/docs/kcl/types/Point3d)| What should the plane’s X axis be? | No | +| `yAxis` |[`Point3d`](/docs/kcl/types/Point3d)| What should the plane’s Y axis be? | No | +| `zAxis` |[`Point3d`](/docs/kcl/types/Point3d)| The z-axis (normal). | No | +| `__meta` |`[` [`Metadata`](/docs/kcl/types/Metadata) `]`| | No | + + diff --git a/docs/kcl/types/PlaneData.md b/docs/kcl/types/PlaneData.md index f16cfd9d2..8cc4707c2 100644 --- a/docs/kcl/types/PlaneData.md +++ b/docs/kcl/types/PlaneData.md @@ -1,10 +1,10 @@ --- title: "PlaneData" -excerpt: "Data for a plane." +excerpt: "Orientation data that can be used to construct a plane, not a plane in itself." layout: manual --- -Data for a plane. +Orientation data that can be used to construct a plane, not a plane in itself. diff --git a/docs/kcl/types/SketchData.md b/docs/kcl/types/SketchData.md index 53ee3ef0c..fbb01aa85 100644 --- a/docs/kcl/types/SketchData.md +++ b/docs/kcl/types/SketchData.md @@ -22,6 +22,18 @@ Data for start sketch on. You can start a sketch on a plane or an solid. +---- +Data for start sketch on. You can start a sketch on a plane or an solid. + +[`Plane`](/docs/kcl/types/Plane) + + + + + + + + ---- Data for start sketch on. You can start a sketch on a plane or an solid. diff --git a/e2e/playwright/sketch-tests.spec.ts b/e2e/playwright/sketch-tests.spec.ts index a846962b2..1a315b000 100644 --- a/e2e/playwright/sketch-tests.spec.ts +++ b/e2e/playwright/sketch-tests.spec.ts @@ -1274,3 +1274,44 @@ test2.describe('Sketch mode should be toleratant to syntax errors', () => { } ) }) + +test2.describe(`Sketching with offset planes`, () => { + test2( + `Can select an offset plane to sketch on`, + async ({ app, scene, toolbar, editor }) => { + // We seed the scene with a single offset plane + await app.initialise(`offsetPlane001 = offsetPlane("XY", 10)`) + + const [planeClick, planeHover] = scene.makeMouseHelpers(650, 200) + + await test2.step(`Start sketching on the offset plane`, async () => { + await toolbar.startSketchPlaneSelection() + + await test2.step(`Hovering should highlight code`, async () => { + await planeHover() + await editor.expectState({ + activeLines: [`offsetPlane001=offsetPlane("XY",10)`], + diagnostics: [], + highlightedCode: 'offsetPlane("XY", 10)', + }) + }) + + await test2.step( + `Clicking should select the plane and enter sketch mode`, + async () => { + await planeClick() + // Have to wait for engine-side animation to finish + await app.page.waitForTimeout(600) + await expect2(toolbar.lineBtn).toBeEnabled() + await editor.expectEditor.toContain('startSketchOn(offsetPlane001)') + await editor.expectState({ + activeLines: [`offsetPlane001=offsetPlane("XY",10)`], + diagnostics: [], + highlightedCode: '', + }) + } + ) + }) + } + ) +}) diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Zoom-to-fit-on-load---solid-2d-1-Google-Chrome-win32.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Zoom-to-fit-on-load---solid-2d-1-Google-Chrome-win32.png index 93ac49f9bfef585a698941704f912e34d6d4c1f2..113275c1493db0d14c6e4d31e0c9bcb370f0facb 100644 GIT binary patch delta 28922 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 delta 24007 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 MisrSfD@L#XA3(-sS^xk5 diff --git a/src/components/ModelingMachineProvider.tsx b/src/components/ModelingMachineProvider.tsx index e450e76ee..939b2c2f8 100644 --- a/src/components/ModelingMachineProvider.tsx +++ b/src/components/ModelingMachineProvider.tsx @@ -63,6 +63,7 @@ import { import { moveValueIntoNewVariablePath, sketchOnExtrudedFace, + sketchOnOffsetPlane, startSketchOnDefault, } from 'lang/modifyAst' import { Program, parse, recast } from 'lang/wasm' @@ -636,13 +637,16 @@ export const ModelingMachineProvider = ({ ), 'animate-to-face': fromPromise(async ({ input }) => { if (!input) return undefined - if (input.type === 'extrudeFace') { - const sketched = sketchOnExtrudedFace( - kclManager.ast, - input.sketchPathToNode, - input.extrudePathToNode, - input.faceInfo - ) + if (input.type === 'extrudeFace' || input.type === 'offsetPlane') { + const sketched = + input.type === 'extrudeFace' + ? sketchOnExtrudedFace( + kclManager.ast, + input.sketchPathToNode, + input.extrudePathToNode, + input.faceInfo + ) + : sketchOnOffsetPlane(kclManager.ast, input.pathToNode) if (err(sketched)) { const sketchedError = new Error( 'Incompatible face, please try another' @@ -654,10 +658,9 @@ export const ModelingMachineProvider = ({ await kclManager.executeAstMock(modifiedAst) - await letEngineAnimateAndSyncCamAfter( - engineCommandManager, - input.faceId - ) + const id = + input.type === 'extrudeFace' ? input.faceId : input.planeId + await letEngineAnimateAndSyncCamAfter(engineCommandManager, id) sceneInfra.camControls.syncDirection = 'clientToEngine' return { sketchPathToNode: pathToNewSketchNode, diff --git a/src/hooks/useEngineConnectionSubscriptions.ts b/src/hooks/useEngineConnectionSubscriptions.ts index 3bfeb5f14..0640023ad 100644 --- a/src/hooks/useEngineConnectionSubscriptions.ts +++ b/src/hooks/useEngineConnectionSubscriptions.ts @@ -88,6 +88,10 @@ export function useEngineConnectionSubscriptions() { ? [codeRef.range] : [codeRef.range, consumedCodeRef.range] ) + } else if (artifact?.type === 'plane') { + const codeRef = artifact.codeRef + if (err(codeRef)) return + editorManager.setHighlightRange([codeRef.range]) } else { editorManager.setHighlightRange([[0, 0]]) } @@ -186,8 +190,42 @@ export function useEngineConnectionSubscriptions() { }) return } + const artifact = + engineCommandManager.artifactGraph.get(planeOrFaceId) + + if (artifact?.type === 'plane') { + const planeInfo = await getFaceDetails(planeOrFaceId) + sceneInfra.modelingSend({ + type: 'Select default plane', + data: { + type: 'offsetPlane', + zAxis: [ + planeInfo.z_axis.x, + planeInfo.z_axis.y, + planeInfo.z_axis.z, + ], + yAxis: [ + planeInfo.y_axis.x, + planeInfo.y_axis.y, + planeInfo.y_axis.z, + ], + position: [ + planeInfo.origin.x, + planeInfo.origin.y, + planeInfo.origin.z, + ].map((num) => num / sceneInfra._baseUnitMultiplier) as [ + number, + number, + number + ], + planeId: planeOrFaceId, + pathToNode: artifact.codeRef.pathToNode, + }, + }) + } + + // Artifact is likely an extrusion face const faceId = planeOrFaceId - const artifact = engineCommandManager.artifactGraph.get(faceId) const extrusion = getSweepFromSuspectedSweepSurface( faceId, engineCommandManager.artifactGraph diff --git a/src/lang/modifyAst.ts b/src/lang/modifyAst.ts index b581958d3..8ef1aef1e 100644 --- a/src/lang/modifyAst.ts +++ b/src/lang/modifyAst.ts @@ -19,6 +19,7 @@ import { ProgramMemory, SourceRange, sketchFromKclValue, + isPathToNodeNumber, } from './wasm' import { isNodeSafeToReplacePath, @@ -526,6 +527,60 @@ export function sketchOnExtrudedFace( } } +/** + * Modify the AST to create a new sketch using the variable declaration + * of an offset plane. The new sketch just has to come after the offset + * plane declaration. + */ +export function sketchOnOffsetPlane( + node: Node, + offsetPathToNode: PathToNode +) { + let _node = { ...node } + + // Find the offset plane declaration + const offsetPlaneDeclarator = getNodeFromPath( + _node, + offsetPathToNode, + 'VariableDeclarator', + true + ) + if (err(offsetPlaneDeclarator)) return offsetPlaneDeclarator + const { node: offsetPlaneNode } = offsetPlaneDeclarator + const offsetPlaneName = offsetPlaneNode.id.name + + // Create a new sketch declaration + const newSketchName = findUniqueName( + node, + KCL_DEFAULT_CONSTANT_PREFIXES.SKETCH + ) + const newSketch = createVariableDeclaration( + newSketchName, + createCallExpressionStdLib('startSketchOn', [ + createIdentifier(offsetPlaneName), + ]), + undefined, + 'const' + ) + + // Decide where to insert the new sketch declaration + const offsetIndex = offsetPathToNode[1][0] + + if (!isPathToNodeNumber(offsetIndex)) { + return new Error('Expected offsetIndex to be a number') + } + // and insert it + _node.body.splice(offsetIndex + 1, 0, newSketch) + const newPathToNode = structuredClone(offsetPathToNode) + newPathToNode[1][0] = offsetIndex + 1 + + // Return the modified AST and the path to the new sketch declaration + return { + modifiedAst: _node, + pathToNode: newPathToNode, + } +} + export const getLastIndex = (pathToNode: PathToNode): number => splitPathAtLastIndex(pathToNode).index diff --git a/src/lang/std/artifactGraph.test.ts b/src/lang/std/artifactGraph.test.ts index 837acc894..4234bc058 100644 --- a/src/lang/std/artifactGraph.test.ts +++ b/src/lang/std/artifactGraph.test.ts @@ -98,12 +98,22 @@ sketch004 = startSketchOn(extrude003, seg02) |> close(%) extrude004 = extrude(3, sketch004) ` +const exampleCodeOffsetPlanes = ` +offsetPlane001 = offsetPlane("XY", 20) +offsetPlane002 = offsetPlane("XZ", -50) +offsetPlane003 = offsetPlane("YZ", 10) + +sketch002 = startSketchOn(offsetPlane001) + |> startProfileAt([0, 0], %) + |> line([6.78, 15.01], %) +` // add more code snippets here and use `getCommands` to get the orderedCommands and responseMap for more tests const codeToWriteCacheFor = { exampleCode1, sketchOnFaceOnFaceEtc, exampleCodeNo3D, + exampleCodeOffsetPlanes, } as const type CodeKey = keyof typeof codeToWriteCacheFor @@ -165,6 +175,52 @@ afterAll(() => { }) describe('testing createArtifactGraph', () => { + describe('code with offset planes and a sketch:', () => { + let ast: Program + let theMap: ReturnType + + it('setup', () => { + // putting this logic in here because describe blocks runs before beforeAll has finished + const { + orderedCommands, + responseMap, + ast: _ast, + } = getCommands('exampleCodeOffsetPlanes') + ast = _ast + theMap = createArtifactGraph({ orderedCommands, responseMap, ast }) + }) + + it(`there should be one sketch`, () => { + const sketches = [...filterArtifacts({ types: ['path'] }, theMap)].map( + (path) => expandPath(path[1], theMap) + ) + expect(sketches).toHaveLength(1) + sketches.forEach((path) => { + if (err(path)) throw path + expect(path.type).toBe('path') + }) + }) + + it(`there should be three offsetPlanes`, () => { + const offsetPlanes = [ + ...filterArtifacts({ types: ['plane'] }, theMap), + ].map((plane) => expandPlane(plane[1], theMap)) + expect(offsetPlanes).toHaveLength(3) + offsetPlanes.forEach((path) => { + expect(path.type).toBe('plane') + }) + }) + + it(`Only one offset plane should have a path`, () => { + const offsetPlanes = [ + ...filterArtifacts({ types: ['plane'] }, theMap), + ].map((plane) => expandPlane(plane[1], theMap)) + const offsetPlaneWithPaths = offsetPlanes.filter( + (plane) => plane.paths.length + ) + expect(offsetPlaneWithPaths).toHaveLength(1) + }) + }) describe('code with an extrusion, fillet and sketch of face:', () => { let ast: Program let theMap: ReturnType diff --git a/src/lang/std/artifactGraph.ts b/src/lang/std/artifactGraph.ts index e96b6b3f8..8fddddc01 100644 --- a/src/lang/std/artifactGraph.ts +++ b/src/lang/std/artifactGraph.ts @@ -249,7 +249,20 @@ export function getArtifactsToUpdate({ const cmd = command.cmd const returnArr: ReturnType = [] if (!response) return returnArr - if (cmd.type === 'enable_sketch_mode') { + if (cmd.type === 'make_plane' && range[1] !== 0) { + // If we're calling `make_plane` and the code range doesn't end at `0` + // it's not a default plane, but a custom one from the offsetPlane standard library function + return [ + { + id, + artifact: { + type: 'plane', + pathIds: [], + codeRef: { range, pathToNode }, + }, + }, + ] + } else if (cmd.type === 'enable_sketch_mode') { const plane = getArtifact(currentPlaneId) const pathIds = plane?.type === 'plane' ? plane?.pathIds : [] const codeRef = diff --git a/src/lang/wasm.ts b/src/lang/wasm.ts index bae827193..d3373119a 100644 --- a/src/lang/wasm.ts +++ b/src/lang/wasm.ts @@ -144,6 +144,12 @@ export const parse = (code: string | Error): Node | Error => { export type PathToNode = [string | number, string][] +export const isPathToNodeNumber = ( + pathToNode: string | number +): pathToNode is number => { + return typeof pathToNode === 'number' +} + export interface ExecState { memory: ProgramMemory idGenerator: IdGenerator diff --git a/src/machines/modelingMachine.ts b/src/machines/modelingMachine.ts index f3147c8c5..9f9810432 100644 --- a/src/machines/modelingMachine.ts +++ b/src/machines/modelingMachine.ts @@ -159,6 +159,15 @@ export type DefaultPlane = { yAxis: [number, number, number] } +export type OffsetPlane = { + type: 'offsetPlane' + position: [number, number, number] + planeId: string + pathToNode: PathToNode + zAxis: [number, number, number] + yAxis: [number, number, number] +} + export type SegmentOverlayPayload = | { type: 'set-one' @@ -198,7 +207,7 @@ export type ModelingMachineEvent = | { type: 'Sketch On Face' } | { type: 'Select default plane' - data: DefaultPlane | ExtrudeFacePlane + data: DefaultPlane | ExtrudeFacePlane | OffsetPlane } | { type: 'Set selection' @@ -1394,7 +1403,7 @@ export const modelingMachine = setup({ } ), 'animate-to-face': fromPromise( - async (_: { input?: ExtrudeFacePlane | DefaultPlane }) => { + async (_: { input?: ExtrudeFacePlane | DefaultPlane | OffsetPlane }) => { return {} as | undefined | { diff --git a/src/wasm-lib/kcl/src/executor.rs b/src/wasm-lib/kcl/src/executor.rs index cfc7a46f3..58308cb32 100644 --- a/src/wasm-lib/kcl/src/executor.rs +++ b/src/wasm-lib/kcl/src/executor.rs @@ -801,6 +801,17 @@ impl Plane { }, } } + + /// The standard planes are XY, YZ and XZ (in both positive and negative) + pub fn is_standard(&self) -> bool { + !self.is_custom() + } + + /// The standard planes are XY, YZ and XZ (in both positive and negative) + /// Custom planes are any other plane that the user might specify. + pub fn is_custom(&self) -> bool { + matches!(self.value, PlaneType::Custom) + } } #[derive(Debug, Default, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] @@ -1049,6 +1060,14 @@ impl KclValue { } } + pub fn as_plane(&self) -> Option<&Plane> { + if let KclValue::Plane(value) = &self { + Some(value) + } else { + None + } + } + pub fn as_solid(&self) -> Option<&Solid> { if let KclValue::Solid(value) = &self { Some(value) diff --git a/src/wasm-lib/kcl/src/lsp/tests.rs b/src/wasm-lib/kcl/src/lsp/tests.rs index bb2f8991d..a2035733b 100644 --- a/src/wasm-lib/kcl/src/lsp/tests.rs +++ b/src/wasm-lib/kcl/src/lsp/tests.rs @@ -2,7 +2,7 @@ use std::collections::BTreeMap; use pretty_assertions::assert_eq; use tower_lsp::{ - lsp_types::{SemanticTokenModifier, SemanticTokenType}, + lsp_types::{Diagnostic, SemanticTokenModifier, SemanticTokenType}, LanguageServer, }; @@ -2369,7 +2369,14 @@ async fn kcl_test_kcl_lsp_diagnostics_on_execution_error() { // Get the diagnostics. let diagnostics = server.diagnostics_map.get("file:///test.kcl"); - assert!(diagnostics.is_none()); + if let Some(diagnostics) = diagnostics { + let ds: Vec = diagnostics.to_owned(); + eprintln!("Expected no diagnostics, but found some."); + for d in ds { + eprintln!("{:?}: {}", d.severity, d.message); + } + panic!(); + } } #[tokio::test(flavor = "multi_thread")] diff --git a/src/wasm-lib/kcl/src/std/args.rs b/src/wasm-lib/kcl/src/std/args.rs index 2910609ac..562c36c3c 100644 --- a/src/wasm-lib/kcl/src/std/args.rs +++ b/src/wasm-lib/kcl/src/std/args.rs @@ -794,6 +794,45 @@ impl<'a> FromKclValue<'a> for crate::std::planes::StandardPlane { } } +impl<'a> FromKclValue<'a> for crate::executor::Plane { + fn from_kcl_val(arg: &'a KclValue) -> Option { + if let Some(plane) = arg.as_plane() { + return Some(plane.clone()); + } + + let obj = arg.as_object()?; + let_field_of!(obj, id); + let_field_of!(obj, value); + let_field_of!(obj, origin); + let_field_of!(obj, x_axis "xAxis"); + let_field_of!(obj, y_axis "yAxis"); + let_field_of!(obj, z_axis "zAxis"); + let_field_of!(obj, meta "__meta"); + Some(Self { + id, + value, + origin, + x_axis, + y_axis, + z_axis, + meta, + }) + } +} + +impl<'a> FromKclValue<'a> for crate::executor::PlaneType { + fn from_kcl_val(arg: &'a KclValue) -> Option { + let plane_type = match arg.as_str()? { + "XY" | "xy" => Self::XY, + "XZ" | "xz" => Self::XZ, + "YZ" | "yz" => Self::YZ, + "Custom" => Self::Custom, + _ => return None, + }; + Some(plane_type) + } +} + impl<'a> FromKclValue<'a> for kittycad_modeling_cmds::units::UnitLength { fn from_kcl_val(arg: &'a KclValue) -> Option { let s = arg.as_str()?; @@ -1264,11 +1303,15 @@ impl<'a> FromKclValue<'a> for crate::executor::Solid { impl<'a> FromKclValue<'a> for super::sketch::SketchData { fn from_kcl_val(arg: &'a KclValue) -> Option { - let case1 = super::sketch::PlaneData::from_kcl_val; - let case2 = crate::executor::Solid::from_kcl_val; + // Order is critical since PlaneData is a subset of Plane. + let case1 = crate::executor::Plane::from_kcl_val; + let case2 = super::sketch::PlaneData::from_kcl_val; + let case3 = crate::executor::Solid::from_kcl_val; case1(arg) + .map(Box::new) .map(Self::Plane) - .or_else(|| case2(arg).map(Box::new).map(Self::Solid)) + .or_else(|| case2(arg).map(Self::PlaneOrientation)) + .or_else(|| case3(arg).map(Box::new).map(Self::Solid)) } } diff --git a/src/wasm-lib/kcl/src/std/planes.rs b/src/wasm-lib/kcl/src/std/planes.rs index e322185d2..072d99962 100644 --- a/src/wasm-lib/kcl/src/std/planes.rs +++ b/src/wasm-lib/kcl/src/std/planes.rs @@ -1,17 +1,20 @@ //! Standard library plane helpers. use derive_docs::stdlib; +use kcmc::{each_cmd as mcmd, length_unit::LengthUnit, shared::Color, ModelingCmd}; +use kittycad_modeling_cmds as kcmc; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use crate::{ errors::KclError, - executor::{ExecState, KclValue, Plane}, + executor::{ExecState, KclValue, Plane, PlaneType}, std::{sketch::PlaneData, Args}, }; /// One of the standard planes. -#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, JsonSchema)] +#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] +#[ts(export)] #[serde(rename_all = "camelCase")] pub enum StandardPlane { /// The XY plane. @@ -50,8 +53,8 @@ impl From for PlaneData { /// Offset a plane by a distance along its normal. pub async fn offset_plane(exec_state: &mut ExecState, args: Args) -> Result { let (std_plane, offset): (StandardPlane, f64) = args.get_data_and_float()?; - let plane_data = inner_offset_plane(std_plane, offset, exec_state).await?; - let plane = Plane::from_plane_data(plane_data, exec_state); + let plane = inner_offset_plane(std_plane, offset, exec_state).await?; + make_offset_plane_in_engine(&plane, exec_state, &args).await?; Ok(KclValue::Plane(Box::new(plane))) } @@ -144,11 +147,14 @@ async fn inner_offset_plane( std_plane: StandardPlane, offset: f64, exec_state: &mut ExecState, -) -> Result { +) -> Result { // Convert to the plane type. let plane_data: PlaneData = std_plane.into(); // Convert to a plane. let mut plane = Plane::from_plane_data(plane_data, exec_state); + // Though offset planes are derived from standard planes, they are not + // standard planes themselves. + plane.value = PlaneType::Custom; match std_plane { StandardPlane::XY => { @@ -171,10 +177,44 @@ async fn inner_offset_plane( } } - Ok(PlaneData::Plane { - origin: Box::new(plane.origin), - x_axis: Box::new(plane.x_axis), - y_axis: Box::new(plane.y_axis), - z_axis: Box::new(plane.z_axis), - }) + Ok(plane) +} + +// Engine-side effectful creation of an actual plane object. +// offset planes are shown by default, and hidden by default if they +// are used as a sketch plane. That hiding command is sent within inner_start_profile_at +async fn make_offset_plane_in_engine(plane: &Plane, exec_state: &mut ExecState, args: &Args) -> Result<(), KclError> { + // Create new default planes. + let default_size = 100.0; + let color = Color { + r: 0.6, + g: 0.6, + b: 0.6, + a: 0.3, + }; + + args.batch_modeling_cmd( + plane.id, + ModelingCmd::from(mcmd::MakePlane { + clobber: false, + origin: plane.origin.into(), + size: LengthUnit(default_size), + x_axis: plane.x_axis.into(), + y_axis: plane.y_axis.into(), + hide: Some(false), + }), + ) + .await?; + + // Set the color. + args.batch_modeling_cmd( + exec_state.id_generator.next_uuid(), + ModelingCmd::from(mcmd::PlaneSetColor { + color, + plane_id: plane.id, + }), + ) + .await?; + + Ok(()) } diff --git a/src/wasm-lib/kcl/src/std/sketch.rs b/src/wasm-lib/kcl/src/std/sketch.rs index 05dad6d72..bcf089c17 100644 --- a/src/wasm-lib/kcl/src/std/sketch.rs +++ b/src/wasm-lib/kcl/src/std/sketch.rs @@ -894,7 +894,7 @@ pub async fn start_sketch_at(exec_state: &mut ExecState, args: Args) -> Result Result { // Let's assume it's the XY plane for now, this is just for backwards compatibility. let xy_plane = PlaneData::XY; - let sketch_surface = inner_start_sketch_on(SketchData::Plane(xy_plane), None, exec_state, &args).await?; + let sketch_surface = inner_start_sketch_on(SketchData::PlaneOrientation(xy_plane), None, exec_state, &args).await?; let sketch = inner_start_profile_at(data, sketch_surface, None, exec_state, args).await?; Ok(sketch) } @@ -905,11 +905,12 @@ async fn inner_start_sketch_at(data: [f64; 2], exec_state: &mut ExecState, args: #[ts(export)] #[serde(rename_all = "camelCase", untagged)] pub enum SketchData { - Plane(PlaneData), + PlaneOrientation(PlaneData), + Plane(Box), Solid(Box), } -/// Data for a plane. +/// Orientation data that can be used to construct a plane, not a plane in itself. #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(rename_all = "camelCase")] @@ -1069,10 +1070,11 @@ async fn inner_start_sketch_on( args: &Args, ) -> Result { match data { - SketchData::Plane(plane_data) => { - let plane = start_sketch_on_plane(plane_data, exec_state, args).await?; + SketchData::PlaneOrientation(plane_data) => { + let plane = make_sketch_plane_from_orientation(plane_data, exec_state, args).await?; Ok(SketchSurface::Plane(plane)) } + SketchData::Plane(plane) => Ok(SketchSurface::Plane(plane)), SketchData::Solid(solid) => { let Some(tag) = tag else { return Err(KclError::Type(KclErrorDetails { @@ -1106,7 +1108,7 @@ async fn start_sketch_on_face( })) } -async fn start_sketch_on_plane( +async fn make_sketch_plane_from_orientation( data: PlaneData, exec_state: &mut ExecState, args: &Args, @@ -1122,10 +1124,10 @@ async fn start_sketch_on_plane( plane.id = match data { PlaneData::XY => default_planes.xy, - PlaneData::XZ => default_planes.xz, - PlaneData::YZ => default_planes.yz, PlaneData::NegXY => default_planes.neg_xy, + PlaneData::XZ => default_planes.xz, PlaneData::NegXZ => default_planes.neg_xz, + PlaneData::YZ => default_planes.yz, PlaneData::NegYZ => default_planes.neg_yz, PlaneData::Plane { origin, @@ -1210,11 +1212,26 @@ pub(crate) async fn inner_start_profile_at( exec_state: &mut ExecState, args: Args, ) -> Result { - if let SketchSurface::Face(face) = &sketch_surface { - // Flush the batch for our fillets/chamfers if there are any. - // If we do not do these for sketch on face, things will fail with face does not exist. - args.flush_batch_for_solid_set(exec_state, face.solid.clone().into()) + match &sketch_surface { + SketchSurface::Face(face) => { + // Flush the batch for our fillets/chamfers if there are any. + // If we do not do these for sketch on face, things will fail with face does not exist. + args.flush_batch_for_solid_set(exec_state, face.solid.clone().into()) + .await?; + } + SketchSurface::Plane(plane) if !plane.is_standard() => { + // Hide whatever plane we are sketching on. + // This is especially helpful for offset planes, which would be visible otherwise. + args.batch_end_cmd( + exec_state.id_generator.next_uuid(), + ModelingCmd::from(mcmd::ObjectVisible { + object_id: plane.id, + hidden: true, + }), + ) .await?; + } + _ => {} } // Enter sketch mode on the surface.