From 73b7d3cc9dd667c2c74a873399f320d2373a5ad2 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Tue, 12 Mar 2024 12:54:45 -0700 Subject: [PATCH] Patterns 2d 3d (#1701) * refactor Signed-off-by: Jess Frazelle * pattern2d and 3d Signed-off-by: Jess Frazelle * fix derive docs more Signed-off-by: Jess Frazelle * fixes Signed-off-by: Jess Frazelle * fix Signed-off-by: Jess Frazelle --------- Signed-off-by: Jess Frazelle --- docs/kcl/std.json | 13663 ++++++++-------- docs/kcl/std.md | 130 +- src/wasm-lib/Cargo.lock | 20 +- src/wasm-lib/derive-docs/Cargo.toml | 2 +- src/wasm-lib/derive-docs/src/lib.rs | 209 +- src/wasm-lib/derive-docs/tests/array.gen | 4 +- src/wasm-lib/derive-docs/tests/box.gen | 2 +- src/wasm-lib/derive-docs/tests/lineTo.gen | 2 +- src/wasm-lib/derive-docs/tests/min.gen | 2 +- src/wasm-lib/derive-docs/tests/option.gen | 4 +- .../derive-docs/tests/option_input_format.gen | 4 +- .../tests/return_vec_box_sketch_group.gen | 84 + .../tests/return_vec_sketch_group.gen | 84 + src/wasm-lib/derive-docs/tests/show.gen | 7 +- src/wasm-lib/kcl/Cargo.toml | 4 +- src/wasm-lib/kcl/src/docs.rs | 4 +- src/wasm-lib/kcl/src/std/mod.rs | 52 +- src/wasm-lib/kcl/src/std/patterns.rs | 312 +- src/wasm-lib/tests/executor/main.rs | 16 +- .../outputs/patterns_circular_basic_3d.png | Bin 104217 -> 108598 bytes .../outputs/patterns_linear_basic_3d.png | Bin 95046 -> 95314 bytes 21 files changed, 7576 insertions(+), 7029 deletions(-) create mode 100644 src/wasm-lib/derive-docs/tests/return_vec_box_sketch_group.gen create mode 100644 src/wasm-lib/derive-docs/tests/return_vec_sketch_group.gen diff --git a/docs/kcl/std.json b/docs/kcl/std.json index 9349825c2..d1faedf6d 100644 --- a/docs/kcl/std.json +++ b/docs/kcl/std.json @@ -38511,16 +38511,1993 @@ "deprecated": false }, { - "name": "patternCircular", - "summary": "A Circular pattern.", + "name": "patternCircular2d", + "summary": "A circular pattern on a 2D sketch.", "description": "", "tags": [], "args": [ { "name": "data", - "type": "CircularPatternData", + "type": "CircularPattern2dData", "schema": { - "description": "Data for a circular pattern.", + "description": "Data for a circular pattern on a 2D sketch.", + "type": "object", + "required": [ + "arcDegrees", + "center", + "repetitions", + "rotateDuplicates" + ], + "properties": { + "arcDegrees": { + "description": "The arc angle (in degrees) to place the repetitions. Must be greater than 0.", + "type": "number", + "format": "double" + }, + "center": { + "description": "The center about which to make th pattern. This is a 2D vector.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "repetitions": { + "description": "The number of repetitions. Must be greater than 0. This excludes the original entity. For example, if `repetitions` is 1, the original entity will be copied once.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "rotateDuplicates": { + "description": "Whether or not to rotate the duplicates as they are copied.", + "type": "boolean" + } + } + }, + "required": true + }, + { + "name": "sketch_group", + "type": "SketchGroup", + "schema": { + "description": "A sketch group is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "position", + "rotation", + "start", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + } + }, + "entityId": { + "description": "The plane id or face id of the sketch group.", + "type": "string", + "format": "uuid", + "nullable": true + }, + "id": { + "description": "The id of the sketch group.", + "type": "string", + "format": "uuid" + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "__meta": { + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + } + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "origin": { + "description": "Origin of the plane.", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "value": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "zAxis": { + "description": "The z-axis (normal).", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "sketchGroupId", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "__meta": { + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + } + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "sketchGroupId": { + "description": "The original sketch group id of the object we are sketching on.", + "type": "string", + "format": "uuid" + }, + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "zAxis": { + "description": "The z-axis (normal).", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + } + } + } + ] + }, + "position": { + "description": "The position of the sketch group.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation of the sketch group base plane.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "start": { + "description": "The starting path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "value": { + "description": "The paths in the sketch group.", + "type": "array", + "items": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "center": { + "description": "the arc's center", + "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 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type", + "x" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "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 + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Base" + ] + } + } + } + ] + } + }, + "xAxis": { + "description": "The x-axis of the sketch group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "yAxis": { + "description": "The y-axis of the sketch group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "zAxis": { + "description": "The z-axis of the sketch group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + } + } + }, + "required": true + } + ], + "returnValue": { + "name": "", + "type": "[SketchGroup]", + "schema": { + "type": "array", + "items": { + "description": "A sketch group is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "position", + "rotation", + "start", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + } + }, + "entityId": { + "description": "The plane id or face id of the sketch group.", + "type": "string", + "format": "uuid", + "nullable": true + }, + "id": { + "description": "The id of the sketch group.", + "type": "string", + "format": "uuid" + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "__meta": { + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + } + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "origin": { + "description": "Origin of the plane.", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "value": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "zAxis": { + "description": "The z-axis (normal).", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "sketchGroupId", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "__meta": { + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + } + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "sketchGroupId": { + "description": "The original sketch group id of the object we are sketching on.", + "type": "string", + "format": "uuid" + }, + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "zAxis": { + "description": "The z-axis (normal).", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + } + } + } + ] + }, + "position": { + "description": "The position of the sketch group.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation of the sketch group base plane.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "start": { + "description": "The starting path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "value": { + "description": "The paths in the sketch group.", + "type": "array", + "items": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "center": { + "description": "the arc's center", + "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 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type", + "x" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "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 + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Base" + ] + } + } + } + ] + } + }, + "xAxis": { + "description": "The x-axis of the sketch group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "yAxis": { + "description": "The y-axis of the sketch group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "zAxis": { + "description": "The z-axis of the sketch group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + } + } + } + }, + "required": true + }, + "unpublished": false, + "deprecated": false + }, + { + "name": "patternCircular3d", + "summary": "A circular pattern on a 3D model.", + "description": "", + "tags": [], + "args": [ + { + "name": "data", + "type": "CircularPattern3dData", + "schema": { + "description": "Data for a circular pattern on a 3D model.", "type": "object", "required": [ "arcDegrees", @@ -38536,14 +40513,14 @@ "format": "double" }, "axis": { - "description": "The axis around which to make the pattern. This is a 2D vector.", + "description": "The axis around which to make the pattern. This is a 3D vector.", "type": "array", "items": { "type": "number", "format": "double" }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, "center": { "description": "The center about which to make th pattern. This is a 3D vector.", @@ -38558,7 +40535,7 @@ "repetitions": { "description": "The number of repetitions. Must be greater than 0. This excludes the original entity. For example, if `repetitions` is 1, the original entity will be copied once.", "type": "integer", - "format": "uint", + "format": "uint32", "minimum": 0.0 }, "rotateDuplicates": { @@ -38570,1001 +40547,600 @@ "required": true }, { - "name": "geometry", - "type": "Geometry", + "name": "extrude_group", + "type": "ExtrudeGroup", "schema": { - "description": "A geometry.", - "oneOf": [ - { - "description": "A sketch group is a collection of paths.", - "type": "object", - "required": [ - "__meta", - "id", - "on", - "position", - "rotation", - "start", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "description": "Metadata.", - "type": "object", - "required": [ - "sourceRange" - ], - "properties": { - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - } - }, - "entityId": { - "description": "The plane id or face id of the sketch group.", - "type": "string", - "format": "uuid", - "nullable": true - }, - "id": { - "description": "The id of the sketch group.", - "type": "string", - "format": "uuid" - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "oneOf": [ - { - "description": "A plane.", - "type": "object", - "required": [ - "__meta", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "__meta": { - "type": "array", - "items": { - "description": "Metadata.", - "type": "object", - "required": [ - "sourceRange" - ], - "properties": { - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - } - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "origin": { - "description": "Origin of the plane.", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "value": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - } - ] - }, - "xAxis": { - "description": "What should the plane’s X axis be?", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "yAxis": { - "description": "What should the plane’s Y axis be?", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "zAxis": { - "description": "The z-axis (normal).", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - } - } + "description": "An extrude group is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "position", + "rotation", + "sketchGroupValues", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 }, - { - "description": "A face.", - "type": "object", - "required": [ - "__meta", - "id", - "sketchGroupId", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "__meta": { - "type": "array", - "items": { - "description": "Metadata.", - "type": "object", - "required": [ - "sourceRange" - ], - "properties": { - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - } - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "sketchGroupId": { - "description": "The original sketch group id of the object we are sketching on.", - "type": "string", - "format": "uuid" - }, - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face’s X axis be?", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "yAxis": { - "description": "What should the face’s Y axis be?", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "zAxis": { - "description": "The z-axis (normal).", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - } - } - } - ] - }, - "position": { - "description": "The position of the sketch group.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 3, - "minItems": 3 - }, - "rotation": { - "description": "The rotation of the sketch group base plane.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 4, - "minItems": 4 - }, - "start": { - "description": "The starting path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "type": { - "type": "string", - "enum": [ - "SketchGroup" - ] - }, - "value": { - "description": "The paths in the sketch group.", - "type": "array", - "items": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "center": { - "description": "the arc's center", - "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 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type", - "x" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "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 - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "Base" - ] - } - } - } - ] - } - }, - "xAxis": { - "description": "The x-axis of the sketch group base plane in the 3D space", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "yAxis": { - "description": "The y-axis of the sketch group base plane in the 3D space", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "zAxis": { - "description": "The z-axis of the sketch group base plane in the 3D space", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } + "maxItems": 2, + "minItems": 2 } } } }, - { - "description": "An extrude group is a collection of extrude surfaces.", - "type": "object", - "required": [ - "__meta", - "height", - "id", - "position", - "rotation", - "sketchGroupValues", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "description": "Metadata.", + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "height": { + "description": "The height of the extrude group.", + "type": "number", + "format": "double" + }, + "id": { + "description": "The id of the extrude group.", + "type": "string", + "format": "uuid" + }, + "position": { + "description": "The position of the extrude group.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation of the extrude group.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "sketchGroupValues": { + "description": "The sketch group paths.", + "type": "array", + "items": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", "type": "object", "required": [ - "sourceRange" + "__geoMeta", + "from", + "name", + "to", + "type" ], "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "center": { + "description": "the arc's center", + "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 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type", + "x" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "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 + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Base" + ] + } + } + } + ] + } + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "name", + "position", + "rotation", + "sourceRange", + "type" + ], + "properties": { + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "name": { + "description": "The name.", + "type": "string" + }, + "position": { + "description": "The position.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, "sourceRange": { "description": "The source range.", "type": "array", @@ -39575,1742 +41151,755 @@ }, "maxItems": 2, "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "name", + "position", + "rotation", + "sourceRange", + "type" + ], + "properties": { + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "name": { + "description": "The name.", + "type": "string" + }, + "position": { + "description": "The position.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] } } } - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "height": { - "description": "The height of the extrude group.", + ] + } + }, + "xAxis": { + "description": "The x-axis of the extrude group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { "type": "number", "format": "double" }, - "id": { - "description": "The id of the extrude group.", - "type": "string", - "format": "uuid" + "y": { + "type": "number", + "format": "double" }, - "position": { - "description": "The position of the extrude group.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 3, - "minItems": 3 + "z": { + "type": "number", + "format": "double" + } + } + }, + "yAxis": { + "description": "The y-axis of the extrude group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" }, - "rotation": { - "description": "The rotation of the extrude group.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 4, - "minItems": 4 + "y": { + "type": "number", + "format": "double" }, - "sketchGroupValues": { - "description": "The sketch group paths.", - "type": "array", - "items": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "center": { - "description": "the arc's center", - "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 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type", - "x" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "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 - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "Base" - ] - } - } - } - ] - } + "z": { + "type": "number", + "format": "double" + } + } + }, + "zAxis": { + "description": "The z-axis of the extrude group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true + "y": { + "type": "number", + "format": "double" }, - "type": { - "type": "string", - "enum": [ - "ExtrudeGroup" - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "name", - "position", - "rotation", - "sourceRange", - "type" - ], - "properties": { - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "name": { - "description": "The name.", - "type": "string" - }, - "position": { - "description": "The position.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 3, - "minItems": 3 - }, - "rotation": { - "description": "The rotation.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 4, - "minItems": 4 - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "name", - "position", - "rotation", - "sourceRange", - "type" - ], - "properties": { - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "name": { - "description": "The name.", - "type": "string" - }, - "position": { - "description": "The position.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 3, - "minItems": 3 - }, - "rotation": { - "description": "The rotation.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 4, - "minItems": 4 - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - } - } - } - ] - } - }, - "xAxis": { - "description": "The x-axis of the extrude group base plane in the 3D space", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "yAxis": { - "description": "The y-axis of the extrude group base plane in the 3D space", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "zAxis": { - "description": "The z-axis of the extrude group base plane in the 3D space", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } + "z": { + "type": "number", + "format": "double" } } } - ] + } }, "required": true } ], "returnValue": { "name": "", - "type": "Geometries", + "type": "[ExtrudeGroup]", "schema": { - "description": "A set of geometry.", - "oneOf": [ - { - "type": [ - "object", - "array" - ], - "items": { - "description": "A sketch group is a collection of paths.", - "type": "object", - "required": [ - "__meta", - "id", - "on", - "position", - "rotation", - "start", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "description": "Metadata.", - "type": "object", - "required": [ - "sourceRange" - ], - "properties": { - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - } - }, - "entityId": { - "description": "The plane id or face id of the sketch group.", - "type": "string", - "format": "uuid", - "nullable": true - }, - "id": { - "description": "The id of the sketch group.", - "type": "string", - "format": "uuid" - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "oneOf": [ - { - "description": "A plane.", - "type": "object", - "required": [ - "__meta", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "__meta": { - "type": "array", - "items": { - "description": "Metadata.", - "type": "object", - "required": [ - "sourceRange" - ], - "properties": { - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - } - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "origin": { - "description": "Origin of the plane.", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "value": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - } - ] - }, - "xAxis": { - "description": "What should the plane’s X axis be?", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "yAxis": { - "description": "What should the plane’s Y axis be?", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "zAxis": { - "description": "The z-axis (normal).", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - } - } + "type": "array", + "items": { + "description": "An extrude group is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "position", + "rotation", + "sketchGroupValues", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 }, - { - "description": "A face.", - "type": "object", - "required": [ - "__meta", - "id", - "sketchGroupId", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "__meta": { - "type": "array", - "items": { - "description": "Metadata.", - "type": "object", - "required": [ - "sourceRange" - ], - "properties": { - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - } - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "sketchGroupId": { - "description": "The original sketch group id of the object we are sketching on.", - "type": "string", - "format": "uuid" - }, - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face’s X axis be?", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "yAxis": { - "description": "What should the face’s Y axis be?", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "zAxis": { - "description": "The z-axis (normal).", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - } - } - } - ] - }, - "position": { - "description": "The position of the sketch group.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 3, - "minItems": 3 - }, - "rotation": { - "description": "The rotation of the sketch group base plane.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 4, - "minItems": 4 - }, - "start": { - "description": "The starting path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "value": { - "description": "The paths in the sketch group.", - "type": "array", - "items": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "center": { - "description": "the arc's center", - "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 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type", - "x" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "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 - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "Base" - ] - } - } - } - ] - } - }, - "xAxis": { - "description": "The x-axis of the sketch group base plane in the 3D space", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "yAxis": { - "description": "The y-axis of the sketch group base plane in the 3D space", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "zAxis": { - "description": "The z-axis of the sketch group base plane in the 3D space", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } + "maxItems": 2, + "minItems": 2 } } } }, - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "SketchGroups" - ] - } - } - }, - { - "type": [ - "object", - "array" - ], - "items": { - "description": "An extrude group is a collection of extrude surfaces.", - "type": "object", - "required": [ - "__meta", - "height", - "id", - "position", - "rotation", - "sketchGroupValues", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "description": "Metadata.", + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "height": { + "description": "The height of the extrude group.", + "type": "number", + "format": "double" + }, + "id": { + "description": "The id of the extrude group.", + "type": "string", + "format": "uuid" + }, + "position": { + "description": "The position of the extrude group.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation of the extrude group.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "sketchGroupValues": { + "description": "The sketch group paths.", + "type": "array", + "items": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", "type": "object", "required": [ - "sourceRange" + "__geoMeta", + "from", + "name", + "to", + "type" ], "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "center": { + "description": "the arc's center", + "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 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type", + "x" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "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 + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Base" + ] + } + } + } + ] + } + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "name", + "position", + "rotation", + "sourceRange", + "type" + ], + "properties": { + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "name": { + "description": "The name.", + "type": "string" + }, + "position": { + "description": "The position.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, "sourceRange": { "description": "The source range.", "type": "array", @@ -41321,734 +41910,155 @@ }, "maxItems": 2, "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "name", + "position", + "rotation", + "sourceRange", + "type" + ], + "properties": { + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "name": { + "description": "The name.", + "type": "string" + }, + "position": { + "description": "The position.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] } } } - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "height": { - "description": "The height of the extrude group.", + ] + } + }, + "xAxis": { + "description": "The x-axis of the extrude group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { "type": "number", "format": "double" }, - "id": { - "description": "The id of the extrude group.", - "type": "string", - "format": "uuid" + "y": { + "type": "number", + "format": "double" }, - "position": { - "description": "The position of the extrude group.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 3, - "minItems": 3 - }, - "rotation": { - "description": "The rotation of the extrude group.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 4, - "minItems": 4 - }, - "sketchGroupValues": { - "description": "The sketch group paths.", - "type": "array", - "items": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "center": { - "description": "the arc's center", - "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 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type", - "x" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "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 - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "Base" - ] - } - } - } - ] - } - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "name", - "position", - "rotation", - "sourceRange", - "type" - ], - "properties": { - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "name": { - "description": "The name.", - "type": "string" - }, - "position": { - "description": "The position.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 3, - "minItems": 3 - }, - "rotation": { - "description": "The rotation.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 4, - "minItems": 4 - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "name", - "position", - "rotation", - "sourceRange", - "type" - ], - "properties": { - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "name": { - "description": "The name.", - "type": "string" - }, - "position": { - "description": "The position.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 3, - "minItems": 3 - }, - "rotation": { - "description": "The rotation.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 4, - "minItems": 4 - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - } - } - } - ] - } - }, - "xAxis": { - "description": "The x-axis of the extrude group base plane in the 3D space", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "yAxis": { - "description": "The y-axis of the extrude group base plane in the 3D space", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "zAxis": { - "description": "The z-axis of the extrude group base plane in the 3D space", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } + "z": { + "type": "number", + "format": "double" } } }, - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ExtrudeGroups" - ] + "yAxis": { + "description": "The y-axis of the extrude group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "zAxis": { + "description": "The z-axis of the extrude group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } } } } - ] + } }, "required": true }, @@ -42056,16 +42066,16 @@ "deprecated": false }, { - "name": "patternLinear", - "summary": "A linear pattern.", + "name": "patternLinear2d", + "summary": "A linear pattern on a 2D sketch.", "description": "", "tags": [], "args": [ { "name": "data", - "type": "LinearPatternData", + "type": "LinearPattern2dData", "schema": { - "description": "Data for a linear pattern.", + "description": "Data for a linear pattern on a 2D sketch.", "type": "object", "required": [ "axis", @@ -42091,7 +42101,7 @@ "repetitions": { "description": "The number of repetitions. Must be greater than 0. This excludes the original entity. For example, if `repetitions` is 1, the original entity will be copied once.", "type": "integer", - "format": "uint", + "format": "uint32", "minimum": 0.0 } } @@ -42099,1573 +42109,247 @@ "required": true }, { - "name": "geometry", - "type": "Geometry", + "name": "sketch_group", + "type": "SketchGroup", "schema": { - "description": "A geometry.", - "oneOf": [ - { - "description": "A sketch group is a collection of paths.", - "type": "object", - "required": [ - "__meta", - "id", - "on", - "position", - "rotation", - "start", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "description": "Metadata.", - "type": "object", - "required": [ - "sourceRange" - ], - "properties": { - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - } - }, - "entityId": { - "description": "The plane id or face id of the sketch group.", - "type": "string", - "format": "uuid", - "nullable": true - }, - "id": { - "description": "The id of the sketch group.", - "type": "string", - "format": "uuid" - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "oneOf": [ - { - "description": "A plane.", - "type": "object", - "required": [ - "__meta", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "__meta": { - "type": "array", - "items": { - "description": "Metadata.", - "type": "object", - "required": [ - "sourceRange" - ], - "properties": { - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - } - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "origin": { - "description": "Origin of the plane.", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "value": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - } - ] - }, - "xAxis": { - "description": "What should the plane’s X axis be?", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "yAxis": { - "description": "What should the plane’s Y axis be?", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "zAxis": { - "description": "The z-axis (normal).", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - } - } + "description": "A sketch group is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "position", + "rotation", + "start", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 }, - { - "description": "A face.", - "type": "object", - "required": [ - "__meta", - "id", - "sketchGroupId", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "__meta": { - "type": "array", - "items": { - "description": "Metadata.", - "type": "object", - "required": [ - "sourceRange" - ], - "properties": { - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - } - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "sketchGroupId": { - "description": "The original sketch group id of the object we are sketching on.", - "type": "string", - "format": "uuid" - }, - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face’s X axis be?", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "yAxis": { - "description": "What should the face’s Y axis be?", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "zAxis": { - "description": "The z-axis (normal).", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - } - } - } - ] - }, - "position": { - "description": "The position of the sketch group.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 3, - "minItems": 3 - }, - "rotation": { - "description": "The rotation of the sketch group base plane.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 4, - "minItems": 4 - }, - "start": { - "description": "The starting path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "type": { - "type": "string", - "enum": [ - "SketchGroup" - ] - }, - "value": { - "description": "The paths in the sketch group.", - "type": "array", - "items": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "center": { - "description": "the arc's center", - "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 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type", - "x" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "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 - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "Base" - ] - } - } - } - ] - } - }, - "xAxis": { - "description": "The x-axis of the sketch group base plane in the 3D space", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "yAxis": { - "description": "The y-axis of the sketch group base plane in the 3D space", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "zAxis": { - "description": "The z-axis of the sketch group base plane in the 3D space", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } + "maxItems": 2, + "minItems": 2 } } } }, - { - "description": "An extrude group is a collection of extrude surfaces.", - "type": "object", - "required": [ - "__meta", - "height", - "id", - "position", - "rotation", - "sketchGroupValues", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "description": "Metadata.", - "type": "object", - "required": [ - "sourceRange" - ], - "properties": { - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 + "entityId": { + "description": "The plane id or face id of the sketch group.", + "type": "string", + "format": "uuid", + "nullable": true + }, + "id": { + "description": "The id of the sketch group.", + "type": "string", + "format": "uuid" + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "__meta": { + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + } + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "origin": { + "description": "Origin of the plane.", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" }, - "maxItems": 2, - "minItems": 2 + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "value": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "zAxis": { + "description": "The z-axis (normal).", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } } } } }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "height": { - "description": "The height of the extrude group.", - "type": "number", - "format": "double" - }, - "id": { - "description": "The id of the extrude group.", - "type": "string", - "format": "uuid" - }, - "position": { - "description": "The position of the extrude group.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 3, - "minItems": 3 - }, - "rotation": { - "description": "The rotation of the extrude group.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 4, - "minItems": 4 - }, - "sketchGroupValues": { - "description": "The sketch group paths.", - "type": "array", - "items": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "sketchGroupId", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "__meta": { + "type": "array", + "items": { + "description": "Metadata.", "type": "object", "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" + "sourceRange" ], "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "center": { - "description": "the arc's center", - "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 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type", - "x" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "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 - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "Base" - ] - } - } - } - ] - } - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "type": { - "type": "string", - "enum": [ - "ExtrudeGroup" - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "name", - "position", - "rotation", - "sourceRange", - "type" - ], - "properties": { - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "name": { - "description": "The name.", - "type": "string" - }, - "position": { - "description": "The position.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 3, - "minItems": 3 - }, - "rotation": { - "description": "The rotation.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 4, - "minItems": 4 - }, "sourceRange": { "description": "The source range.", "type": "array", @@ -43676,1908 +42360,3239 @@ }, "maxItems": 2, "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "name", - "position", - "rotation", - "sourceRange", - "type" - ], - "properties": { - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "name": { - "description": "The name.", - "type": "string" - }, - "position": { - "description": "The position.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 3, - "minItems": 3 - }, - "rotation": { - "description": "The rotation.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 4, - "minItems": 4 - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] } } } - ] - } - }, - "xAxis": { - "description": "The x-axis of the extrude group base plane in the 3D space", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" }, - "y": { - "type": "number", - "format": "double" + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "yAxis": { - "description": "The y-axis of the extrude group base plane in the 3D space", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" + "sketchGroupId": { + "description": "The original sketch group id of the object we are sketching on.", + "type": "string", + "format": "uuid" }, - "y": { - "type": "number", - "format": "double" + "type": { + "type": "string", + "enum": [ + "face" + ] }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "zAxis": { - "description": "The z-axis of the extrude group base plane in the 3D space", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" + "value": { + "description": "The tag of the face.", + "type": "string" }, - "y": { - "type": "number", - "format": "double" + "xAxis": { + "description": "What should the face’s X axis be?", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } }, - "z": { - "type": "number", - "format": "double" + "yAxis": { + "description": "What should the face’s Y axis be?", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "zAxis": { + "description": "The z-axis (normal).", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } } } } + ] + }, + "position": { + "description": "The position of the sketch group.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation of the sketch group base plane.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "start": { + "description": "The starting path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "value": { + "description": "The paths in the sketch group.", + "type": "array", + "items": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "center": { + "description": "the arc's center", + "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 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type", + "x" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "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 + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Base" + ] + } + } + } + ] + } + }, + "xAxis": { + "description": "The x-axis of the sketch group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "yAxis": { + "description": "The y-axis of the sketch group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "zAxis": { + "description": "The z-axis of the sketch group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } } } - ] + } }, "required": true } ], "returnValue": { "name": "", - "type": "Geometries", + "type": "[SketchGroup]", "schema": { - "description": "A set of geometry.", - "oneOf": [ - { - "type": [ - "object", - "array" - ], - "items": { - "description": "A sketch group is a collection of paths.", - "type": "object", - "required": [ - "__meta", - "id", - "on", - "position", - "rotation", - "start", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "description": "Metadata.", - "type": "object", - "required": [ - "sourceRange" - ], - "properties": { - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - } - }, - "entityId": { - "description": "The plane id or face id of the sketch group.", - "type": "string", - "format": "uuid", - "nullable": true - }, - "id": { - "description": "The id of the sketch group.", - "type": "string", - "format": "uuid" - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "oneOf": [ - { - "description": "A plane.", - "type": "object", - "required": [ - "__meta", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "__meta": { - "type": "array", - "items": { - "description": "Metadata.", - "type": "object", - "required": [ - "sourceRange" - ], - "properties": { - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - } - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "origin": { - "description": "Origin of the plane.", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "value": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - } - ] - }, - "xAxis": { - "description": "What should the plane’s X axis be?", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "yAxis": { - "description": "What should the plane’s Y axis be?", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "zAxis": { - "description": "The z-axis (normal).", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - } - } + "type": "array", + "items": { + "description": "A sketch group is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "position", + "rotation", + "start", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 }, - { - "description": "A face.", - "type": "object", - "required": [ - "__meta", - "id", - "sketchGroupId", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "__meta": { - "type": "array", - "items": { - "description": "Metadata.", - "type": "object", - "required": [ - "sourceRange" - ], - "properties": { - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - } - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "sketchGroupId": { - "description": "The original sketch group id of the object we are sketching on.", - "type": "string", - "format": "uuid" - }, - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face’s X axis be?", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "yAxis": { - "description": "What should the face’s Y axis be?", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "zAxis": { - "description": "The z-axis (normal).", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - } - } - } - ] - }, - "position": { - "description": "The position of the sketch group.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 3, - "minItems": 3 - }, - "rotation": { - "description": "The rotation of the sketch group base plane.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 4, - "minItems": 4 - }, - "start": { - "description": "The starting path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "value": { - "description": "The paths in the sketch group.", - "type": "array", - "items": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "center": { - "description": "the arc's center", - "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 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type", - "x" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "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 - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "Base" - ] - } - } - } - ] - } - }, - "xAxis": { - "description": "The x-axis of the sketch group base plane in the 3D space", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "yAxis": { - "description": "The y-axis of the sketch group base plane in the 3D space", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "zAxis": { - "description": "The z-axis of the sketch group base plane in the 3D space", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } + "maxItems": 2, + "minItems": 2 } } } }, - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "SketchGroups" - ] - } - } - }, - { - "type": [ - "object", - "array" - ], - "items": { - "description": "An extrude group is a collection of extrude surfaces.", - "type": "object", - "required": [ - "__meta", - "height", - "id", - "position", - "rotation", - "sketchGroupValues", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "description": "Metadata.", - "type": "object", - "required": [ - "sourceRange" - ], - "properties": { - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 + "entityId": { + "description": "The plane id or face id of the sketch group.", + "type": "string", + "format": "uuid", + "nullable": true + }, + "id": { + "description": "The id of the sketch group.", + "type": "string", + "format": "uuid" + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "__meta": { + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + } + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "origin": { + "description": "Origin of the plane.", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" }, - "maxItems": 2, - "minItems": 2 + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "value": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "zAxis": { + "description": "The z-axis (normal).", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } } } } }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "sketchGroupId", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "__meta": { + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + } + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "sketchGroupId": { + "description": "The original sketch group id of the object we are sketching on.", + "type": "string", + "format": "uuid" + }, + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "zAxis": { + "description": "The z-axis (normal).", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + } + } + } + ] + }, + "position": { + "description": "The position of the sketch group.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation of the sketch group base plane.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "start": { + "description": "The starting path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } }, - "height": { - "description": "The height of the extrude group.", + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "value": { + "description": "The paths in the sketch group.", + "type": "array", + "items": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "center": { + "description": "the arc's center", + "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 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type", + "x" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "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 + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Base" + ] + } + } + } + ] + } + }, + "xAxis": { + "description": "The x-axis of the sketch group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { "type": "number", "format": "double" }, - "id": { - "description": "The id of the extrude group.", - "type": "string", - "format": "uuid" + "y": { + "type": "number", + "format": "double" }, - "position": { - "description": "The position of the extrude group.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 3, - "minItems": 3 + "z": { + "type": "number", + "format": "double" + } + } + }, + "yAxis": { + "description": "The y-axis of the sketch group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" }, - "rotation": { - "description": "The rotation of the extrude group.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 4, - "minItems": 4 + "y": { + "type": "number", + "format": "double" }, - "sketchGroupValues": { - "description": "The sketch group paths.", - "type": "array", - "items": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "center": { - "description": "the arc's center", - "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 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type", - "x" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "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 - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "Base" - ] - } - } - } - ] - } + "z": { + "type": "number", + "format": "double" + } + } + }, + "zAxis": { + "description": "The z-axis of the sketch group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true + "y": { + "type": "number", + "format": "double" }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "name", - "position", - "rotation", - "sourceRange", - "type" - ], - "properties": { - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "name": { - "description": "The name.", - "type": "string" - }, - "position": { - "description": "The position.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 3, - "minItems": 3 - }, - "rotation": { - "description": "The rotation.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 4, - "minItems": 4 - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "name", - "position", - "rotation", - "sourceRange", - "type" - ], - "properties": { - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "name": { - "description": "The name.", - "type": "string" - }, - "position": { - "description": "The position.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 3, - "minItems": 3 - }, - "rotation": { - "description": "The rotation.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 4, - "minItems": 4 - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - } - } - } - ] - } - }, - "xAxis": { - "description": "The x-axis of the extrude group base plane in the 3D space", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" + "z": { + "type": "number", + "format": "double" + } + } + } + } + } + }, + "required": true + }, + "unpublished": false, + "deprecated": false + }, + { + "name": "patternLinear3d", + "summary": "A linear pattern on a 3D model.", + "description": "", + "tags": [], + "args": [ + { + "name": "data", + "type": "LinearPattern3dData", + "schema": { + "description": "Data for a linear pattern on a 3D model.", + "type": "object", + "required": [ + "axis", + "distance", + "repetitions" + ], + "properties": { + "axis": { + "description": "The axis of the pattern.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "distance": { + "description": "The distance between each repetition. This can also be referred to as spacing.", + "type": "number", + "format": "double" + }, + "repetitions": { + "description": "The number of repetitions. Must be greater than 0. This excludes the original entity. For example, if `repetitions` is 1, the original entity will be copied once.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + } + }, + "required": true + }, + { + "name": "extrude_group", + "type": "ExtrudeGroup", + "schema": { + "description": "An extrude group is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "position", + "rotation", + "sketchGroupValues", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "yAxis": { - "description": "The y-axis of the extrude group base plane in the 3D space", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "zAxis": { - "description": "The z-axis of the extrude group base plane in the 3D space", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } + "maxItems": 2, + "minItems": 2 } } } }, - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ExtrudeGroups" + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "height": { + "description": "The height of the extrude group.", + "type": "number", + "format": "double" + }, + "id": { + "description": "The id of the extrude group.", + "type": "string", + "format": "uuid" + }, + "position": { + "description": "The position of the extrude group.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation of the extrude group.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "sketchGroupValues": { + "description": "The sketch group paths.", + "type": "array", + "items": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "center": { + "description": "the arc's center", + "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 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type", + "x" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "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 + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Base" + ] + } + } + } ] } + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "name", + "position", + "rotation", + "sourceRange", + "type" + ], + "properties": { + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "name": { + "description": "The name.", + "type": "string" + }, + "position": { + "description": "The position.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "name", + "position", + "rotation", + "sourceRange", + "type" + ], + "properties": { + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "name": { + "description": "The name.", + "type": "string" + }, + "position": { + "description": "The position.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + } + } + } + ] + } + }, + "xAxis": { + "description": "The x-axis of the extrude group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "yAxis": { + "description": "The y-axis of the extrude group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "zAxis": { + "description": "The z-axis of the extrude group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } } } - ] + }, + "required": true + } + ], + "returnValue": { + "name": "", + "type": "[ExtrudeGroup]", + "schema": { + "type": "array", + "items": { + "description": "An extrude group is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "position", + "rotation", + "sketchGroupValues", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + } + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "height": { + "description": "The height of the extrude group.", + "type": "number", + "format": "double" + }, + "id": { + "description": "The id of the extrude group.", + "type": "string", + "format": "uuid" + }, + "position": { + "description": "The position of the extrude group.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation of the extrude group.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "sketchGroupValues": { + "description": "The sketch group paths.", + "type": "array", + "items": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "center": { + "description": "the arc's center", + "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 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type", + "x" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "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 + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Base" + ] + } + } + } + ] + } + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "name", + "position", + "rotation", + "sourceRange", + "type" + ], + "properties": { + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "name": { + "description": "The name.", + "type": "string" + }, + "position": { + "description": "The position.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "name", + "position", + "rotation", + "sourceRange", + "type" + ], + "properties": { + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "name": { + "description": "The name.", + "type": "string" + }, + "position": { + "description": "The position.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + } + } + } + ] + } + }, + "xAxis": { + "description": "The x-axis of the extrude group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "yAxis": { + "description": "The y-axis of the extrude group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "zAxis": { + "description": "The z-axis of the extrude group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + } + } + } }, "required": true }, diff --git a/docs/kcl/std.md b/docs/kcl/std.md index 2e40789f0..548a04a83 100644 --- a/docs/kcl/std.md +++ b/docs/kcl/std.md @@ -46,8 +46,10 @@ * [`log2`](#log2) * [`max`](#max) * [`min`](#min) - * [`patternCircular`](#patternCircular) - * [`patternLinear`](#patternLinear) + * [`patternCircular2d`](#patternCircular2d) + * [`patternCircular3d`](#patternCircular3d) + * [`patternLinear2d`](#patternLinear2d) + * [`patternLinear3d`](#patternLinear3d) * [`pi`](#pi) * [`pow`](#pow) * [`segAng`](#segAng) @@ -7170,34 +7172,32 @@ min(args: [number]) -> number -### patternCircular +### patternCircular2d -A Circular pattern. +A circular pattern on a 2D sketch. ``` -patternCircular(data: CircularPatternData, geometry: Geometry) -> Geometries +patternCircular2d(data: CircularPattern2dData, sketch_group: SketchGroup) -> [SketchGroup] ``` #### Arguments -* `data`: `CircularPatternData` - Data for a circular pattern. (REQUIRED) +* `data`: `CircularPattern2dData` - Data for a circular pattern on a 2D sketch. (REQUIRED) ``` { // The arc angle (in degrees) to place the repetitions. Must be greater than 0. arcDegrees: number, - // The axis around which to make the pattern. This is a 2D vector. - axis: [number, number], - // The center about which to make th pattern. This is a 3D vector. - center: [number, number, number], + // The center about which to make th pattern. This is a 2D vector. + center: [number, number], // The number of repetitions. Must be greater than 0. This excludes the original entity. For example, if `repetitions` is 1, the original entity will be copied once. repetitions: number, // Whether or not to rotate the duplicates as they are copied. rotateDuplicates: string, } ``` -* `geometry`: `Geometry` - A geometry. (REQUIRED) +* `sketch_group`: `SketchGroup` - A sketch group is a collection of paths. (REQUIRED) ``` { // The plane id or face id of the sketch group. @@ -7276,7 +7276,6 @@ patternCircular(data: CircularPatternData, geometry: Geometry) -> Geometries // The to point. to: [number, number], }, - type: "SketchGroup", // The paths in the sketch group. value: [{ // The from point. @@ -7360,7 +7359,44 @@ patternCircular(data: CircularPatternData, geometry: Geometry) -> Geometries y: number, z: number, }, -} | +} +``` + +#### Returns + +* `[SketchGroup]` + + + +### patternCircular3d + +A circular pattern on a 3D model. + + + +``` +patternCircular3d(data: CircularPattern3dData, extrude_group: ExtrudeGroup) -> [ExtrudeGroup] +``` + +#### Arguments + +* `data`: `CircularPattern3dData` - Data for a circular pattern on a 3D model. (REQUIRED) +``` +{ + // The arc angle (in degrees) to place the repetitions. Must be greater than 0. + arcDegrees: number, + // The axis around which to make the pattern. This is a 3D vector. + axis: [number, number, number], + // The center about which to make th pattern. This is a 3D vector. + center: [number, number, number], + // The number of repetitions. Must be greater than 0. This excludes the original entity. For example, if `repetitions` is 1, the original entity will be copied once. + repetitions: number, + // Whether or not to rotate the duplicates as they are copied. + rotateDuplicates: string, +} +``` +* `extrude_group`: `ExtrudeGroup` - An extrude group is a collection of extrude surfaces. (REQUIRED) +``` { // The id of the extrusion end cap endCapId: uuid, @@ -7439,7 +7475,6 @@ patternCircular(data: CircularPatternData, geometry: Geometry) -> Geometries }], // The id of the extrusion start cap startCapId: uuid, - type: "ExtrudeGroup", // The extrude surfaces. value: [{ // The face id for the extrude plane. @@ -7494,31 +7529,23 @@ patternCircular(data: CircularPatternData, geometry: Geometry) -> Geometries #### Returns -* `Geometries` - A set of geometry. -``` -{ - type: "SketchGroups", -} | -{ - type: "ExtrudeGroups", -} -``` +* `[ExtrudeGroup]` -### patternLinear +### patternLinear2d -A linear pattern. +A linear pattern on a 2D sketch. ``` -patternLinear(data: LinearPatternData, geometry: Geometry) -> Geometries +patternLinear2d(data: LinearPattern2dData, sketch_group: SketchGroup) -> [SketchGroup] ``` #### Arguments -* `data`: `LinearPatternData` - Data for a linear pattern. (REQUIRED) +* `data`: `LinearPattern2dData` - Data for a linear pattern on a 2D sketch. (REQUIRED) ``` { // The axis of the pattern. This is a 2D vector. @@ -7529,7 +7556,7 @@ patternLinear(data: LinearPatternData, geometry: Geometry) -> Geometries repetitions: number, } ``` -* `geometry`: `Geometry` - A geometry. (REQUIRED) +* `sketch_group`: `SketchGroup` - A sketch group is a collection of paths. (REQUIRED) ``` { // The plane id or face id of the sketch group. @@ -7608,7 +7635,6 @@ patternLinear(data: LinearPatternData, geometry: Geometry) -> Geometries // The to point. to: [number, number], }, - type: "SketchGroup", // The paths in the sketch group. value: [{ // The from point. @@ -7692,7 +7718,40 @@ patternLinear(data: LinearPatternData, geometry: Geometry) -> Geometries y: number, z: number, }, -} | +} +``` + +#### Returns + +* `[SketchGroup]` + + + +### patternLinear3d + +A linear pattern on a 3D model. + + + +``` +patternLinear3d(data: LinearPattern3dData, extrude_group: ExtrudeGroup) -> [ExtrudeGroup] +``` + +#### Arguments + +* `data`: `LinearPattern3dData` - Data for a linear pattern on a 3D model. (REQUIRED) +``` +{ + // The axis of the pattern. + axis: [number, number, number], + // The distance between each repetition. This can also be referred to as spacing. + distance: number, + // The number of repetitions. Must be greater than 0. This excludes the original entity. For example, if `repetitions` is 1, the original entity will be copied once. + repetitions: number, +} +``` +* `extrude_group`: `ExtrudeGroup` - An extrude group is a collection of extrude surfaces. (REQUIRED) +``` { // The id of the extrusion end cap endCapId: uuid, @@ -7771,7 +7830,6 @@ patternLinear(data: LinearPatternData, geometry: Geometry) -> Geometries }], // The id of the extrusion start cap startCapId: uuid, - type: "ExtrudeGroup", // The extrude surfaces. value: [{ // The face id for the extrude plane. @@ -7826,15 +7884,7 @@ patternLinear(data: LinearPatternData, geometry: Geometry) -> Geometries #### Returns -* `Geometries` - A set of geometry. -``` -{ - type: "SketchGroups", -} | -{ - type: "ExtrudeGroups", -} -``` +* `[ExtrudeGroup]` diff --git a/src/wasm-lib/Cargo.lock b/src/wasm-lib/Cargo.lock index b0d580602..c0ffc8a55 100644 --- a/src/wasm-lib/Cargo.lock +++ b/src/wasm-lib/Cargo.lock @@ -947,7 +947,7 @@ dependencies = [ [[package]] name = "derive-docs" -version = "0.1.9" +version = "0.1.10" dependencies = [ "convert_case", "expectorate", @@ -962,22 +962,6 @@ dependencies = [ "syn 2.0.52", ] -[[package]] -name = "derive-docs" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b81bc4c6288273218d0bb4f2ee7cda229264f2e8381e53aae250c840946171f9" -dependencies = [ - "convert_case", - "once_cell", - "proc-macro2", - "quote", - "regex", - "serde", - "serde_tokenstream", - "syn 2.0.52", -] - [[package]] name = "diesel_derives" version = "2.1.2" @@ -1918,7 +1902,7 @@ dependencies = [ "criterion", "dashmap", "databake", - "derive-docs 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "derive-docs", "expectorate", "futures", "gltf-json", diff --git a/src/wasm-lib/derive-docs/Cargo.toml b/src/wasm-lib/derive-docs/Cargo.toml index 6700e914a..af12ada2a 100644 --- a/src/wasm-lib/derive-docs/Cargo.toml +++ b/src/wasm-lib/derive-docs/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "derive-docs" description = "A tool for generating documentation from Rust derive macros" -version = "0.1.9" +version = "0.1.10" edition = "2021" license = "MIT" repository = "https://github.com/KittyCAD/modeling-app" diff --git a/src/wasm-lib/derive-docs/src/lib.rs b/src/wasm-lib/derive-docs/src/lib.rs index f247a7a54..554b44830 100644 --- a/src/wasm-lib/derive-docs/src/lib.rs +++ b/src/wasm-lib/derive-docs/src/lib.rs @@ -223,31 +223,59 @@ fn do_stdlib_inner( } } - let ret_ty = ast.sig.output.clone(); - let ret_ty_string = ret_ty - .into_token_stream() - .to_string() - .replace("-> ", "") - .replace("Result < ", "") - .replace(", KclError >", ""); - let return_type = if !ret_ty_string.is_empty() { - let ret_ty_string = if ret_ty_string.starts_with("Box <") { - ret_ty_string - .trim_start_matches("Box <") - .trim_end_matches(' ') - .trim_end_matches('>') - .trim() - .to_string() - } else { - ret_ty_string.trim().to_string() - }; - let ret_ty_ident = format_ident!("{}", ret_ty_string); + let return_type_inner = match &ast.sig.output { + syn::ReturnType::Default => quote! { () }, + syn::ReturnType::Type(_, ty) => { + // Get the inside of the result. + match &**ty { + syn::Type::Path(syn::TypePath { path, .. }) => { + let path = &path.segments; + if path.len() == 1 { + let seg = &path[0]; + if seg.ident == "Result" { + if let syn::PathArguments::AngleBracketed(syn::AngleBracketedGenericArguments { + args, + .. + }) = &seg.arguments + { + if args.len() == 2 || args.len() == 1 { + let mut args = args.iter(); + let ok = args.next().unwrap(); + if let syn::GenericArgument::Type(ty) = ok { + let ty = unbox(unbox_vec(ty.clone())); + quote! { #ty } + } else { + quote! { () } + } + } else { + quote! { () } + } + } else { + quote! { () } + } + } else { + let ty = unbox(unbox_vec(*ty.clone())); + quote! { #ty } + } + } else { + quote! { () } + } + } + _ => { + quote! { () } + } + } + } + }; + + let ret_ty_string = return_type_inner.to_string().replace(' ', ""); + let return_type = if !ret_ty_string.is_empty() || ret_ty_string != "()" { let ret_ty_string = rust_type_to_openapi_type(&ret_ty_string); quote! { Some(#docs_crate::StdLibFnArg { name: "".to_string(), type_: #ret_ty_string.to_string(), - schema: #ret_ty_ident::json_schema(&mut generator), + schema: <#return_type_inner>::json_schema(&mut generator), required: true, }) } @@ -547,6 +575,93 @@ fn parse_array_type(type_name: &str) -> Option<(&str, usize)> { Some((inner_type.as_str(), length)) } +// Unbox a syn::Type that is boxed to the inner object. +fn unbox(t: syn::Type) -> syn::Type { + match t { + syn::Type::Path(syn::TypePath { ref path, .. }) => { + let path = &path.segments; + if path.len() == 1 { + let seg = &path[0]; + if seg.ident == "Box" { + if let syn::PathArguments::AngleBracketed(syn::AngleBracketedGenericArguments { args, .. }) = + &seg.arguments + { + if args.len() == 1 { + let mut args = args.iter(); + let ok = args.next().unwrap(); + if let syn::GenericArgument::Type(ty) = ok { + return ty.clone(); + } + } + } + } + } + } + _ => { + return t; + } + } + t +} + +// For a Vec> return Vec. +// For a Vec return Vec. +// For a Box return T. +fn unbox_vec(t: syn::Type) -> syn::Type { + match t { + syn::Type::Path(syn::TypePath { ref path, .. }) => { + let path = &path.segments; + if path.len() == 1 { + let seg = &path[0]; + if seg.ident == "Vec" { + if let syn::PathArguments::AngleBracketed(syn::AngleBracketedGenericArguments { args, .. }) = + &seg.arguments + { + if args.len() == 1 { + let mut args = args.iter(); + let ok = args.next().unwrap(); + if let syn::GenericArgument::Type(ty) = ok { + let unboxed = unbox(ty.clone()); + // Wrap it back in a vec. + let wrapped = syn::Type::Path(syn::TypePath { + qself: None, + path: syn::Path { + leading_colon: None, + segments: { + let mut segments = syn::punctuated::Punctuated::new(); + segments.push_value(syn::PathSegment { + ident: syn::Ident::new("Vec", proc_macro2::Span::call_site()), + arguments: syn::PathArguments::AngleBracketed( + syn::AngleBracketedGenericArguments { + colon2_token: None, + lt_token: syn::token::Lt::default(), + args: { + let mut args = syn::punctuated::Punctuated::new(); + args.push_value(syn::GenericArgument::Type(unboxed)); + args + }, + gt_token: syn::token::Gt::default(), + }, + ), + }); + segments + }, + }, + }); + return wrapped; + } + } + } + } + } + } + _ => { + return t; + } + } + t +} + #[cfg(test)] mod tests { @@ -672,7 +787,7 @@ mod tests { fn inner_show( /// The args to do shit to. args: Option - ) -> Box { + ) -> Result> { args } }, @@ -693,7 +808,7 @@ mod tests { fn inner_show( /// The args to do shit to. args: [f64; 2] - ) -> Box { + ) -> Result> { args } }, @@ -714,7 +829,7 @@ mod tests { fn inner_import( /// The args to do shit to. args: Option - ) -> Box { + ) -> Result> { args } }, @@ -727,4 +842,52 @@ mod tests { &openapitor::types::get_text_fmt(&item).unwrap(), ); } + + #[test] + fn test_stdlib_return_vec_sketch_group() { + let (item, errors) = do_stdlib( + quote! { + name = "import", + }, + quote! { + fn inner_import( + /// The args to do shit to. + args: Option + ) -> Result> { + args + } + }, + ) + .unwrap(); + + assert!(errors.is_empty()); + expectorate::assert_contents( + "tests/return_vec_sketch_group.gen", + &openapitor::types::get_text_fmt(&item).unwrap(), + ); + } + + #[test] + fn test_stdlib_return_vec_box_sketch_group() { + let (item, errors) = do_stdlib( + quote! { + name = "import", + }, + quote! { + fn inner_import( + /// The args to do shit to. + args: Option + ) -> Result>> { + args + } + }, + ) + .unwrap(); + + assert!(errors.is_empty()); + expectorate::assert_contents( + "tests/return_vec_box_sketch_group.gen", + &openapitor::types::get_text_fmt(&item).unwrap(), + ); + } } diff --git a/src/wasm-lib/derive-docs/tests/array.gen b/src/wasm-lib/derive-docs/tests/array.gen index 362ebdd38..a06729cf6 100644 --- a/src/wasm-lib/derive-docs/tests/array.gen +++ b/src/wasm-lib/derive-docs/tests/array.gen @@ -55,7 +55,7 @@ impl crate::docs::StdLibFn for Show { Some(crate::docs::StdLibFnArg { name: "".to_string(), type_: "number".to_string(), - schema: f64::json_schema(&mut generator), + schema: ::json_schema(&mut generator), required: true, }) } @@ -77,6 +77,6 @@ impl crate::docs::StdLibFn for Show { } } -fn inner_show(#[doc = r" The args to do shit to."] args: [f64; 2]) -> Box { +fn inner_show(#[doc = r" The args to do shit to."] args: [f64; 2]) -> Result> { args } diff --git a/src/wasm-lib/derive-docs/tests/box.gen b/src/wasm-lib/derive-docs/tests/box.gen index a21f0ca0f..84f1f9262 100644 --- a/src/wasm-lib/derive-docs/tests/box.gen +++ b/src/wasm-lib/derive-docs/tests/box.gen @@ -55,7 +55,7 @@ impl crate::docs::StdLibFn for Show { Some(crate::docs::StdLibFnArg { name: "".to_string(), type_: "number".to_string(), - schema: f64::json_schema(&mut generator), + schema: ::json_schema(&mut generator), required: true, }) } diff --git a/src/wasm-lib/derive-docs/tests/lineTo.gen b/src/wasm-lib/derive-docs/tests/lineTo.gen index 6d2e34f4a..ffc78c18c 100644 --- a/src/wasm-lib/derive-docs/tests/lineTo.gen +++ b/src/wasm-lib/derive-docs/tests/lineTo.gen @@ -63,7 +63,7 @@ impl crate::docs::StdLibFn for LineTo { Some(crate::docs::StdLibFnArg { name: "".to_string(), type_: "SketchGroup".to_string(), - schema: SketchGroup::json_schema(&mut generator), + schema: ::json_schema(&mut generator), required: true, }) } diff --git a/src/wasm-lib/derive-docs/tests/min.gen b/src/wasm-lib/derive-docs/tests/min.gen index d9b393efd..3bfac9c7b 100644 --- a/src/wasm-lib/derive-docs/tests/min.gen +++ b/src/wasm-lib/derive-docs/tests/min.gen @@ -55,7 +55,7 @@ impl crate::docs::StdLibFn for Min { Some(crate::docs::StdLibFnArg { name: "".to_string(), type_: "number".to_string(), - schema: f64::json_schema(&mut generator), + schema: ::json_schema(&mut generator), required: true, }) } diff --git a/src/wasm-lib/derive-docs/tests/option.gen b/src/wasm-lib/derive-docs/tests/option.gen index f743e517d..dce8d619d 100644 --- a/src/wasm-lib/derive-docs/tests/option.gen +++ b/src/wasm-lib/derive-docs/tests/option.gen @@ -55,7 +55,7 @@ impl crate::docs::StdLibFn for Show { Some(crate::docs::StdLibFnArg { name: "".to_string(), type_: "number".to_string(), - schema: f64::json_schema(&mut generator), + schema: ::json_schema(&mut generator), required: true, }) } @@ -77,6 +77,6 @@ impl crate::docs::StdLibFn for Show { } } -fn inner_show(#[doc = r" The args to do shit to."] args: Option) -> Box { +fn inner_show(#[doc = r" The args to do shit to."] args: Option) -> Result> { args } diff --git a/src/wasm-lib/derive-docs/tests/option_input_format.gen b/src/wasm-lib/derive-docs/tests/option_input_format.gen index 3ccc218a4..a15f62310 100644 --- a/src/wasm-lib/derive-docs/tests/option_input_format.gen +++ b/src/wasm-lib/derive-docs/tests/option_input_format.gen @@ -55,7 +55,7 @@ impl crate::docs::StdLibFn for Import { Some(crate::docs::StdLibFnArg { name: "".to_string(), type_: "number".to_string(), - schema: f64::json_schema(&mut generator), + schema: ::json_schema(&mut generator), required: true, }) } @@ -79,6 +79,6 @@ impl crate::docs::StdLibFn for Import { fn inner_import( #[doc = r" The args to do shit to."] args: Option, -) -> Box { +) -> Result> { args } diff --git a/src/wasm-lib/derive-docs/tests/return_vec_box_sketch_group.gen b/src/wasm-lib/derive-docs/tests/return_vec_box_sketch_group.gen new file mode 100644 index 000000000..f2e72e878 --- /dev/null +++ b/src/wasm-lib/derive-docs/tests/return_vec_box_sketch_group.gen @@ -0,0 +1,84 @@ +#[allow(non_camel_case_types, missing_docs)] +#[doc = "Std lib function: import"] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, schemars :: JsonSchema, ts_rs :: TS)] +#[ts(export)] +pub(crate) struct Import {} + +#[allow(non_upper_case_globals, missing_docs)] +#[doc = "Std lib function: import"] +pub(crate) const Import: Import = Import {}; +fn boxed_import( + args: crate::std::Args, +) -> std::pin::Pin< + Box< + dyn std::future::Future< + Output = anyhow::Result, + >, + >, +> { + Box::pin(import(args)) +} + +impl crate::docs::StdLibFn for Import { + fn name(&self) -> String { + "import".to_string() + } + + fn summary(&self) -> String { + "".to_string() + } + + fn description(&self) -> String { + "".to_string() + } + + fn tags(&self) -> Vec { + vec![] + } + + fn args(&self) -> Vec { + let mut settings = schemars::gen::SchemaSettings::openapi3(); + settings.inline_subschemas = true; + let mut generator = schemars::gen::SchemaGenerator::new(settings); + vec![crate::docs::StdLibFnArg { + name: "args".to_string(), + type_: "kittycad::types::InputFormat".to_string(), + schema: >::json_schema(&mut generator), + required: false, + }] + } + + fn return_value(&self) -> Option { + let mut settings = schemars::gen::SchemaSettings::openapi3(); + settings.inline_subschemas = true; + let mut generator = schemars::gen::SchemaGenerator::new(settings); + Some(crate::docs::StdLibFnArg { + name: "".to_string(), + type_: "[SketchGroup]".to_string(), + schema: >::json_schema(&mut generator), + required: true, + }) + } + + fn unpublished(&self) -> bool { + false + } + + fn deprecated(&self) -> bool { + false + } + + fn std_lib_fn(&self) -> crate::std::StdFn { + boxed_import + } + + fn clone_box(&self) -> Box { + Box::new(self.clone()) + } +} + +fn inner_import( + #[doc = r" The args to do shit to."] args: Option, +) -> Result>> { + args +} diff --git a/src/wasm-lib/derive-docs/tests/return_vec_sketch_group.gen b/src/wasm-lib/derive-docs/tests/return_vec_sketch_group.gen new file mode 100644 index 000000000..0c937f24f --- /dev/null +++ b/src/wasm-lib/derive-docs/tests/return_vec_sketch_group.gen @@ -0,0 +1,84 @@ +#[allow(non_camel_case_types, missing_docs)] +#[doc = "Std lib function: import"] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, schemars :: JsonSchema, ts_rs :: TS)] +#[ts(export)] +pub(crate) struct Import {} + +#[allow(non_upper_case_globals, missing_docs)] +#[doc = "Std lib function: import"] +pub(crate) const Import: Import = Import {}; +fn boxed_import( + args: crate::std::Args, +) -> std::pin::Pin< + Box< + dyn std::future::Future< + Output = anyhow::Result, + >, + >, +> { + Box::pin(import(args)) +} + +impl crate::docs::StdLibFn for Import { + fn name(&self) -> String { + "import".to_string() + } + + fn summary(&self) -> String { + "".to_string() + } + + fn description(&self) -> String { + "".to_string() + } + + fn tags(&self) -> Vec { + vec![] + } + + fn args(&self) -> Vec { + let mut settings = schemars::gen::SchemaSettings::openapi3(); + settings.inline_subschemas = true; + let mut generator = schemars::gen::SchemaGenerator::new(settings); + vec![crate::docs::StdLibFnArg { + name: "args".to_string(), + type_: "kittycad::types::InputFormat".to_string(), + schema: >::json_schema(&mut generator), + required: false, + }] + } + + fn return_value(&self) -> Option { + let mut settings = schemars::gen::SchemaSettings::openapi3(); + settings.inline_subschemas = true; + let mut generator = schemars::gen::SchemaGenerator::new(settings); + Some(crate::docs::StdLibFnArg { + name: "".to_string(), + type_: "[SketchGroup]".to_string(), + schema: >::json_schema(&mut generator), + required: true, + }) + } + + fn unpublished(&self) -> bool { + false + } + + fn deprecated(&self) -> bool { + false + } + + fn std_lib_fn(&self) -> crate::std::StdFn { + boxed_import + } + + fn clone_box(&self) -> Box { + Box::new(self.clone()) + } +} + +fn inner_import( + #[doc = r" The args to do shit to."] args: Option, +) -> Result> { + args +} diff --git a/src/wasm-lib/derive-docs/tests/show.gen b/src/wasm-lib/derive-docs/tests/show.gen index 0d2538429..71c54d7b9 100644 --- a/src/wasm-lib/derive-docs/tests/show.gen +++ b/src/wasm-lib/derive-docs/tests/show.gen @@ -52,7 +52,12 @@ impl crate::docs::StdLibFn for Show { let mut settings = schemars::gen::SchemaSettings::openapi3(); settings.inline_subschemas = true; let mut generator = schemars::gen::SchemaGenerator::new(settings); - None + Some(crate::docs::StdLibFnArg { + name: "".to_string(), + type_: "()".to_string(), + schema: <()>::json_schema(&mut generator), + required: true, + }) } fn unpublished(&self) -> bool { diff --git a/src/wasm-lib/kcl/Cargo.toml b/src/wasm-lib/kcl/Cargo.toml index f570b1f14..cc122a27f 100644 --- a/src/wasm-lib/kcl/Cargo.toml +++ b/src/wasm-lib/kcl/Cargo.toml @@ -17,8 +17,8 @@ async-trait = "0.1.77" clap = { version = "4.5.2", features = ["cargo", "derive", "env", "unicode"], optional = true } dashmap = "5.5.3" databake = { version = "0.1.7", features = ["derive"] } -derive-docs = { version = "0.1.9" } -#derive-docs = { path = "../derive-docs" } +#derive-docs = { version = "0.1.10" } +derive-docs = { path = "../derive-docs" } futures = { version = "0.3.30" } gltf-json = "1.4.0" kittycad = { workspace = true } diff --git a/src/wasm-lib/kcl/src/docs.rs b/src/wasm-lib/kcl/src/docs.rs index 045cb9e92..99b046cec 100644 --- a/src/wasm-lib/kcl/src/docs.rs +++ b/src/wasm-lib/kcl/src/docs.rs @@ -310,7 +310,7 @@ pub fn get_type_string_from_schema(schema: &schemars::schema::Schema) -> Result< if let Some(format) = &o.format { if format == "uuid" { return Ok((Primitive::Uuid.to_string(), false)); - } else if format == "double" || format == "uint" || format == "int64" { + } else if format == "double" || format == "uint" || format == "int64" || format == "uint32" { return Ok((Primitive::Number.to_string(), false)); } else { anyhow::bail!("unknown format: {}", format); @@ -428,7 +428,7 @@ pub fn get_autocomplete_string_from_schema(schema: &schemars::schema::Schema) -> if let Some(format) = &o.format { if format == "uuid" { return Ok(Primitive::Uuid.to_string()); - } else if format == "double" || format == "uint" || format == "int64" { + } else if format == "double" || format == "uint" || format == "int64" || format == "uint32" { return Ok(Primitive::Number.to_string()); } else { anyhow::bail!("unknown format: {}", format); diff --git a/src/wasm-lib/kcl/src/std/mod.rs b/src/wasm-lib/kcl/src/std/mod.rs index e9febe35c..4757701f5 100644 --- a/src/wasm-lib/kcl/src/std/mod.rs +++ b/src/wasm-lib/kcl/src/std/mod.rs @@ -27,8 +27,7 @@ use crate::{ engine::EngineManager, errors::{KclError, KclErrorDetails}, executor::{ - ExecutorContext, ExtrudeGroup, Geometry, MemoryItem, Metadata, SketchGroup, SketchGroupSet, SketchSurface, - SourceRange, + ExecutorContext, ExtrudeGroup, MemoryItem, Metadata, SketchGroup, SketchGroupSet, SketchSurface, SourceRange, }, std::{kcl_stdlib::KclStdLibFn, sketch::SketchOnFaceTag}, }; @@ -72,8 +71,10 @@ lazy_static! { Box::new(crate::std::sketch::TangentialArcTo), Box::new(crate::std::sketch::BezierCurve), Box::new(crate::std::sketch::Hole), - Box::new(crate::std::patterns::PatternLinear), - Box::new(crate::std::patterns::PatternCircular), + Box::new(crate::std::patterns::PatternLinear2D), + Box::new(crate::std::patterns::PatternLinear3D), + Box::new(crate::std::patterns::PatternCircular2D), + Box::new(crate::std::patterns::PatternCircular3D), Box::new(crate::std::fillet::Fillet), Box::new(crate::std::fillet::GetOppositeEdge), Box::new(crate::std::fillet::GetNextAdjacentEdge), @@ -522,49 +523,6 @@ impl Args { Ok((data, sketch_group)) } - fn get_data_and_geometry(&self) -> Result<(T, Geometry), KclError> { - let first_value = self - .args - .first() - .ok_or_else(|| { - KclError::Type(KclErrorDetails { - message: format!("Expected a struct as the first argument, found `{:?}`", self.args), - source_ranges: vec![self.source_range], - }) - })? - .get_json_value()?; - - let data: T = serde_json::from_value(first_value).map_err(|e| { - KclError::Type(KclErrorDetails { - message: format!("Failed to deserialize struct from JSON: {}", e), - source_ranges: vec![self.source_range], - }) - })?; - - let second_value = self.args.get(1).ok_or_else(|| { - KclError::Type(KclErrorDetails { - message: format!("Expected a SketchGroup as the second argument, found `{:?}`", self.args), - source_ranges: vec![self.source_range], - }) - })?; - - let geometry = if let MemoryItem::SketchGroup(sg) = second_value { - Geometry::SketchGroup(sg.clone()) - } else if let MemoryItem::ExtrudeGroup(eg) = second_value { - Geometry::ExtrudeGroup(eg.clone()) - } else { - return Err(KclError::Type(KclErrorDetails { - message: format!( - "Expected a SketchGroup or ExtrudeGroup as the second argument, found `{:?}`", - self.args - ), - source_ranges: vec![self.source_range], - })); - }; - - Ok((data, geometry)) - } - fn get_data_and_sketch_surface(&self) -> Result<(T, SketchSurface), KclError> { let first_value = self .args diff --git a/src/wasm-lib/kcl/src/std/patterns.rs b/src/wasm-lib/kcl/src/std/patterns.rs index 180bf6458..2bf5b3031 100644 --- a/src/wasm-lib/kcl/src/std/patterns.rs +++ b/src/wasm-lib/kcl/src/std/patterns.rs @@ -8,47 +8,71 @@ use serde::{Deserialize, Serialize}; use crate::{ errors::{KclError, KclErrorDetails}, - executor::{Geometries, Geometry, MemoryItem}, + executor::{ExtrudeGroup, Geometries, Geometry, MemoryItem, SketchGroup}, std::Args, }; -/// Data for a linear pattern. +/// Data for a linear pattern on a 2D sketch. #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(rename_all = "camelCase")] -pub struct LinearPatternData { +pub struct LinearPattern2dData { /// The number of repetitions. Must be greater than 0. /// This excludes the original entity. For example, if `repetitions` is 1, /// the original entity will be copied once. - pub repetitions: usize, + pub repetitions: u32, /// The distance between each repetition. This can also be referred to as spacing. pub distance: f64, /// The axis of the pattern. This is a 2D vector. pub axis: [f64; 2], } -/// Data for a circular pattern. +/// Data for a linear pattern on a 3D model. #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(rename_all = "camelCase")] -pub struct CircularPatternData { +pub struct LinearPattern3dData { /// The number of repetitions. Must be greater than 0. /// This excludes the original entity. For example, if `repetitions` is 1, /// the original entity will be copied once. - pub repetitions: usize, - /// The axis around which to make the pattern. This is a 2D vector. - pub axis: [f64; 2], - /// The center about which to make th pattern. This is a 3D vector. - pub center: [f64; 3], - /// The arc angle (in degrees) to place the repetitions. Must be greater than 0. - pub arc_degrees: f64, - /// Whether or not to rotate the duplicates as they are copied. - pub rotate_duplicates: bool, + pub repetitions: u32, + /// The distance between each repetition. This can also be referred to as spacing. + pub distance: f64, + /// The axis of the pattern. + pub axis: [f64; 3], } -/// A linear pattern. -pub async fn pattern_linear(args: Args) -> Result { - let (data, geometry): (LinearPatternData, Geometry) = args.get_data_and_geometry()?; +pub enum LinearPattern { + ThreeD(LinearPattern3dData), + TwoD(LinearPattern2dData), +} + +impl LinearPattern { + pub fn axis(&self) -> [f64; 3] { + match self { + LinearPattern::TwoD(lp) => [lp.axis[0], lp.axis[1], 0.0], + LinearPattern::ThreeD(lp) => lp.axis, + } + } + + pub fn repetitions(&self) -> u32 { + match self { + LinearPattern::TwoD(lp) => lp.repetitions, + LinearPattern::ThreeD(lp) => lp.repetitions, + } + } + + pub fn distance(&self) -> f64 { + match self { + LinearPattern::TwoD(lp) => lp.distance, + LinearPattern::ThreeD(lp) => lp.distance, + } + } +} + +/// A linear pattern on a 2D sketch. +pub async fn pattern_linear_2d(args: Args) -> Result { + let (data, sketch_group): (LinearPattern2dData, Box) = args.get_data_and_sketch_group()?; if data.axis == [0.0, 0.0] { return Err(KclError::Semantic(KclErrorDetails { @@ -59,38 +83,80 @@ pub async fn pattern_linear(args: Args) -> Result { })); } - let new_geometries = inner_pattern_linear(data, geometry, args).await?; - match new_geometries { - Geometries::SketchGroups(sketch_groups) => Ok(MemoryItem::SketchGroups { value: sketch_groups }), - Geometries::ExtrudeGroups(extrude_groups) => Ok(MemoryItem::ExtrudeGroups { value: extrude_groups }), - } + let sketch_groups = inner_pattern_linear_2d(data, sketch_group, args).await?; + Ok(MemoryItem::SketchGroups { value: sketch_groups }) } -/// A circular pattern. -pub async fn pattern_circular(args: Args) -> Result { - let (data, geometry): (CircularPatternData, Geometry) = args.get_data_and_geometry()?; +/// A linear pattern on a 2D sketch. +#[stdlib { + name = "patternLinear2d", +}] +async fn inner_pattern_linear_2d( + data: LinearPattern2dData, + sketch_group: Box, + args: Args, +) -> Result>, KclError> { + let geometries = pattern_linear( + LinearPattern::TwoD(data), + Geometry::SketchGroup(sketch_group), + args.clone(), + ) + .await?; - if data.axis == [0.0, 0.0] { + let Geometries::SketchGroups(sketch_groups) = geometries else { + return Err(KclError::Semantic(KclErrorDetails { + message: "Expected a vec of sketch groups".to_string(), + source_ranges: vec![args.source_range], + })); + }; + + Ok(sketch_groups) +} + +/// A linear pattern on a 3D model. +pub async fn pattern_linear_3d(args: Args) -> Result { + let (data, extrude_group): (LinearPattern3dData, Box) = args.get_data_and_extrude_group()?; + + if data.axis == [0.0, 0.0, 0.0] { return Err(KclError::Semantic(KclErrorDetails { message: - "The axis of the circular pattern cannot be the zero vector. Otherwise they will just duplicate in place." + "The axis of the linear pattern cannot be the zero vector. Otherwise they will just duplicate in place." .to_string(), source_ranges: vec![args.source_range], })); } - let new_geometries = inner_pattern_circular(data, geometry, args).await?; - match new_geometries { - Geometries::SketchGroups(sketch_groups) => Ok(MemoryItem::SketchGroups { value: sketch_groups }), - Geometries::ExtrudeGroups(extrude_groups) => Ok(MemoryItem::ExtrudeGroups { value: extrude_groups }), - } + let extrude_groups = inner_pattern_linear_3d(data, extrude_group, args).await?; + Ok(MemoryItem::ExtrudeGroups { value: extrude_groups }) } -/// A linear pattern. +/// A linear pattern on a 3D model. #[stdlib { - name = "patternLinear", + name = "patternLinear3d", }] -async fn inner_pattern_linear(data: LinearPatternData, geometry: Geometry, args: Args) -> Result { +async fn inner_pattern_linear_3d( + data: LinearPattern3dData, + extrude_group: Box, + args: Args, +) -> Result>, KclError> { + let geometries = pattern_linear( + LinearPattern::ThreeD(data), + Geometry::ExtrudeGroup(extrude_group), + args.clone(), + ) + .await?; + + let Geometries::ExtrudeGroups(extrude_groups) = geometries else { + return Err(KclError::Semantic(KclErrorDetails { + message: "Expected a vec of extrude groups".to_string(), + source_ranges: vec![args.source_range], + })); + }; + + Ok(extrude_groups) +} + +async fn pattern_linear(data: LinearPattern, geometry: Geometry, args: Args) -> Result { let id = uuid::Uuid::new_v4(); let resp = args @@ -98,13 +164,13 @@ async fn inner_pattern_linear(data: LinearPatternData, geometry: Geometry, args: id, ModelingCmd::EntityLinearPattern { axis: kittycad::types::Point3D { - x: data.axis[0], - y: data.axis[1], - z: 0.0, + x: data.axis()[0], + y: data.axis()[1], + z: data.axis()[2], }, entity_id: geometry.id(), - num_repetitions: data.repetitions as u32, - spacing: data.distance, + num_repetitions: data.repetitions(), + spacing: data.distance(), }, ) .await?; @@ -143,15 +209,153 @@ async fn inner_pattern_linear(data: LinearPatternData, geometry: Geometry, args: Ok(geometries) } -/// A Circular pattern. +/// Data for a circular pattern on a 2D sketch. +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct CircularPattern2dData { + /// The number of repetitions. Must be greater than 0. + /// This excludes the original entity. For example, if `repetitions` is 1, + /// the original entity will be copied once. + pub repetitions: u32, + /// The center about which to make th pattern. This is a 2D vector. + pub center: [f64; 2], + /// The arc angle (in degrees) to place the repetitions. Must be greater than 0. + pub arc_degrees: f64, + /// Whether or not to rotate the duplicates as they are copied. + pub rotate_duplicates: bool, +} + +/// Data for a circular pattern on a 3D model. +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct CircularPattern3dData { + /// The number of repetitions. Must be greater than 0. + /// This excludes the original entity. For example, if `repetitions` is 1, + /// the original entity will be copied once. + pub repetitions: u32, + /// The axis around which to make the pattern. This is a 3D vector. + pub axis: [f64; 3], + /// The center about which to make th pattern. This is a 3D vector. + pub center: [f64; 3], + /// The arc angle (in degrees) to place the repetitions. Must be greater than 0. + pub arc_degrees: f64, + /// Whether or not to rotate the duplicates as they are copied. + pub rotate_duplicates: bool, +} + +pub enum CircularPattern { + ThreeD(CircularPattern3dData), + TwoD(CircularPattern2dData), +} + +impl CircularPattern { + pub fn axis(&self) -> [f64; 3] { + match self { + CircularPattern::TwoD(_lp) => [0.0, 0.0, 0.0], + CircularPattern::ThreeD(lp) => lp.axis, + } + } + + pub fn center(&self) -> [f64; 3] { + match self { + CircularPattern::TwoD(lp) => [lp.center[0], lp.center[1], 0.0], + CircularPattern::ThreeD(lp) => lp.center, + } + } + + pub fn repetitions(&self) -> u32 { + match self { + CircularPattern::TwoD(lp) => lp.repetitions, + CircularPattern::ThreeD(lp) => lp.repetitions, + } + } + + pub fn arc_degrees(&self) -> f64 { + match self { + CircularPattern::TwoD(lp) => lp.arc_degrees, + CircularPattern::ThreeD(lp) => lp.arc_degrees, + } + } + + pub fn rotate_duplicates(&self) -> bool { + match self { + CircularPattern::TwoD(lp) => lp.rotate_duplicates, + CircularPattern::ThreeD(lp) => lp.rotate_duplicates, + } + } +} + +/// A circular pattern on a 2D sketch. +pub async fn pattern_circular_2d(args: Args) -> Result { + let (data, sketch_group): (CircularPattern2dData, Box) = args.get_data_and_sketch_group()?; + + let sketch_groups = inner_pattern_circular_2d(data, sketch_group, args).await?; + Ok(MemoryItem::SketchGroups { value: sketch_groups }) +} + +/// A circular pattern on a 2D sketch. #[stdlib { - name = "patternCircular", + name = "patternCircular2d", }] -async fn inner_pattern_circular( - data: CircularPatternData, - geometry: Geometry, +async fn inner_pattern_circular_2d( + data: CircularPattern2dData, + sketch_group: Box, args: Args, -) -> Result { +) -> Result>, KclError> { + let geometries = pattern_circular( + CircularPattern::TwoD(data), + Geometry::SketchGroup(sketch_group), + args.clone(), + ) + .await?; + + let Geometries::SketchGroups(sketch_groups) = geometries else { + return Err(KclError::Semantic(KclErrorDetails { + message: "Expected a vec of sketch groups".to_string(), + source_ranges: vec![args.source_range], + })); + }; + + Ok(sketch_groups) +} + +/// A circular pattern on a 3D model. +pub async fn pattern_circular_3d(args: Args) -> Result { + let (data, extrude_group): (CircularPattern3dData, Box) = args.get_data_and_extrude_group()?; + + let extrude_groups = inner_pattern_circular_3d(data, extrude_group, args).await?; + Ok(MemoryItem::ExtrudeGroups { value: extrude_groups }) +} + +/// A circular pattern on a 3D model. +#[stdlib { + name = "patternCircular3d", +}] +async fn inner_pattern_circular_3d( + data: CircularPattern3dData, + extrude_group: Box, + args: Args, +) -> Result>, KclError> { + let geometries = pattern_circular( + CircularPattern::ThreeD(data), + Geometry::ExtrudeGroup(extrude_group), + args.clone(), + ) + .await?; + + let Geometries::ExtrudeGroups(extrude_groups) = geometries else { + return Err(KclError::Semantic(KclErrorDetails { + message: "Expected a vec of extrude groups".to_string(), + source_ranges: vec![args.source_range], + })); + }; + + Ok(extrude_groups) +} + +async fn pattern_circular(data: CircularPattern, geometry: Geometry, args: Args) -> Result { let id = uuid::Uuid::new_v4(); let resp = args @@ -159,15 +363,15 @@ async fn inner_pattern_circular( id, ModelingCmd::EntityCircularPattern { axis: kittycad::types::Point3D { - x: data.axis[0], - y: data.axis[1], - z: 0.0, + x: data.axis()[0], + y: data.axis()[1], + z: data.axis()[2], }, entity_id: geometry.id(), - center: data.center.into(), - num_repetitions: data.repetitions as u32, - arc_degrees: data.arc_degrees, - rotate_duplicates: data.rotate_duplicates, + center: data.center().into(), + num_repetitions: data.repetitions(), + arc_degrees: data.arc_degrees(), + rotate_duplicates: data.rotate_duplicates(), }, ) .await?; diff --git a/src/wasm-lib/tests/executor/main.rs b/src/wasm-lib/tests/executor/main.rs index 5333db544..0cbd7b2f7 100644 --- a/src/wasm-lib/tests/executor/main.rs +++ b/src/wasm-lib/tests/executor/main.rs @@ -815,7 +815,7 @@ async fn serial_test_top_level_expression() { async fn serial_test_patterns_linear_basic() { let code = r#"const part = startSketchOn('XY') |> circle([0,0], 2, %) - |> patternLinear({axis: [0,1], repetitions: 12, distance: 2}, %) + |> patternLinear2d({axis: [0,1], repetitions: 12, distance: 2}, %) "#; let result = execute_and_snapshot(code, kittycad::types::UnitLength::Mm) @@ -833,7 +833,7 @@ async fn serial_test_patterns_linear_basic_3d() { |> line([0, -1], %) |> close(%) |> extrude(1, %) - |> patternLinear({axis: [1, 0], repetitions: 3, distance: 6}, %) + |> patternLinear3d({axis: [1, 0, 1], repetitions: 3, distance: 6}, %) "#; let result = execute_and_snapshot(code, kittycad::types::UnitLength::Mm) @@ -846,7 +846,7 @@ async fn serial_test_patterns_linear_basic_3d() { async fn serial_test_patterns_linear_basic_negative_distance() { let code = r#"const part = startSketchOn('XY') |> circle([0,0], 2, %) - |> patternLinear({axis: [0,1], repetitions: 12, distance: -2}, %) + |> patternLinear2d({axis: [0,1], repetitions: 12, distance: -2}, %) "#; let result = execute_and_snapshot(code, kittycad::types::UnitLength::Mm) @@ -863,7 +863,7 @@ async fn serial_test_patterns_linear_basic_negative_distance() { async fn serial_test_patterns_linear_basic_negative_axis() { let code = r#"const part = startSketchOn('XY') |> circle([0,0], 2, %) - |> patternLinear({axis: [0,-1], repetitions: 12, distance: 2}, %) + |> patternLinear2d({axis: [0,-1], repetitions: 12, distance: 2}, %) "#; let result = execute_and_snapshot(code, kittycad::types::UnitLength::Mm) @@ -880,7 +880,7 @@ async fn serial_test_patterns_linear_basic_negative_axis() { async fn serial_test_patterns_linear_basic_holes() { let code = r#"const circles = startSketchOn('XY') |> circle([5, 5], 1, %) - |> patternLinear({axis: [1,1], repetitions: 12, distance: 3}, %) + |> patternLinear2d({axis: [1,1], repetitions: 12, distance: 3}, %) const rectangle = startSketchOn('XY') |> startProfileAt([0, 0], %) @@ -902,7 +902,7 @@ const rectangle = startSketchOn('XY') async fn serial_test_patterns_circular_basic_2d() { let code = r#"const part = startSketchOn('XY') |> circle([0,0], 2, %) - |> patternCircular({axis: [0,1], center: [20, 20, 20], repetitions: 12, arcDegrees: 210, rotateDuplicates: true}, %) + |> patternCircular2d({center: [20, 20], repetitions: 12, arcDegrees: 210, rotateDuplicates: true}, %) "#; let result = execute_and_snapshot(code, kittycad::types::UnitLength::Mm) @@ -920,7 +920,7 @@ async fn serial_test_patterns_circular_basic_3d() { |> line([0, -1], %) |> close(%) |> extrude(1, %) - |> patternCircular({axis: [0,1], center: [-20, -20, -20], repetitions: 40, arcDegrees: 360, rotateDuplicates: false}, %) + |> patternCircular3d({axis: [0,0, 1], center: [-20, -20, -20], repetitions: 40, arcDegrees: 360, rotateDuplicates: false}, %) "#; let result = execute_and_snapshot(code, kittycad::types::UnitLength::Mm) @@ -938,7 +938,7 @@ async fn serial_test_patterns_circular_3d_tilted_axis() { |> line([0, -1], %) |> close(%) |> extrude(1, %) - |> patternCircular({axis: [1,1], center: [10, 0, 10], repetitions: 10, arcDegrees: 360, rotateDuplicates: true}, %) + |> patternCircular3d({axis: [1,1,0], center: [10, 0, 10], repetitions: 10, arcDegrees: 360, rotateDuplicates: true}, %) "#; let result = execute_and_snapshot(code, kittycad::types::UnitLength::Mm) diff --git a/src/wasm-lib/tests/executor/outputs/patterns_circular_basic_3d.png b/src/wasm-lib/tests/executor/outputs/patterns_circular_basic_3d.png index b4a8548c9e175f9ccb57d1f1e694427009fa488d..62720fccce3d5600d64f2a904f8d6981e2af53cc 100644 GIT binary patch literal 108598 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 literal 104217 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

fLIu`xfS|DYv2POW&{JHe9)oKA0>%dXA7=KGG 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ð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 diff --git a/src/wasm-lib/tests/executor/outputs/patterns_linear_basic_3d.png b/src/wasm-lib/tests/executor/outputs/patterns_linear_basic_3d.png index ec40e200dee5086f32c67a1967d197fe36380390..a52b09d87d6bfcdb7e04ec541c1d1c489c9dbae7 100644 GIT binary patch literal 95314 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 z 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 literal 95046 zcmeFaYkZZ}nKmBqfQM?-4yM-X)=JwMQDaLhRe|lH4)#c$Hl_-acAS=0su2;9KzOw3 zKUH)hwG5?*(b5hz5mJZJa4>8Y5G#k&A|N1ygAh!B03oNH?7iN5UDv&yy`G)j`Tf7V zpI-YRm1G~*v(|mM?(06RC%^lhk!PLp=`-^3^3MADtzY}Myu4H7Kl}gfv{U8(8p?Ox zp4V^USzrI!jo*K`-{IZ;o*ne{Uk&>Dc{8f#tQh&Vul?jFKe@d~{x{kFuXFwXjsHDp zKf1Wse#=jO@~{8;wZ~V?opVORw|-JQdD7&`qZ;g2e(T@M|Mu9$tBZ>7nzXs^kM`ia zSv8B6H&^HQVJ^Qs_nRhdHbvk62XCr2HGdqF>zm|vruepHIlrm8CSCix2XZXWeo(69 zmi@VwC%;Q3o_eS6GvV9YgMlAEn75-JpIAgFKNdw#Ha^y|h-?(!^|A4Y8vc)sM?^qA zHXa`vkB^Z@1OR@F6(bn>V-Os{`5&YENC5M3*b5oqkN1MxxV?jmQ6U#v>VPT{HI3nz3^;Fw;D`@rB`2Tgp3kP999_ zks9UF3g*>C%MSc@K(J|O`KC=~Pb|Hst~-8k{hT5Br+#&6$DxJ2u@nDZ*zxbRseE%Z zKe55wIBw(fQ?7n}+v0Jh`^}35Q(rBZdN}B+2)gb~=YKl+(HnWG@Amz}brTP)f2^Nf z#9%X^{{0#C?~iYs+*n>Gzv#FOidp7vyJ?4($oI#4SB&`Z<`ExWD$o8uwLNE4 zopN+`qI+D`Dsy91&$6nX(edM##gAWWKmX{C-q^$qU)egWYvPEeiPKx;T{mC+rnynJ zF_yk7uf(*Mm=V#Jv?S6kjZO9i)91>UHccAaRNr{)qQ+x(F(X4RCRCX6K)+dal>QX@dI_! zTk2N!@F#X+hOYYypIypeIC#Dx^+7{wVZ!tz%;Co5!p7u%>3n^vnX&Gf4Z0lj;^b*- zC-=T0zlwGLJY88P687p=`}&2gd(0nkxC`aPT5n&JEcvL_q+5d?2>c8)Kb@9;*Og#T zyW$7!!M2YKPK=D(-%Q#y!#pN3*z+{L{Rjl)Dp|w3vDCW_-S~p^f0rizd%;B7Q1j)J zRa+{L%dsy@oN^SKB685$^`EU>cjUl{^W$EJ@UZ`)krs073qdkEwi^nzWN~&<&2;t!3T2FkZ^~4>$u?HLF zlaitX?X7Lx9QR^*>O^Wd#HaD2dAmMZ>?Hn-P~sn6D}vCl9BM8SH>Y-$xs4wT3A_&9 z=k~t*!1_4@%$CyBmdS0wdwAR}c$TwG1%!R2mGJ%5W)}1d#-=TJUtV8Y-hh2M-;7Mb z`keF{9=k30o85+%%Jjj?=^L%81O;Y*C_s7LbnMx%j#n$o7eZLCARU;jdSo}b4)YLC zPXwa2Z5P)ohi%Pk<0)2?ttr)~ahlt~9ddu(ou}zzl(tjtA@uDyKG}O;D#Itj$D9>D5f{zx z*7JGDF7BNoQ+DD6B6$32>^Ml4@#Jl~GW)#-(kUHMVvUyvl%sZ-mXH_dc*xRqroz`DGDKl-7T_R#Yau%k7!ouUgZ%eqxuLFu<^^9gL*3=Wmexs zfgwdyjq!<&@reRcL5ubp&h(h5xalYj@?Vz|zJ9vZaXf-KD9dh|2GJ<7TYW(F_8w>Q zXZO(Iinr=%Ov5>di1vAsaFtM72aCqsM}KEu)cQc&hMEfe(ITQP zv?=Mz<<@4U;PR*7gr`SUrLlKIWACDd?&ll2uhdAO2+pb+P1jvc<_N$*$7hT@a(%tn&$?b z-RZ#jw&5UCG*D`CW;v5n*rpy_BhV1ttKo6bZEda*{=$&U}$$rbV_)sX&(o+^*8QBPa)gtPPKDH3o7 zQPqx;tIsk4UTd2J3!T(Vm3fM_V6&c2*iE)yGreg|N$;AHxn|$=p1PoCD&bpq{0N~8 zz)lYhN<|8SOo^f$6zk^sEvu2cBR;A&)XU{OVg3{Z-7xKmWr{50n-$$y4RxsHhr9nD&EI#@Oh&`PYk%n zJPHMe2#;wG-o!@ICdRs838v%W_nM`R>BEib7x?h_De+Ga%%&nqn2){YPXI~{$yXZ6 z=JD0|{!-P~hOcRPm-#YHG|@bT8Wzt&l}<4|c=N&`<2DZK5>0G)7z;UIsHU~p|HJ&~ zv}!USPq}*?-=Fom57!M#F6k^hva{^aq`&MEiNj$q9I;UO6YjJ4+y~53xMx9k->HH! z3KU$5HQ_W{?8QW{8tri3 zho0#yd44A>XFIK}I~O&R&YW}ae9&%Q_X3b>Og;e6foe06k3CilV(*gfU^gDPhe61r zJmW`H|0;VJ!$Awvs((v~D)}?wDl0=*shA3q8np`)`!t-UScl1F3nnLDkr2E#h^1px zL1F`j7v@pu0uQ(*J?dHqtgbfsA2`Bei(9S)`r_UZ`*!PUAH~-{k5?Rauj}yxRG4Rn zR&I4@rJ@_Z@86|%`%$9A=t@tuL7`;QEKnbHDsVxn5(jw#{k=X>@cB&*U(cd?bPuJkk+3XGOiGH)?E= z*be1@HC+hcIFFWCY$9TasM&lHAGL@k*lybG=_<9IuxxwGlM&dp1zPA+15XldDZHuj z^#ml*Uh`xQ!>NZxa#3QW=NmyLt=HJ&PG>x8NDdQ9D@9;dM<{|(*lB$%w`f}F%+h<~ z#|T;I^rWyj_CPiQ4)!XDw+O$9AfB!Pq|#LE<76;aVyFM1@7n5U)sp>Gh77KrYrfzC z3#HISq^S(FtyG#X(0Z=4(7U`V_z=p~g1?FH>LK36dG0kcX{m4mh2k9PN+sh|zEeblyNoYxRp%U=5{Xpjh;=de; zndw3Fd(*LQJP+wa9McB#$*3ibANxmfYT@OoxMK%dQz6X0#(VJzeeLH+p@f9c47Zg4 zi&lsmKaxh2Mo8S&pFOwrc3&=AqY@fnXoW_hCPHj^u`(N zw;@niV=g1^%cBSCjZd&@VYze3FaRyCF`opgCOuS}+FqL)OGl-)r|?qs0Z%X=K&eYU zEBT#@qvmZob!RjyX*8+ON6q>OvaF<&3|Z|nxi+`7<9Ie8(>BAyh>*mUL=1d8we^@; zjYGrkb@0o$Acm^-SF5F|zrm03l=sy=RYF!NgUc9iC4MW@mn93@f>l?xZlrK=q%AewPznl6)Vi;>}qp>rWQ8C;@k?wDo zJlSQEHyc7e3_E?j2!}64MW$52=A0fuoSH@F^g2(C{Tz>C{SduH_+5K zR!m0W3CxTwbke|I6yGsutN#KG18Lj%@8kF zG6!N3!EjWF>v_Bi&dF4JL-4tcv7Se=}a;o&Z!*u zaY^UE5ohi$4B8q-RG4v|$7jG?*ByKaS#O%Qv8k7=Sc4k&%I8H&n9AM}JAP^G_&Mn+ z<(J{homE{=unDY3?@Ugkzr*AI10B5T5#@Zy zO$Hj!k;~F@g^FCJSXM1mAAPH)?eYm^%9+46??F!Stc#L?LhDhQbOhu%X8z{KL25Z0 zd?J9ta!empQjFv3H!^DCt4Z($=K__a;(ha^&K=U@?Q#_Y@e?G);14&L@A>=Q8;?}j z6q!~=aCTEPUD{^;hBQ`#t~noh4oOT)5{qy~o{g`-E@;GEMHjlfwr6=K<%8gf;i%C} zsj2vf!RUH?8f6L2`7`O5;x8ibsAAC1QQTBJlvOIkg2y7$W?q6~TWjlT2X6K~k(Nfp z!Kvmd9l%MoHY9jRn z#i<0!8jyiJX5NdS!^pvahLNL#+IY(?F!_-z5-HA-hgiWE!k#A0V`@;J)DYD9v8XNOLQ5ZU9*n!oE!|^Y z&BXs=K>u#fdhqLz$8=Q^)Wa0`kiCZ6J})BonV@GE@v}OIg9zgW?4~~h0yHtV*DQ?b z-=&U=iC)X*G$xOPi=-#V0%Vaqjx6~A0VEXrR)3qZ!=%?=B_5}fm#4A1)X40X3;L8b^XJY7ai3-R4iFOGnXqhjgjdA6WJFOyfS5G^`SavW7ig%70-eaJnHFddtk<(eQ+`@;6d?oHdY-OqE@6(d zk4%rcdNuC+LLAFQ;+GCXZC!$QEop5cysqF7DNQK&470!o10Du+u9?M)NEP=WP+`TV zS)p>Gm2+A|0#4H5%a>`=A@7d5t16?&;FMhvfC`RERV-2=P;ELb2LE9?hWZh@H2&<3 zvm^;HBgG;k)nFna3cGt53kVpeNLk$8TE=bW+l-rCxgs;ukoxdJ=;@qp#->K_+N++4 z5wnP_qRVsCS|Jcr9Q8Jsm6dM(Ab^>W|OaFvIX2N*UaH>Dusp|RKh<`#(SXb}-(=VeGsjeub zNa=!T1GUH`uE}XcA*;+pxD^(eEI)(snL`81lqR(sEy+OAzCOr1U|!`*JOkew?_hw# zEH61ckS*pcr?k-;RKwy6%DCFfDy>O^ZQ5g&QC+QrECX&d6MdXKX41g>t!1}R=ZC7e z^_{z>R;88Bz1zcuTGCkw+{t=P0%cZv87i>{U4iDjf>@~HWMp_}7M8(0QRuJrzalp;rd zXwKg$>Tte^RO2ncg@P!Q^z6_MJ$6i=W0KD7SQQhbb6)^$%S7*bIAOE+h(P z0jH)jXB>L--COd$bKmn?fK{*oR?r9djL~|eSK#1{JkL^6TXR=_H1~ycgteT=x)U05 z^>S5e7@+XZ(JZ3@fpLDp;V2bf4;P7jm|ecJxa*2X61^MZJ)cQe(SrByQedpHI|~UM z-c+|rRH2kMt5UYWzIF<|R59#v)5Jgx@dA$%ks@YCwI|Lbw_&~nWlwx0kNXkR6yb4_ zxAm&rL`-?&T4*D z6qp96BjZ-#rJ`X^;KH6CGwdPP<&wFqQ@K!US!#%Z6@pz(07d)1toeUnsO0D;X6i4B z!4R_+4OnW~Q$)8)OGNS}gozF6>R9uNR4wXsGdulR(s|HN$J9^mlMt%WTqndt9gVIS zerxK|<~!gjglr!G%Ww)RGQ>2XBAIq;!a$y)7`)a^EaB-6j#$35ov4v%CT0{HG?#gx zG<{&Qbh=1u519O9qq>y9g*?jZ?e!QKrNrG96MIyzi{z}H@{yH5^KSGCp*4tNLAsJZ zmpz4VX(d)$v=@tJpr*Yd)Q(8u93tUh0P}9<6pDmaiY$FfVILK7k>)ljgZMeuZMw!d z>nu`zQO$32x7PAmY_fIl<({ABf|oueK4`=~ex8P4tZYE(3oY50HGK#dG7wElZpB!B z)j~#{rByXK^5fO(m@q^nJ8^0A{}6-V*)CqR{1BKgfksuL-@{{&0&O1|Gl{^-YFx`} zLyPayLR&bFaw~|xsbNJBxj$DvybL&qMvn)nM`P>r(pp%Vj43%s!D44q(QNg8Al>fY z{A0UE>ANWW&;w^d;O}Tr4j~q#7^b%;;Q? zEsmZk>c7`WlB}9R2NAGt@-WS}O8fFdOqvsh>8hY}y-ZcG<)LUcV^kKAPTaiMFSn=} z`v}cU`xUG;X3|oQq%X%n2 z)r?WHfJwyabnmNg*_0ATgH!!)p_3M4i~+K(E!u$DXYQ^+uBHj9)^>88xd;Z7mz59T3&yC<~6F zlPQ$Ngh(1rRF7j42ZdD2n(v6Ri#1mAv4LFhRkd=x_>Ur8D=Za<%tN@<# zz$a{8%mz}w-d;|g*qla?N}%G;g2DFq>%>2=GlYexEf>QpU}$Jv zCv83xNahR_?)^p-9U8BNA@Wb!GypL?tt=1kL{rTjx;iIY==othz%5THcQltRQGS9< zPL>3WA22(4P#{*_bkr+U*ih7PJo3-t`qMna-|#>NKbD=%rk`+qbaT-yr3PTrIsrj7 z3&o|^>(Vu9$d(R>gR+gGc%0;vHzF?91gGZu?P_xHFxM!nAic7v?7wI}Au`PK$@3yA zX1JlA>nh8R4I!9SKZUAS#`vvjAsbnJrQKr8gvn{b_fuF@Cw2MhR}=3&IW$h zR--ZPpCL?x+D(?PD0l?N>lld}b8xM<6x)g?2GmrXchh z7BNg!MIB0XlY?;-;bC;+(~wShXiS_*X*vq{qODX#4STY%!?}nz;qSN`3E~e`ZNUIRy`*D<5X6~0(=g3lsPRZje zZNApGJrg&#`SsPR0)vZ(S7J+n@{WLsyD~fuhGg=&GP+5~-<25l^ zz%m`?9LW-B4Bx;Cu1K|!>@mRuZ3jK-3#&+c!z_!hiW;FA+1cTVni3kYTElIVWq-uSp7HOi!gl64-rzcf=s+*31c+d{)P;{U~ zPy-Q>3UZ$gnKoAkb)Ft8``oZc^GKO0O($GXLx$xA@@YIj{shs>M!a;3szgCFF(wAG zZwxLAW%$J{aQhFZuoe41RK&&S9h1e82u2>9JRGQ?HS&1~v4#e1LlZ4(hF-8=5$}z} zW^CER5C6WJa@HzbyEp7)A&3)0tRj4d&V?_p zWXKAwWlNo18ICGa(I$^@@q_!W%s=%9iTB?fZ|$%xT4q0-*335@prpFzyO_A0klP}X zH;WoRvU@aeHx8!<1ixJvM4kA{+P1q8k9Q&Ts9P7`rdyU!BKddL?* zIJGfJ7L|qCOX#+VS;w?bW0az?N0B*|kQUV~*U6u4{&5RxFlt`V_RR>CB>lu5K*GWq z@|`f^9d!RJ?PJ^u<|cd+EntWsbu|U3Y?cWiG6v`V&23B@Xqm2<2ikG!av}&4~7CSGIX?Z7qqPc>dyk>%W_{Z3e&!`KfO|n3; zGW40s%D7cpTdbu5)lDt<8e8H~x3Z#U?2D0*De;EIg*EqTr+*V!5=$t^Oqg)@#gcb^ zxr@YO+!~eC?0O?jmQTvA%ze>1yN=diLZn1o-eP1^WYk2tyK#ypjp%v zi7I}70~Ey+9Hco1%Cq7Up{ zR7#tU7)KeIu(^#T9;~@%A`j@BwHt}E7)2%Cpy~FysT$mJeV@qh6M^VkLLkcFDfir( zv7Ewzy@Z(20+zj`$#`IprOl@#$z1{uq3U(L2rxu43j|Xz{iv54NfM_;k7Y2)kiJDI zqK{Nw@MO$o%bFQd`H+6Bj!Sd6_|Zs8MIw;};s9LQL8GIwFZ$_uIWZg`Qw0uZosyJM z1czHW5X~_WGyvnKy*2JNMl0TMmb4411~Q?D1Q8X60=XtKPR0_jv8Mh{79%_^=_WzxxU5fpf zP}8?^9Dam_?-W6Lk!e`X3Y5LX^KeNy?KILtKLH9SMd;a^QcT=~Semf;OwPIj3~WO( zeuHRfUn^XH11%tbDu}jLxc(r`*x0X8FFb20CWm}nKgJf;95BaYJ04sxd?u&qIO0UM zq~rjeRIANIaX6R3q1~5w*sk)jOH6S&hU5vYPz69yEMCwYae<4H`I%}D`G7w3tZpuS0+8YP#r5B%)KGs_ zi^X08P57<; zsyn7J2RD|ZtzN*MTpFuj<}&S_=SMha z_XGin7IXn)ACOO?`GhH|s7c=v#i=(j$>pS|$T+89%WUjgt>dXvhrweYhp2RczG5=D zD%jT*Vtu{YMa<;*4{?ez62k0Vyhu*UOBzkwJcAunge&$jEbM+jevLgRYpLRvzQuP}_L#64 zex9rSCW0u~A{rcT^4K=s8#kPpB4&oPUrTnKN5{H@($0rUzhKu2d`PV9IG}{04z9ahykXyl#hnM9ICx)4Ftp(Wy&e&&Ch7F7sB%0jO?NpX zZO=TtlaJ;^iO_m7GNAO0lwb$;ii-QO4RV}XI)6M{b?`2~NEw3qTj_P;YFJcG{SK%i z^E*Ox<%7#+?kqcSwEo(Ohw7({cxT(5x)yHKvE-5Z?ek?qQo#))r;NY$`rd2Is!uFf zH}$N-y3}2-&nHZW@w@p zR@_AeB^piO+}KYnJ3$&wW6rXf=n~|{xBu>wm)!73UcdgUiyHR(b~YGL`OL6SPr31d zA=0Ap-JP$Vb;Adv`ky}NoU7+m*RD~#WXJM#Or0Qx4|;>QJ61Y@$FnOlPzhsJX-gLyp-<9Q1f;CwRBg-MB)VTOL3Kfz9~ut}d7(k9YEE=UkE= zcj4@o0c|(^dC1Q3$6{KrOKTi_;p?~Fbl$DQo*nwmV>>=NvZTA}zz;fq*nUdhIhWip zY{n0l|2REj*y|BGyZ%;G_%Du>L&<`@G$EYxTru<>#|^C!FDjrjG2fQ=r4k%~$6-=h zOQh=U7l$luzU4U8key~lg})+`U@;wwYUNiHc^8JvoHzZi11{_L%XKH;bjeRgtyq1$ z?y95lcY9Y~Gj!#Vb$OROId0}T_y1|ymj+Z${gRoP$=@b!eyHr|%X4d+lEuL%E_tD9 zYOM46S2oVuAN=aC-Mbgn4(q*g>=S=4%DZ~@1$ie8JGiK%=VwPyB3dRi%ZOA2>y7;* zTpn{S1S@a|Hr9h1XE4n|dS+|L-)T5R@|jYhwNy&#+YQ91jC7;&0Dj4Rb-`b0Fi0?~ z!%EFiR019$6c!zQ0F@C;$Ra~kkIz1rcXD3;OV4Q-l>WkVj}N-)xo01L`18kNEYE{O zHs4u%_uNY!&FgpGubzE;(0@-HS$91Ct>Gg^K63I+kKEAz^wS6R+q*0pP|Wy{PLVr> zpH@onjeaq(#h;kQ!4w1L29aE{I+HZ$8chZt@pBjkIjlZN6Pf(HG3}pauadTCRTpd{ z{Lzi6SN#dC$k)ewKJU?oKmTY~tS0`K-FFOHJ>=_`9IM)|>&6VjVE&;gSD$y&X_uaU z`m;Cmf6_ep;48t^=l!AO#+zg#@=pHcu*9@e)ub?rmNOsZJ)>5?w11Yxff0wQ&kasz zIx@HpP}t}Gr9}hM2+HRsflHjEvZcstJKd^7nxAE<+z2~3%GJf(;+HX~xh(vZZ?9{= zkay{XCrxi&LWiwfzpd*PbB;g}u2?YQvtXu;H8VC&h zsu>EuUyoS#ni{J6H51u;tkwJqd%z1p! z>fk>$N5$5PXMQrfcjw}Lqs4_-8!+h7C(X>O&Z^t8Vr$~c)B9Z_GIQRq@{aZL#1Z|7 zLVER5j(${CU`3V=qY_KT2t8+Jz!U;qn$l@+_pEH3yfgLmj{EAHE~wjCcF*{pH^hKk zCscj@^bCCH1Kn z*T|c?^SAuh;P2dfZ@kOCt9$6%|2bg7oEwH!TH#pmm%qf;n;TkIR5YGie@*{mKmSX= z3Db%`W0$n-&+|XmIc(owMmMIf+;x1hqiSwB-jX;vqp|JM)}HB&DG0K#FTYBp+7ey! zCR=NGxGtDc*UMQ17U`!BSEag3WLX++J86o?V9?(KUS3<5Iiurxc=?rkRACer!EOvUM`pNxuyGmJhu6b$s_hW zS@)OyPt}b5@{hmR^k1{fUmg%o<)=TCEcDEsT?a>w=<0nVy|Cu`BXTM`ZytMi*2U9y zl%zK-lx?pr_;zso(Itrsws9cJ z3Mo=@Hxty1{g3#u@09Kv)%(ZFhfkA5J8u22qoysaHSe|tFHf_#4ow_;=-fp6{2)EDN;~1@7+@$HPyAQu@e{FRMWU=K1l#@~3Nx#u;~e{$8@FBG z*uz*>i;fF_h2jTt_7M*zsS)!f#IokkTD<5erO(&m!=JT4$sUbG=wWOpoDG~WJM zRwzefv&$pFp->~7PsgNbx`-!)>L{fF>fZ)EPJrS-bmZs&j>V1iEoj4YVJxqi!6y=7 z7F)N3KGW|;5sTMB%EWr0gkxOI<=n;0$zYRNe6gX(+~Y^%f=oy1h&7IStPW-|8YDVb z&RiWpma+FLA$fU$D~_bL92?)<$!Wj371UL*F>_zWB&s$Ea{w7(m9smf#ut-l{9C6r5l(F z&XJ#2FiunLfLtx3JA@NGn&?XxQO&$E@>C59$6fVdO?rl6hhP?j9$De+$D?*=v6#vd zV-zM5!^5+i+Stu#HadZ@JvhY@iS5B#+<3Zg7lPE}s_=1Vq-H)~lEG<6O3x*xVYu}e9Ua3i&z8$xLQ;>_^bY08t~dTCcD>{<4C|S@ z9T%{fsF^(?u!6FG-1Q50gR8U~NQ=f@UfSFkB{)k+(118$PBmFf{K>G;$`CS0SL(#& zP>3iRO4O(jQQA<{rM^-8T`&aBI#|e~r>RqqEnfz3!e|znV}*o)h?YAihid;pmJBIr zwY)jOdgl&X8MR(aE}b76(^54U{1B})ukE0e@Ta;5wOcSHyJ*xinR+uC8DTS+>gRXY zhDwO++21CTLM83y*0bABc?Q6gjAVd ztL-`KXXx4{^>uBb%;5aJe0{zY!*gC1t9;}k{|a6}uSl_fMyr8~4vWlLSb}zQC5PJE z17~*U2Cd=WbYS|9ew^3PSD2u8oRoKS~i?U{J5MAw<_R?r~RH>IsO%A2yhYFD~5zT(i z^IuoUlQMID>ccQnRu6s8U~lpwUu|n7%xE6Pcsi|UTa@#hF4afTR|lYN7Vxsv)ZkZ}`E z%&|a?9|F&FNWNm(^tY97#E2nlQ5hXWhnzE4^$0Vpa?b6Z%wW#jGI=ZcPf*PqU*_yU z8ihA_w#mYy|CNyh5kn>=ADl$n`dYO9OpY>#S$&SW!Ci3D&CO)$O15+{qAn}Rl5h=14!_Sp;#OKi+854?l(p*Y18kZD&%twa=ydLy zUy#Q_vR5Y}RR^;@;#6X~`A}R%%&i(fAaJrmropS-hV5$nov1}U_U9Qu;KIf1`N8Is z^w|68r}RcJt$|IrUIA#80KK`Kh~YX36YS38&3MLlpgOawt`rH>F+%TYGsbfQrf(%joyK~ zhZeh0bb6I^dW<4S6ev5B-jD;-HXfoGc3OW|7N#ZUb=35tWNbHlu?9i2VewogPI4$c z1Y99I)Wj7ohC~uJz)XrO(HAn31JKnr4r{m=$;CC2qc(-cpOb4T1aNoZAq;g5pQ#nm zjA=SZmgmryaYRxEeT+h%YN}Fu zlW6B182Sm%60M>xVAA!5cu-XYLN&BFRlx~E!oQ~n_?6?0`*9RDL|TbpO15Gh$z|Al zdFzT^R@Fhrs0ntze2)icN(*%|EL5;UJzi*Wcz+Nn8b_O5MFSRs@Kz>u=!pfS-xpzL zOh4GndwI{6U6((LLzazW>5w+_o)a*4rJ;| z83I#(Rd6ptNleBZVC15;G|LH2p6fwKY(rZPPM`5nCJN=K94Q$iSmW|sAg%U$42@L~P?JJlA5t1CufVEUW%627CR-LnRRp(%iiGqU=y zyd_2AQ{K1V~t2|FfXRDshhC#f{ zQ0Fh@%Ct86EEsf8Kwuq_INgoiWr;H<6Ee93O`ylYzY2@;8-P66Q5>FZ%MR9^w5&YR zveF(u9S#bJ$WTb&psyh^jS8P1Vq}u1we--l$-F}Sqn%OaDvxD$q`ztd#nqvz6{OF+ z_R8dBnrZv|3EMT$9uSVgs6qhmm96Lj*wz6y+NZ6iiX2CTa&^b%)eUB*=qLIEp_k~i zBeJ6oYwXO`rW5MDl<|xZ0_|pHI+St^eu-u3b<}b&FZvTorG)ty>2L>U?}PZz8Nixv z6Fcr_mK^_dpC347ip0%8CUQSwc#1AUhyqNQtWS+sjz8F6Y5xHskn>t9Ye0XlEH|LKd-koiy@TKkOUOxX7C2 zH^kinPyqk(x@q}H>!U8nBaP3Fdw9t?;eC2$82^a(hRTnX&|kPQCFUG1o#6v^-R?B% zy}&_RYt$&SZ}oMKHi`ZF^GgPlUeq}KXmZ#5Tz^-WVO0;;2R^Vl_$9*~?CO2?%<=4W z+pf0G0~gMv2sm2&UF0`5kzMO2L*8(WKwR%0LhR_u6vUtt6XBgdeOZf4`z!d&N}$ zB{3D83VtHKhF{K~E(L8X6VPX$8;#2 zJ#Tx`Ou`C|o2IvUTcAqj8q(lM_Mi^F4t!WE&(g0Ep!U#p2dgG!7qKc6{<7Fjp$7-Syu?8=Q9r0MweWP zO+CRV{aZman?$g`r`lYNWsQY$N&iEPH=%eT7h=YT)mWRWqb2OI1L#C(QaqNvndpar z07cE}fc%5dO9a#_*jy3sJ`8>XOXb@P>byOF1V3!{3~{Fl4g8S8n`AyOq@k~uc=ksO zDP5ggwRr=;AyA#AvWaO%fYD?C`Vu#zvJDx*#ir%Kk zxG&LJ0>7}ZH}|3J3N2YPRFTRpi1dBCa*gTZyvcza0MNksq6>@$TxWr~n)Rr8ggF^? zB1?&AU4tX5+b2`ER}+NtlbwOC(8&aB!BpI1u4XvH%?r=$0Hnh8@upXW6mUUCDIB>F zZyejS4O5ebKADMoxfQ7Yv_BLWeh!~g)Z(hj`)l%v|^>J$+(C|s5> z-^+G|dHtJ}l+#LufGwid;-4xfnjq2Qh9IRX*f2R|=hpI_opP$*g@M|}BhtD9x6M(o zOw*jo$^Vw#f*j6VKY|PWv~Q+Df7VQ4_j^R$N%%N9U#}T)Ksie30v=;5)u6ktSKPR5m-}U=~NQglguKG z3_oAX^UCZfdDqAyAy|K;JY2LAGU zw|Ls(%L@iV{XfeNX1NIb+oKGsx?TIO`ED+|+e{)jw7awcE(;y_H`8BaYY%uQk+p2U z6ctfQ1~nhzoY`nV9IbttNvc*7Db|nzc!@R{3BRl+WW8k3brnR3;0ksux!bWs8VK&f zDPl3birc~4RUC9COx~B^9y#eBn8rC0eJeN};iD^1tWw5!D2zC))6m_7b=9b*1;SbKy7R+*s*g7H!QK~8{e$Q;UyGIg8)Z->+Y z4;kOLCl?tk@9>6aZz0emoQ8(C`xCI66;_+T|_qFyREB^eU~M0zc>y{=w2n=q#3? z<^?6zLsZHH4FWVr2^&iM^%2Cqirq6I{~NHU2o{hH@T@7GVY}D6aY>XLE5t~YGuFj0 zXq+7>1`D3@;%uoOA9V~z%hFEq4FBRKq3R^4H&2ivwLLJsOTX97I=qwL+1fO%J-pUz1s3U&^4hLtczwj}mh!^SLY{_-gKB8FxuZPBq<$uZ#qcsoh zM4pB=*TR|2%(&*A96iUH0~*sPe^WtDS9vNOL}UJmJ4L6g0Y#OPOwO@=j{$|&92S{x zqKpmF?|zlprpC9{m4GI!Zndcg1!iYr5Ws#Yk|&#q>O@XXc0 z#5XX837-s8RBUU&8u~p~ZX4ggxXk&61%4)uaw{A0Pg%TxJ0toCRTb&GdPbsXxjYGi z!o}lS0zp%Yvo9%__Ln2Z%z_e}N8@SO)bU@|C#bF&XG|F}e?z=-foz>E|+Q z!Eae=8)|KIo{ae!v69Q!R-2R5$DvC?eB1^)1ueb(8EQZYs9k(EN=M)$k_{2Hw|s4Y zVVG$}G=Sji-K_M%;rf)dqdjw!fv&P2*Jf8m_fFB)cvBd+!e2yFHKRac_!or8TluC8 z=V$EzQ7FZjKgYCJacn#@|DZjmBl@+DGq700=#}reC|5Ow(V-!uqLcZ|%iMe_tU%Ar zP*NvTk~&+h7<&|l`SJd3si1n9n3aZ4-pKoM`i5c78c{WfZd5gjQ|3lH25l5w0r;h4 zG(P(>-57ZkN9I*2UvEikvT~xR)l_51h4s$a+(yhAjQj+g_HV?whhq}EoUc>U3Wmh7 z-aNfz)Rg|rkJPM`uW+u-#I0*HCsCpCr!2O0Ll)b*fGyP_1^#^xXzvsOh|(Fs>pt7M z8Qcby!{OQm^ra!&`u%LHs@EFlU|ZV*JAx(^KMJy}oz*(nG;!xYBM^;NFT^)9@6RRR zr$B%ANQfPT1^d2pmF8w_oDSy^722EyUI_(leu8#fo}c6r(KgLY=C~MmGVF1Ir|GoN z)l5)wl1e3?qcJ_pz?78u9!nWQfL9HWhSj=2Q}v+(3zdsd+5>y@c>XbCOp zB2-Lo(aTtwq;u{TUw;TTMyRAw?YVkLQjPX@NK?V0u5e&fP|dgLJ%sk%JRAt5O9H;^ z6^*QrZQW@tCB}xmBj*`A&Xa`FiQ;}llp-YxYgYUX-W$ zBgf#~N{}3tJ+VUgIas6%xbcJqR&24^J1)pf4fjxYcwkJj30pvA7fARq#OkO{s)tKZe~!-(YV%IdyIEp2_?uc!UObjs&;z3tV$uf@ zIVs<5FY*(7r|mjP z^{B{L<^pNi?&W=<>vBeJmZ}Who-RK}kyucTPoVMjrB62QBKF9jMWc^8ck)7Ntj*HBvXUTTpzwfj{05`!5t#8rvSX3+rYWR{)^=01-w!-0g7 zy+1DL9GKU&uCaGTmeKkB zlD#D-vlk^u;1WC+ABbNNeJtbumLH(lfrzCu?zA6js~6Gh0X8h zy3EXjI2*4zw$t&=?TLJA$_h2;V}Jsd-C867dq(Z9bSaoat`mio)`~GC3Mtzk)91K2 zvD&QSe>%!Gu^uNBQns_R>LbpBq~)S)Rh5Va2!9A9e?jW9DM;r22kcmz)E~SvdTnw|$cETGpIk-UhbGvb8dH7k)d9 zi(g#HL7^5(0Ey_#?X+4eZU}|JnYk@26$P3Juj)2uOD&fa2iVAYcaFR1QnR&ig_&$e z*?x&9LQDjcX-y-+x z1#`%2GO~AFziI@?C%`VcM3_4#_?9pgY1&|z?kA4NZg7jo$Q)y)Hkd|$VV8Ya=QSmd zb1Wg1U||SdNG|}qS~nFx8V$1kpgNB%pta4Ee%tcDQKlA-PZSiVW|Ibuj^Hp~qBr6a zaf|SS)+Jmcbx?A1Ce|CyM3$u@@CdIT3shH0lV>e9Z1~u38MIGWO@0*8JTKf@8ZpkH z5fAU40z{n4&5Qjq9i>60$82^tva0l|uGq0A-DKzEnU_cqxeHchC!iHjm_?xp&8mm^ z1I2|FM2YL76MD`q%szkf9`-V-fj^In)oJ0Z(n{S%~hpcn_DTtw0 z_NO_!sYFK2KT3-n8C6JW30s2p!>xpQmwYJRSfQqDJ?R5D`mm0pq!|f-Gj}^RUFWN* zW_yDu~4?8Ss1zomcqIwIP-6m>?pNR;?X=kS)Q#5o^3#1&n5`% z--yk*$`EaEl^2GIyl-lb7DniWs?1w%831Ze#iE^ zCL`wx+KsY4N;?-$wg&-ia$G}>q0Yg}_`btYZhU6V9OyRby&-^el`N(_SnmesJy*xAn1Y!xiW&|X8dA-w5j z_^&()wMYspG{Q>Qb%0D5AA(R`n#*;Q`AE^s*B>Rh@d@d2d+YQqjaizpa#5`jVBWjs-eNcz+qsYa)KWR_gZL>;3h z*Cb}nr+KAY8YA6};4{P)+KaxEGhF{8dCYqf0f2wm3sJSBP=%C(3woF~f4k2+shrzK8dB}&X6 zfl!CgL@KbRR;Aqnft#MDjR~Vsp}e^m$;x zUEid6fJ71Cq-*p^u;FEE_)eUAcwI!?!Qvg%rm$pShCh1(kjC;yojAs5}ixpl?a8MJnNJVb9ajbGoWTfePTIEHRQ$@%lTiK9XKzb;9Ehi3!`Ti zJaxKohv#I?!@CWkzdJuG=~Y4w%Jwks;)HNF6Ii$_q##eBC&(3NE`#5pRMC%G9iTw* zr!!%rbCnm&z}rIudpG_|>*ipkhD5@*I<~lj@Cy<52Z$bg_QE~>Yy^O`v$PF(5G!Nd zR>tDnJh%xEFPm&n?2|;T(d`t!H<9Ajw2bJ z=n&<)nu#4+R0nHem%=sk8_8KDOIdJc_iVb{=9vs^H&mSq8|cHCjQZ2h+UNoNC?@h6GxZtXS?+f~O7Q8KdSBP-BX0Rivk45+_U$phOd)iF)X!B9zJ zZU;ny0B+ja$-S8kpXgUliz3??zX8U>A-z&tqCZYAs>gCN4*FFX8+B+b3W&O;UceD| zA*5ND#a(ZPQ)gqnbeY#N?BHZ2J8s)Oh9=rab3#a{nl+4kol`Dl<4`V4dL?{{dbDU8 zqxmZK|9|mlJ1Bcu7=nKG>!9P}Z_8kK6LkW+-i z@GOqBC`NYRog#A>8_GDy)fChv>5mN@|y zkb;*=FlLoz0wfvq9?UEQR6|(g%FonXQvX9}!Agn9Fb#7%!!%`Qr1q>h#YUxQ(^h1$ zdNoi)a_EJz+t#E-qR(j?n|jX|v(yR}>1>Zg4INrD!JpS0VlB3JIaNra*1)UPhEF=# zkA>tS^k}zh@mW0erABft@c2NJP9n5QO6L*4f7Km!45OD<}`ynKUdNdb1mU8C04L@NnKbLS&H zW{pwmD?Ku65X%)16_x1VaU4cCo2#@FT>T^~e4*~vfIyA10i~=>p&LQEF~h31*usv) zn+$8|@KF0Gy)$)F(S4C=$a;uPW=_E3Z!&@n15s^ta)GGa4^NeLEKDPF&OO?f^$=_p z>zo{~UB|)|#*2=FSB=5;Zs&%p-b~s&!;bqM`!ziPv_tS9v2)h!`C1SnC>PR!N)@QL zA_q>5;Z9*(r!}P)*){I650b@~88P!}9kr9*q*Jmuc{M;Pb8T<|#k8a`W^xMCPbM+E@h?oXgF zakDv%3<8u41djlW4wLXCT>l9v)in+Pr= z|D(>>wI|}b%i%GuF{D)EZ)PQ=oRmZ*Usp*SCA<15%ctN@Ty$=pnKe=NvP>L2&L#S3 zq}p-hEvRji=xAiFu`MPdPOjXg!LkxB=-e}U0mq+Ka(-osWVq`exSJ8aD>gQtf+^nS zSk?Gjh_yu0M?7X#^_1vTS@T6``D90{22ayfQR6fA2?=H{$5BLev{G!HW)FcXO3e$O z6n!1eCTj)Lu3K@ff7`JL{uim#tftVEtTQhL(z?WFh@Ny zT(&&vmRM=$4vbTpQg>JtJ(nS6k)Kb8h3MkvRu#V0*Q<%Dy~X63$D2#7dL`o{Vm(J_ ztW}SIAV!}3wrJ#2|6Kd3IA_S#^0P9*bQxRCX}(<087Q&sAZu(Nl7xIB z?2jnOTGmxD!GLlb;ccm294tVVj)+Ytwi~3{t<(3+;I~jQ6v`|O5>Hd}1F=08>S#wJ z1Q*{ZbN4T!C2jkbJA%jYIeG4%Pv0_hT+ix_k14ri{#kl4?=EQ}_oOzAHZ_#jH$kov z!bO2unmgXkw~#$FBz*!PM+44j`X>FGylDXN8V^y+V+>xrNbT?E-8IZwslVxeXU<16ct_b zRsYh{b~CU{2B1kzYQU}oN#!89WPx{-hQMX%2u+TFKh{%PbZ_(Din;E zPh~LsE?5%RCulDGMNPVdIS=v>lu_#xvaPVnM}(1`9|g6TMah{#yjV$cB$b$NAL$Pa z=vU_9qaeRxW#{*z6FbTle9=~NJx%hH;^`<*dp)5U%1{QbI4m*_e(fugJ?Lvig*MUv zBEYfQ(}wR2i(2&zSl%OsT`q28*b%yq=iz>y4}D=1%S#+3GqO+Nl^cF>H_(}O?W13x znM%QR1t-e|wTh;^q03>iYQFNZ@G3l6dDlNP$fbb~&HTm)ERhFf@>zo^OHAO3HhKS7 z5nQMfSHhXg$LKsqJ;mRly|IJ;I-1Cn>1k>@m;sJUjK|Iy(;n=C17M*{G{%eV*K9@T zwwcZh)9@20aIT&;_&tshk}Fh%DuK*+jeSJNEhQi$dUO_n`Kr&-*yAP)LfqlPrrW5` zjO*-fu5e~-lAJ>ohg?FZvzX+OITd6=F2wjeeX01cpw`R5jKV->;wu4 z8UUP?)FaBOzKS&wJL)6Y41|1Mt@Q=J$0J<%h$DhyHmIJoE7KpamI#x++Z7RCrWCC6 z1Gi!W<;peGvdT>|6cks?8vBUf>>Te%9nJ`>Ez2~z-Y{SP`XMBUxug_>GA+-^%`ksY9+)=#+9C<=F(d_M4!{3&ZIYwR2IinwkYcE?I7!= zZ^~UAz}%L^Br~DCyxG!flZ}8`zm>Uk<1($2qbo)Sr#i**xBQsf1@9$t$%84Q9^~k7 z?4u1W(fq_(Kh-O^>eX!eHN63gmXPAlgcz<;z;|@vWmqGbsEBg1d~DWD(JMJW@R0a{ zT6(rzU5q1{EJ^~chs9Vk75at5t6a+S_hsPmgPU9hX29ApoN?@&DX;#Uy z@W?%1!S7+qvMuUI_!u^WSa&vYx@!k66$aVdL;ajzRr9()_)^Jwx5~dW zt3Sn2S{dOOG<)BHD{%;3f!m1y)4Nl=!NT!2Kgdx>AN-y{41X&7nrwVpFzS*V9g2!= z^l=UJM$GrC9w?IPjNmoK){@cUZ7X3LVq7nq#%D;WWbR$Z)A?{3rqh}% zCM8PK2TG@J)!C@&I`L(}AF_QJ*+jMmhP7~O*&iSB$nR3hLk2l2L3a6dc9XS?*!&;| zBweeM9<=S-yh_i^nXUjkvN}$yI>LQ-;G$8kus4&kL&#ScIy{n*Vi+=(m%Ebx^x85+ z$-zEt3gs zNLH-lM1l0ekW5WS^seLJ&(X4m*kL?Y4=kol|9F=Ltg-=GD{mnR3tH#X%e|%}u*^?c zx)#N7uTW@!J;HlX)Iia+69YKkFjOk5f@jFyGBD2Xel~x~X(E`4N|ALG^_;JTZ%|Lo z-u9kZ+1dDrXv8tHPC05o-F}BP0`cu$xa_VOsML#dfLCqAPQ03lncYBK z7%w6Mt3lkJ@JRlQRg(G%qiMNjzNaq1Xo>b*B!%he3#yJ?P^+y-4oz)3SM+Z?Vw7C{ zhn1|zBl1A=n^go39Z;IXao_LK!1@;(S4OUYlp53bG=(_7@BFxtTEhWF%^VL*75y<; zwh$_cp(}rj#+Ia>eF(`LR9Ro~E^Sscvl#r@gWK*3_+;#G7R=z&(QXOMIOZ8(WO>u8 zn5(vR1~GLP7r2D>iV4pSe52vxfdQ z8?Wl!zY)N_FB_!FbbrpS2ygJJ)Cz7V1N$g=Vg0IGSOlZ0`e^Uoe~YllYyl$|^a(Bm z@W>$NOE z+6t$#<1g8|YzF{kLi<+gGEy8aAo!UC1j+yb(j5(xiJJPiGM>2*Ud4gPOOW3g9wjPM zqvHN4T}%nMP%LgkvAZ=CLs@7> zIOwJ@7#5*}%{XU|%5|cx`e0qK(E+#!F)T;QaXB`P=;r$duQA$>K+%1EMU_jZzxxk4 z(ki)V+?9Ly1JuM-yapc?9sQGFayp!mTYEIhkq+h_`1W3{A1DVg^#e%}(4@+@JVDgp zINO+v$3C*6op=G}%iR*E)`!D?K`4ejx}OwUQOluvXwakOQ)_cws435d@Je z=~F-wU!$geFmiZ&c}Tc$`Bt-6x?td8hz$`_XbX1%7&4Zmk;kwR2}bSElEmhJ%#pSN zqhzN47HgK;d8>h5I3N|!!815Utif`mI+WD@0qQ_l?E0(*`=!ld1<%M8(=(Zl?<2eB zXl$9>;VSgWk@6UUR&2uh}DO?nyrbPW7tLDq>i$Sa*678}*-4U|zU zI+#>1cfdhwn$od2`{85S6K`3Gcf-`Aso(&sgd9J*mHj#)KRS?6Sd<@qB3CqDvd8B~ z9g}^%sB_5?DDs)RUD=(YYcvJ9?yukp4@Q%+v#Vv60|3fyIuperD-BYvBIDzjItgQ& z@yzRmOxLFwaKXS|N8>FY`liFYGCI9<0_cL5ETZ*xZ^m z1@|j`VP6oJQ4a-D7JFY_2HlV1dsi zI(dU}n>&ffxmY=5hiGM`bK%HA^ z1U`@V^RQ0SKb=KdZvvWM37aaE?x(TY8RA9cLY4hg2D{?Wzrs)?D{ub<3^eUO9G2@g zOfMF}s$vTQGv82>@G7=iza>v%|C;Pm!2{okQ<3|z67S$_U2`5z#mbZ<0ZW)a;+QH) zyKH6EL6jE#3T;(1fltrK@RNa+N@$f_&1$|(o)_7{=w#F28Rn&E>Xd{?mh6N6WC{_K zxe1%ri>Nx8)WIhBgs_s{TuvEO^1b#rOn8(meI}=Q-A7KGMm9p0juX9zZ=go7Y?<+{)W(J%V5xV7tRd}<=<3Sd~CfgDg;_%)vd${7f z)<0&e%4Jqcq&D7M4tqn)iK;bGTgp%>I-IqLgb^qi?2?rv^yYEXSt8;hOS#TYZcail zq|}a^H>IlQ5784FJYuE;+#}l=xMX;)o4#STGSS*&oymC#fxsOiE4=ov=h+&~mAZ!m! z66*rFDKKXC(Y2flmO|L9Sy{R~TL)a4!9>_h^okZ=m#Y9_R!;j#_3)3x`F3fxNKU34 zuqr3oLarBKp2Y>=p*;}ZI7ktIq>CS%lx=qBQNispy5RA}$`&(8_ol zufSGFS9*yiQ=L#3(=l@Jg5ItZuyFN=J3YKK00!y?kh*XXX zeTsF)mUG~<82T_*;mp<__*76#+ovL9!QjkoNNqVg4*CTlhB#R$jXr8%t@lUNU(CQ^ zO^{)c4;VJ%lNR4Ix`x$zregz%B} zv;3MUFuI|!V)t5f<^L?YTEJYFAEpVk`v#*0RE0275`eLgI0@9bjC3k#;aR}5TG!^+ zgV@%8Vbvh#PA3;e3r$OSis7xle8^M|OxofXnsR=D@@Mv{w}SsAEIZ*1F9U_T|} z`hv}!bniTNk(4c--NdBJV6Ic6!x;+Cjvw!m86)N!8twQfTb~FhBaQLZVqa%@D1%Dt zZrgc6qMK7V&^_0UhqJN`=t8P^NK@!}gvuQmF)o9<*xIXwYD+R^eueA)ujRd#Oxwu( zs_`V)&{-JzXDw0{zZs7-|JPq4s(b_Wg&r?NZR&zh&D9Yy8UB=l@NCAj`y4q8Tc37k zR;WL^Z>DmqIxu&;0H2IWYZxaPED|it30}3(kX?D|!N#6*dGYWPuU(#x;T*TxReW5` zjml22QmuoefF?dmKC)YlxN4f!1ILKcL2r+Eg(U|M{JiS@DM#H~d271pc1!}g!3a)q z4OSMp^LJ8D1Phc`YY(J%XBO{@;PboNS%W{Y#vhoP?W$V5Fns8V7Y7XgWz7qlh-B41 z*7%oyn$5mQoRUklS5r;CR~}bR%SChm3EJ9Y4pKMLYoZ zk;2}9rCCzfWHsQTFdFh@t#$Vz`Lp-lj; zv^M%MY;=z`Si7`>^&T2J)lQpSIqbI+*W}PJudXEI%c*9$N&&uslcf#NjHA7QVcVEV z@n6(j6)9G55#VN8LPnfny~#piDgK1>u*m2zfFA>M>vpou97l#ZywwTfflU!&(rOsH z)9Hnnp&@u@qBTRzZq7-}E<_AZNKEzN2bjjwWRRIm zPrbM|XF%(ZrgRE_53wudQ}%cl&eCzQsoH2Mfn+b@Z)rJ1)lmwQt0Ji(e6;aICo@t4 zANi0tlMMddj>Ku7>X@|oY*#?|LK{wL3++V*9}1jJ=pt(fUrq|!W>l;~+re;F_~HZltj|&^9{aH6Pi$Vp*1xcOl0oT& ztu|6rKyY`*{n03|3owwj0jJg#&XtnFowUe;Wd+Q6#IPY$p#hnow4qCSi_#CVLs(8T z4#I=+XUwJQdiDNQD90vK+D3u^s!@qXp6TnMs=OGf$B{-EHf7Z z&~%L~7o#YYu&xwE9A0U{QE39D5;ZJ`iI`(FSV3@=2RGR(F~rFil({KUCT_2qObJ9z z)4+%~t0{al<0X=;v*Mp7%WGoz13Mj*Q+8Fv6p zGC&p%uB7TplhBY$eWaIfmr7|T$#`1<{PZ|+Iz&#nx^BvH)Z?JQBI>zR7sD?zFM1&s za@fV95elRU2zRlgrVoiZ4iJQy7Jc9$$7B*FEjkL+OhBy!1JF)x4V0@PkWKc3t`UNJ z*8^+HAwuyP#mgX7Isn#0s~V~>n84l%9Z4Lh(}`pww2t)Dn>z;=+Iy6H{U#H2 z&UMi^BoMT|)g}F%9(3H1(8>`8#>H0LaF8LTzi=2n3PrRyQ3-^NMy)b|HnzOkLsl!@ zOQ($4TvmQ@P!tcQX$dqdb`ZTn(oyMWR8!w311~uhCDHumZz2Gdwci`|Og=KgKe^9|nDwO1Sr4Qm|EFqFl5z{Jt_jPF= zCt+j-mGm}7n13eltnz>utN#_iJd?Z?!wcw^B^u^NNQ1dxB_=PXk@-*bGj>Es?I`Qd zbfnaXt5l^w#Lrz(sdAgTMXD;@^}2K)XIc?-$V{vBw#tTNqE+Wab5!oh(o=sx^=+to z!pblrTAL&ItkB5VXUD%Zz;&xOvT1ZcWy#sh1e-=>0t>itAmkwvCF)7c{XtMicWFct z+le-ciwPntZr-`d{hK<{GZ3Q1g%6OomJ^1iIuNk?y|*Gv8xggb;HZ3q_;ZSwY>Gb^ z)mV1MT{y*bi9P9IC=Xjxk4mqQ#gYq<2hh<&gdQ(o(oDI+bMwcq5cNw`##E27pOnE$ z*ynl$8FHHWS_nDfufk%8kM1Lmlh;d-NdD%Ta5 zRoA>LIe8o9QnYPYcBZ>!6Nfwt7S_4OAzI}aq$XOqc_oI-ndtG<&Lw&Q`4b=9#31n- z7ch<{s$syPalNi`e}wMe9EIF+$WyaoEaa2qnO0Rx58^3P=^<+a^keP~TS9*D6$&jZ zOQ_r$eRBYxd(`v9ko5~H6saaaB*n5iSKMLfl*uxf6-N7`MzT^6JV*rrAx*Gl+-$?{ zzW`Cxt;5UJs51;$fx|Y zG7c&=57T#&(?KVTL}t1!58r`0 ztWXhDCnPakL>h9Gb_qN1JmLfJx?YlQqyC#c5Loan>bbrFO++5wUqar5XU&R%oh&rQ z$M=QJiI>^vXaZ4b0qJQbnVr5v*+s=Ihob^Hg7Qr+=wP(yXohI~VbIWnm@+O-)zh$Y zV%(&(M3IgPA~+c?yFjC3=0>_FMV!hdgo={HMh!}$3IV9*sg~sM<~w8v{xMbM6{u5n zq$g2n0H|n_ioP9{?-`_OR4#j~$7}KDkuTBva)2zU_PiAG4!?`cNp=o!U)1B^wKXui zgaOEwh&|QILzM7J`h;+?qP7A=Ej_4lb zlA$Kkk)niZvIB<50SDd1unDdz5KC{Z$v|Vl4?q!FNwg-OrY&I^h^~)(P<9y`*X+XehoE32vqG8vefRV&lj{>(!2uXtQwLTpX?z zE;zNp4Z7>e2kVV{dJTK`=iO{iFWi+bZA*&mEtA;w1NvBFS?sbt5=)AGUMB4h6x))b zO>ISu>7n4(G`;RO?;PrXJmJk$_dE*IUYCAP^ar*5)hC*55py#Vv(8+lG*ZukZ{2TL9y)WjD{4&@3 zQOhHHgllQ0prQ)gt8x7ngVbP+q&S8k2PW%cPMtU*HT1N`|4Od!KQzAK+~m7Ay7W69 zU)1ukX?QCX-vBpVj-Qs#FW<7|E{)w3nJM-gg+O{!ccjVFVb9C;Tu1Y5Y%X zBCYS7SZW(4tW#kPRX9jacT)PvHfM90Pj`}%&-Lrqy)xIS>)WdB+iL3P9Ra4!1L{m4 zejolbi+eobJ!M!O0ZzDxuMU(KpDwrD$=n6gRY`vSp-8n5uGRsikd`I=DaDY|HCXNN zgA!i2IK2`6^S7AA5v%-Xw%l)bmDpW1sewbyF_aF$nng3`CTORlPbc{dEc{NHHf=EH zrI)4@vAfF3s6Or1{q_CJ?d@9sUz;t#l)2uw$|C2OTs(aJ(u)U#zKbX4l%MUjr&ztq zP3`c;Jvz&)F9c>(l{c?lF?V#ICiLUo+XmN`MLG=sdU@J&-+N=%^4yaCRL@}cAtz+T z0d49~rO__dAKWUGGS>|L)P8M1D;!uhI5&JjBZh&!&5iD3m00Y%ci-(gUs=+=VcJMn zxv(p}@T^|gomqGwaAfdE%Cx*Sdj&^#_tApaDl46B)|1OEvE)T9k7V5ZZCSA&wq~V^ zhsp~-Dlc+B{h}a7OZ1ImxFS2c*%ADyc3^3C@1u6t8!0)aw|4E?Flpk%NWg3E!AQ$g zk`8LtAzJJfzJA8*Y!2~TRop*JD)@Av(nVfC8hK1u@`RG~KKb|0twWQnLzmboA<}8< z?(QBmi+yJCTkLTERGQJV8&wSw{Ho7}07Tbws_pBCB7MdfqxfEBWsnN2GxxhIDanYh z%7tT-=p*u98@lhw?ykMRuXTBDY&C;l_=UD-_ieX_kxZd~t@}$-Qql}2?7C!|+qXa; ztnGcJ;H_2Aqp_#KoB7KM50@A98cU8%7P~Xs+?TYr-%Tmq_4Kbwc9a)vgkk)uhH3CX zuT=Y1yc9XMF|R)R(3-(}>DYXsV%H1$qBE((o`<(MhflnH{|5xRL-7t+3H!KFO0&Mda0_gv8`xpnWMdZw(sp#83X#} zwX@pc_1+)n4nJcqhz7kW=8^ZCrRxLrI;SSp`)0G{{B-N^YKsm0?ljn_^oO+Q@w)X{ z)(~7}@ypb_;hw&UorUft()}~j#0^uYPR$}Fpa6{?0X&x1#-L~ZT1MhyAU~rN2QaI3oTqz3H(}I`vjJW40b@WYuDkqTyLkT3T9e4^=usc_z^%h&7O8 z_?jFxWRR85sNKS?60l2htu)BrRQ26xwCfBgrv`xrQ|dW^a-QG z8tIIOX{_h=Kd3Lb=K1)sJ2QU%{6U|~rXBd8V%o^R$_hSPXt}V}9Q}ji+1kI9-`_XV zH#4c^(|OaxGvAp#Yt}5I_gbjq)Y=t|t*aZ4mZnafI$&SdHdSc0KK1-TP}{h@X^VH7 zKHo93O&d)&Im@lrT9=!{&1FK=A@x7}&m@D#Z|`wR&=u>MFAjRd{#EADkJF^?CFXFC zL%5V#QX6RK`(R?@XU=H>qZK4TCHiN7^4ONnSI*AMW;1x1*6SbXOD=jKK1oBX%V!MO znfC2@bMQo(cCbx?uQxIuqGENFzJjT*+!U&3J3K#1XS8I6VQ*!0;+%|(tF%+6z#J$r z*V)0$MC`vD7c}Vho)M}XsFnPHVfX=(<*`FROV~qA$K|<={yO$cQu$%u54?Ypfdy@@ zmk2@1m@mjV^I4Bi>+xM81A#McV1dG)bl7{~D}$zRmX*D5!L@Vto9DFQWK(x?(;Hwb z*hsA#`exnGGjOgYj5=U?rMxX$w#=B@1F@+uv-o6Yv0E2w(Z%j%HZe4`Ccx|hE#i_U zdQ4M%r}Sj2+kcdWVPkIaja>1;noF+)&d{Yh0D}v2*iM!*6CbbiYxNeG{X^X6N1vLA=@WOwFaEpb<$ieSvQ@ zYxZo*n*97V;=Q)~c5@TB!-eM7Wvlc>?OUaxJqq<|t-aQy-k{eRHS*GGyx!ARLXGheE5j7EcxB*tIi%hDjwdH zY;%nMu`c+cXWzbk>xR+AvW~p!-NPniqkYzJjV`ut|0++>uU5A}ECJoNJq>(vL-yc> zGLttwKkAeQGf%Dk&2a7`-*O)>8a(V?TQ~BnI?-O@&br!Z|8Ka%dRMQa?Tt^c$gLR2(SHEmo z(;c1p2_pnQAjeOK!|wDKt{Z~H5wo!vGva*U)yP1-_%-PcmO3fW10vJ*RkQFQ`O$@} z6X~$AqZwsSOdy#W!6qzwu#Ll42SRBQJqsE8S*oMz?S*cG60x~wJBIFb3~6Q0Mz))) zV#y03!LN(W%PD^OwFa}P4LV*D3-t}`agDU1cgw;VRK16r0Eil5N>G`~pj%GPGy(km zWW5Of-eP9;NKT`_)mngKP}8$#(k}r!xn``G1swwhxh^+0b~XUF9C#4&jq&PQw?RAn=dyy%`5D)KR_6;g zOR>7=uYcT7OYiOa;dFQdiqERPJOhk_J9}E z2c~0vEvu%5&(uY~@9_bw9nfrX9-5tzF-rgvG#XoOIoTmx*f`0R1Lc)Hjr%q8Z2-b0 zP5tEI@c)-fg^1J*BoRfx-9~IMBC|&r>Oz?zrSyeOJqzthN=KN7g>i#|3it*y^h-e1 zIthK1+IycUXm89xKTEz%ek^w~E?&5B0pKnC=Vn9z*YQxypGk}yB$-wP=buMB8M|VR zeKx=N#Qfp_zS{`=c82t|WviV7^^UMh17(jinr_ecE!2iiLtpNNzqMw(Ryhz2?FYQE zXO1`ujMSal;hxhiNk;|_R!aq|U+y~m&u3~HC(ga`Zru>*T6^wc`8m9*8NAxFrtjil zmUGq&gZqHJ>%KvY@1V84qv2KCtSx6davJ=aY$!LKjp^z2ive-9h$q%p>4ed~r?;gS zA5WKhSP%*Cn3Q~eu9G3hCcC@Q+dMFkbp%=!Mdpk}E#ZS5Ik8P(Ef?ziH|E3jlseHX z1g7tJd;sc)mBzranfB{1+xyN^X1CjSH-z+Sn1%bw& z;Q*Ff9}z{Yz$N#1g_(^CGZIA;p9W5~-_97lUE&Bt(N*YRz{~Pq;^+#66+mzQbf>=J zTs`4xY^1@&BoedP+#`w;kQV^)i}lxaK?tzVKt(5nXR@Tv&XIk5CZv`=ME(cn=5>8w zuf~-totIgqDU6^JAxV1jjo+5!H&3mX&Vk0NqWIV&i)!W!=ASZLSzNW%Xw=xfJ!!h` z`c&UvlZ9R6Nx%Kxmi0!>)j#jpdjF5!1AIM2_-tkNwavDjhp)d27AQnEfe)_=8TVGg zxKH4VmCaB?!w2m5_`j&udX1Siz4liMJ}v??6_2Mhbyo;yy1T_I0P!Ms?0CF0&z4oz z;5}7g=;gqhauf&!fpYlJ5dDS(V{@K^O%D^AC^d z+KG>rS22+G?f?RT>KB$-Pghv{tC-HzZ>wvonIKNSTIjA78V?^Xh@vxdFeEJ_NA5$e zVp5l^IJ42fDlvKTGPzY8fnl$X1k4a_Ul<30wKBhNBIJxw9n=iZwk4Ehh7WKjvl$PH zwcy-0Zv4LhHdP}sP_xaRJ-fYRe|pjWGSjJ-}`T z_WC*~Z01`>5472bZq(Ke%+!S5(L|mBOns#HXp-s1bnUgf%L)eQRiBq?hc7X^0O#yH z+k0VNR95zWIXWc^n%_@)8;?{+=ejxO+-jy zhc$NAysWORG&<)%>!~>&ODs2a_)n#c!}m?|-e@!RFENi4IcM#ek=5SlzPKAA_?3#r zb1wV(jut6;ad&3}9H7p5uRgNB900e_u{@_>=q&4?ozv{p362&q(%Sxs@H+ZZ zWgH}tFGbtlouV`Clpdn?m~y+0z|$^8NgCy0Q4(UkANdeJGCFyfDcLWPcj1gD!0_ru z8=&V*y26GrCQ#muu?h17Z=v_zFiRn`^dd6~mVK!9hBCZJM(SG`2q^=!-iXxz2{XXP z7R;YNzns(!#NNb1JuqCR=!wm{x6PQj{P}~BCrgIGqCVC=TbCKxapgbu|L*w-MN>*I z4GwPXSiXA6^NW);Rn`GW?-2vj6u1qS9S&>Vwh!Uh5Us~fo1;eqQQ-3ijqqi5I(47U z+Cnkpt5c><&0aC1Z2eaZht`M(Ax=AHn>7bDD`o{oK6~l-UTtx>#XLNJ|CN{Wa&tXZ zaC(!FKVyE{QNWDvV4fg&>~jVW4dfm?cyMv0P8jS1%5wSY<5;Y}|7L4DGtw;hPK=?a zIvdcI!CMRX6oPB8?)TGRn8Iu5CY1td*yJ@N`Ut^rlC2`0!2&V;8A{AbBdDE{JN}l| zzB84<=wzLDvZQpfL23dO^vPzaJ(A( z@*Z5rrO@dE>i)DWa<;LWc_zO?4~OYUofxt`Ib^;;eKgD=V^-JND1}hrFDDY0>UvKX z*g*ji-%3HIR>R}i8}!2HW?HxdVGPL~pu0w7QAsuS2gVbX?8in9pB2G%u=IFCws}M5 zp7^{>YvNWFdCxz-jiP_ACVR%IG{v;I9v3-k=)l`}Q<6IvG_JUK3jQ|(_Hz?8Y&2$+ zNY~SusXL)!%A%GNKy9T6Fd|lp<-!-2UOXwNBui#OaHQ98{UE3(X*l)iFbGhmkEsOY z+a~44gpW6^ajgp&jRno3PR`Q8m~~>ZS_y7YW34GtpJFnO$#O#r*OT)Lqjj|AP;QS( z|K0M4_ubU6*D66cI&GC0Uac4$gzRw7#EBD&+l(b=lTA09O<|94qtq1TKU1en*}JSZ zSWhG%-Eu)a7TO^qWV|ljPE{rC6-L|YV8Mw5Q)2{wd>Vj0IsRn4{+Kzy0t{EEbh2UK zy^Smg!j*;kjRPlJQBksoy1u zFCMt|(5#G%+q(c_-BNMenKk!l{z&hG zXD~2bmG{{dVQQ}QnHMNJcVA!;xjBi($ShgWwy&OixnRjJm}~d@fmTD1_1ic z$z#GSE)j3VpfG@co{1O8=xGl&UjV|$WVPkPoq+RnBTm6AH3PaS$N}a%)!QGPq#a$U zizR&Jq`U6=P3<$5A228vn@jdhwjOQ%VK8azh=Yq@J8smF_gwL-WYD=ia_3#(8yoR} zSdb!RIve*wA+g;3l4me9)C;Dh4(MwVv9K7bXLDakuz>+u_9#yHb<2qc%h`x{89KLV zl2-av`HZYqih}PvWi(bJIByQn!O7&^ve$r=1-)Lr=h%u;OVuVzB@Yac z*Z>9zwOl1CmsK1t{1f^fZ4|C(nIq}59MApj$663ch5{jDaGO44aY*lJ!f$74b`MF5 z9^B}1VH}77o8mT^g$;nRY+}i@F6i3$3^9C9d>>x`W=&`9~D9X z$TfU{VdAV#0SOU^TFDKp&rO3n&&V(omvAJGEPyr(>oImDAXpNdwB!(>1Hm*FI~a_P zIH>PWk`7sDBekG+LF5vA4WzLkg-9?H?7SF*zc00CiMH2gGS`Sp_-}rl8d#eenC%(O z@r+(kpJ}w??&us6RjF4BpyCBWRRR55WgWM~CsAZYy)|)lprpA)pJk>UzseR>je2&0 zIRf&INHy3n(R`QPM8#zrgj6;?cVHR!ehPRnIb;bG2{!`9&V8k3ZOPe`V$64t>4tKj z7|JC+jUZNH4(B+7--3rKFCbgE^(Nf+A<*av4@1mi;A&Rx7Vs3|#rJXtN2m69r=WKJHc|>xLYEUEs3ID2kQ|%f0g8rnc#Wff!zMj2)FqlZ4=XhAl$1vsu65EGT(4Xm50;dZAaj&T6wBhlc9=)_i{^ zY&gRwcGtt-njbJ-NG|F2lnhN2hBg#jcq)`hEB3w`RGe_U{F6e}jw17sPLZ&Is7ZL5 z>bpEaMNE|=m-+B~1>cfMGtZM+Ierdk1F8~25n&N3p?*8bxv`=gK+yAAdBKj%;_At1 zi|wCn>Vgh+y7km*%lSFpU%SqC8Y7ddfZq)6EuA~u8_aC)Y|QuEmm0c}+4GOHCJ5R7 zBFI+I+>e<}74-$xWmaZT=O+|P0imtb0^)?5De6nnhTi*O{@pb06kn~LLhvPV(n&gn zvfEMorXb|7a`~yOddyW%<=_@S3_`MQR&XkoBo~j;Db-Vhpk*c1wOWHTlPEQF^mJ%E3Z4o~npsyMc@;$RHdPPoSrBmG!Q%mz6#ZxJSzf0w!#o;$I7wUJbV2 zX4J*@I3Qc3vx``|6568DF~+FRgBO?EFJGR;8~Okn5b|W^LmPPdf+JjhVZd&032VI6 ztE3>$0PD@VQAzre{>eh9PVBdtdXQ9W^0!ty?t(GeN7H>jYQKCrW0dtsPS)2O7w6=9 zcCM()EY%lYoGgy?oL-VX^wpa;r|3GDRXmnnzr`nAX8s&K4`&%D(b`4;^el9QzMebu zf#BA#EJf4rmR?iep4BP2O_G znlRskEY`85QZ9i2et!X9t|V=zATN_M0*z@zWVpxg{#0inx`2c>tGeY{3wp>96+I!4 z#JuUDVwRl=mWqwETtjhW^?FzYdX)2cMZXH%b4`SinAqFtHi*5cdC}nM3dTQM`{B8K z$1}ndX*I)jYr-RsGDlzGTYTGCKhK}h(2(rul@7z_GQ_l1XVI?1AgXJNX>HB^Hb-zx zRhc>bQEF(|8a=BMU#TiXev3z#5G3-S^6{1Ihab}LJ;IbbkYGWFrZGEI(c|R^z!c{4 zfe~~LSrad%U^ziLFIG>p@yO|fR0+pphIHWo9v}BI5P)cclGH3xX2R$Qg*}=upW&g% zBg?BL+I>zbgs4wi+>-npw9N(tNC4sc=x1}8*%AtRC#TOH{o zakzFI*;7%eEjf2Cqg?%X#jj!Hrz@Cg7k*jMRj0{?Si8bi)CN4h;Ru#Sj#t9*UaRu)yH-j zVwcRZ4^yK@J^3Bby|Wcl4%{60rVuI@qP>H-+M5f4u#(>)pm6g6f4Hz#DVyqtIjXWp}3u!=>8(fC(6e z9&ecx(e)U**bE7Sr&4lz&d>4m{GMsBT$TABVB!W@P_wol6F1b;c!;>@ zxrFW+kFRqYe(81_AIPFQSmuLe8^X4WQu}67!Ar$D7!hrxWcdL1z6*Q{q~ePbpV5-< zo$xRTYAlx?ICNvC;}<6bBA~ef{2S}@gzX*w$^23TP*bfN-k=Lk&5c0&sGx3Wt1dJz z)n8-{EZ4mtYWI zp9+6U;Nmb3R82lQp%^Dz;%hdhk1fJ!8#!$m8pZg_GDPA%%aR6nWMHh%#b8E55^m@r z%po?6k5Tv~T8qyAo;)Ycy-%JK7xs2`PO6tK8Df29(f&H|=KPX#ZN(R+Gx48&dbCF` zem;LL29}H#G?8y)W<9gI7YyX~E_e~dDS~sWo33vHIi<;+*|bx-ot`~~LJEQzDMx3H zg}gj_B~JH99MCKHj>bmF5#)Uso?G|`E8E|!>~@=j7Qh6nej3Vw8lOgxkmM&(6EyrX z(cOrhCkLfTAaU})2{m)9z7+dkYO3bdZfBbC!y$@8{Coco9RMb3e!JW2x8-9;i+Vuv zu$+f4i$y+8CS~~JKu$p^XXx~aY+;0zdJ`Ow&jQWq@shrLOi9lpdWSNsl}RW1o| z=3fm(-J@i=OKnUUGZ0OtXN4tP!A-b&a2YpMP75L8jwxSeY-*i@C;F@cC`h#)z&0R@ z|LPOP71+{wEKkW&@n2wk#oz)chfb58Em;%zGrxcv|EO|BiBFq%Jg zpx@-cCG&56N);SWjh35{G2!3Y|0Mz9B|fQ|%+DG$GRn$jo)%Y|gp^bpvmQZW#W z&*7V`8TqgqVZDs0X{8%xZPP%TX&?X%kaB8iDU;*7F?Z#>M&$gSu=EBHN*orDbVwF& z^N&FfC;o`=!_ZVlFoi); z-MiTUyptd_Cuc`MP}qn?Iie=khJ#xn90mB$35$OnS$LSK<;P3Ce8g4oC(7|^ReAlF zbn(54{U!hHIw~8{Zj$j~+^=JA0i~A){{n{+EYm_aOyG;I2@fg-E7evAV%lgwOc;|3 z0KlZr8DiB|q6lG}AJUI#%_r6sxBigse~2vzhpjue{E(LZ-&_AZ4%+`is`-#brEy-g zRLXpc_3g%crC9ggE91W?GiG>_U4hMNpRqr})<2#Z_njDdeh==9yY)rjNe_Mb#Z=Gb z%M(j5tuIYcWgCF)zVxw#u=8c`NQlH=29N)J@Hnaa>fFZ;URb