From 8c36d742e5cb7ec334ab153702243a9443fc8caa Mon Sep 17 00:00:00 2001 From: Jonathan Tran Date: Thu, 5 Jun 2025 12:52:53 -0400 Subject: [PATCH] Add mirror2d operations to Feature Tree (#7308) * Add mirror2d operations * Update output --- rust/kcl-lib/src/std/mod.rs | 2 +- .../kcl-lib/tests/kcl_samples/bottle/ops.snap | 104 ++++++ .../tests/kcl_samples/cold-plate/ops.snap | 104 ++++++ .../tests/kcl_samples/helium-tank/ops.snap | 208 +++++++++++ .../kcl-lib/tests/kcl_samples/i-beam/ops.snap | 208 +++++++++++ .../tests/kcl_samples/t-slot-rail/ops.snap | 351 ++++++++++++++++++ .../tests/subtract_regression10/ops.snap | 250 +++++++++++++ src/lib/operations.ts | 4 + 8 files changed, 1230 insertions(+), 1 deletion(-) diff --git a/rust/kcl-lib/src/std/mod.rs b/rust/kcl-lib/src/std/mod.rs index aaace6da4..030f69a48 100644 --- a/rust/kcl-lib/src/std/mod.rs +++ b/rust/kcl-lib/src/std/mod.rs @@ -162,7 +162,7 @@ pub(crate) fn std_fn(path: &str, fn_name: &str) -> (crate::std::StdFn, StdFnProp ), ("transform", "mirror2d") => ( |e, a| Box::pin(crate::std::mirror::mirror_2d(e, a)), - StdFnProps::default("std::transform::mirror2d"), + StdFnProps::default("std::transform::mirror2d").include_in_feature_tree(), ), ("transform", "translate") => ( |e, a| Box::pin(crate::std::transform::translate(e, a)), diff --git a/rust/kcl-lib/tests/kcl_samples/bottle/ops.snap b/rust/kcl-lib/tests/kcl_samples/bottle/ops.snap index e00b485a5..120aea288 100644 --- a/rust/kcl-lib/tests/kcl_samples/bottle/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/bottle/ops.snap @@ -34,6 +34,110 @@ description: Operations executed bottle.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "mirror2d", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "axis": { + "value": { + "type": "Object", + "value": { + "direction": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "origin": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + } + } + }, + "sourceRange": [] + } + }, + "nodePath": { + "steps": [ + { + "type": "ProgramBodyItem", + "index": 6 + }, + { + "type": "VariableDeclarationDeclaration" + }, + { + "type": "VariableDeclarationInit" + }, + { + "type": "PipeBodyItem", + "index": 5 + } + ] + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "extrude", diff --git a/rust/kcl-lib/tests/kcl_samples/cold-plate/ops.snap b/rust/kcl-lib/tests/kcl_samples/cold-plate/ops.snap index fe1040853..9953d4225 100644 --- a/rust/kcl-lib/tests/kcl_samples/cold-plate/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/cold-plate/ops.snap @@ -34,6 +34,110 @@ description: Operations executed cold-plate.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "mirror2d", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "axis": { + "value": { + "type": "Object", + "value": { + "direction": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "origin": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + } + } + }, + "sourceRange": [] + } + }, + "nodePath": { + "steps": [ + { + "type": "ProgramBodyItem", + "index": 3 + }, + { + "type": "VariableDeclarationDeclaration" + }, + { + "type": "VariableDeclarationInit" + }, + { + "type": "PipeBodyItem", + "index": 16 + } + ] + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "extrude", diff --git a/rust/kcl-lib/tests/kcl_samples/helium-tank/ops.snap b/rust/kcl-lib/tests/kcl_samples/helium-tank/ops.snap index 1f37b7a9f..10b764264 100644 --- a/rust/kcl-lib/tests/kcl_samples/helium-tank/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/helium-tank/ops.snap @@ -593,6 +593,110 @@ description: Operations executed helium-tank.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "mirror2d", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "axis": { + "value": { + "type": "Object", + "value": { + "direction": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "origin": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + } + } + }, + "sourceRange": [] + } + }, + "nodePath": { + "steps": [ + { + "type": "ProgramBodyItem", + "index": 11 + }, + { + "type": "VariableDeclarationDeclaration" + }, + { + "type": "VariableDeclarationInit" + }, + { + "type": "PipeBodyItem", + "index": 8 + } + ] + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "startSketchOn", @@ -671,6 +775,110 @@ description: Operations executed helium-tank.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "mirror2d", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "axis": { + "value": { + "type": "Object", + "value": { + "direction": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "origin": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + } + } + }, + "sourceRange": [] + } + }, + "nodePath": { + "steps": [ + { + "type": "ProgramBodyItem", + "index": 12 + }, + { + "type": "VariableDeclarationDeclaration" + }, + { + "type": "VariableDeclarationInit" + }, + { + "type": "PipeBodyItem", + "index": 8 + } + ] + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "subtract2d", diff --git a/rust/kcl-lib/tests/kcl_samples/i-beam/ops.snap b/rust/kcl-lib/tests/kcl_samples/i-beam/ops.snap index 8ad3ab064..2fb991d8a 100644 --- a/rust/kcl-lib/tests/kcl_samples/i-beam/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/i-beam/ops.snap @@ -34,6 +34,214 @@ description: Operations executed i-beam.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "mirror2d", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "axis": { + "value": { + "type": "Object", + "value": { + "direction": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "origin": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + } + } + }, + "sourceRange": [] + } + }, + "nodePath": { + "steps": [ + { + "type": "ProgramBodyItem", + "index": 6 + }, + { + "type": "VariableDeclarationDeclaration" + }, + { + "type": "VariableDeclarationInit" + }, + { + "type": "PipeBodyItem", + "index": 7 + } + ] + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "mirror2d", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "axis": { + "value": { + "type": "Object", + "value": { + "direction": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "origin": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + } + } + }, + "sourceRange": [] + } + }, + "nodePath": { + "steps": [ + { + "type": "ProgramBodyItem", + "index": 6 + }, + { + "type": "VariableDeclarationDeclaration" + }, + { + "type": "VariableDeclarationInit" + }, + { + "type": "PipeBodyItem", + "index": 8 + } + ] + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "extrude", diff --git a/rust/kcl-lib/tests/kcl_samples/t-slot-rail/ops.snap b/rust/kcl-lib/tests/kcl_samples/t-slot-rail/ops.snap index aaa802537..10798c004 100644 --- a/rust/kcl-lib/tests/kcl_samples/t-slot-rail/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/t-slot-rail/ops.snap @@ -47,6 +47,357 @@ description: Operations executed t-slot-rail.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "mirror2d", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "axis": { + "value": { + "type": "Object", + "value": { + "direction": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "origin": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + } + } + }, + "sourceRange": [] + } + }, + "nodePath": { + "steps": [ + { + "type": "ProgramBodyItem", + "index": 4 + }, + { + "type": "VariableDeclarationDeclaration" + }, + { + "type": "VariableDeclarationInit" + }, + { + "type": "FunctionExpressionBody" + }, + { + "type": "FunctionExpressionBodyItem", + "index": 0 + }, + { + "type": "VariableDeclarationDeclaration" + }, + { + "type": "VariableDeclarationInit" + }, + { + "type": "PipeBodyItem", + "index": 16 + } + ] + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "mirror2d", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "axis": { + "value": { + "type": "Object", + "value": { + "direction": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "origin": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.5, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + } + } + }, + "sourceRange": [] + } + }, + "nodePath": { + "steps": [ + { + "type": "ProgramBodyItem", + "index": 4 + }, + { + "type": "VariableDeclarationDeclaration" + }, + { + "type": "VariableDeclarationInit" + }, + { + "type": "FunctionExpressionBody" + }, + { + "type": "FunctionExpressionBodyItem", + "index": 0 + }, + { + "type": "VariableDeclarationDeclaration" + }, + { + "type": "VariableDeclarationInit" + }, + { + "type": "PipeBodyItem", + "index": 17 + } + ] + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "mirror2d", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "axis": { + "value": { + "type": "Object", + "value": { + "direction": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "origin": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.5, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + } + } + }, + "sourceRange": [] + } + }, + "nodePath": { + "steps": [ + { + "type": "ProgramBodyItem", + "index": 4 + }, + { + "type": "VariableDeclarationDeclaration" + }, + { + "type": "VariableDeclarationInit" + }, + { + "type": "FunctionExpressionBody" + }, + { + "type": "FunctionExpressionBodyItem", + "index": 0 + }, + { + "type": "VariableDeclarationDeclaration" + }, + { + "type": "VariableDeclarationInit" + }, + { + "type": "PipeBodyItem", + "index": 18 + } + ] + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "subtract2d", diff --git a/rust/kcl-lib/tests/subtract_regression10/ops.snap b/rust/kcl-lib/tests/subtract_regression10/ops.snap index 98a45dd97..462348f11 100644 --- a/rust/kcl-lib/tests/subtract_regression10/ops.snap +++ b/rust/kcl-lib/tests/subtract_regression10/ops.snap @@ -697,6 +697,110 @@ description: Operations executed subtract_regression10.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "mirror2d", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "axis": { + "value": { + "type": "Object", + "value": { + "direction": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "origin": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + } + } + }, + "sourceRange": [] + } + }, + "nodePath": { + "steps": [ + { + "type": "ProgramBodyItem", + "index": 14 + }, + { + "type": "VariableDeclarationDeclaration" + }, + { + "type": "VariableDeclarationInit" + }, + { + "type": "PipeBodyItem", + "index": 6 + } + ] + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "extrude", @@ -834,6 +938,48 @@ description: Operations executed subtract_regression10.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "mirror2d", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "axis": { + "value": { + "type": "TagIdentifier", + "value": "seg02", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + } + }, + "nodePath": { + "steps": [ + { + "type": "ProgramBodyItem", + "index": 16 + }, + { + "type": "VariableDeclarationDeclaration" + }, + { + "type": "VariableDeclarationInit" + }, + { + "type": "PipeBodyItem", + "index": 20 + } + ] + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "extrude", @@ -922,6 +1068,110 @@ description: Operations executed subtract_regression10.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "mirror2d", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "axis": { + "value": { + "type": "Object", + "value": { + "direction": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "origin": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + } + } + }, + "sourceRange": [] + } + }, + "nodePath": { + "steps": [ + { + "type": "ProgramBodyItem", + "index": 18 + }, + { + "type": "VariableDeclarationDeclaration" + }, + { + "type": "VariableDeclarationInit" + }, + { + "type": "PipeBodyItem", + "index": 7 + } + ] + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "extrude", diff --git a/src/lib/operations.ts b/src/lib/operations.ts index 88b091ee9..694d753e8 100644 --- a/src/lib/operations.ts +++ b/src/lib/operations.ts @@ -959,6 +959,10 @@ export const stdLibMap: Record = { supportsAppearance: true, supportsTransform: true, }, + mirror2d: { + label: 'Mirror 2D', + icon: 'mirror', + }, revolve: { label: 'Revolve', icon: 'revolve',