diff --git a/docs/kcl/index.md b/docs/kcl/index.md index ef92ecb131..ab59cfc839 100644 --- a/docs/kcl/index.md +++ b/docs/kcl/index.md @@ -88,6 +88,7 @@ layout: manual * [`tan`](kcl/tan) * [`tangentialArc`](kcl/tangentialArc) * [`tangentialArcTo`](kcl/tangentialArcTo) +* [`tangentialArcToRelative`](kcl/tangentialArcToRelative) * [`tau`](kcl/tau) * [`toDegrees`](kcl/toDegrees) * [`toRadians`](kcl/toRadians) diff --git a/docs/kcl/std.json b/docs/kcl/std.json index adb547dbb4..95a2e0b1fe 100644 --- a/docs/kcl/std.json +++ b/docs/kcl/std.json @@ -217177,16 +217177,6 @@ "format": "double" } } - }, - { - "description": "A point where the arc should end. Must lie in the same plane as the current path pen position. Must not be colinear with current path pen position.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 } ] }, @@ -230578,6 +230568,6709 @@ "const exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> angledLine({ angle: 60, length: 10 }, %)\n |> tangentialArcTo([15, 15], %)\n |> line([10, -15], %)\n |> close(%)\n\nconst example = extrude(10, exampleSketch)" ] }, + { + "name": "tangentialArcToRelative", + "summary": "Starting at the current sketch's origin, draw a curved line segment along", + "description": "some part of an imaginary circle until it reaches a point the given (x, y) distance away.", + "tags": [], + "args": [ + { + "name": "delta", + "type": "[number]", + "schema": { + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "required": true + }, + { + "name": "sketch_group", + "type": "SketchGroup", + "schema": { + "description": "A sketch group is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "start", + "value" + ], + "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 + } + } + } + }, + "id": { + "description": "The id of the sketch group (this will change when the engine's reference to it changes.", + "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", + "extrudeGroup", + "id", + "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 + } + } + } + }, + "extrudeGroup": { + "description": "The extrude group the face is on.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketchGroup", + "value" + ], + "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 + } + } + } + }, + "edgeCuts": { + "description": "Chamfers or fillets on this extrude group.", + "type": "array", + "items": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "tag": { + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "fillet" + ] + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "tag": { + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + } + } + } + ] + } + }, + "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" + }, + "sketchGroup": { + "description": "The sketch group.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "start", + "value" + ], + "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 + } + } + } + }, + "id": { + "description": "The id of the sketch group (this will change when the engine's reference to it changes.", + "type": "string", + "format": "uuid" + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "$ref": "#/components/schemas/SketchSurface" + }, + "start": { + "description": "The starting path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch group.", + "type": "object", + "additionalProperties": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "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 + } + } + } + }, + "info": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketchGroup" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + } + }, + "nullable": true + }, + "sketchGroup": { + "description": "The sketch group the tag is on.", + "type": "string", + "format": "uuid" + }, + "surface": { + "description": "The surface information for the tag.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "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" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "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" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "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 + }, + "tag": { + "description": "The tag.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "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 + }, + "tag": { + "description": "The tag.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "fillet" + ] + } + } + } + ], + "nullable": true + } + }, + "nullable": true + }, + "value": { + "type": "string" + } + } + } + }, + "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", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "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", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "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", + "ccw", + "center", + "from", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "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", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "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", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "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", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "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", + "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" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "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" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "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 + }, + "tag": { + "description": "The tag.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "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 + }, + "tag": { + "description": "The tag.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "fillet" + ] + } + } + } + ] + } + } + } + }, + "id": { + "description": "The id of the face.", + "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" + } + } + } + } + } + ] + }, + "start": { + "description": "The starting path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch group.", + "type": "object", + "additionalProperties": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "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 + } + } + } + }, + "info": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketchGroup" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + } + }, + "nullable": true + }, + "sketchGroup": { + "description": "The sketch group the tag is on.", + "type": "string", + "format": "uuid" + }, + "surface": { + "description": "The surface information for the tag.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "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" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "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" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "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 + }, + "tag": { + "description": "The tag.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "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 + }, + "tag": { + "description": "The tag.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "fillet" + ] + } + } + } + ], + "nullable": true + } + }, + "nullable": true + }, + "value": { + "type": "string" + } + } + } + }, + "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", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "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", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "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", + "ccw", + "center", + "from", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "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", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "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", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "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", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Base" + ] + } + } + } + ] + } + } + } + }, + "required": true + }, + { + "name": "tag", + "type": "TagDeclarator", + "schema": { + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "required": false + } + ], + "returnValue": { + "name": "", + "type": "SketchGroup", + "schema": { + "description": "A sketch group is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "start", + "value" + ], + "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 + } + } + } + }, + "id": { + "description": "The id of the sketch group (this will change when the engine's reference to it changes.", + "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", + "extrudeGroup", + "id", + "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 + } + } + } + }, + "extrudeGroup": { + "description": "The extrude group the face is on.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketchGroup", + "value" + ], + "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 + } + } + } + }, + "edgeCuts": { + "description": "Chamfers or fillets on this extrude group.", + "type": "array", + "items": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "tag": { + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "fillet" + ] + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "tag": { + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + } + } + } + ] + } + }, + "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" + }, + "sketchGroup": { + "description": "The sketch group.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "start", + "value" + ], + "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 + } + } + } + }, + "id": { + "description": "The id of the sketch group (this will change when the engine's reference to it changes.", + "type": "string", + "format": "uuid" + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "$ref": "#/components/schemas/SketchSurface" + }, + "start": { + "description": "The starting path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch group.", + "type": "object", + "additionalProperties": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "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 + } + } + } + }, + "info": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketchGroup" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + } + }, + "nullable": true + }, + "sketchGroup": { + "description": "The sketch group the tag is on.", + "type": "string", + "format": "uuid" + }, + "surface": { + "description": "The surface information for the tag.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "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" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "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" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "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 + }, + "tag": { + "description": "The tag.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "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 + }, + "tag": { + "description": "The tag.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "fillet" + ] + } + } + } + ], + "nullable": true + } + }, + "nullable": true + }, + "value": { + "type": "string" + } + } + } + }, + "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", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "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", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "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", + "ccw", + "center", + "from", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "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", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "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", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "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", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "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", + "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" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "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" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "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 + }, + "tag": { + "description": "The tag.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "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 + }, + "tag": { + "description": "The tag.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "fillet" + ] + } + } + } + ] + } + } + } + }, + "id": { + "description": "The id of the face.", + "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" + } + } + } + } + } + ] + }, + "start": { + "description": "The starting path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch group.", + "type": "object", + "additionalProperties": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "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 + } + } + } + }, + "info": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketchGroup" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + } + }, + "nullable": true + }, + "sketchGroup": { + "description": "The sketch group the tag is on.", + "type": "string", + "format": "uuid" + }, + "surface": { + "description": "The surface information for the tag.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "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" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "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" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "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 + }, + "tag": { + "description": "The tag.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "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 + }, + "tag": { + "description": "The tag.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "fillet" + ] + } + } + } + ], + "nullable": true + } + }, + "nullable": true + }, + "value": { + "type": "string" + } + } + } + }, + "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", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "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", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "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", + "ccw", + "center", + "from", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "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", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "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", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "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", + "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 + }, + "tag": { + "description": "The tag of the path.", + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + } + }, + "nullable": true + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Base" + ] + } + } + } + ] + } + } + } + }, + "required": true + }, + "unpublished": false, + "deprecated": false, + "examples": [ + "const exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> angledLine({ angle: 45, length: 10 }, %)\n |> tangentialArcToRelative([0, -10], %)\n |> line([-10, 0], %)\n |> close(%)\n\nconst example = extrude(10, exampleSketch)" + ] + }, { "name": "tau", "summary": "Return the value of `tau`. The full circle constant (τ). Equal to 2π.", diff --git a/docs/kcl/tangentialArc.md b/docs/kcl/tangentialArc.md index 5724715d69..4cfa30c498 100644 --- a/docs/kcl/tangentialArc.md +++ b/docs/kcl/tangentialArc.md @@ -37,8 +37,7 @@ const example = extrude(10, exampleSketch) offset: number, // Radius of the arc. Not to be confused with Raiders of the Lost Ark. radius: number, -} | -[number, number] +} ``` * `sketch_group`: `SketchGroup` - A sketch group is a collection of paths. (REQUIRED) ```js diff --git a/docs/kcl/tangentialArcToRelative.md b/docs/kcl/tangentialArcToRelative.md new file mode 100644 index 0000000000..e5669c0ebc --- /dev/null +++ b/docs/kcl/tangentialArcToRelative.md @@ -0,0 +1,863 @@ +--- +title: "tangentialArcToRelative" +excerpt: "Starting at the current sketch's origin, draw a curved line segment along" +layout: manual +--- + +Starting at the current sketch's origin, draw a curved line segment along + +some part of an imaginary circle until it reaches a point the given (x, y) distance away. + +```js +tangentialArcToRelative(delta: [number], sketch_group: SketchGroup, tag?: TagDeclarator) -> SketchGroup +``` + +### Examples + +```js +const exampleSketch = startSketchOn('XZ') + |> startProfileAt([0, 0], %) + |> angledLine({ angle: 45, length: 10 }, %) + |> tangentialArcToRelative([0, -10], %) + |> line([-10, 0], %) + |> close(%) + +const example = extrude(10, exampleSketch) +``` + +![Rendered example of tangentialArcToRelative 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAADpwklEQVR4Ae3gAZAkSZIkSRKLqpm7R0REZmZmVlVVVVV3d3d3d/fMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMdHd3d3dXV1VVVVVmZkZGRIS7m5kKz0xmV3d1d3dPz8zMzMxMYn3Qgx7EVVddddVVV1111VVXXXXVVVddddVVV131fxKVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq676P+Caa655MMCZM2cefM011zz4zJkzDwK45pprHnzNNdc8GODMmTMPPnv27K1nzpx58DXXXPNgXoD77rvvVh7g7Nmzt95333238kz/8A//8DsA9913361nz5699b777ruVq6666qqrrrrqqv+Z0IMe9CCuuuqqq6666qqrrrrqf4NrrrnmwQAv9mIv9tpnzpx50Iu/+Iu/NsCLvdiLvTYvwO7uLgC22d3d5eLFizw/u7u7ABw/fpz7nThxggd6yEMewr333su1117Lc7vvvvtuPXv27K333Xffrf/wD//wO/fdd9+tZ8+evfW+++67lauuuuqqq6666qr/PuhBD3oQV1111VVXXXXVVVdd9T/NNddc8+AzZ848+MVe7MVe68Vf/MVf+8Ve7MVem+eyu7vLxYsX2d3d5eLFiwDceuutADz96U/nhbHNv8Q2z8/x48cBOH78OCdOnODEiROcOHGC48eP89CHPpQHuu+++249e/bsrffdd9+t//AP//A79913363/8A//8NtcddVVV1111VVX/ddAD3rQg7jqqquuuuqqq6666qr/btdcc82DX+zFXuy1z5w586DXeZ3Xee9rrrnmwTzT7u4uFy9e5OlPfzoAt956K09/+tP5j2Cbf4ltnh/bPDfbnDhxAoCHPvShPOQhD+HEiRM89KEP5X733XffrWfPnr317//+73/7H/7hH37nH/7hH36bq6666qqrrrrqqv8c6EEPehBXXXXVVVddddVVV131X+2aa6558Iu92Iu99pkzZx70Tu/0Tp/NA+zu7vJXf/VX7O7u8ld/9Vf8W9jmX8s2L4xtnh/bPDfbPJBtTpw4wUMf+lAe+tCHcuLECR760IcCcN999936D//wD7/9D//wD79z33333foP//APv81VV1111VVXXXXVfwz0oAc9iKuuuuqqq6666qqrrvqvcM011zz4tV/7td/rxV/8xV/7xV7sxV6bZ9rd3eWv/uqvePrTn86tt97KfwbbvKhs84LY5vmxzXOzzQPZ5oGOHz/OQx/6UB72sIdx4sQJHvrQhwJw33333foP//APv/1bv/Vb3/MP//APv81VV1111VVXXXXVvx160IMexFVXXXXVVVddddVVV/1nueaaax782q/92u/1Oq/zOu99zTXXPBhgd3eXv/qrv+LpT386t956K/8dbPMvsc0LYpvnxzYPZJvnZpv72eZ+J06c4KEPfSgPfehDefmXf3kA7rvvvlv/4R/+4bd/67d+63v+4R/+4be56qqrrrrqqquu+tdBD3rQg7jqqquuuuqqq6666qr/SNdcc82DX/u1X/u9Xud1Xue9r7nmmgcD7O7u8ld/9Vf81V/9Fbu7u/xPYZt/iW1eENs8N9s8N9s8kG3uZ5sHss2JEyc4ceIEL//yL8/Lv/zLA3Dffffd+lu/9Vvf/Q//8A+/8w//8A+/zVVXXXXVVVddddW/DD3oQQ/iqquuuuqqq6666qqr/r2uueaaB7/2a7/2e734i7/4a7/Yi73YawPs7u7yV3/1V/zWb/0WLypJ/HvZ5t/CNi+MbZ4f2zw32zw32zyQbR7INvezzf2OHz/Owx72MB72sIfx8i//8gDcd999t/7Wb/3Wd//oj/7o53DVVVddddVVV131gqEHPehBXHXVVVddddVVV1111b/VNddc8+DXfu3Xfq93eqd3+myA3d1d/uqv/oq/+qu/Ynd3l3+JJP4r2OZFZZsXxjbPj22em20eyDYPZJsHss39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++679Uu+5Eve5hd+4Re+hquuuuqqq6666j8a5fjx41x11VVXXXXVVVdd9b/H4eHh7j/8wz/8DsCLv/iLv/Ytt9zCS7zES3Dfffdx6dIlrvrPY5v/7Wzz3+nYsWO8/du/Pa/4iq8IwD/8wz/89sd//Me/zNmzZ2/lqquuuuqqq676z4Ae9KAHcdVVV1111VVXXXXV/05nzpx50Od+7uf+9jXXXPPgS5cu8Xd/93f8/u//Plf929nm/xLb/E/xGq/xGrzGa7wGAPfdd9+tv/Vbv/XdP/qjP/o5XHXVVVddddVV/5kox48f56qrrrrqqquuuuqq/52Ojo4u/dmf/dnPHB4e7r7cy73ca99yyy28xEu8BPfddx+XLl3iqufPNv8X2eZ/omPHjvH2b//2vORLviQA//AP//DbH//xH/8y//AP//A7XHXVVVddddVV/9nQgx70IK666qqrrrrqqquu+t/vmmuuefDnfM7n/NY111zz4EuXLvF3f/d3/P7v/z7/39jm/wvb/E9mm9d4jdfgNV/zNQG47777bv36r//69/mHf/iH3+aqq6666qqrrvqvgh70oAdx1VVXXXXVVVddddX/Dddcc82DX/u1X/u93umd3umzAS5dusTf/d3f8fu///v8X2Cb/69s87+BbQBe8iVfkrd4i7fgfj/yIz/y2T/6oz/6OVx11VVXXXXVVf/V0IMe9CCuuuqqq6666qqrrvq/5Zprrnnw53zO5/zWNddc82CAv/u7v+P3f//3uXTpEv/T2OaqZ7PN/ya2eaBjx47xFm/xFjzoQQ8C4L777rv167/+69/nH/7hH36bq6666qqrrrrqvwPl+PHjXHXVVVddddVVV131f8vh4eHun/3Zn/3M4eHh7ou/+Iu/9rXXXssjH/lI5vM5t912G//RbHPVv55t/rexzfNz7NgxXvEVX5F3eId34Pjx49x33323/vzP//xXf+mXfunbnD179lauuuqqq6666qr/LuhBD3oQV1111VVXXXXVVVf933XNNdc8+LVf+7Xf653e6Z0+G+DSpUv87d/+Lb//+7/PVf81bPO/lW1emGPHjvGSL/mSvOZrvib3+5Ef+ZHP/tEf/dHP4aqrrrrqqquu+p8APehBD+Kqq6666qqrrrrqqv/7rrnmmgd/+Id/+He92Iu92GsDXLp0iZ//+Z/ntttu46r/GLb538w2L6pjx47xki/5krzma74m9/uRH/mRz/7RH/3Rz+Gqq6666qqrrvqfBD3oQQ/iqquuuuqqq6666qr/P17ndV7nvd/xHd/xs6655poHA1y6dImf//mf57bbbuOqF41t/i+wzb/WsWPHeMmXfEle8zVfk/v9wz/8w29//dd//fvcd999t3LVVVddddVVV/1Pgx70oAdx1VVXXXXVVVddddX/L9dcc82DX/u1X/u93umd3umzeaa/+7u/42//9m+57bbbuAps83+Nbf6tjh07xku+5Evymq/5mtzvvvvuu/Xrv/7r3+cf/uEffpurrrrqqquuuup/KvSgBz2Iq6666qqrrrrqqqv+f7rmmmse/Nqv/drv9Tqv8zrvfc011zwY4NKlS/z8z/88t912G/+X2eb/Mtv8Rzh27Bgv+ZIvyWu+5mtyv/vuu+/Wr//6r3+ff/iHf/htrrrqqquuuuqq/+nQgx70IK666qqrrrrqqquu+v/tmmuuefBrv/Zrv9c7vdM7fTbPdOnSJX7v936Pv/u7v+N/I9v8f2Gb/2jHjh3jNV/zNXnJl3xJ7vcP//APv/31X//173PffffdylVXXXXVVVdd9b8FetCDHsRVV1111VVXXXXVVVcBnDlz5kGv8zqv897v9E7v9Nk806VLl/jbv/1bfv/3f5//KWzz/5Vt/jO9xmu8Bi/1Ui/FsWPHuN+P/MiPfPZv/dZvfffZs2efwVVXXXXVVVdd9b8NetCDHsRVV1111VVXXXXVVVc90DXXXPPg137t136v13md13nva6655sEAly5d4m//9m+57bbbuO222/iPZpurnpNt/iscO3aMl3zJl+Q1X/M1ud99991362/91m9994/+6I9+DlddddVVV1111f9m6EEPehBXXXXVVVddddVVV131/FxzzTUPfrEXe7HXep3XeZ33frEXe7HX5pkuXbrE7/3e7/F3f/d3PDfbXPWvY5v/aseOHeMlX/IlefCDH8wtt9zC/e67775bf+u3fuu7f/RHf/RzuOqqq6666qqr/i9AD3rQg7jqqquuuuqqq6666qp/yTXXXPPg137t136vd3qnd/psnunSpUs84xnP4G//9m+57bbbuOpfZpv/TseOHeMlX/Ilec3XfE3ud9999936W7/1W9/927/9299z33333cpVV1111VVXXfV/CXrQgx7EVVddddVVV1111VVXvaiuueaaB7/Yi73Ya73O67zOe7/Yi73Ya/NMly5d4m//9m95xjOewW233cb/d7b5n+LYsWO85Eu+JK/5mq/JA9133323/tZv/dZ3/+iP/ujncNVVV1111VVX/V+FHvSgB3HVVVddddVVV1111VX/Ftdcc82DX/u1X/u9Xud1Xue9r7nmmgfzTJcuXeJv//ZvecYznsFtt93G/1W2+Z/q2LFjvORLviSv+ZqvyQPdd999t/7Wb/3Wd//2b//299x33323ctVVV1111VVX/V+HHvSgB3HVVVddddVVV1111VX/Htdcc82Dz5w586DXeZ3Xee/XeZ3XeW8e4NKlS/zt3/4tz3jGM7jtttv438Y2/xscO3aMBz3oQRw7dozXfM3X5IHuu+++W3/0R3/0c/7+7//+t86ePfsMrrrqqquuuuqq/0/Qgx70IK666qqrrrrqqquuuuo/yjXXXPPgF3uxF3vtF3uxF3ut13md13lvHuDSpUs84xnP4LbbbuNv//Zv+Z/CNv8bHTt2jJd8yZfkwQ9+MLfccgsPdN999936W7/1W9/9D//wD7/zD//wD7/NVVddddVVV131/xV60IMexFVXXXXVVVddddVVV/1nOHPmzIOuueaah7zO67zOe11zzTUPfrEXe7HX5gEuXbrEM57xDG677Tb+9m//lv8stvm/4NixY7zkS74kD3rQg3jQgx7Ec7vvvvtu/a3f+q3v/u3f/u3vue+++27lqquuuuqqq666CtCDHvQgrrrqqquuuuqqq6666r/CNddc8+AXe7EXe63XeZ3Xee8Xe7EXe22ey6VLl3jGM57Bbbfdxu7uLrfddhv/Etv8X3Ts2DEe9KAHcezYMR70oAfxoAc9iAe67777bgX4rd/6re/+h3/4h9/+h3/4h9/hqquuuuqqq6666nmhBz3oQVx11VVXXXXVVVddddV/tWuuuebBZ86cefCLvdiLvdaLv/iLv/aLvdiLvTbP5dKlSwA84xnP4BnPeAaXLl3iGc94Bv/XHDt2jAc96EEcO3aMBz3oQTzoQQ/i+bnvvvtu/a3f+q3vBvjRH/3Rz+Gqq6666qqrrrrqX4Ye9KAHcdVVV1111VVXXXXVVf/drrnmmgcDvNiLvdhrv9iLvdhrXXPNNQ9+sRd7sdfm+bh06RK7u7tcunSJZzzjGVy6dAmAZzzjGfxPdezYMY4fP84tt9wCwIMe9CCOHz/OsWPHeH7uu+++W8+ePXvr3//93//2P/zDP/zOP/zDP/w2V1111VVXXXXVVf966EEPehBXXXXVVVddddVVV131P9E111zz4DNnzjz4mmuuefCLvdiLvdY111zz4Bd7sRd7bV6IS5cuAbC7u8ulS5fY3d3l0qVLAFy6dAmA3d1dAC5dusS/1bFjxwA4fvw4AMeOHePYsWPc70EPehAAD3rQg/iX3Hfffbf+wz/8w2/fd999t/7DP/zD7/zDP/zDb3PVVVddddVVV131HwM96EEP4qqrrrrqqquuuuqqq/43ueaaax585syZB19zzTUPfrEXe7HXuuaaax4M8GIv9mKvzb/RpUuXeGGOHTvGv8d9991369mzZ2/9+7//+98GOHv27DPuu+++W//hH/7ht7nqqquuuuqqq676z4Me9KAHcdVVV1111VVXXXXVVf9XXHPNNQ+27WuuueYh11xzzYPPnDnzoGuuuebBANdcc82DAc6cOfNggGuuuebB/Bvdd999twKcPXv21vvuu+9WgPvuu+9Wnukf/uEffgfgH/7hH36bq6666qqrrrrqqv8+6EEPehBXXXXVVVddddVVV131/90111zzYADbliQewLbPnj37DK666qqrrrrqqqv+90EPetCDuOqqq6666qqrrrrqqquuuuqqq6666qqr/k+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9V/CPHeHihS/k/+QAAAABJRU5ErkJggg==) + +### Arguments + +* `delta`: `[number]` (REQUIRED) +* `sketch_group`: `SketchGroup` - A sketch group is a collection of paths. (REQUIRED) +```js +{ + // The id of the sketch group (this will change when the engine's reference to it changes. + id: uuid, + // What the sketch is on (can be a plane or a face). + on: { + // The id of the plane. + id: uuid, + // Origin of the plane. + origin: { + x: number, + y: number, + z: number, +}, + type: "plane", + // Type for a plane. + value: "XY" | "XZ" | "YZ" | "Custom", + // What should the plane’s X axis be? + xAxis: { + x: number, + y: number, + z: number, +}, + // What should the plane’s Y axis be? + yAxis: { + x: number, + y: number, + z: number, +}, + // The z-axis (normal). + zAxis: { + x: number, + y: number, + z: number, +}, +} | +{ + // The extrude group the face is on. + extrudeGroup: { + // Chamfers or fillets on this extrude group. + edgeCuts: [{ + // The engine id of the edge to fillet. + edgeId: uuid, + // The id of the engine command that called this fillet. + id: uuid, + radius: number, + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + type: "fillet", +} | +{ + // The engine id of the edge to chamfer. + edgeId: uuid, + // The id of the engine command that called this chamfer. + id: uuid, + length: number, + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + type: "chamfer", +}], + // The id of the extrusion end cap + endCapId: uuid, + // The height of the extrude group. + height: number, + // The id of the extrude group. + id: uuid, + // The sketch group. + sketchGroup: { + // The id of the sketch group (this will change when the engine's reference to it changes. + id: uuid, + // What the sketch is on (can be a plane or a face). + on: SketchSurface, + // The starting path. + start: { + // The from point. + from: [number, number], + // The tag of the path. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + // The to point. + to: [number, number], +}, + // Tag identifiers that have been declared in this sketch group. + tags: { +}, + // The paths in the sketch group. + value: [{ + // The from point. + from: [number, number], + // The tag of the path. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + // The to point. + to: [number, number], + type: "ToPoint", +} | +{ + // arc's direction + ccw: bool, + // the arc's center + center: [number, number], + // The from point. + from: [number, number], + // The tag of the path. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + // The to point. + to: [number, number], + type: "TangentialArcTo", +} | +{ + // arc's direction + ccw: bool, + // the arc's center + center: [number, number], + // The from point. + from: [number, number], + // The tag of the path. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + // The to point. + to: [number, number], + type: "TangentialArc", +} | +{ + // The from point. + from: [number, number], + // The tag of the path. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + // The to point. + to: [number, number], + type: "Horizontal", + // The x coordinate. + x: number, +} | +{ + // The from point. + from: [number, number], + // The tag of the path. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + // The to point. + to: [number, number], + type: "AngledLineTo", + // The x coordinate. + x: number, + // The y coordinate. + y: number, +} | +{ + // The from point. + from: [number, number], + // The tag of the path. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + // The to point. + to: [number, number], + type: "Base", +}], +}, + // The id of the extrusion start cap + startCapId: uuid, + // The extrude surfaces. + value: [{ + // The face id for the extrude plane. + faceId: uuid, + // The id of the geometry. + id: uuid, + // The source range. + sourceRange: [number, number], + // The tag. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + type: "extrudePlane", +} | +{ + // The face id for the extrude plane. + faceId: uuid, + // The id of the geometry. + id: uuid, + // The source range. + sourceRange: [number, number], + // The tag. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + type: "extrudeArc", +} | +{ + // The id for the chamfer surface. + faceId: uuid, + // The id of the geometry. + id: uuid, + // The source range. + sourceRange: [number, number], + // The tag. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + type: "chamfer", +} | +{ + // The id for the fillet surface. + faceId: uuid, + // The id of the geometry. + id: uuid, + // The source range. + sourceRange: [number, number], + // The tag. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + type: "fillet", +}], +}, + // The id of the face. + id: uuid, + type: "face", + // The tag of the face. + value: string, + // What should the face’s X axis be? + xAxis: { + x: number, + y: number, + z: number, +}, + // What should the face’s Y axis be? + yAxis: { + x: number, + y: number, + z: number, +}, + // The z-axis (normal). + zAxis: { + x: number, + y: number, + z: number, +}, +}, + // The starting path. + start: { + // The from point. + from: [number, number], + // The tag of the path. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + // The to point. + to: [number, number], +}, + // Tag identifiers that have been declared in this sketch group. + tags: { +}, + // The paths in the sketch group. + value: [{ + // The from point. + from: [number, number], + // The tag of the path. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + // The to point. + to: [number, number], + type: "ToPoint", +} | +{ + // arc's direction + ccw: bool, + // the arc's center + center: [number, number], + // The from point. + from: [number, number], + // The tag of the path. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + // The to point. + to: [number, number], + type: "TangentialArcTo", +} | +{ + // arc's direction + ccw: bool, + // the arc's center + center: [number, number], + // The from point. + from: [number, number], + // The tag of the path. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + // The to point. + to: [number, number], + type: "TangentialArc", +} | +{ + // The from point. + from: [number, number], + // The tag of the path. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + // The to point. + to: [number, number], + type: "Horizontal", + // The x coordinate. + x: number, +} | +{ + // The from point. + from: [number, number], + // The tag of the path. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + // The to point. + to: [number, number], + type: "AngledLineTo", + // The x coordinate. + x: number, + // The y coordinate. + y: number, +} | +{ + // The from point. + from: [number, number], + // The tag of the path. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + // The to point. + to: [number, number], + type: "Base", +}], +} +``` +* `tag`: `TagDeclarator` (OPTIONAL) +```js +{ + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +} +``` + +### Returns + +`SketchGroup` - A sketch group is a collection of paths. +```js +{ + // The id of the sketch group (this will change when the engine's reference to it changes. + id: uuid, + // What the sketch is on (can be a plane or a face). + on: { + // The id of the plane. + id: uuid, + // Origin of the plane. + origin: { + x: number, + y: number, + z: number, +}, + type: "plane", + // Type for a plane. + value: "XY" | "XZ" | "YZ" | "Custom", + // What should the plane’s X axis be? + xAxis: { + x: number, + y: number, + z: number, +}, + // What should the plane’s Y axis be? + yAxis: { + x: number, + y: number, + z: number, +}, + // The z-axis (normal). + zAxis: { + x: number, + y: number, + z: number, +}, +} | +{ + // The extrude group the face is on. + extrudeGroup: { + // Chamfers or fillets on this extrude group. + edgeCuts: [{ + // The engine id of the edge to fillet. + edgeId: uuid, + // The id of the engine command that called this fillet. + id: uuid, + radius: number, + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + type: "fillet", +} | +{ + // The engine id of the edge to chamfer. + edgeId: uuid, + // The id of the engine command that called this chamfer. + id: uuid, + length: number, + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + type: "chamfer", +}], + // The id of the extrusion end cap + endCapId: uuid, + // The height of the extrude group. + height: number, + // The id of the extrude group. + id: uuid, + // The sketch group. + sketchGroup: { + // The id of the sketch group (this will change when the engine's reference to it changes. + id: uuid, + // What the sketch is on (can be a plane or a face). + on: SketchSurface, + // The starting path. + start: { + // The from point. + from: [number, number], + // The tag of the path. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + // The to point. + to: [number, number], +}, + // Tag identifiers that have been declared in this sketch group. + tags: { +}, + // The paths in the sketch group. + value: [{ + // The from point. + from: [number, number], + // The tag of the path. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + // The to point. + to: [number, number], + type: "ToPoint", +} | +{ + // arc's direction + ccw: bool, + // the arc's center + center: [number, number], + // The from point. + from: [number, number], + // The tag of the path. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + // The to point. + to: [number, number], + type: "TangentialArcTo", +} | +{ + // arc's direction + ccw: bool, + // the arc's center + center: [number, number], + // The from point. + from: [number, number], + // The tag of the path. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + // The to point. + to: [number, number], + type: "TangentialArc", +} | +{ + // The from point. + from: [number, number], + // The tag of the path. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + // The to point. + to: [number, number], + type: "Horizontal", + // The x coordinate. + x: number, +} | +{ + // The from point. + from: [number, number], + // The tag of the path. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + // The to point. + to: [number, number], + type: "AngledLineTo", + // The x coordinate. + x: number, + // The y coordinate. + y: number, +} | +{ + // The from point. + from: [number, number], + // The tag of the path. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + // The to point. + to: [number, number], + type: "Base", +}], +}, + // The id of the extrusion start cap + startCapId: uuid, + // The extrude surfaces. + value: [{ + // The face id for the extrude plane. + faceId: uuid, + // The id of the geometry. + id: uuid, + // The source range. + sourceRange: [number, number], + // The tag. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + type: "extrudePlane", +} | +{ + // The face id for the extrude plane. + faceId: uuid, + // The id of the geometry. + id: uuid, + // The source range. + sourceRange: [number, number], + // The tag. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + type: "extrudeArc", +} | +{ + // The id for the chamfer surface. + faceId: uuid, + // The id of the geometry. + id: uuid, + // The source range. + sourceRange: [number, number], + // The tag. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + type: "chamfer", +} | +{ + // The id for the fillet surface. + faceId: uuid, + // The id of the geometry. + id: uuid, + // The source range. + sourceRange: [number, number], + // The tag. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + type: "fillet", +}], +}, + // The id of the face. + id: uuid, + type: "face", + // The tag of the face. + value: string, + // What should the face’s X axis be? + xAxis: { + x: number, + y: number, + z: number, +}, + // What should the face’s Y axis be? + yAxis: { + x: number, + y: number, + z: number, +}, + // The z-axis (normal). + zAxis: { + x: number, + y: number, + z: number, +}, +}, + // The starting path. + start: { + // The from point. + from: [number, number], + // The tag of the path. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + // The to point. + to: [number, number], +}, + // Tag identifiers that have been declared in this sketch group. + tags: { +}, + // The paths in the sketch group. + value: [{ + // The from point. + from: [number, number], + // The tag of the path. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + // The to point. + to: [number, number], + type: "ToPoint", +} | +{ + // arc's direction + ccw: bool, + // the arc's center + center: [number, number], + // The from point. + from: [number, number], + // The tag of the path. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + // The to point. + to: [number, number], + type: "TangentialArcTo", +} | +{ + // arc's direction + ccw: bool, + // the arc's center + center: [number, number], + // The from point. + from: [number, number], + // The tag of the path. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + // The to point. + to: [number, number], + type: "TangentialArc", +} | +{ + // The from point. + from: [number, number], + // The tag of the path. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + // The to point. + to: [number, number], + type: "Horizontal", + // The x coordinate. + x: number, +} | +{ + // The from point. + from: [number, number], + // The tag of the path. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + // The to point. + to: [number, number], + type: "AngledLineTo", + // The x coordinate. + x: number, + // The y coordinate. + y: number, +} | +{ + // The from point. + from: [number, number], + // The tag of the path. + tag: { + digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], + end: number, + start: number, + value: string, +}, + // The to point. + to: [number, number], + type: "Base", +}], +} +``` + + + diff --git a/src/wasm-lib/kcl/src/ast/types.rs b/src/wasm-lib/kcl/src/ast/types.rs index 37eeeb87f4..c8438c70aa 100644 --- a/src/wasm-lib/kcl/src/ast/types.rs +++ b/src/wasm-lib/kcl/src/ast/types.rs @@ -2573,7 +2573,6 @@ impl ObjectExpression { } }) .collect(); - dbg!(&format_items); let end_indent = if is_in_pipe { options.get_indentation_offset_pipe(indentation_level) } else { diff --git a/src/wasm-lib/kcl/src/std/args.rs b/src/wasm-lib/kcl/src/std/args.rs index 0036db270b..714da650de 100644 --- a/src/wasm-lib/kcl/src/std/args.rs +++ b/src/wasm-lib/kcl/src/std/args.rs @@ -495,6 +495,9 @@ where { fn from_args(args: &'a Args, i: usize) -> Result { let Some(arg) = args.args.get(i) else { return Ok(None) }; + if crate::ast::types::KclNone::from_mem_item(arg).is_some() { + return Ok(None); + } let Some(val) = T::from_mem_item(arg) else { return Err(KclError::Semantic(KclErrorDetails { message: format!( @@ -620,6 +623,7 @@ impl_from_arg_via_json!(crate::std::polar::PolarCoordsData); impl_from_arg_via_json!(SketchGroup); impl_from_arg_via_json!(FaceTag); impl_from_arg_via_json!(String); +impl_from_arg_via_json!(crate::ast::types::KclNone); impl_from_arg_via_json!(u32); impl_from_arg_via_json!(u64); impl_from_arg_via_json!(f64); diff --git a/src/wasm-lib/kcl/src/std/mod.rs b/src/wasm-lib/kcl/src/std/mod.rs index 7b1c57f7da..3317e003ab 100644 --- a/src/wasm-lib/kcl/src/std/mod.rs +++ b/src/wasm-lib/kcl/src/std/mod.rs @@ -81,6 +81,7 @@ lazy_static! { Box::new(crate::std::sketch::Arc), Box::new(crate::std::sketch::TangentialArc), Box::new(crate::std::sketch::TangentialArcTo), + Box::new(crate::std::sketch::TangentialArcToRelative), Box::new(crate::std::sketch::BezierCurve), Box::new(crate::std::sketch::Hole), Box::new(crate::std::patterns::PatternLinear2D), diff --git a/src/wasm-lib/kcl/src/std/sketch.rs b/src/wasm-lib/kcl/src/std/sketch.rs index 0f19d060d4..87d99fdcfd 100644 --- a/src/wasm-lib/kcl/src/std/sketch.rs +++ b/src/wasm-lib/kcl/src/std/sketch.rs @@ -14,7 +14,7 @@ use crate::{ errors::{KclError, KclErrorDetails}, executor::{ BasePath, ExtrudeGroup, Face, GeoMeta, KclValue, Path, Plane, PlaneType, Point2d, Point3d, SketchGroup, - SketchGroupSet, SketchSurface, SourceRange, TagEngineInfo, TagIdentifier, UserVal, + SketchGroupSet, SketchSurface, TagEngineInfo, TagIdentifier, UserVal, }, std::{ utils::{ @@ -1634,8 +1634,6 @@ pub enum TangentialArcData { /// Offset of the arc, in degrees. offset: f64, }, - /// A point where the arc should end. Must lie in the same plane as the current path pen position. Must not be colinear with current path pen position. - Point([f64; 2]), } /// Draw a tangential arc. @@ -1728,13 +1726,6 @@ async fn inner_tangential_arc( .await?; (center, to.into(), ccw) } - TangentialArcData::Point(to) => { - args.batch_modeling_cmd(id, tan_arc_to(&sketch_group, &to)).await?; - // TODO: Figure out these calculations. - let ccw = false; - let center = Point2d { x: 0.0, y: 0.0 }; - (center, to, ccw) - } }; let current_path = Path::TangentialArc { @@ -1775,35 +1766,24 @@ fn tan_arc_to(sketch_group: &SketchGroup, to: &[f64; 2]) -> ModelingCmd { } } -fn too_few_args(source_range: SourceRange) -> KclError { - KclError::Syntax(KclErrorDetails { - source_ranges: vec![source_range], - message: "too few arguments".to_owned(), - }) -} - -fn get_arg(it: &mut I, src: SourceRange) -> Result { - it.next().ok_or_else(|| too_few_args(src)) -} - /// Draw a tangential arc to a specific point. pub async fn tangential_arc_to(args: Args) -> Result { - let src = args.source_range; - - // Get arguments to function call - let mut it = args.args.iter(); - let to: [f64; 2] = get_arg(&mut it, src)?.get_json()?; - let sketch_group: SketchGroup = get_arg(&mut it, src)?.get_json()?; - let tag = if let Ok(memory_item) = get_arg(&mut it, src) { - memory_item.get_json_opt()? - } else { - None - }; + let (to, sketch_group, tag): ([f64; 2], SketchGroup, Option) = + super::args::FromArgs::from_args(&args, 0)?; let new_sketch_group = inner_tangential_arc_to(to, sketch_group, tag, args).await?; Ok(KclValue::new_user_val(new_sketch_group.meta.clone(), new_sketch_group)) } +/// Draw a tangential arc to point some distance away.. +pub async fn tangential_arc_to_relative(args: Args) -> Result { + let (delta, sketch_group, tag): ([f64; 2], SketchGroup, Option) = + super::args::FromArgs::from_args(&args, 0)?; + + let new_sketch_group = inner_tangential_arc_to_relative(delta, sketch_group, tag, args).await?; + Ok(KclValue::new_user_val(new_sketch_group.meta.clone(), new_sketch_group)) +} + /// Starting at the current sketch's origin, draw a curved line segment along /// some part of an imaginary circle until it reaches the desired (x, y) /// coordinates. @@ -1873,6 +1853,90 @@ async fn inner_tangential_arc_to( Ok(new_sketch_group) } +/// Starting at the current sketch's origin, draw a curved line segment along +/// some part of an imaginary circle until it reaches a point the given (x, y) +/// distance away. +/// +/// ```no_run +/// const exampleSketch = startSketchOn('XZ') +/// |> startProfileAt([0, 0], %) +/// |> angledLine({ +/// angle: 45, +/// length: 10, +/// }, %) +/// |> tangentialArcToRelative([0, -10], %) +/// |> line([-10, 0], %) +/// |> close(%) +/// +/// const example = extrude(10, exampleSketch) +/// ``` +#[stdlib { + name = "tangentialArcToRelative", +}] +async fn inner_tangential_arc_to_relative( + delta: [f64; 2], + sketch_group: SketchGroup, + tag: Option, + args: Args, +) -> Result { + let from: Point2d = sketch_group.current_pen_position()?; + let tangent_info = sketch_group.get_tangential_info_from_paths(); + let tan_previous_point = if tangent_info.is_center { + get_tangent_point_from_previous_arc(tangent_info.center_or_tangent_point, tangent_info.ccw, from.into()) + } else { + tangent_info.center_or_tangent_point + }; + let [dx, dy] = delta; + let result = get_tangential_arc_to_info(TangentialArcInfoInput { + arc_start_point: [from.x, from.y], + arc_end_point: [from.x + dx, from.y + dy], + tan_previous_point, + obtuse: true, + }); + + if result.center[0].is_infinite() { + return Err(KclError::Semantic(KclErrorDetails { + source_ranges: vec![args.source_range], + message: + "could not sketch tangential arc, because its center would be infinitely far away in the X direction" + .to_owned(), + })); + } else if result.center[1].is_infinite() { + return Err(KclError::Semantic(KclErrorDetails { + source_ranges: vec![args.source_range], + message: + "could not sketch tangential arc, because its center would be infinitely far away in the Y direction" + .to_owned(), + })); + } + + let id = uuid::Uuid::new_v4(); + args.batch_modeling_cmd(id, tan_arc_to(&sketch_group, &delta)).await?; + + let current_path = Path::TangentialArcTo { + base: BasePath { + from: from.into(), + to: delta, + tag: tag.clone(), + geo_meta: GeoMeta { + id, + metadata: args.source_range.into(), + }, + }, + center: dbg!(result.center), + ccw: result.ccw > 0, + }; + + let mut new_sketch_group = sketch_group.clone(); + if let Some(tag) = &tag { + new_sketch_group.add_tag(tag, ¤t_path); + } + + new_sketch_group.value.push(current_path); + + Ok(new_sketch_group) +} + /// Data to draw a bezier curve. #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_tangential_arc_to_relative0.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_tangential_arc_to_relative0.png new file mode 100644 index 0000000000..b6a2294c1b Binary files /dev/null and b/src/wasm-lib/kcl/tests/outputs/serial_test_example_tangential_arc_to_relative0.png differ diff --git a/src/wasm-lib/tests/executor/inputs/i_shape.kcl b/src/wasm-lib/tests/executor/inputs/i_shape.kcl index e35de7f128..5921da73a1 100644 --- a/src/wasm-lib/tests/executor/inputs/i_shape.kcl +++ b/src/wasm-lib/tests/executor/inputs/i_shape.kcl @@ -9,40 +9,40 @@ let corner_radius = 5.0 // because your wrist isn't a perfect cylindrical surface let brace_base = startSketchAt([corner_radius, 0]) |> line([width - corner_radius, 0.0], %) - |> tangentialArc([corner_radius, corner_radius], %) + |> tangentialArcToRelative([corner_radius, corner_radius], %) |> yLine(25.0 - corner_radius, %) - |> tangentialArc([-corner_radius, corner_radius], %) + |> tangentialArcToRelative([-corner_radius, corner_radius], %) |> xLine(-(d_wrist_circumference[0] - (corner_radius * 2)), %) - |> tangentialArc([-corner_radius, corner_radius], %) + |> tangentialArcToRelative([-corner_radius, corner_radius], %) |> yLine(length - 25.0 - 23.0 - (corner_radius * 2), %) - |> tangentialArc([corner_radius, corner_radius], %) + |> tangentialArcToRelative([corner_radius, corner_radius], %) |> xLine(15.0 - (corner_radius * 2), %) - |> tangentialArc([corner_radius, corner_radius], %) + |> tangentialArcToRelative([corner_radius, corner_radius], %) |> yLine(23.0 - corner_radius, %) - |> tangentialArc([-corner_radius, corner_radius], %) + |> tangentialArcToRelative([-corner_radius, corner_radius], %) |> xLine(-(hand_thickness + 15.0 + 15.0 - (corner_radius * 2)), %) - |> tangentialArc([-corner_radius, -corner_radius], %) + |> tangentialArcToRelative([-corner_radius, -corner_radius], %) |> yLine(-(23.0 - corner_radius), %) - |> tangentialArc([corner_radius, -corner_radius], %) + |> tangentialArcToRelative([corner_radius, -corner_radius], %) |> xLine(15.0 - (corner_radius * 2), %) - |> tangentialArc([corner_radius, -corner_radius], %) + |> tangentialArcToRelative([corner_radius, -corner_radius], %) |> yLine(-(length - 25.0 - 23.0 - (corner_radius * 2)), %) - |> tangentialArc([-corner_radius, -corner_radius], %) + |> tangentialArcToRelative([-corner_radius, -corner_radius], %) |> xLine(-(d_wrist_circumference[1] + d_wrist_circumference[2] + d_wrist_circumference[3] - hand_thickness - corner_radius), %) - |> tangentialArc([-corner_radius, -corner_radius], %) + |> tangentialArcToRelative([-corner_radius, -corner_radius], %) |> yLine(-(25.0 - corner_radius), %) - |> tangentialArc([corner_radius, -corner_radius], %) + |> tangentialArcToRelative([corner_radius, -corner_radius], %) |> close(%) let inner = startSketchAt([0, 0]) |> xLine(1.0, %) - |> tangentialArc([corner_radius, corner_radius], %) + |> tangentialArcToRelative([corner_radius, corner_radius], %) |> yLine(25.0 - (corner_radius * 2), %) - |> tangentialArc([-corner_radius, corner_radius], %) + |> tangentialArcToRelative([-corner_radius, corner_radius], %) |> xLine(-1.0, %) - |> tangentialArc([-corner_radius, -corner_radius], %) + |> tangentialArcToRelative([-corner_radius, -corner_radius], %) |> yLine(-(25.0 - (corner_radius * 2)), %) - |> tangentialArc([corner_radius, -corner_radius], %) + |> tangentialArcToRelative([corner_radius, -corner_radius], %) |> close(%) let final = brace_base diff --git a/src/wasm-lib/tests/executor/main.rs b/src/wasm-lib/tests/executor/main.rs index c3ac605faa..43e7edb400 100644 --- a/src/wasm-lib/tests/executor/main.rs +++ b/src/wasm-lib/tests/executor/main.rs @@ -186,7 +186,7 @@ async fn kcl_test_negative_args() { async fn kcl_test_basic_tangential_arc_with_point() { let code = r#"const boxSketch = startSketchAt([0, 0]) |> line([0, 10], %) - |> tangentialArc([-5, 5], %) + |> tangentialArcToRelative([-5, 5], %) |> line([5, -15], %) |> extrude(10, %) "#; @@ -715,7 +715,7 @@ async fn kcl_test_error_sketch_on_arc_face() { let code = r#"fn cube = (pos, scale) => { const sg = startSketchOn('XY') |> startProfileAt(pos, %) - |> tangentialArc([0, scale], %, $here) + |> tangentialArcToRelative([0, scale], %, $here) |> line([scale, 0], %) |> line([0, -scale], %) @@ -739,7 +739,7 @@ const part002 = startSketchOn(part001, part001.sketchGroup.tags.here) assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - r#"type: KclErrorDetails { source_ranges: [SourceRange([280, 333])], message: "Tag `here` is a non-planar surface" }"# + r#"semantic: KclErrorDetails { source_ranges: [SourceRange([94, 139]), SourceRange([222, 238])], message: "could not sketch tangential arc, because its center would be infinitely far away in the X direction" }"# ); }