From 92fc294eaeb2c60439ffec879dbae2c56ee0f978 Mon Sep 17 00:00:00 2001 From: alteous Date: Thu, 15 May 2025 17:46:37 +0100 Subject: [PATCH] Update mesh clone test (#6597) --- rust/kcl-lib/src/simulation_tests.rs | 1 - .../import_mesh_clone/artifact_commands.snap | 195 ++++- rust/kcl-lib/tests/import_mesh_clone/ast.snap | 790 +++++++++++++++--- .../import_mesh_clone/execution_error.snap | 10 - .../kcl-lib/tests/import_mesh_clone/input.kcl | 27 +- rust/kcl-lib/tests/import_mesh_clone/ops.snap | 26 + .../import_mesh_clone/program_memory.snap | 31 + .../import_mesh_clone/rendered_model.png | Bin 0 -> 60204 bytes .../tests/import_mesh_clone/unparsed.snap | 21 +- 9 files changed, 961 insertions(+), 140 deletions(-) delete mode 100644 rust/kcl-lib/tests/import_mesh_clone/execution_error.snap create mode 100644 rust/kcl-lib/tests/import_mesh_clone/program_memory.snap create mode 100644 rust/kcl-lib/tests/import_mesh_clone/rendered_model.png diff --git a/rust/kcl-lib/src/simulation_tests.rs b/rust/kcl-lib/src/simulation_tests.rs index 440de3139..38fafec14 100644 --- a/rust/kcl-lib/src/simulation_tests.rs +++ b/rust/kcl-lib/src/simulation_tests.rs @@ -2748,7 +2748,6 @@ mod import_mesh_clone { /// Test that KCL is executed correctly. #[tokio::test(flavor = "multi_thread")] - #[ignore = "turn on when katie fixes the mesh import"] async fn kcl_test_execute() { super::execute(TEST_NAME, true).await } diff --git a/rust/kcl-lib/tests/import_mesh_clone/artifact_commands.snap b/rust/kcl-lib/tests/import_mesh_clone/artifact_commands.snap index d9f68b0cb..010fe11a1 100644 --- a/rust/kcl-lib/tests/import_mesh_clone/artifact_commands.snap +++ b/rust/kcl-lib/tests/import_mesh_clone/artifact_commands.snap @@ -996,10 +996,51 @@ description: Artifact commands import_mesh_clone.kcl "direction": "positive" } }, - "units": "mm" + "units": "m" } } }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "set_object_transform", + "object_id": "[uuid]", + "transforms": [ + { + "translate": { + "property": { + "x": -2000.0, + "y": -2000.0, + "z": 0.0 + }, + "set": false, + "is_local": true + }, + "rotate_rpy": null, + "rotate_angle_axis": null, + "scale": null + } + ] + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "object_set_material_params_pbr", + "object_id": "[uuid]", + "color": { + "r": 1.0, + "g": 1.0, + "b": 0.0, + "a": 100.0 + }, + "metalness": 0.0, + "roughness": 0.0, + "ambient_occlusion": 0.0 + } + }, { "cmdId": "[uuid]", "range": [], @@ -1008,6 +1049,22 @@ description: Artifact commands import_mesh_clone.kcl "entity_id": "[uuid]" } }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "entity_get_all_child_uuids", + "entity_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "entity_get_all_child_uuids", + "entity_id": "[uuid]" + } + }, { "cmdId": "[uuid]", "range": [], @@ -1018,7 +1075,7 @@ description: Artifact commands import_mesh_clone.kcl { "translate": { "property": { - "x": 1020.0, + "x": 4000.0, "y": 0.0, "z": 0.0 }, @@ -1044,8 +1101,138 @@ description: Artifact commands import_mesh_clone.kcl "b": 0.0, "a": 100.0 }, - "metalness": 0.5, - "roughness": 0.5, + "metalness": 0.0, + "roughness": 0.0, + "ambient_occlusion": 0.0 + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "entity_clone", + "entity_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "entity_get_all_child_uuids", + "entity_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "entity_get_all_child_uuids", + "entity_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "set_object_transform", + "object_id": "[uuid]", + "transforms": [ + { + "translate": { + "property": { + "x": 0.0, + "y": 4000.0, + "z": 0.0 + }, + "set": false, + "is_local": true + }, + "rotate_rpy": null, + "rotate_angle_axis": null, + "scale": null + } + ] + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "object_set_material_params_pbr", + "object_id": "[uuid]", + "color": { + "r": 0.0, + "g": 1.0, + "b": 0.0, + "a": 100.0 + }, + "metalness": 0.0, + "roughness": 0.0, + "ambient_occlusion": 0.0 + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "entity_clone", + "entity_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "entity_get_all_child_uuids", + "entity_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "entity_get_all_child_uuids", + "entity_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "set_object_transform", + "object_id": "[uuid]", + "transforms": [ + { + "translate": { + "property": { + "x": 0.0, + "y": 4000.0, + "z": 0.0 + }, + "set": false, + "is_local": true + }, + "rotate_rpy": null, + "rotate_angle_axis": null, + "scale": null + } + ] + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "object_set_material_params_pbr", + "object_id": "[uuid]", + "color": { + "r": 0.0, + "g": 0.0, + "b": 1.0, + "a": 100.0 + }, + "metalness": 0.0, + "roughness": 0.0, "ambient_occlusion": 0.0 } } diff --git a/rust/kcl-lib/tests/import_mesh_clone/ast.snap b/rust/kcl-lib/tests/import_mesh_clone/ast.snap index 9fe25bb38..f3b8c8dc7 100644 --- a/rust/kcl-lib/tests/import_mesh_clone/ast.snap +++ b/rust/kcl-lib/tests/import_mesh_clone/ast.snap @@ -8,6 +8,46 @@ description: Result of parsing import_mesh_clone.kcl { "commentStart": 0, "end": 0, + "outerAttrs": [ + { + "commentStart": 0, + "end": 0, + "name": null, + "properties": [ + { + "commentStart": 0, + "end": 0, + "key": { + "commentStart": 0, + "end": 0, + "name": "lengthUnit", + "start": 0, + "type": "Identifier" + }, + "start": 0, + "type": "ObjectProperty", + "value": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "m", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], + "start": 0, + "type": "Annotation" + } + ], "path": { "type": "Foreign", "path": "../inputs/cube.obj" @@ -17,7 +57,7 @@ description: Result of parsing import_mesh_clone.kcl "alias": { "commentStart": 0, "end": 0, - "name": "cube", + "name": "yellow", "start": 0, "type": "Identifier" } @@ -28,24 +68,180 @@ description: Result of parsing import_mesh_clone.kcl }, { "commentStart": 0, - "declaration": { + "end": 0, + "expression": { + "body": [ + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "yellow", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "x", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "2000", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2000.0, + "suffix": "None" + } + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "y", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "2000", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2000.0, + "suffix": "None" + } + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "translate", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + } + ], "commentStart": 0, "end": 0, - "id": { - "commentStart": 0, - "end": 0, - "name": "model", - "start": 0, - "type": "Identifier" - }, - "init": { + "start": 0, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "commentStart": 0, + "end": 0, + "expression": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "color", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "\"#ffff00\"", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": "#ffff00" + } + } + ], + "callee": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "cube", + "name": "appearance", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "yellow", "start": 0, "type": "Identifier" }, @@ -53,15 +249,11 @@ description: Result of parsing import_mesh_clone.kcl "start": 0, "type": "Name", "type": "Name" - }, - "start": 0, - "type": "VariableDeclarator" + } }, - "end": 0, - "kind": "const", "start": 0, - "type": "VariableDeclaration", - "type": "VariableDeclaration" + "type": "ExpressionStatement", + "type": "ExpressionStatement" }, { "commentStart": 0, @@ -71,7 +263,7 @@ description: Result of parsing import_mesh_clone.kcl "id": { "commentStart": 0, "end": 0, - "name": "model2", + "name": "red", "start": 0, "type": "Identifier" }, @@ -105,7 +297,7 @@ description: Result of parsing import_mesh_clone.kcl "name": { "commentStart": 0, "end": 0, - "name": "model", + "name": "yellow", "start": 0, "type": "Identifier" }, @@ -129,12 +321,12 @@ description: Result of parsing import_mesh_clone.kcl "arg": { "commentStart": 0, "end": 0, - "raw": "1020", + "raw": "4000", "start": 0, "type": "Literal", "type": "Literal", "value": { - "value": 1020.0, + "value": 4000.0, "suffix": "None" } } @@ -160,95 +352,13 @@ description: Result of parsing import_mesh_clone.kcl "start": 0, "type": "CallExpressionKw", "type": "CallExpressionKw", - "unlabeled": null - }, - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "color", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "end": 0, - "raw": "\"#ff0000\"", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": "#ff0000" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "metalness", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "end": 0, - "raw": "50", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 50.0, - "suffix": "None" - } - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "roughness", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "end": 0, - "raw": "50", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 50.0, - "suffix": "None" - } - } - } - ], - "callee": { - "abs_path": false, + "unlabeled": { "commentStart": 0, "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "appearance", - "start": 0, - "type": "Identifier" - }, - "path": [], "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } } ], "commentStart": 0, @@ -265,6 +375,446 @@ description: Result of parsing import_mesh_clone.kcl "start": 0, "type": "VariableDeclaration", "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "end": 0, + "expression": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "color", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "\"#ff0000\"", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": "#ff0000" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "appearance", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "red", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "green", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "clone", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "yellow", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "y", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "4000", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 4000.0, + "suffix": "None" + } + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "translate", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + } + ], + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "end": 0, + "expression": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "color", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "\"#00ff00\"", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": "#00ff00" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "appearance", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "green", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "blue", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "clone", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "red", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "y", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "4000", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 4000.0, + "suffix": "None" + } + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "translate", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + } + ], + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "end": 0, + "expression": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "color", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "\"#0000ff\"", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": "#0000ff" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "appearance", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "blue", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" } ], "commentStart": 0, @@ -282,7 +832,29 @@ description: Result of parsing import_mesh_clone.kcl } } ], - "1": [ + "2": [ + { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "4": [ + { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "6": [ { "commentStart": 0, "end": 0, diff --git a/rust/kcl-lib/tests/import_mesh_clone/execution_error.snap b/rust/kcl-lib/tests/import_mesh_clone/execution_error.snap deleted file mode 100644 index a711be032..000000000 --- a/rust/kcl-lib/tests/import_mesh_clone/execution_error.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: kcl-lib/src/simulation_tests.rs -description: Error from executing import_mesh_clone.kcl ---- -KCL Engine error - - × engine: Modeling command failed: websocket closed early - ╭──── - 13 │ ) - ╰──── diff --git a/rust/kcl-lib/tests/import_mesh_clone/input.kcl b/rust/kcl-lib/tests/import_mesh_clone/input.kcl index 4643458ca..ee6895f41 100644 --- a/rust/kcl-lib/tests/import_mesh_clone/input.kcl +++ b/rust/kcl-lib/tests/import_mesh_clone/input.kcl @@ -1,13 +1,18 @@ -import "../inputs/cube.obj" as cube +@(lengthUnit = m) +import "../inputs/cube.obj" as yellow -model = cube +yellow + |> translate(%, x = -2000, y = -2000) +appearance(yellow, color = "#ffff00") -model2 = clone(model) - |> translate( - x = 1020, - ) - |> appearance( - color = "#ff0000", - metalness = 50, - roughness = 50 - ) +red = clone(yellow) + |> translate(%, x = 4000) +appearance(red, color = "#ff0000") + +green = clone(yellow) + |> translate(%, y = 4000) +appearance(green, color = "#00ff00") + +blue = clone(red) + |> translate(%, y = 4000) +appearance(blue, color = "#0000ff") diff --git a/rust/kcl-lib/tests/import_mesh_clone/ops.snap b/rust/kcl-lib/tests/import_mesh_clone/ops.snap index 35463302d..2fb6173c9 100644 --- a/rust/kcl-lib/tests/import_mesh_clone/ops.snap +++ b/rust/kcl-lib/tests/import_mesh_clone/ops.snap @@ -25,6 +25,32 @@ description: Operations executed import_mesh_clone.kcl "labeledArgs": {}, "sourceRange": [] }, + { + "type": "KclStdLibCall", + "name": "clone", + "unlabeledArg": { + "value": { + "type": "ImportedGeometry", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": {}, + "sourceRange": [] + }, + { + "type": "KclStdLibCall", + "name": "clone", + "unlabeledArg": { + "value": { + "type": "ImportedGeometry", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": {}, + "sourceRange": [] + }, { "type": "GroupEnd" } diff --git a/rust/kcl-lib/tests/import_mesh_clone/program_memory.snap b/rust/kcl-lib/tests/import_mesh_clone/program_memory.snap new file mode 100644 index 000000000..8b581fcf6 --- /dev/null +++ b/rust/kcl-lib/tests/import_mesh_clone/program_memory.snap @@ -0,0 +1,31 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Variables in memory after executing import_mesh_clone.kcl +--- +{ + "blue": { + "type": "ImportedGeometry", + "id": "[uuid]", + "value": [ + "cube.obj" + ] + }, + "green": { + "type": "ImportedGeometry", + "id": "[uuid]", + "value": [ + "cube.obj" + ] + }, + "red": { + "type": "ImportedGeometry", + "id": "[uuid]", + "value": [ + "cube.obj" + ] + }, + "yellow": { + "type": "Module", + "value": 1 + } +} diff --git a/rust/kcl-lib/tests/import_mesh_clone/rendered_model.png b/rust/kcl-lib/tests/import_mesh_clone/rendered_model.png new file mode 100644 index 0000000000000000000000000000000000000000..5ed234f31f543e755a0f67c9c81a33dd4c2175fe GIT binary patch literal 60204 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 NY<~KQ!N$bf{{n}7r4|4H literal 0 HcmV?d00001 diff --git a/rust/kcl-lib/tests/import_mesh_clone/unparsed.snap b/rust/kcl-lib/tests/import_mesh_clone/unparsed.snap index c1771d1ee..b17476cde 100644 --- a/rust/kcl-lib/tests/import_mesh_clone/unparsed.snap +++ b/rust/kcl-lib/tests/import_mesh_clone/unparsed.snap @@ -2,10 +2,21 @@ source: kcl-lib/src/simulation_tests.rs description: Result of unparsing import_mesh_clone.kcl --- -import "../inputs/cube.obj" as cube +@(lengthUnit = m) +import "../inputs/cube.obj" as yellow -model = cube +yellow + |> translate(%, x = -2000, y = -2000) +appearance(yellow, color = "#ffff00") -model2 = clone(model) - |> translate(x = 1020) - |> appearance(color = "#ff0000", metalness = 50, roughness = 50) +red = clone(yellow) + |> translate(%, x = 4000) +appearance(red, color = "#ff0000") + +green = clone(yellow) + |> translate(%, y = 4000) +appearance(green, color = "#00ff00") + +blue = clone(red) + |> translate(%, y = 4000) +appearance(blue, color = "#0000ff")