Compare commits

..

3 Commits

Author SHA1 Message Date
7325cfbb39 more failing tests
Signed-off-by: Jess Frazelle <github@jessfraz.com>
2024-07-28 14:24:05 -07:00
77ee88002d more tests
Signed-off-by: Jess Frazelle <github@jessfraz.com>
2024-07-28 14:23:18 -07:00
9a40d99d0b add failing tests
Signed-off-by: Jess Frazelle <github@jessfraz.com>
2024-07-28 14:22:18 -07:00
171 changed files with 4172 additions and 5466 deletions

View File

@ -124,7 +124,7 @@ const extrusion = extrude(5, sketch001)
* `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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -166,7 +166,7 @@ const extrusion = extrude(5, sketch001)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -180,7 +180,7 @@ const extrusion = extrude(5, sketch001)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -198,7 +198,7 @@ const extrusion = extrude(5, sketch001)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,

View File

@ -128,7 +128,7 @@ const extrusion = extrude(5, sketch001)
* `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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -170,7 +170,7 @@ const extrusion = extrude(5, sketch001)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -184,7 +184,7 @@ const extrusion = extrude(5, sketch001)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -202,7 +202,7 @@ const extrusion = extrude(5, sketch001)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,

View File

@ -33,7 +33,7 @@ const example = extrude(10, exampleSketch)
* `data`: `AngledLineData` - Data to draw an angled line. (REQUIRED)
```js
{
// The angle of the line (in degrees).
// The angle of the line.
angle: number,
// The length of the line.
length: number,
@ -43,7 +43,7 @@ const example = extrude(10, exampleSketch)
* `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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -85,7 +85,7 @@ const example = extrude(10, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -99,7 +99,7 @@ const example = extrude(10, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -117,7 +117,7 @@ const example = extrude(10, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,
@ -455,7 +455,7 @@ const example = extrude(10, exampleSketch)
`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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -497,7 +497,7 @@ const example = extrude(10, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -511,7 +511,7 @@ const example = extrude(10, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -529,7 +529,7 @@ const example = extrude(10, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,

View File

@ -32,7 +32,7 @@ const extrusion = extrude(10, sketch001)
* `data`: `AngledLineData` - Data to draw an angled line. (REQUIRED)
```js
{
// The angle of the line (in degrees).
// The angle of the line.
angle: number,
// The length of the line.
length: number,
@ -42,7 +42,7 @@ const extrusion = extrude(10, sketch001)
* `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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -84,7 +84,7 @@ const extrusion = extrude(10, sketch001)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -98,7 +98,7 @@ const extrusion = extrude(10, sketch001)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -116,7 +116,7 @@ const extrusion = extrude(10, sketch001)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,
@ -454,7 +454,7 @@ const extrusion = extrude(10, sketch001)
`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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -496,7 +496,7 @@ const extrusion = extrude(10, sketch001)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -510,7 +510,7 @@ const extrusion = extrude(10, sketch001)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -528,7 +528,7 @@ const extrusion = extrude(10, sketch001)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,

View File

@ -34,7 +34,7 @@ const example = extrude(10, exampleSketch)
* `data`: `AngledLineData` - Data to draw an angled line. (REQUIRED)
```js
{
// The angle of the line (in degrees).
// The angle of the line.
angle: number,
// The length of the line.
length: number,
@ -44,7 +44,7 @@ const example = extrude(10, exampleSketch)
* `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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -86,7 +86,7 @@ const example = extrude(10, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -100,7 +100,7 @@ const example = extrude(10, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -118,7 +118,7 @@ const example = extrude(10, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,
@ -456,7 +456,7 @@ const example = extrude(10, exampleSketch)
`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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -498,7 +498,7 @@ const example = extrude(10, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -512,7 +512,7 @@ const example = extrude(10, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -530,7 +530,7 @@ const example = extrude(10, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,

View File

@ -136,7 +136,7 @@ const example = extrude(10, exampleSketch)
* `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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -178,7 +178,7 @@ const example = extrude(10, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -192,7 +192,7 @@ const example = extrude(10, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -210,7 +210,7 @@ const example = extrude(10, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,
@ -548,7 +548,7 @@ const example = extrude(10, exampleSketch)
`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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -590,7 +590,7 @@ const example = extrude(10, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -604,7 +604,7 @@ const example = extrude(10, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -622,7 +622,7 @@ const example = extrude(10, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,

View File

@ -41,7 +41,7 @@ const example = extrude(10, exampleSketch)
* `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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -83,7 +83,7 @@ const example = extrude(10, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -97,7 +97,7 @@ const example = extrude(10, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -115,7 +115,7 @@ const example = extrude(10, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,
@ -453,7 +453,7 @@ const example = extrude(10, exampleSketch)
`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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -495,7 +495,7 @@ const example = extrude(10, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -509,7 +509,7 @@ const example = extrude(10, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -527,7 +527,7 @@ const example = extrude(10, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,

View File

@ -41,7 +41,7 @@ const example = extrude(10, exampleSketch)
* `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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -83,7 +83,7 @@ const example = extrude(10, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -97,7 +97,7 @@ const example = extrude(10, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -115,7 +115,7 @@ const example = extrude(10, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,
@ -453,7 +453,7 @@ const example = extrude(10, exampleSketch)
`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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -495,7 +495,7 @@ const example = extrude(10, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -509,7 +509,7 @@ const example = extrude(10, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -527,7 +527,7 @@ const example = extrude(10, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,

View File

@ -19,8 +19,8 @@ const exampleSketch = startSketchOn('XZ')
|> startProfileAt([0, 0], %)
|> line([10, 0], %)
|> arc({
angleStart: 0,
angleEnd: 280,
angle_start: 0,
angle_end: 280,
radius: 16
}, %)
|> close(%)
@ -34,9 +34,9 @@ const exampleSketch = startSketchOn('XZ')
```js
{
// The end angle.
angleEnd: number,
angle_end: number,
// The start angle.
angleStart: number,
angle_start: number,
// The radius.
radius: number,
} |
@ -52,7 +52,7 @@ const exampleSketch = startSketchOn('XZ')
* `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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -94,7 +94,7 @@ const exampleSketch = startSketchOn('XZ')
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -108,7 +108,7 @@ const exampleSketch = startSketchOn('XZ')
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -126,7 +126,7 @@ const exampleSketch = startSketchOn('XZ')
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,
@ -464,7 +464,7 @@ const exampleSketch = startSketchOn('XZ')
`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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -506,7 +506,7 @@ const exampleSketch = startSketchOn('XZ')
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -520,7 +520,7 @@ const exampleSketch = startSketchOn('XZ')
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -538,7 +538,7 @@ const exampleSketch = startSketchOn('XZ')
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,

View File

@ -47,7 +47,7 @@ const example = extrude(10, exampleSketch)
* `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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -89,7 +89,7 @@ const example = extrude(10, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -103,7 +103,7 @@ const example = extrude(10, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -121,7 +121,7 @@ const example = extrude(10, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,
@ -459,7 +459,7 @@ const example = extrude(10, exampleSketch)
`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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -501,7 +501,7 @@ const example = extrude(10, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -515,7 +515,7 @@ const example = extrude(10, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -533,7 +533,7 @@ const example = extrude(10, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,

View File

@ -149,7 +149,7 @@ const mountingPlate = extrude(thickness, mountingPlateSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -163,7 +163,7 @@ const mountingPlate = extrude(thickness, mountingPlateSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -181,7 +181,7 @@ const mountingPlate = extrude(thickness, mountingPlateSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -223,7 +223,7 @@ const mountingPlate = extrude(thickness, mountingPlateSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -237,7 +237,7 @@ const mountingPlate = extrude(thickness, mountingPlateSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -549,7 +549,7 @@ const mountingPlate = extrude(thickness, mountingPlateSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -563,7 +563,7 @@ const mountingPlate = extrude(thickness, mountingPlateSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -581,7 +581,7 @@ const mountingPlate = extrude(thickness, mountingPlateSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -623,7 +623,7 @@ const mountingPlate = extrude(thickness, mountingPlateSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -637,7 +637,7 @@ const mountingPlate = extrude(thickness, mountingPlateSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,

View File

@ -82,7 +82,7 @@ const example = extrude(5, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -96,7 +96,7 @@ const example = extrude(5, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -114,7 +114,7 @@ const example = extrude(5, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,
@ -324,7 +324,7 @@ const example = extrude(5, exampleSketch)
},
} |
{
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -366,7 +366,7 @@ const example = extrude(5, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -380,7 +380,7 @@ const example = extrude(5, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -619,7 +619,7 @@ const example = extrude(5, exampleSketch)
`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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -661,7 +661,7 @@ const example = extrude(5, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -675,7 +675,7 @@ const example = extrude(5, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -693,7 +693,7 @@ const example = extrude(5, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,

View File

@ -15,7 +15,7 @@ close(sketch_group: SketchGroup, tag?: TagDeclarator) -> SketchGroup
### Examples
```js
const exampleSketch = startSketchOn('XZ')
startSketchOn('XZ')
|> startProfileAt([0, 0], %)
|> line([10, 10], %)
|> line([10, 0], %)
@ -42,7 +42,7 @@ const example = extrude(10, exampleSketch)
* `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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -84,7 +84,7 @@ const example = extrude(10, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -98,7 +98,7 @@ const example = extrude(10, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -116,7 +116,7 @@ const example = extrude(10, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,
@ -454,7 +454,7 @@ const example = extrude(10, exampleSketch)
`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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -496,7 +496,7 @@ const example = extrude(10, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -510,7 +510,7 @@ const example = extrude(10, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -528,7 +528,7 @@ const example = extrude(10, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,

View File

@ -19,8 +19,8 @@ const example = startSketchOn('XZ')
|> startProfileAt([0, 0], %)
|> line([10, 0], %)
|> arc({
angleStart: 120,
angleEnd: 0,
angle_end: 0,
angle_start: 120,
radius: 5
}, %)
|> line([5, 0], %)
@ -41,8 +41,8 @@ const example = startSketchOn('XZ')
const exampleSketch = startSketchOn('XZ')
|> startProfileAt([-10, 0], %)
|> arc({
angleStart: 120,
angleEnd: -60,
angle_end: -60,
angle_start: 120,
radius: 5
}, %)
|> line([10, 0], %)
@ -67,7 +67,7 @@ const example = extrude(10, exampleSketch)
* `sketch_group_set`: `SketchGroupSet` - A sketch group or a group of sketch groups. (REQUIRED)
```js
{
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -109,7 +109,7 @@ const example = extrude(10, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -123,7 +123,7 @@ const example = extrude(10, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -141,7 +141,7 @@ const example = extrude(10, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,
@ -479,7 +479,7 @@ const example = extrude(10, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -493,7 +493,7 @@ const example = extrude(10, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -511,7 +511,7 @@ const example = extrude(10, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -553,7 +553,7 @@ const example = extrude(10, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -567,7 +567,7 @@ const example = extrude(10, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,

View File

@ -149,7 +149,7 @@ const mountingPlate = extrude(thickness, mountingPlateSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -163,7 +163,7 @@ const mountingPlate = extrude(thickness, mountingPlateSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -181,7 +181,7 @@ const mountingPlate = extrude(thickness, mountingPlateSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -223,7 +223,7 @@ const mountingPlate = extrude(thickness, mountingPlateSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -237,7 +237,7 @@ const mountingPlate = extrude(thickness, mountingPlateSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -549,7 +549,7 @@ const mountingPlate = extrude(thickness, mountingPlateSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -563,7 +563,7 @@ const mountingPlate = extrude(thickness, mountingPlateSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -581,7 +581,7 @@ const mountingPlate = extrude(thickness, mountingPlateSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -623,7 +623,7 @@ const mountingPlate = extrude(thickness, mountingPlateSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -637,7 +637,7 @@ const mountingPlate = extrude(thickness, mountingPlateSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,

View File

@ -19,9 +19,10 @@ const part001 = startSketchOn('XY')
|> circle([5, 5], 10, %)
|> extrude(10, %)
|> helix({
angleStart: 0,
angle_start: 0,
ccw: true,
revolutions: 16
revolutions: 16,
angle_start: 0
}, %)
```
@ -33,7 +34,7 @@ const part001 = startSketchOn('XY')
```js
{
// Start angle (in degrees).
angleStart: number,
angle_start: number,
// Is the helix rotation counter clockwise? The default is `false`.
ccw: string,
// Length of the helix. If this argument is not provided, the height of the extrude group is used.
@ -50,7 +51,7 @@ const part001 = startSketchOn('XY')
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -64,7 +65,7 @@ const part001 = startSketchOn('XY')
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -82,7 +83,7 @@ const part001 = startSketchOn('XY')
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -124,7 +125,7 @@ const part001 = startSketchOn('XY')
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -138,7 +139,7 @@ const part001 = startSketchOn('XY')
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -441,7 +442,7 @@ const part001 = startSketchOn('XY')
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -455,7 +456,7 @@ const part001 = startSketchOn('XY')
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -473,7 +474,7 @@ const part001 = startSketchOn('XY')
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -515,7 +516,7 @@ const part001 = startSketchOn('XY')
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -529,7 +530,7 @@ const part001 = startSketchOn('XY')
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,

View File

@ -53,7 +53,7 @@ const example = extrude(1, exampleSketch)
* `hole_sketch_group`: `SketchGroupSet` - A sketch group or a group of sketch groups. (REQUIRED)
```js
{
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -95,7 +95,7 @@ const example = extrude(1, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -109,7 +109,7 @@ const example = extrude(1, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -127,7 +127,7 @@ const example = extrude(1, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,
@ -457,7 +457,7 @@ const example = extrude(1, exampleSketch)
* `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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -499,7 +499,7 @@ const example = extrude(1, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -513,7 +513,7 @@ const example = extrude(1, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -531,7 +531,7 @@ const example = extrude(1, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,
@ -860,7 +860,7 @@ const example = extrude(1, exampleSketch)
`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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -902,7 +902,7 @@ const example = extrude(1, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -916,7 +916,7 @@ const example = extrude(1, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -934,7 +934,7 @@ const example = extrude(1, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,

View File

@ -62,7 +62,6 @@ layout: manual
* [`patternLinear3d`](kcl/patternLinear3d)
* [`patternTransform`](kcl/patternTransform)
* [`pi`](kcl/pi)
* [`polar`](kcl/polar)
* [`pow`](kcl/pow)
* [`profileStart`](kcl/profileStart)
* [`profileStartX`](kcl/profileStartX)

View File

@ -33,7 +33,7 @@ const example = extrude(5, exampleSketch)
* `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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -75,7 +75,7 @@ const example = extrude(5, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -89,7 +89,7 @@ const example = extrude(5, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -107,7 +107,7 @@ const example = extrude(5, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,

View File

@ -33,7 +33,7 @@ const example = extrude(5, exampleSketch)
* `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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -75,7 +75,7 @@ const example = extrude(5, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -89,7 +89,7 @@ const example = extrude(5, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -107,7 +107,7 @@ const example = extrude(5, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,

View File

@ -46,7 +46,7 @@ const example = extrude(5, exampleSketch)
* `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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -88,7 +88,7 @@ const example = extrude(5, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -102,7 +102,7 @@ const example = extrude(5, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -120,7 +120,7 @@ const example = extrude(5, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,
@ -458,7 +458,7 @@ const example = extrude(5, exampleSketch)
`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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -500,7 +500,7 @@ const example = extrude(5, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -514,7 +514,7 @@ const example = extrude(5, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -532,7 +532,7 @@ const example = extrude(5, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,

View File

@ -33,7 +33,7 @@ const example = extrude(5, exampleSketch)
* `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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -75,7 +75,7 @@ const example = extrude(5, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -89,7 +89,7 @@ const example = extrude(5, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -107,7 +107,7 @@ const example = extrude(5, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,
@ -445,7 +445,7 @@ const example = extrude(5, exampleSketch)
`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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -487,7 +487,7 @@ const example = extrude(5, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -501,7 +501,7 @@ const example = extrude(5, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -519,7 +519,7 @@ const example = extrude(5, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,

View File

@ -51,7 +51,7 @@ const example = extrude(1, exampleSketch)
* `sketch_group_set`: `SketchGroupSet` - A sketch group or a group of sketch groups. (REQUIRED)
```js
{
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -93,7 +93,7 @@ const example = extrude(1, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -107,7 +107,7 @@ const example = extrude(1, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -125,7 +125,7 @@ const example = extrude(1, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,

View File

@ -55,7 +55,7 @@ const example = extrude(-5, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -69,7 +69,7 @@ const example = extrude(-5, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -87,7 +87,7 @@ const example = extrude(-5, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -129,7 +129,7 @@ const example = extrude(-5, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -143,7 +143,7 @@ const example = extrude(-5, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,

View File

@ -44,7 +44,7 @@ const example = extrude(1, exampleSketch)
* `sketch_group_set`: `SketchGroupSet` - A sketch group or a group of sketch groups. (REQUIRED)
```js
{
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -86,7 +86,7 @@ const example = extrude(1, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -100,7 +100,7 @@ const example = extrude(1, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -118,7 +118,7 @@ const example = extrude(1, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,

View File

@ -53,7 +53,7 @@ const example = extrude(1, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -67,7 +67,7 @@ const example = extrude(1, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -85,7 +85,7 @@ const example = extrude(1, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -127,7 +127,7 @@ const example = extrude(1, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -141,7 +141,7 @@ const example = extrude(1, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,

View File

@ -55,7 +55,7 @@ let vase = layer()
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -69,7 +69,7 @@ let vase = layer()
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -87,7 +87,7 @@ let vase = layer()
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -129,7 +129,7 @@ let vase = layer()
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -143,7 +143,7 @@ let vase = layer()
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,

File diff suppressed because one or more lines are too long

View File

@ -34,7 +34,7 @@ const sketch001 = startSketchOn('XY')
* `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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -76,7 +76,7 @@ const sketch001 = startSketchOn('XY')
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -90,7 +90,7 @@ const sketch001 = startSketchOn('XY')
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -108,7 +108,7 @@ const sketch001 = startSketchOn('XY')
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,

View File

@ -29,7 +29,7 @@ const sketch001 = startSketchOn('XY')
* `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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -71,7 +71,7 @@ const sketch001 = startSketchOn('XY')
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -85,7 +85,7 @@ const sketch001 = startSketchOn('XY')
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -103,7 +103,7 @@ const sketch001 = startSketchOn('XY')
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,

View File

@ -28,7 +28,7 @@ const sketch001 = startSketchOn('XY')
* `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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -70,7 +70,7 @@ const sketch001 = startSketchOn('XY')
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -84,7 +84,7 @@ const sketch001 = startSketchOn('XY')
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -102,7 +102,7 @@ const sketch001 = startSketchOn('XY')
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,

View File

@ -250,7 +250,7 @@ uuid |
* `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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -292,7 +292,7 @@ uuid |
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -306,7 +306,7 @@ uuid |
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -324,7 +324,7 @@ uuid |
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,
@ -658,7 +658,7 @@ uuid |
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -672,7 +672,7 @@ uuid |
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -690,7 +690,7 @@ uuid |
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -732,7 +732,7 @@ uuid |
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -746,7 +746,7 @@ uuid |
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,

View File

@ -137,7 +137,7 @@ shell({ faces: ['end'], thickness: 0.25 }, firstSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -151,7 +151,7 @@ shell({ faces: ['end'], thickness: 0.25 }, firstSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -169,7 +169,7 @@ shell({ faces: ['end'], thickness: 0.25 }, firstSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -211,7 +211,7 @@ shell({ faces: ['end'], thickness: 0.25 }, firstSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -225,7 +225,7 @@ shell({ faces: ['end'], thickness: 0.25 }, firstSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -528,7 +528,7 @@ shell({ faces: ['end'], thickness: 0.25 }, firstSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -542,7 +542,7 @@ shell({ faces: ['end'], thickness: 0.25 }, firstSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -560,7 +560,7 @@ shell({ faces: ['end'], thickness: 0.25 }, firstSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -602,7 +602,7 @@ shell({ faces: ['end'], thickness: 0.25 }, firstSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -616,7 +616,7 @@ shell({ faces: ['end'], thickness: 0.25 }, firstSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,

View File

@ -97,7 +97,7 @@ const example = extrude(5, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -111,7 +111,7 @@ const example = extrude(5, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -129,7 +129,7 @@ const example = extrude(5, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -411,7 +411,7 @@ const example = extrude(5, exampleSketch)
`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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -453,7 +453,7 @@ const example = extrude(5, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -467,7 +467,7 @@ const example = extrude(5, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -485,7 +485,7 @@ const example = extrude(5, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,

View File

@ -59,7 +59,7 @@ const example = extrude(5, exampleSketch)
`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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -101,7 +101,7 @@ const example = extrude(5, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -115,7 +115,7 @@ const example = extrude(5, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -133,7 +133,7 @@ const example = extrude(5, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,

View File

@ -106,9 +106,9 @@ const example002 = extrude(5, exampleSketch002)
const a1 = startSketchOn({
plane: {
origin: { x: 0, y: 0, z: 0 },
xAxis: { x: 1, y: 0, z: 0 },
yAxis: { x: 0, y: 1, z: 0 },
zAxis: { x: 0, y: 0, z: 1 }
x_axis: { x: 1, y: 0, z: 0 },
y_axis: { x: 0, y: 1, z: 0 },
z_axis: { x: 0, y: 0, z: 1 }
}
})
|> startProfileAt([0, 0], %)
@ -141,19 +141,19 @@ const a1 = startSketchOn({
z: number,
},
// What should the planes X axis be?
xAxis: {
x_axis: {
x: number,
y: number,
z: number,
},
// What should the planes Y axis be?
yAxis: {
y_axis: {
x: number,
y: number,
z: number,
},
// The z-axis (normal).
zAxis: {
z_axis: {
x: number,
y: number,
z: number,
@ -166,7 +166,7 @@ const a1 = startSketchOn({
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -180,7 +180,7 @@ const a1 = startSketchOn({
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -198,7 +198,7 @@ const a1 = startSketchOn({
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -578,7 +578,7 @@ const a1 = startSketchOn({
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -592,7 +592,7 @@ const a1 = startSketchOn({
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -610,7 +610,7 @@ const a1 = startSketchOn({
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {

File diff suppressed because it is too large Load Diff

View File

@ -42,7 +42,7 @@ const example = extrude(10, exampleSketch)
* `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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -84,7 +84,7 @@ const example = extrude(10, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -98,7 +98,7 @@ const example = extrude(10, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -116,7 +116,7 @@ const example = extrude(10, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,
@ -454,7 +454,7 @@ const example = extrude(10, exampleSketch)
`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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -496,7 +496,7 @@ const example = extrude(10, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -510,7 +510,7 @@ const example = extrude(10, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -528,7 +528,7 @@ const example = extrude(10, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,

View File

@ -33,7 +33,7 @@ const example = extrude(10, exampleSketch)
* `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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -75,7 +75,7 @@ const example = extrude(10, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -89,7 +89,7 @@ const example = extrude(10, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -107,7 +107,7 @@ const example = extrude(10, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,
@ -445,7 +445,7 @@ const example = extrude(10, exampleSketch)
`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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -487,7 +487,7 @@ const example = extrude(10, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -501,7 +501,7 @@ const example = extrude(10, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -519,7 +519,7 @@ const example = extrude(10, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,

View File

@ -36,7 +36,7 @@ const example = extrude(10, exampleSketch)
* `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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -78,7 +78,7 @@ const example = extrude(10, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -92,7 +92,7 @@ const example = extrude(10, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -110,7 +110,7 @@ const example = extrude(10, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,
@ -448,7 +448,7 @@ const example = extrude(10, exampleSketch)
`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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -490,7 +490,7 @@ const example = extrude(10, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -504,7 +504,7 @@ const example = extrude(10, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -522,7 +522,7 @@ const example = extrude(10, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,

View File

@ -36,7 +36,7 @@ const example = extrude(10, exampleSketch)
* `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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -78,7 +78,7 @@ const example = extrude(10, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -92,7 +92,7 @@ const example = extrude(10, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -110,7 +110,7 @@ const example = extrude(10, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,
@ -448,7 +448,7 @@ const example = extrude(10, exampleSketch)
`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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -490,7 +490,7 @@ const example = extrude(10, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -504,7 +504,7 @@ const example = extrude(10, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -522,7 +522,7 @@ const example = extrude(10, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,

View File

@ -34,7 +34,7 @@ const example = extrude(10, exampleSketch)
* `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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -76,7 +76,7 @@ const example = extrude(10, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -90,7 +90,7 @@ const example = extrude(10, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -108,7 +108,7 @@ const example = extrude(10, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,
@ -446,7 +446,7 @@ const example = extrude(10, exampleSketch)
`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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -488,7 +488,7 @@ const example = extrude(10, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -502,7 +502,7 @@ const example = extrude(10, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -520,7 +520,7 @@ const example = extrude(10, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,

View File

@ -32,7 +32,7 @@ const example = extrude(5, exampleSketch)
* `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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -74,7 +74,7 @@ const example = extrude(5, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -88,7 +88,7 @@ const example = extrude(5, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -106,7 +106,7 @@ const example = extrude(5, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,
@ -444,7 +444,7 @@ const example = extrude(5, exampleSketch)
`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.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: {
@ -486,7 +486,7 @@ const example = extrude(5, exampleSketch)
// Chamfers or fillets on this extrude group.
filletOrChamfers: [{
// The engine id of the edge to fillet.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
@ -500,7 +500,7 @@ const example = extrude(5, exampleSketch)
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
edge_id: uuid,
// The id of the engine command that called this chamfer.
id: uuid,
length: number,
@ -518,7 +518,7 @@ const example = extrude(5, exampleSketch)
id: uuid,
// The sketch group.
sketchGroup: {
// The id of the sketch group (this will change when the engine's reference to it changes.
// The id of the sketch group.
id: uuid,
// What the sketch is on (can be a plane or a face).
on: SketchSurface,

View File

@ -925,10 +925,10 @@ test.describe('Editor tests', () => {
await expect(page.locator('.cm-lint-marker-error')).toBeVisible()
await expect(
page.locator('.cm-lint-marker.cm-lint-marker-error')
page.locator('.cm-lintRange.cm-lintRange-error').first()
).toBeVisible()
await page.locator('.cm-lint-marker.cm-lint-marker-error').hover()
await page.locator('.cm-lintRange.cm-lintRange-error').hover()
await expect(page.locator('.cm-diagnosticText').first()).toBeVisible()
await expect(
page.getByText('Cannot redefine `topAng`').first()
@ -1045,7 +1045,7 @@ test.describe('Editor tests', () => {
await page.hover('.cm-lint-marker-error')
const searchText =
'sketch profile must lie entirely on one side of the revolution axis'
await expect(page.getByText(searchText)).toBeVisible()
await expect(page.getByText(searchText).first()).toBeVisible()
})
test.describe('Autocomplete works', () => {
test('with enter/click to accept the completion', async ({ page }) => {
@ -2265,50 +2265,6 @@ test.describe('Onboarding tests', () => {
await expect(page.locator('.cm-content')).toContainText('// Shelf Bracket')
})
test('Code resets after confirmation', async ({ page }) => {
const initialCode = `const sketch001 = startSketchOn('XZ')`
// Load the page up with some code so we see the confirmation warning
// when we go to replay onboarding
await page.addInitScript((code) => {
localStorage.setItem('persistCode', code)
}, initialCode)
const u = await getUtils(page)
await page.setViewportSize({ width: 1200, height: 500 })
await u.waitForAuthSkipAppStart()
// Replay the onboarding
await page.getByRole('link', { name: 'Settings' }).last().click()
const replayButton = page.getByRole('button', { name: 'Replay onboarding' })
await expect(replayButton).toBeVisible()
await replayButton.click()
// Ensure we see the warning, and that the code has not yet updated
await expect(
page.getByText('Replaying onboarding resets your code')
).toBeVisible()
await expect(page.locator('.cm-content')).toHaveText(initialCode)
const nextButton = page.getByTestId('onboarding-next')
await expect(nextButton).toBeVisible()
await nextButton.click()
// Ensure we see the introduction and that the code has been reset
await expect(page.getByText('Welcome to Modeling App!')).toBeVisible()
await expect(page.locator('.cm-content')).toContainText('// Shelf Bracket')
// Ensure we persisted the code to local storage.
// Playwright's addInitScript method unfortunately will reset
// this code if we try reloading the page as a test,
// so this is our best way to test persistence afaik.
expect(
await page.evaluate(() => {
return localStorage.getItem('persistCode')
})
).toContain('// Shelf Bracket')
})
test('Click through each onboarding step', async ({ page }) => {
const u = await getUtils(page)
@ -4019,19 +3975,16 @@ test.describe('Regression tests', () => {
)
})
await expect(async () => {
await page.goto('/')
await u.waitForPageLoad()
// error in guter
await expect(page.locator('.cm-lint-marker-error')).toBeVisible({
timeout: 1_000,
})
await page.waitForTimeout(200)
// expect it still to be there (sometimes it just clears for a bit?)
await expect(page.locator('.cm-lint-marker-error')).toBeVisible({
timeout: 1_000,
})
}).toPass({ timeout: 40_000, intervals: [1_000] })
await page.goto('/')
await u.waitForPageLoad()
// error in guter
await expect(page.locator('.cm-lint-marker-error')).toBeVisible()
await page.waitForTimeout(200)
// expect it still to be there (sometimes it just clears for a bit?)
await expect(page.locator('.cm-lint-marker-error')).toBeVisible({
timeout: 10_000,
})
// error text on hover
await page.hover('.cm-lint-marker-error')
@ -4179,15 +4132,12 @@ test.describe('Sketch tests', () => {
await page.setViewportSize({ width: 1200, height: 500 })
await u.waitForAuthSkipAppStart()
await page.getByText('tangentialArcTo([24.95, -5.38], %)').click()
await expect(async () => {
await page.mouse.click(700, 200)
await page.getByText('tangentialArcTo([24.95, -5.38], %)').click()
await expect(
page.getByRole('button', { name: 'Edit Sketch' })
).toBeEnabled({ timeout: 1000 })
await page.getByRole('button', { name: 'Edit Sketch' }).click()
}).toPass({ timeout: 40_000, intervals: [1_000] })
await expect(
page.getByRole('button', { name: 'Edit Sketch' })
).toBeEnabled()
await page.getByRole('button', { name: 'Edit Sketch' }).click()
await page.waitForTimeout(600) // wait for animation
@ -7293,15 +7243,15 @@ test.describe('Test network and connection issues', () => {
.toHaveText(`const sketch001 = startSketchOn('XZ')
|> startProfileAt(${commonPoints.startAt}, %)
|> line([${commonPoints.num1}, 0], %)
|> line([-8.84, 8.75], %)`)
|> line([-9.16, 8.81], %)`)
await page.waitForTimeout(100)
await page.mouse.click(startXPx, 500 - PUR * 20)
await expect(page.locator('.cm-content'))
.toHaveText(`const sketch001 = startSketchOn('XZ')
|> startProfileAt(${commonPoints.startAt}, %)
|> line([${commonPoints.num1}, 0], %)
|> line([-8.84, 8.75], %)
|> line([-5.6, 0], %)`)
|> line([-9.16, 8.81], %)
|> line([-5.28, 0], %)`)
// Unequip line tool
await page.keyboard.press('Escape')
@ -8097,34 +8047,3 @@ test('Sketch on face', async ({ page }) => {
const sketch002 = extrude(${[5, 5]} + 7, sketch002)`
await expect(page.locator('.cm-content')).toHaveText(result2.regExp)
})
test('Typing KCL errors induces a badge on the error logs pane button', async ({
page,
}) => {
const u = await getUtils(page)
// Load the app with the working starter code
await page.addInitScript((code) => {
localStorage.setItem('persistCode', code)
}, bracket)
await page.setViewportSize({ width: 1200, height: 500 })
await u.waitForAuthSkipAppStart()
// wait for execution done
await u.openDebugPanel()
await u.expectCmdLog('[data-message-type="execution-done"]')
await u.closeDebugPanel()
// Ensure no badge is present
const errorLogsButton = page.getByRole('button', { name: 'KCL Code pane' })
await expect(errorLogsButton).not.toContainText('notification')
// Delete a character to break the KCL
await u.openKclCodePanel()
await page.getByText('extrude(').click()
await page.keyboard.press('Backspace')
// Ensure that a badge appears on the button
await expect(errorLogsButton).toContainText('notification')
})

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

View File

@ -266,7 +266,7 @@ export async function getUtils(page: Page) {
getSegmentBodyCoords: async (locator: string, px = 30) => {
const overlay = page.locator(locator)
const bbox = await overlay
.boundingBox({ timeout: 5000 })
.boundingBox()
.then((box) => ({ ...box, x: box?.x || 0, y: box?.y || 0 }))
const angle = Number(await overlay.getAttribute('data-overlay-angle'))
const angleXOffset = Math.cos(((angle - 180) * Math.PI) / 180) * px

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{
"name": "untitled-app",
"version": "0.24.7",
"version": "0.24.4",
"private": true,
"dependencies": {
"@codemirror/autocomplete": "^6.17.0",
@ -109,7 +109,7 @@
},
"devDependencies": {
"@babel/plugin-proposal-private-property-in-object": "^7.21.11",
"@babel/preset-env": "^7.25.0",
"@babel/preset-env": "^7.24.3",
"@iarna/toml": "^2.2.5",
"@lezer/generator": "^1.7.1",
"@playwright/test": "^1.45.1",

View File

@ -1,10 +1,5 @@
import { Extension } from '@codemirror/state'
import {
hoverTooltip,
tooltips,
ViewPlugin,
EditorView,
} from '@codemirror/view'
import { hoverTooltip, tooltips, ViewPlugin } from '@codemirror/view'
import { LanguageServerPlugin } from './lsp'
import { offsetToPos } from './util'
@ -22,13 +17,6 @@ export default function lspHoverExt(
}),
tooltips({
position: 'absolute',
parent: document.body,
}),
EditorView.baseTheme({
'.cm-tooltip': {
fontSize: '12px',
maxWidth: '400px',
},
}),
]
}

View File

@ -0,0 +1,12 @@
import { Extension } from '@codemirror/state'
import { linter, forEachDiagnostic, Diagnostic } from '@codemirror/lint'
export default function lspLintExt(): Extension {
return linter((view) => {
let diagnostics: Diagnostic[] = []
forEachDiagnostic(view.state, (d: Diagnostic, from: number, to: number) => {
diagnostics.push(d)
})
return diagnostics
})
}

View File

@ -17,8 +17,8 @@ import type {
PluginSpec,
ViewPlugin,
} from '@codemirror/view'
import { setDiagnosticsEffect } from '@codemirror/lint'
import { EditorView, Tooltip } from '@codemirror/view'
import { linter } from '@codemirror/lint'
import type { PublishDiagnosticsParams } from 'vscode-languageserver-protocol'
import type * as LSP from 'vscode-languageserver-protocol'
@ -36,6 +36,7 @@ import lspAutocompleteExt from './autocomplete'
import lspHoverExt from './hover'
import lspFormatExt from './format'
import lspIndentExt from './indent'
import lspLintExt from './lint'
import lspSemanticTokensExt from './semantic-tokens'
const useLast = (values: readonly any[]) => values.reduce((_, v) => v, '')
@ -215,6 +216,20 @@ export class LanguageServerPlugin implements PluginValue {
if (!this.client.ready) return
// TODO(paultag): This is the *wrong* place for this to live.
//
// We need to clear diagnostics before updating the code, because
// if the code shrinks, the errors/diagnostics can go out of range
// of the source code, which cause an exception, breaking all the
// things.
//
// We need some sort of clear diagnostics boolean on the editor
// and we can drop this.
this.view.dispatch({
effects: [setDiagnosticsEffect.of([])],
annotations: [],
})
try {
// Update the state (not the editor) with the new code.
this.client.textDocumentDidChange({
@ -572,8 +587,8 @@ export class LanguageServerPluginSpec
lspFormatExt(plugin),
lspHoverExt(plugin),
lspIndentExt(),
lspLintExt(),
lspSemanticTokensExt(),
linter(null),
]
}
}

View File

@ -23,7 +23,6 @@ export default defineConfig({
reporter: [
[process.env.CI ? 'dot' : 'list'],
['json', { outputFile: './test-results/report.json' }],
['html'],
],
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
use: {

204
src-tauri/Cargo.lock generated
View File

@ -188,7 +188,7 @@ dependencies = [
"tauri-plugin-shell",
"tauri-plugin-updater",
"tokio",
"toml 0.8.19",
"toml 0.8.14",
"url",
]
@ -332,7 +332,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -367,7 +367,7 @@ checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -407,7 +407,7 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -550,7 +550,7 @@ dependencies = [
"proc-macro-crate 3.1.0",
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
"syn_derive",
]
@ -648,12 +648,6 @@ version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
[[package]]
name = "byteorder-lite"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495"
[[package]]
name = "bytes"
version = "1.6.0"
@ -727,7 +721,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a969e13a7589e9e3e4207e153bae624ade2b5622fb4684a4923b23ec3d57719"
dependencies = [
"serde",
"toml 0.8.19",
"toml 0.8.14",
]
[[package]]
@ -798,9 +792,9 @@ dependencies = [
[[package]]
name = "clap"
version = "4.5.13"
version = "4.5.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fbb260a053428790f3de475e304ff84cdbc4face759ea7a3e64c1edd938a7fc"
checksum = "64acc1846d54c1fe936a78dc189c34e28d3f5afc348403f28ecf53660b9b8462"
dependencies = [
"clap_builder",
"clap_derive",
@ -808,9 +802,9 @@ dependencies = [
[[package]]
name = "clap_builder"
version = "4.5.13"
version = "4.5.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "64b17d7ea74e9f833c7dbf2cbe4fb12ff26783eda4782a8975b72f895c9b4d99"
checksum = "6fb8393d67ba2e7bfaf28a23458e4e2b543cc73a99595511eb207fdb8aede942"
dependencies = [
"anstream",
"anstyle",
@ -822,14 +816,14 @@ dependencies = [
[[package]]
name = "clap_derive"
version = "4.5.13"
version = "4.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0"
checksum = "2bac35c6dafb060fd4d275d9a4ffae97917c13a6327903a8be2153cd964f7085"
dependencies = [
"heck 0.5.0",
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -1079,7 +1073,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
dependencies = [
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -1089,7 +1083,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f"
dependencies = [
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -1113,7 +1107,7 @@ dependencies = [
"proc-macro2",
"quote",
"strsim 0.10.0",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -1124,7 +1118,7 @@ checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f"
dependencies = [
"darling_core",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -1185,7 +1179,7 @@ checksum = "4078275de501a61ceb9e759d37bdd3d7210e654dbc167ac1a3678ef4435ed57b"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
"synstructure",
]
@ -1212,7 +1206,7 @@ dependencies = [
[[package]]
name = "derive-docs"
version = "0.1.21"
version = "0.1.20"
dependencies = [
"Inflector",
"convert_case 0.6.0",
@ -1222,7 +1216,7 @@ dependencies = [
"regex",
"serde",
"serde_tokenstream",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -1233,7 +1227,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -1294,7 +1288,7 @@ checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -1326,7 +1320,7 @@ checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -1389,7 +1383,7 @@ dependencies = [
"cc",
"memchr",
"rustc_version",
"toml 0.8.19",
"toml 0.8.14",
"vswhom",
"winreg 0.52.0",
]
@ -1433,7 +1427,7 @@ checksum = "5c785274071b1b420972453b306eeca06acf4633829db4223b58a2a8c5953bc4"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -1594,7 +1588,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -1710,7 +1704,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -1986,7 +1980,7 @@ dependencies = [
"proc-macro-error",
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -2014,7 +2008,7 @@ dependencies = [
"inflections",
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -2089,7 +2083,7 @@ dependencies = [
"proc-macro-error",
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -2405,18 +2399,6 @@ dependencies = [
"unicode-normalization",
]
[[package]]
name = "image"
version = "0.25.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "99314c8a2152b8ddb211f924cdae532d8c5e4c8bb54728e12fff1b0cd5963a10"
dependencies = [
"bytemuck",
"byteorder-lite",
"num-traits",
"png",
]
[[package]]
name = "indexmap"
version = "1.9.3"
@ -2589,7 +2571,7 @@ dependencies = [
[[package]]
name = "kcl-lib"
version = "0.2.3"
version = "0.2.0"
dependencies = [
"anyhow",
"approx",
@ -2599,7 +2581,6 @@ dependencies = [
"bson",
"chrono",
"clap",
"convert_case 0.6.0",
"dashmap 6.0.1",
"databake",
"derive-docs",
@ -2607,7 +2588,6 @@ dependencies = [
"futures",
"git_rev",
"gltf-json",
"image",
"js-sys",
"kittycad",
"lazy_static",
@ -2622,11 +2602,10 @@ dependencies = [
"thiserror",
"tokio",
"tokio-tungstenite",
"toml 0.8.19",
"toml 0.8.14",
"tower-lsp",
"ts-rs",
"url",
"urlencoding",
"uuid",
"validator",
"wasm-bindgen",
@ -2649,9 +2628,9 @@ dependencies = [
[[package]]
name = "kittycad"
version = "0.3.9"
version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "36b87a9cca545825ba18005c1944b8525fac28867d99984178bf22c79fb5ec25"
checksum = "e1777b503442fa4666564cc3ab237d456df853a09648a4b2bb09622d25d021a5"
dependencies = [
"anyhow",
"async-trait",
@ -3389,7 +3368,7 @@ dependencies = [
"regex",
"regex-syntax 0.8.3",
"structmeta",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -3508,7 +3487,7 @@ dependencies = [
"phf_shared 0.11.2",
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -3540,9 +3519,9 @@ dependencies = [
[[package]]
name = "phonenumber"
version = "0.3.6+8.13.36"
version = "0.3.5+8.13.36"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "11756237b57b8cc5e97dc8b1e70ea436324d30e7075de63b14fd15073a8f692a"
checksum = "f174c8db59b620032bd52b655fc97000458850fec0db35fcd4e802b668517ec0"
dependencies = [
"bincode",
"either",
@ -3576,7 +3555,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -4450,7 +4429,7 @@ dependencies = [
"proc-macro2",
"quote",
"serde_derive_internals",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -4570,7 +4549,7 @@ checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -4581,18 +4560,17 @@ checksum = "330f01ce65a3a5fe59a60c82f3c9a024b573b8a6e875bd233fe5f934e71d54e3"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
name = "serde_json"
version = "1.0.121"
version = "1.0.120"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ab380d7d9f22ef3f21ad3e6c1ebe8e4fc7a2000ccba2e4d71fc96f15b2cb609"
checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5"
dependencies = [
"indexmap 2.2.6",
"itoa 1.0.11",
"memchr",
"ryu",
"serde",
]
@ -4615,14 +4593,14 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
name = "serde_spanned"
version = "0.6.7"
version = "0.6.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d"
checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0"
dependencies = [
"serde",
]
@ -4636,7 +4614,7 @@ dependencies = [
"proc-macro2",
"quote",
"serde",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -4678,7 +4656,7 @@ dependencies = [
"darling",
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -4946,7 +4924,7 @@ dependencies = [
"proc-macro2",
"quote",
"structmeta-derive",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -4957,7 +4935,7 @@ checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -4979,7 +4957,7 @@ dependencies = [
"proc-macro2",
"quote",
"rustversion",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -5012,9 +4990,9 @@ dependencies = [
[[package]]
name = "syn"
version = "2.0.72"
version = "2.0.71"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af"
checksum = "b146dcf730474b4bcd16c311627b31ede9ab149045db4d6088b3becaea046462"
dependencies = [
"proc-macro2",
"quote",
@ -5030,7 +5008,7 @@ dependencies = [
"proc-macro-error",
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -5047,7 +5025,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -5089,7 +5067,7 @@ dependencies = [
"cfg-expr",
"heck 0.5.0",
"pkg-config",
"toml 0.8.19",
"toml 0.8.14",
"version-compare",
]
@ -5242,7 +5220,7 @@ dependencies = [
"serde_json",
"tauri-utils",
"tauri-winres",
"toml 0.8.19",
"toml 0.8.14",
"walkdir",
]
@ -5264,7 +5242,7 @@ dependencies = [
"serde",
"serde_json",
"sha2",
"syn 2.0.72",
"syn 2.0.71",
"tauri-utils",
"thiserror",
"time",
@ -5282,7 +5260,7 @@ dependencies = [
"heck 0.5.0",
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
"tauri-codegen",
"tauri-utils",
]
@ -5300,7 +5278,7 @@ dependencies = [
"serde",
"serde_json",
"tauri-utils",
"toml 0.8.19",
"toml 0.8.14",
"walkdir",
]
@ -5584,7 +5562,7 @@ dependencies = [
"serde_with",
"swift-rs",
"thiserror",
"toml 0.8.19",
"toml 0.8.14",
"url",
"urlpattern",
"walkdir",
@ -5640,22 +5618,22 @@ checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c"
[[package]]
name = "thiserror"
version = "1.0.63"
version = "1.0.62"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724"
checksum = "f2675633b1499176c2dff06b0856a27976a8f9d436737b4cf4f312d4d91d8bbb"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
version = "1.0.63"
version = "1.0.62"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261"
checksum = "d20468752b09f49e909e55a5d338caa8bedf615594e9d80bc4c565d30faf798c"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -5752,7 +5730,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -5831,21 +5809,21 @@ dependencies = [
[[package]]
name = "toml"
version = "0.8.19"
version = "0.8.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e"
checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335"
dependencies = [
"serde",
"serde_spanned",
"toml_datetime",
"toml_edit 0.22.20",
"toml_edit 0.22.14",
]
[[package]]
name = "toml_datetime"
version = "0.6.8"
version = "0.6.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf"
dependencies = [
"serde",
]
@ -5887,15 +5865,15 @@ dependencies = [
[[package]]
name = "toml_edit"
version = "0.22.20"
version = "0.22.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d"
checksum = "f21c7aaf97f1bd9ca9d4f9e73b0a6c74bd5afef56f2bc931943a6e1c37e04e38"
dependencies = [
"indexmap 2.2.6",
"serde",
"serde_spanned",
"toml_datetime",
"winnow 0.6.18",
"winnow 0.6.6",
]
[[package]]
@ -5952,7 +5930,7 @@ checksum = "84fd902d4e0b9a4b27f2f440108dc034e1758628a9b702f8ec61ad66355422fa"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -5981,7 +5959,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -6111,7 +6089,7 @@ checksum = "c88cc88fd23b5a04528f3a8436024f20010a16ec18eb23c164b1242f65860130"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
"termcolor",
]
@ -6259,12 +6237,6 @@ dependencies = [
"serde",
]
[[package]]
name = "urlencoding"
version = "2.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da"
[[package]]
name = "urlpattern"
version = "0.2.0"
@ -6334,7 +6306,7 @@ dependencies = [
"proc-macro-error",
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -6433,7 +6405,7 @@ dependencies = [
"once_cell",
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
"wasm-bindgen-shared",
]
@ -6467,7 +6439,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
@ -6608,7 +6580,7 @@ checksum = "ac1345798ecd8122468840bcdf1b95e5dc6d2206c5e4b0eafa078d061f59c9bc"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -6714,7 +6686,7 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -6725,7 +6697,7 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]
@ -6972,9 +6944,9 @@ dependencies = [
[[package]]
name = "winnow"
version = "0.6.18"
version = "0.6.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f"
checksum = "f0c976aaaa0e1f90dbb21e9587cdaf1d9679a1cde8875c0d6bd83ab96a208352"
dependencies = [
"memchr",
]
@ -7177,7 +7149,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.71",
]
[[package]]

View File

@ -80,5 +80,5 @@
}
},
"productName": "Zoo Modeling App",
"version": "0.24.7"
"version": "0.24.4"
}

View File

@ -95,16 +95,16 @@ export function App() {
})
const newCmdId = uuidv4()
if (state.matches('idle.showPlanes')) return
if (context.store?.buttonDownInStream !== undefined) return
debounceSocketSend({
type: 'modeling_cmd_req',
cmd: {
type: 'highlight_set_entity',
selected_at_window: { x, y },
},
cmd_id: newCmdId,
})
if (context.store?.buttonDownInStream === undefined) {
debounceSocketSend({
type: 'modeling_cmd_req',
cmd: {
type: 'highlight_set_entity',
selected_at_window: { x, y },
},
cmd_id: newCmdId,
})
}
}
return (

View File

@ -190,59 +190,49 @@ export function Toolbar({
maybeIconConfig[0].onClick(configCallbackProps)
}
>
<span
className={!maybeIconConfig[0].showTitle ? 'sr-only' : ''}
>
{maybeIconConfig[0].title}
</span>
<ToolbarItemContents
itemConfig={maybeIconConfig[0]}
configCallbackProps={configCallbackProps}
/>
</ActionButton>
<ToolbarItemTooltip
itemConfig={maybeIconConfig[0]}
configCallbackProps={configCallbackProps}
/>
</ActionButtonDropdown>
)
}
const itemConfig = maybeIconConfig
return (
<div className="relative" key={itemConfig.id}>
<ActionButton
Element="button"
key={itemConfig.id}
id={itemConfig.id}
data-testid={itemConfig.id}
iconStart={{
icon: itemConfig.icon,
className: iconClassName,
bgClassName: bgClassName,
}}
className={
'pressed:!text-chalkboard-10 pressed:enabled:hovered:!text-chalkboard-10 ' +
buttonBorderClassName +
' ' +
buttonBgClassName +
(!itemConfig.showTitle ? ' !px-0' : '')
}
name={itemConfig.title}
aria-description={itemConfig.description}
aria-pressed={itemConfig.isActive}
disabled={
disableAllButtons ||
itemConfig.status !== 'available' ||
itemConfig.disabled
}
onClick={() => itemConfig.onClick(configCallbackProps)}
>
<span className={!itemConfig.showTitle ? 'sr-only' : ''}>
{itemConfig.title}
</span>
</ActionButton>
<ToolbarItemTooltip
<ActionButton
Element="button"
key={itemConfig.id}
id={itemConfig.id}
data-testid={itemConfig.id}
iconStart={{
icon: itemConfig.icon,
className: iconClassName,
bgClassName: bgClassName,
}}
className={
'pressed:!text-chalkboard-10 pressed:enabled:hovered:!text-chalkboard-10 ' +
buttonBorderClassName +
' ' +
buttonBgClassName +
(!itemConfig.showTitle ? ' !px-0' : '')
}
name={itemConfig.title}
aria-description={itemConfig.description}
aria-pressed={itemConfig.isActive}
disabled={
disableAllButtons ||
itemConfig.status !== 'available' ||
itemConfig.disabled
}
onClick={() => itemConfig.onClick(configCallbackProps)}
>
<ToolbarItemContents
itemConfig={itemConfig}
configCallbackProps={configCallbackProps}
/>
</div>
</ActionButton>
)
})}
</ul>
@ -260,7 +250,7 @@ export function Toolbar({
* It contains a tooltip with the title, description, and links
* and a hotkey listener
*/
const ToolbarItemTooltip = memo(function ToolbarItemContents({
const ToolbarItemContents = memo(function ToolbarItemContents({
itemConfig,
configCallbackProps,
}: {
@ -282,69 +272,73 @@ const ToolbarItemTooltip = memo(function ToolbarItemContents({
)
return (
<Tooltip
inert={false}
position="bottom"
wrapperClassName="!p-4 !pointer-events-auto"
contentClassName="!text-left text-wrap !text-xs !p-0 !pb-2 flex gap-2 !max-w-none !w-72 flex-col items-stretch"
>
<div className="rounded-top flex items-center gap-2 pt-3 pb-2 px-2 bg-chalkboard-20/50 dark:bg-chalkboard-80/50">
<span
className={`text-sm flex-1 ${
itemConfig.status !== 'available'
? 'text-chalkboard-70 dark:text-chalkboard-40'
: ''
}`}
>
{itemConfig.title}
</span>
{itemConfig.status === 'available' && itemConfig.hotkey ? (
<kbd className="flex-none hotkey">{itemConfig.hotkey}</kbd>
) : itemConfig.status === 'kcl-only' ? (
<>
<span className="text-wrap font-sans flex-0 text-chalkboard-70 dark:text-chalkboard-40">
KCL code only
</span>
<CustomIcon
name="code"
className="w-5 h-5 text-chalkboard-70 dark:text-chalkboard-40"
/>
</>
) : (
itemConfig.status === 'unavailable' && (
<>
<span className={!itemConfig.showTitle ? 'sr-only' : ''}>
{itemConfig.title}
</span>
<Tooltip
position="bottom"
wrapperClassName="!p-4 !pointer-events-auto"
contentClassName="!text-left text-wrap !text-xs !p-0 !pb-2 flex gap-2 !max-w-none !w-72 flex-col items-stretch"
>
<div className="rounded-top flex items-center gap-2 pt-3 pb-2 px-2 bg-chalkboard-20/50 dark:bg-chalkboard-80/50">
<span
className={`text-sm flex-1 ${
itemConfig.status !== 'available'
? 'text-chalkboard-70 dark:text-chalkboard-40'
: ''
}`}
>
{itemConfig.title}
</span>
{itemConfig.status === 'available' && itemConfig.hotkey ? (
<kbd className="flex-none hotkey">{itemConfig.hotkey}</kbd>
) : itemConfig.status === 'kcl-only' ? (
<>
<span className="text-wrap font-sans flex-0 text-chalkboard-70 dark:text-chalkboard-40">
In development
KCL code only
</span>
<CustomIcon
name="lockClosed"
name="code"
className="w-5 h-5 text-chalkboard-70 dark:text-chalkboard-40"
/>
</>
)
) : (
itemConfig.status === 'unavailable' && (
<>
<span className="text-wrap font-sans flex-0 text-chalkboard-70 dark:text-chalkboard-40">
In development
</span>
<CustomIcon
name="lockClosed"
className="w-5 h-5 text-chalkboard-70 dark:text-chalkboard-40"
/>
</>
)
)}
</div>
<p className="px-2 text-ch font-sans">{itemConfig.description}</p>
{itemConfig.links.length > 0 && (
<>
<hr className="border-chalkboard-20 dark:border-chalkboard-80" />
<ul className="p-0 px-1 m-0 flex flex-col">
{itemConfig.links.map((link) => (
<li key={link.label} className="contents">
<a
href={link.url}
target="_blank"
rel="noreferrer"
className="flex items-center rounded-sm p-1 no-underline text-inherit hover:bg-primary/10 hover:text-primary dark:hover:bg-chalkboard-70 dark:hover:text-inherit"
>
<span className="flex-1">Open {link.label}</span>
<CustomIcon name="link" className="w-4 h-4" />
</a>
</li>
))}
</ul>
</>
)}
</div>
<p className="px-2 text-ch font-sans">{itemConfig.description}</p>
{itemConfig.links.length > 0 && (
<>
<hr className="border-chalkboard-20 dark:border-chalkboard-80" />
<ul className="p-0 px-1 m-0 flex flex-col">
{itemConfig.links.map((link) => (
<li key={link.label} className="contents">
<a
href={link.url}
target="_blank"
rel="noreferrer"
className="flex items-center rounded-sm p-1 no-underline text-inherit hover:bg-primary/10 hover:text-primary dark:hover:bg-chalkboard-70 dark:hover:text-inherit"
>
<span className="flex-1">Open {link.label}</span>
<CustomIcon name="link" className="w-4 h-4" />
</a>
</li>
))}
</ul>
</>
)}
</Tooltip>
</Tooltip>
</>
)
})

View File

@ -102,7 +102,6 @@ export const ClientSideScene = ({
canvas.addEventListener('mousedown', sceneInfra.onMouseDown, false)
canvas.addEventListener('mouseup', sceneInfra.onMouseUp, false)
sceneInfra.setSend(send)
engineCommandManager.modelingSend = send
return () => {
canvas?.removeEventListener('mousemove', sceneInfra.onMouseMove)
canvas?.removeEventListener('mousedown', sceneInfra.onMouseDown)

View File

@ -22,9 +22,11 @@ import {
import {
ARROWHEAD,
AXIS_GROUP,
DEFAULT_PLANES,
DefaultPlane,
defaultPlaneColor,
getSceneScale,
INTERSECTION_PLANE_LAYER,
OnClickCallbackArgs,
OnMouseEnterLeaveArgs,
RAYCASTABLE_PLANE,
SEGMENT_LENGTH_LABEL,
@ -76,7 +78,6 @@ import {
} from 'lang/std/sketch'
import { isOverlap, normaliseAngle, roundOff, throttle } from 'lib/utils'
import {
addStartProfileAt,
createArrayExpression,
createCallExpressionStdLib,
createLiteral,
@ -199,7 +200,6 @@ export class SceneEntities {
createIntersectionPlane() {
if (sceneInfra.scene.getObjectByName(RAYCASTABLE_PLANE)) {
// this.removeIntersectionPlane()
console.warn('createIntersectionPlane called when it already exists')
return
}
@ -296,51 +296,6 @@ export class SceneEntities {
if (intersectionPlane) this.scene.remove(intersectionPlane)
}
setupNoPointsListener({
sketchDetails,
afterClick,
}: {
sketchDetails: SketchDetails
afterClick: (args: OnClickCallbackArgs) => void
}) {
// Create a THREEjs plane to raycast clicks onto
this.createIntersectionPlane()
const quaternion = quaternionFromUpNForward(
new Vector3(...sketchDetails.yAxis),
new Vector3(...sketchDetails.zAxis)
)
// Position the click raycast plane
if (this.intersectionPlane) {
this.intersectionPlane.setRotationFromQuaternion(quaternion)
this.intersectionPlane.position.copy(
new Vector3(...(sketchDetails?.origin || [0, 0, 0]))
)
}
sceneInfra.setCallbacks({
onClick: async (args) => {
if (!args) return
if (args.mouseEvent.which !== 1) return
const { intersectionPoint } = args
if (!intersectionPoint?.twoD || !sketchDetails?.sketchPathToNode) return
const addStartProfileAtRes = addStartProfileAt(
kclManager.ast,
sketchDetails.sketchPathToNode,
[intersectionPoint.twoD.x, intersectionPoint.twoD.y]
)
if (trap(addStartProfileAtRes)) return
const { modifiedAst } = addStartProfileAtRes
await kclManager.updateAst(modifiedAst, false)
this.removeIntersectionPlane()
// Now perform the caller-specified action
afterClick(args)
},
})
}
async setupSketch({
sketchPathToNode,
forward,
@ -717,6 +672,21 @@ export class SceneEntities {
...this.mouseEnterLeaveCallbacks(),
})
}
setupRectangleOriginListener = () => {
sceneInfra.setCallbacks({
onClick: (args) => {
const twoD = args.intersectionPoint?.twoD
if (!twoD) {
console.warn(`This click didn't have a 2D intersection`, args)
return
}
sceneInfra.modelingSend({
type: 'Add rectangle origin',
data: [twoD.x, twoD.y],
})
},
})
}
setupDraftRectangle = async (
sketchPathToNode: PathToNode,
forward: [number, number, number],
@ -734,8 +704,6 @@ export class SceneEntities {
if (trap(_node1)) return Promise.reject(_node1)
const variableDeclarationName =
_node1.node?.declarations?.[0]?.id?.name || ''
const startSketchOn = _node1.node?.declarations
const startSketchOnInit = startSketchOn?.[0]?.init
const tags: [string, string, string] = [
findUniqueName(_ast, 'rectangleSegmentA'),
@ -743,6 +711,15 @@ export class SceneEntities {
findUniqueName(_ast, 'rectangleSegmentC'),
]
const _node2 = getNodeFromPath<VariableDeclaration>(
_ast,
sketchPathToNode || [],
'VariableDeclaration'
)
if (trap(_node2)) return Promise.reject(_node2)
const startSketchOn = _node2.node?.declarations
const startSketchOnInit = startSketchOn?.[0]?.init
startSketchOn[0].init = createPipeExpression([
startSketchOnInit,
...getRectangleCallExpressions(rectangleOrigin, tags),
@ -1500,6 +1477,146 @@ export class SceneEntities {
this._tearDownSketch(0, resolve, reject, { removeAxis })
})
}
setupDefaultPlaneHover() {
sceneInfra.setCallbacks({
onMouseEnter: ({ selected }) => {
if (!(selected instanceof Mesh && selected.parent)) return
if (selected.parent.userData.type !== DEFAULT_PLANES) return
const type: DefaultPlane = selected.userData.type
selected.material.color = defaultPlaneColor(type, 0.5, 1)
},
onMouseLeave: ({ selected }) => {
if (!(selected instanceof Mesh && selected.parent)) return
if (selected.parent.userData.type !== DEFAULT_PLANES) return
const type: DefaultPlane = selected.userData.type
selected.material.color = defaultPlaneColor(type)
},
onClick: async (args) => {
const { entity_id } = await sendSelectEventToEngine(
args?.mouseEvent,
document.getElementById('video-stream') as HTMLVideoElement,
sceneInfra._streamDimensions
)
let _entity_id = entity_id
if (!_entity_id) return
if (
engineCommandManager.defaultPlanes?.xy === _entity_id ||
engineCommandManager.defaultPlanes?.xz === _entity_id ||
engineCommandManager.defaultPlanes?.yz === _entity_id ||
engineCommandManager.defaultPlanes?.negXy === _entity_id ||
engineCommandManager.defaultPlanes?.negXz === _entity_id ||
engineCommandManager.defaultPlanes?.negYz === _entity_id
) {
const defaultPlaneStrMap: Record<string, DefaultPlaneStr> = {
[engineCommandManager.defaultPlanes.xy]: 'XY',
[engineCommandManager.defaultPlanes.xz]: 'XZ',
[engineCommandManager.defaultPlanes.yz]: 'YZ',
[engineCommandManager.defaultPlanes.negXy]: '-XY',
[engineCommandManager.defaultPlanes.negXz]: '-XZ',
[engineCommandManager.defaultPlanes.negYz]: '-YZ',
}
// TODO can we get this information from rust land when it creates the default planes?
// maybe returned from make_default_planes (src/wasm-lib/src/wasm.rs)
let zAxis: [number, number, number] = [0, 0, 1]
let yAxis: [number, number, number] = [0, 1, 0]
// get unit vector from camera position to target
const camVector = sceneInfra.camControls.camera.position
.clone()
.sub(sceneInfra.camControls.target)
if (engineCommandManager.defaultPlanes?.xy === _entity_id) {
zAxis = [0, 0, 1]
yAxis = [0, 1, 0]
if (camVector.z < 0) {
zAxis = [0, 0, -1]
_entity_id = engineCommandManager.defaultPlanes?.negXy || ''
}
} else if (engineCommandManager.defaultPlanes?.yz === _entity_id) {
zAxis = [1, 0, 0]
yAxis = [0, 0, 1]
if (camVector.x < 0) {
zAxis = [-1, 0, 0]
_entity_id = engineCommandManager.defaultPlanes?.negYz || ''
}
} else if (engineCommandManager.defaultPlanes?.xz === _entity_id) {
zAxis = [0, 1, 0]
yAxis = [0, 0, 1]
_entity_id = engineCommandManager.defaultPlanes?.negXz || ''
if (camVector.y < 0) {
zAxis = [0, -1, 0]
_entity_id = engineCommandManager.defaultPlanes?.xz || ''
}
}
sceneInfra.modelingSend({
type: 'Select default plane',
data: {
type: 'defaultPlane',
planeId: _entity_id,
plane: defaultPlaneStrMap[_entity_id],
zAxis,
yAxis,
},
})
return
}
const artifact = this.engineCommandManager.artifactMap[_entity_id]
// If we clicked on an extrude wall, we climb up the parent Id
// to get the sketch profile's face ID. If we clicked on an endcap,
// we already have it.
const pathId =
artifact?.type === 'extrudeWall' || artifact?.type === 'extrudeCap'
? artifact.pathId
: ''
// tsc cannot infer that target can have extrusions
// from the commandType (why?) so we need to cast it
const path = this.engineCommandManager.artifactMap?.[pathId || '']
const extrusionId =
path?.type === 'startPath' ? path.extrusionIds[0] : ''
// TODO: We get the first extrusion command ID,
// which is fine while backend systems only support one extrusion.
// but we need to more robustly handle resolving to the correct extrusion
// if there are multiple.
const extrusions = this.engineCommandManager.artifactMap?.[extrusionId]
if (artifact?.type !== 'extrudeCap' && artifact?.type !== 'extrudeWall')
return
const faceInfo = await getFaceDetails(_entity_id)
if (!faceInfo?.origin || !faceInfo?.z_axis || !faceInfo?.y_axis) return
const { z_axis, y_axis, origin } = faceInfo
const sketchPathToNode = getNodePathFromSourceRange(
kclManager.ast,
artifact.range
)
const extrudePathToNode = extrusions?.range
? getNodePathFromSourceRange(kclManager.ast, extrusions.range)
: []
sceneInfra.modelingSend({
type: 'Select default plane',
data: {
type: 'extrudeFace',
zAxis: [z_axis.x, z_axis.y, z_axis.z],
yAxis: [y_axis.x, y_axis.y, y_axis.z],
position: [origin.x, origin.y, origin.z].map(
(num) => num / sceneInfra._baseUnitMultiplier
) as [number, number, number],
sketchPathToNode,
extrudePathToNode,
cap: artifact.type === 'extrudeCap' ? artifact.cap : 'none',
faceId: _entity_id,
},
})
return
},
})
}
mouseEnterLeaveCallbacks() {
return {
onMouseEnter: ({ selected, dragSelected }: OnMouseEnterLeaveArgs) => {

View File

@ -11,8 +11,10 @@ import {
Raycaster,
Vector2,
Group,
PlaneGeometry,
MeshBasicMaterial,
Mesh,
DoubleSide,
Intersection,
Object3D,
Object3DEventMap,
@ -46,6 +48,7 @@ export const DEBUG_SHOW_INTERSECTION_PLANE: false = false
export const DEBUG_SHOW_BOTH_SCENES: false = false
export const RAYCASTABLE_PLANE = 'raycastable-plane'
export const DEFAULT_PLANES = 'default-planes'
export const X_AXIS = 'xAxis'
export const Y_AXIS = 'yAxis'
@ -69,7 +72,7 @@ interface OnDragCallbackArgs extends OnMouseEnterLeaveArgs {
}
intersects: Intersection<Object3D<Object3DEventMap>>[]
}
export interface OnClickCallbackArgs {
interface OnClickCallbackArgs {
mouseEvent: MouseEvent
intersectionPoint?: {
twoD: Vector2
@ -322,9 +325,16 @@ export class SceneInfra {
this.camControls.camera,
this.camControls.target
)
const planesGroup = this.scene.getObjectByName(DEFAULT_PLANES)
const axisGroup = this.scene
.getObjectByName(AXIS_GROUP)
?.getObjectByName('gridHelper')
planesGroup &&
planesGroup.scale.set(
scale / this._baseUnitMultiplier,
scale / this._baseUnitMultiplier,
scale / this._baseUnitMultiplier
)
axisGroup?.name === 'gridHelper' && axisGroup.scale.set(scale, scale, scale)
}
@ -622,6 +632,59 @@ export class SceneInfra {
this.onClickCallback({ mouseEvent, intersects })
}
}
showDefaultPlanes() {
const addPlane = (
rotation: { x: number; y: number; z: number }, //
type: DefaultPlane
): Mesh => {
const planeGeometry = new PlaneGeometry(100, 100)
const planeMaterial = new MeshBasicMaterial({
color: defaultPlaneColor(type),
transparent: true,
opacity: 0.0,
side: DoubleSide,
depthTest: false, // needed to avoid transparency issues
})
const plane = new Mesh(planeGeometry, planeMaterial)
plane.rotation.x = rotation.x
plane.rotation.y = rotation.y
plane.rotation.z = rotation.z
plane.userData.type = type
plane.name = type
return plane
}
const planes = [
addPlane({ x: 0, y: Math.PI / 2, z: 0 }, YZ_PLANE),
addPlane({ x: 0, y: 0, z: 0 }, XY_PLANE),
addPlane({ x: -Math.PI / 2, y: 0, z: 0 }, XZ_PLANE),
]
const planesGroup = new Group()
planesGroup.userData.type = DEFAULT_PLANES
planesGroup.name = DEFAULT_PLANES
planesGroup.add(...planes)
planesGroup.traverse((child) => {
if (child instanceof Mesh) {
child.layers.enable(SKETCH_LAYER)
}
})
planesGroup.layers.enable(SKETCH_LAYER)
const sceneScale = getSceneScale(
this.camControls.camera,
this.camControls.target
)
planesGroup.scale.set(
sceneScale / this._baseUnitMultiplier,
sceneScale / this._baseUnitMultiplier,
sceneScale / this._baseUnitMultiplier
)
this.scene.add(planesGroup)
}
removeDefaultPlanes() {
const planesGroup = this.scene.children.find(
({ userData }) => userData.type === DEFAULT_PLANES
)
if (planesGroup) this.scene.remove(planesGroup)
}
updateOtherSelectionColors = (otherSelections: Axis[]) => {
const axisGroup = this.scene.children.find(
({ userData }) => userData?.type === AXIS_GROUP
@ -679,3 +742,28 @@ function baseUnitTomm(baseUnit: BaseUnit) {
return 914.4
}
}
export type DefaultPlane =
| 'xy-default-plane'
| 'xz-default-plane'
| 'yz-default-plane'
export const XY_PLANE: DefaultPlane = 'xy-default-plane'
export const XZ_PLANE: DefaultPlane = 'xz-default-plane'
export const YZ_PLANE: DefaultPlane = 'yz-default-plane'
export function defaultPlaneColor(
plane: DefaultPlane,
lowCh = 0.1,
highCh = 0.7
): Color {
switch (plane) {
case XY_PLANE:
return new Color(highCh, lowCh, lowCh)
case XZ_PLANE:
return new Color(lowCh, lowCh, highCh)
case YZ_PLANE:
return new Color(lowCh, highCh, lowCh)
}
return new Color(lowCh, lowCh, lowCh)
}

View File

@ -5,8 +5,6 @@ import { CustomIcon } from './CustomIcon'
import { useLocation, useNavigate } from 'react-router-dom'
import { createAndOpenNewProject } from 'lib/tauriFS'
import { paths } from 'lib/paths'
import { useAbsoluteFilePath } from 'hooks/useAbsoluteFilePath'
import { useLspContext } from './LspProvider'
const HelpMenuDivider = () => (
<div className="h-[1px] bg-chalkboard-110 dark:bg-chalkboard-80" />
@ -14,18 +12,16 @@ const HelpMenuDivider = () => (
export function HelpMenu(props: React.PropsWithChildren) {
const location = useLocation()
const { onProjectOpen } = useLspContext()
const filePath = useAbsoluteFilePath()
const isInProject = location.pathname.includes(paths.FILE)
const navigate = useNavigate()
const { settings } = useSettingsAuthContext()
return (
<Popover className="relative">
<Popover.Button className="grid p-0 m-0 border-none rounded-full place-content-center">
<Popover.Button className="border-none p-0 m-0 rounded-full grid place-content-center">
<CustomIcon
name="questionMark"
className="rounded-full w-7 h-7 bg-chalkboard-110 dark:bg-chalkboard-80 text-chalkboard-10"
className="w-7 h-7 rounded-full bg-chalkboard-110 dark:bg-chalkboard-80 text-chalkboard-10"
/>
<span className="sr-only">Help and resources</span>
<Tooltip position="top-right" wrapperClassName="ui-open:hidden">
@ -34,7 +30,7 @@ export function HelpMenu(props: React.PropsWithChildren) {
</Popover.Button>
<Popover.Panel
as="ul"
className="absolute right-0 left-auto flex flex-col w-64 gap-1 p-0 py-2 m-0 mb-1 text-sm border border-solid rounded shadow-lg bottom-full align-stretch text-chalkboard-10 dark:text-inherit bg-chalkboard-110 dark:bg-chalkboard-100 border-chalkboard-110 dark:border-chalkboard-80"
className="absolute right-0 left-auto bottom-full mb-1 w-64 py-2 flex flex-col gap-1 align-stretch text-chalkboard-10 dark:text-inherit bg-chalkboard-110 dark:bg-chalkboard-100 rounded shadow-lg border border-solid border-chalkboard-110 dark:border-chalkboard-80 text-sm m-0 p-0"
>
<HelpMenuItem
as="a"
@ -88,12 +84,7 @@ export function HelpMenu(props: React.PropsWithChildren) {
</HelpMenuItem>
<HelpMenuItem
as="button"
onClick={() => {
const targetPath = location.pathname.includes(paths.FILE)
? filePath + paths.SETTINGS
: paths.HOME + paths.SETTINGS
navigate(targetPath + '?tab=keybindings')
}}
onClick={() => navigate('settings?tab=keybindings')}
>
Keyboard shortcuts
</HelpMenuItem>
@ -108,9 +99,9 @@ export function HelpMenu(props: React.PropsWithChildren) {
},
})
if (isInProject) {
navigate(filePath + paths.ONBOARDING.INDEX)
navigate('onboarding')
} else {
createAndOpenNewProject({ onProjectOpen, navigate })
createAndOpenNewProject(navigate)
}
}}
>
@ -137,7 +128,7 @@ function HelpMenuItem({
}: HelpMenuItemProps) {
const baseClassName = 'block px-2 py-1 hover:bg-chalkboard-80'
return (
<li className="p-0 m-0">
<li className="m-0 p-0">
{as === 'a' ? (
<a
{...(props as React.ComponentProps<'a'>)}

View File

@ -1,5 +1,5 @@
import { useMachine } from '@xstate/react'
import React, { createContext, useEffect, useMemo, useRef } from 'react'
import React, { createContext, useEffect, useRef } from 'react'
import {
AnyStateMachine,
ContextFrom,
@ -8,12 +8,7 @@ import {
StateFrom,
assign,
} from 'xstate'
import {
SetSelections,
getPersistedContext,
modelingMachine,
modelingMachineDefaultContext,
} from 'machines/modelingMachine'
import { SetSelections, modelingMachine } from 'machines/modelingMachine'
import { useSetupEngineManager } from 'hooks/useSetupEngineManager'
import { useSettingsAuthContext } from 'hooks/useSettingsAuthContext'
import {
@ -77,6 +72,7 @@ import { err, trap } from 'lib/trap'
import { useCommandsContext } from 'hooks/useCommandsContext'
import { modelingMachineEvent } from 'editor/manager'
import { hasValidFilletSelection } from 'lang/modifyAst/addFillet'
import { uuidv4 } from 'lib/utils'
type MachineContext<T extends AnyStateMachine> = {
state: StateFrom<T>
@ -104,7 +100,6 @@ export const ModelingMachineProvider = ({
} = useSettingsAuthContext()
const token = auth?.context?.token
const streamRef = useRef<HTMLDivElement>(null)
const persistedContext = useMemo(() => getPersistedContext(), [])
let [searchParams] = useSearchParams()
const pool = searchParams.get('pool')
@ -127,13 +122,6 @@ export const ModelingMachineProvider = ({
const [modelingState, modelingSend, modelingActor] = useMachine(
modelingMachine,
{
context: {
...modelingMachineDefaultContext,
store: {
...modelingMachineDefaultContext.store,
...persistedContext,
},
},
actions: {
'disable copilot': () => {
editorManager.setCopilotEnabled(false)
@ -155,9 +143,7 @@ export const ModelingMachineProvider = ({
kclManager.executeCode().then(() => {
if (engineCommandManager.engineConnection?.idleMode) return
store.videoElement?.play().catch((e) => {
console.warn('Video playing was prevented', e)
})
store.videoElement?.play()
})
})()
},

View File

@ -27,3 +27,27 @@ export const LogsPane = () => {
</div>
)
}
export const KclErrorsPane = () => {
const theme = useResolvedTheme()
const { errors } = useKclContext()
return (
<div className="overflow-hidden">
<div className="absolute inset-0 p-2 flex flex-col overflow-auto">
<ReactJsonTypeHack
src={errors}
collapsed={1}
collapseStringsAfterLength={60}
enableClipboard={false}
displayArrayKey={false}
displayDataTypes={false}
displayObjectSize={true}
indentWidth={2}
quotesOnKeys={false}
name={false}
theme={theme === 'light' ? 'rjv-default' : 'monokai'}
/>
</div>
</div>
)
}

View File

@ -3,6 +3,7 @@ import {
faBugSlash,
faCode,
faCodeCommit,
faExclamationCircle,
faSquareRootVariable,
} from '@fortawesome/free-solid-svg-icons'
import { KclEditorMenu } from 'components/ModelingSidebar/ModelingPanes/KclEditorMenu'
@ -10,28 +11,20 @@ import { CustomIconName } from 'components/CustomIcon'
import { KclEditorPane } from 'components/ModelingSidebar/ModelingPanes/KclEditorPane'
import { ReactNode } from 'react'
import { MemoryPane, MemoryPaneMenu } from './MemoryPane'
import { LogsPane } from './LoggingPanes'
import { KclErrorsPane, LogsPane } from './LoggingPanes'
import { DebugPane } from './DebugPane'
import { FileTreeInner, FileTreeMenu } from 'components/FileTree'
import { useKclContext } from 'lang/KclProvider'
export type SidebarType =
| 'code'
| 'debug'
| 'export'
| 'files'
| 'kclErrors'
| 'logs'
| 'lspMessages'
| 'variables'
/**
* This interface can be extended as more context is needed for the panes
* to determine if they should show their badges or not.
*/
interface PaneCallbackProps {
kclContext: ReturnType<typeof useKclContext>
}
export type SidebarPane = {
id: SidebarType
title: string
@ -40,7 +33,6 @@ export type SidebarPane = {
Content: ReactNode | React.FC
Menu?: ReactNode | React.FC
hideOnPlatform?: 'desktop' | 'web'
showBadge?: (props: PaneCallbackProps) => boolean | number
}
export const sidebarPanes: SidebarPane[] = [
@ -51,7 +43,6 @@ export const sidebarPanes: SidebarPane[] = [
Content: KclEditorPane,
keybinding: 'Shift + C',
Menu: KclEditorMenu,
showBadge: ({ kclContext }) => kclContext.errors.length,
},
{
id: 'files',
@ -77,6 +68,13 @@ export const sidebarPanes: SidebarPane[] = [
Content: LogsPane,
keybinding: 'Shift + L',
},
{
id: 'kclErrors',
title: 'KCL Errors',
icon: faExclamationCircle,
Content: KclErrorsPane,
keybinding: 'Shift + E',
},
{
id: 'debug',
title: 'Debug',

View File

@ -12,7 +12,6 @@ import { useModelingContext } from 'hooks/useModelingContext'
import { CustomIconName } from 'components/CustomIcon'
import { useCommandsContext } from 'hooks/useCommandsContext'
import { IconDefinition } from '@fortawesome/free-solid-svg-icons'
import { useKclContext } from 'lang/KclProvider'
interface ModelingSidebarProps {
paneOpacity: '' | 'opacity-20' | 'opacity-40'
@ -20,7 +19,6 @@ interface ModelingSidebarProps {
export function ModelingSidebar({ paneOpacity }: ModelingSidebarProps) {
const { commandBarSend } = useCommandsContext()
const kclContext = useKclContext()
const { settings } = useSettingsAuthContext()
const onboardingStatus = settings.context.app.onboardingStatus
const { send, context } = useModelingContext()
@ -64,15 +62,6 @@ export function ModelingSidebar({ paneOpacity }: ModelingSidebarProps) {
[sidebarPanes, showDebugPanel.current]
)
const paneBadgeMap: Record<SidebarType, number | boolean> = useMemo(() => {
return filteredPanes.reduce((acc, pane) => {
if (pane.showBadge) {
acc[pane.id] = pane.showBadge({ kclContext })
}
return acc
}, {} as Record<SidebarType, number | boolean>)
}, [kclContext.errors])
const togglePane = useCallback(
(newPane: SidebarType) => {
send({
@ -131,7 +120,6 @@ export function ModelingSidebar({ paneOpacity }: ModelingSidebarProps) {
paneIsOpen={context.store?.openPanes.includes(pane.id)}
onClick={() => togglePane(pane.id)}
aria-pressed={context.store?.openPanes.includes(pane.id)}
showBadge={paneBadgeMap[pane.id]}
/>
))}
</ul>
@ -148,6 +136,7 @@ export function ModelingSidebar({ paneOpacity }: ModelingSidebarProps) {
iconClassName: action.iconClassName,
iconSize: 'md',
}}
paneIsOpen={false}
onClick={action.action}
/>
))}
@ -197,15 +186,13 @@ interface ModelingPaneButtonProps
iconSize?: 'sm' | 'md' | 'lg'
}
onClick: () => void
paneIsOpen?: boolean
showBadge?: boolean | number
paneIsOpen: boolean
}
function ModelingPaneButton({
paneConfig,
onClick,
paneIsOpen,
showBadge,
...props
}: ModelingPaneButtonProps) {
useHotkeys(paneConfig.keybinding, onClick, {
@ -233,37 +220,12 @@ function ModelingPaneButton({
'rounded-sm ' + (paneIsOpen ? '!bg-primary' : '!bg-transparent')
}
/>
<span className="sr-only">
{paneConfig.title}
{paneIsOpen !== undefined ? ` pane` : ''}
</span>
{!!showBadge && (
<p
className={
'absolute m-0 p-0 -top-1 -right-1 w-3 h-3 flex items-center justify-center text-[10px] font-semibold text-white bg-primary hue-rotate-90 rounded-full border border-chalkboard-10 dark:border-chalkboard-80'
}
>
<span className="sr-only">&nbsp;has&nbsp;</span>
{typeof showBadge === 'number' ? (
<span>{showBadge}</span>
) : (
<span className="sr-only">a</span>
)}
<span className="sr-only">
&nbsp;notification{Number(showBadge) > 1 ? 's' : ''}
</span>
</p>
)}
<Tooltip
position="right"
contentClassName="max-w-none flex items-center gap-4"
hoverOnly
>
<span className="flex-1">
{paneConfig.title}
{paneIsOpen !== undefined ? ` pane` : ''}
<span className="sr-only">{paneConfig.title} pane</span>
<Tooltip position="right" hoverOnly>
<span className="flex-1">{paneConfig.title} pane: </span>
<span className="hotkey text-xs capitalize">
{paneConfig.keybinding}
</span>
<kbd className="hotkey text-xs capitalize">{paneConfig.keybinding}</kbd>
</Tooltip>
</button>
)

View File

@ -19,8 +19,7 @@ import { createAndOpenNewProject, getSettingsFolderPaths } from 'lib/tauriFS'
import { paths } from 'lib/paths'
import { useDotDotSlash } from 'hooks/useDotDotSlash'
import { sep } from '@tauri-apps/api/path'
import { ForwardedRef, forwardRef, useEffect } from 'react'
import { useLspContext } from 'components/LspProvider'
import { ForwardedRef, forwardRef } from 'react'
interface AllSettingsFieldsProps {
searchParamTab: SettingsLevel
@ -34,10 +33,9 @@ export const AllSettingsFields = forwardRef(
) => {
const location = useLocation()
const navigate = useNavigate()
const { onProjectOpen } = useLspContext()
const dotDotSlash = useDotDotSlash()
const {
settings: { send, context, state },
settings: { send, context },
} = useSettingsAuthContext()
const projectPath =
@ -50,36 +48,18 @@ export const AllSettingsFields = forwardRef(
)
: undefined
async function restartOnboarding() {
function restartOnboarding() {
send({
type: `set.app.onboardingStatus`,
data: { level: 'user', value: '' },
})
}
/**
* A "listener" for the XState to return to "idle" state
* when the user resets the onboarding, using the callback above
*/
useEffect(() => {
async function navigateToOnboardingStart() {
if (
state.context.app.onboardingStatus.user === '' &&
state.matches('idle')
) {
if (isFileSettings) {
// If we're in a project, first navigate to the onboarding start here
// so we can trigger the warning screen if necessary
navigate(dotDotSlash(1) + paths.ONBOARDING.INDEX)
} else {
// If we're in the global settings, create a new project and navigate
// to the onboarding start in that project
await createAndOpenNewProject({ onProjectOpen, navigate })
}
}
if (isFileSettings) {
navigate(dotDotSlash(1) + paths.ONBOARDING.INDEX)
} else {
createAndOpenNewProject(navigate)
}
navigateToOnboardingStart()
}, [isFileSettings, navigate, state])
}
return (
<div className="relative overflow-y-auto">

View File

@ -175,35 +175,11 @@ export const SettingsAuthProviderBase = ({
id: `${event.type}.success`,
})
},
'Execute AST': (context, event) => {
try {
const allSettingsIncludesUnitChange =
event.type === 'Set all settings' &&
event.settings?.modeling?.defaultUnit?.current !==
context.modeling.defaultUnit.current
const resetSettingsIncludesUnitChange =
event.type === 'Reset settings' &&
context.modeling.defaultUnit.current !==
settings?.modeling?.defaultUnit?.default
if (
event.type === 'set.modeling.defaultUnit' ||
allSettingsIncludesUnitChange ||
resetSettingsIncludesUnitChange
) {
kclManager.isFirstRender = true
kclManager.executeCode(true).then(() => {
kclManager.isFirstRender = false
})
} else {
// For any future logging we'd like to do
// console.log(
// 'Not re-executing AST because the settings change did not affect the code interpretation'
// )
}
} catch (e) {
console.error('Error executing AST after settings change', e)
}
'Execute AST': () => {
kclManager.isFirstRender = true
kclManager.executeCode(true).then(() => {
kclManager.isFirstRender = false
})
},
},
services: {

View File

@ -156,13 +156,7 @@ export const Stream = () => {
useEffect(() => {
setIsFirstRender(kclManager.isFirstRender)
if (!kclManager.isFirstRender)
setTimeout(() =>
// execute in the next event loop
videoRef.current?.play().catch((e) => {
console.warn('Video playing was prevented', e, videoRef.current)
})
)
if (!kclManager.isFirstRender) videoRef.current?.play()
setIsFreezeFrame(!kclManager.isFirstRender)
}, [kclManager.isFirstRender])
@ -176,12 +170,8 @@ export const Stream = () => {
if (!mediaStream) return
// Do not immediately play the stream!
try {
videoRef.current.srcObject = mediaStream
videoRef.current.pause()
} catch (e) {
console.warn('Attempted to pause stream while play was still loading', e)
}
videoRef.current.srcObject = mediaStream
videoRef.current.pause()
send({
type: 'Set context',
@ -225,7 +215,7 @@ export const Stream = () => {
},
})
if (state.matches('Sketch')) return
if (state.matches('idle.showPlanes')) return
if (state.matches('Sketch no face')) return
if (!context.store?.didDragInStream && btnName(e).left) {
sendSelectEventToEngine(

View File

@ -57,8 +57,7 @@
transition-delay: var(--_delay);
}
:is(:focus-visible) > .tooltipWrapper.withFocus,
:focus-within > .tooltipWrapper.withFocus {
:is(:focus-visible) > .tooltipWrapper.withFocus {
visibility: visible;
opacity: 1;
}

View File

@ -29,7 +29,7 @@ export default function Tooltip({
return (
<div
// @ts-ignore while awaiting merge of this PR for support of "inert" https://github.com/DefinitelyTyped/DefinitelyTyped/pull/60822
{...{ inert: inert ? '' : undefined }}
inert={inert}
role="tooltip"
className={`p-3 ${
position !== 'left' && position !== 'right' ? 'px-0' : ''

View File

@ -6,7 +6,11 @@ import { Selections, processCodeMirrorRanges, Selection } from 'lib/selections'
import { undo, redo } from '@codemirror/commands'
import { CommandBarMachineEvent } from 'machines/commandBarMachine'
import { addLineHighlight, addLineHighlightEvent } from './highlightextension'
import { Diagnostic, setDiagnosticsEffect } from '@codemirror/lint'
import {
forEachDiagnostic,
Diagnostic,
setDiagnosticsEffect,
} from '@codemirror/lint'
const updateOutsideEditorAnnotation = Annotation.define<boolean>()
export const updateOutsideEditorEvent = updateOutsideEditorAnnotation.of(true)
@ -110,20 +114,12 @@ export default class EditorManager {
}
}
clearDiagnostics(): void {
this.setDiagnostics([])
}
setDiagnostics(diagnostics: Diagnostic[]): void {
if (!this._editorView) return
// Clear out any existing diagnostics that are the same.
for (const diagnostic of diagnostics) {
for (const otherDiagnostic of diagnostics) {
if (diagnosticIsEqual(diagnostic, otherDiagnostic)) {
diagnostics = diagnostics.filter(
(d) => !diagnosticIsEqual(d, diagnostic)
)
diagnostics.push(diagnostic)
break
}
}
}
this._editorView.dispatch({
effects: [setDiagnosticsEffect.of(diagnostics)],
@ -135,6 +131,26 @@ export default class EditorManager {
})
}
addDiagnostics(diagnostics: Diagnostic[]): void {
if (!this._editorView) return
forEachDiagnostic(this._editorView.state, function (diag) {
diagnostics.push(diag)
})
const uniqueDiagnostics = new Set<Diagnostic>()
diagnostics.forEach((diagnostic) => {
for (const knownDiagnostic of uniqueDiagnostics.values()) {
if (diagnosticIsEqual(diagnostic, knownDiagnostic)) {
return
}
}
uniqueDiagnostics.add(diagnostic)
})
this.setDiagnostics([...uniqueDiagnostics])
}
undo() {
if (this._editorView) {
undo(this._editorView)

View File

@ -1,17 +1,10 @@
import { useEffect } from 'react'
import {
editorManager,
engineCommandManager,
kclManager,
sceneInfra,
} from 'lib/singletons'
import { editorManager, engineCommandManager } from 'lib/singletons'
import { useModelingContext } from './useModelingContext'
import { getEventForSelectWithPoint } from 'lib/selections'
import { DefaultPlaneStr, getFaceDetails } from 'clientSideScene/sceneEntities'
import { getNodePathFromSourceRange } from 'lang/queryAst'
export function useEngineConnectionSubscriptions() {
const { send, context, state } = useModelingContext()
const { send, context } = useModelingContext()
useEffect(() => {
if (!engineCommandManager) return
@ -47,135 +40,4 @@ export function useEngineConnectionSubscriptions() {
unSubClick()
}
}, [engineCommandManager, context?.sketchEnginePathId])
useEffect(() => {
const unSub = engineCommandManager.subscribeTo({
event: 'select_with_point',
callback: state.matches('Sketch no face')
? async ({ data }) => {
let planeId = data.entity_id
if (!planeId) return
if (
engineCommandManager.defaultPlanes?.xy === planeId ||
engineCommandManager.defaultPlanes?.xz === planeId ||
engineCommandManager.defaultPlanes?.yz === planeId ||
engineCommandManager.defaultPlanes?.negXy === planeId ||
engineCommandManager.defaultPlanes?.negXz === planeId ||
engineCommandManager.defaultPlanes?.negYz === planeId
) {
const defaultPlaneStrMap: Record<string, DefaultPlaneStr> = {
[engineCommandManager.defaultPlanes.xy]: 'XY',
[engineCommandManager.defaultPlanes.xz]: 'XZ',
[engineCommandManager.defaultPlanes.yz]: 'YZ',
[engineCommandManager.defaultPlanes.negXy]: '-XY',
[engineCommandManager.defaultPlanes.negXz]: '-XZ',
[engineCommandManager.defaultPlanes.negYz]: '-YZ',
}
// TODO can we get this information from rust land when it creates the default planes?
// maybe returned from make_default_planes (src/wasm-lib/src/wasm.rs)
let zAxis: [number, number, number] = [0, 0, 1]
let yAxis: [number, number, number] = [0, 1, 0]
// get unit vector from camera position to target
const camVector = sceneInfra.camControls.camera.position
.clone()
.sub(sceneInfra.camControls.target)
if (engineCommandManager.defaultPlanes?.xy === planeId) {
zAxis = [0, 0, 1]
yAxis = [0, 1, 0]
if (camVector.z < 0) {
zAxis = [0, 0, -1]
planeId = engineCommandManager.defaultPlanes?.negXy || ''
}
} else if (engineCommandManager.defaultPlanes?.yz === planeId) {
zAxis = [1, 0, 0]
yAxis = [0, 0, 1]
if (camVector.x < 0) {
zAxis = [-1, 0, 0]
planeId = engineCommandManager.defaultPlanes?.negYz || ''
}
} else if (engineCommandManager.defaultPlanes?.xz === planeId) {
zAxis = [0, 1, 0]
yAxis = [0, 0, 1]
planeId = engineCommandManager.defaultPlanes?.negXz || ''
if (camVector.y < 0) {
zAxis = [0, -1, 0]
planeId = engineCommandManager.defaultPlanes?.xz || ''
}
}
sceneInfra.modelingSend({
type: 'Select default plane',
data: {
type: 'defaultPlane',
planeId: planeId,
plane: defaultPlaneStrMap[planeId],
zAxis,
yAxis,
},
})
return
}
const artifact = engineCommandManager.artifactMap[planeId]
console.log('artifact', artifact)
// If we clicked on an extrude wall, we climb up the parent Id
// to get the sketch profile's face ID. If we clicked on an endcap,
// we already have it.
const pathId =
artifact?.type === 'extrudeWall' ||
artifact?.type === 'extrudeCap'
? artifact.pathId
: ''
const path = engineCommandManager.artifactMap?.[pathId || '']
const extrusionId =
path?.type === 'startPath' ? path.extrusionIds[0] : ''
// TODO: We get the first extrusion command ID,
// which is fine while backend systems only support one extrusion.
// but we need to more robustly handle resolving to the correct extrusion
// if there are multiple.
const extrusions = engineCommandManager.artifactMap?.[extrusionId]
if (
artifact?.type !== 'extrudeCap' &&
artifact?.type !== 'extrudeWall'
)
return
const faceInfo = await getFaceDetails(planeId)
if (!faceInfo?.origin || !faceInfo?.z_axis || !faceInfo?.y_axis)
return
const { z_axis, y_axis, origin } = faceInfo
const sketchPathToNode = getNodePathFromSourceRange(
kclManager.ast,
artifact.range
)
const extrudePathToNode = extrusions?.range
? getNodePathFromSourceRange(kclManager.ast, extrusions.range)
: []
sceneInfra.modelingSend({
type: 'Select default plane',
data: {
type: 'extrudeFace',
zAxis: [z_axis.x, z_axis.y, z_axis.z],
yAxis: [y_axis.x, y_axis.y, y_axis.z],
position: [origin.x, origin.y, origin.z].map(
(num) => num / sceneInfra._baseUnitMultiplier
) as [number, number, number],
sketchPathToNode,
extrudePathToNode,
cap: artifact.type === 'extrudeCap' ? artifact.cap : 'none',
faceId: planeId,
},
})
return
}
: () => {},
})
return unSub
}, [state])
}

View File

@ -186,7 +186,6 @@ export function useSetupEngineManager(
}
function getDimensions(streamWidth?: number, streamHeight?: number) {
const factorOf = 4
const maxResolution = 2000
const width = streamWidth ? streamWidth : 0
const height = streamHeight ? streamHeight : 0
@ -194,7 +193,7 @@ function getDimensions(streamWidth?: number, streamHeight?: number) {
Math.min(maxResolution / width, maxResolution / height),
1.0
)
const quadWidth = Math.round((width * ratio) / factorOf) * factorOf
const quadHeight = Math.round((height * ratio) / factorOf) * factorOf
const quadWidth = Math.round((width * ratio) / 4) * 4
const quadHeight = Math.round((height * ratio) / 4) * 4
return { width: quadWidth, height: quadHeight }
}

View File

@ -17,7 +17,6 @@ import {
} from 'lang/wasm'
import { getNodeFromPath } from './queryAst'
import { codeManager, editorManager, sceneInfra } from 'lib/singletons'
import { Diagnostic } from '@codemirror/lint'
export class KclManager {
private _ast: Program = {
@ -33,7 +32,6 @@ export class KclManager {
}
private _programMemory: ProgramMemory = ProgramMemory.empty()
private _logs: string[] = []
private _lints: Diagnostic[] = []
private _kclErrors: KCLError[] = []
private _isExecuting = false
private _wasmInitFailed = true
@ -74,36 +72,16 @@ export class KclManager {
this._logsCallBack(logs)
}
get lints() {
return this._lints
}
set lints(lints) {
if (lints === this._lints) return
this._lints = lints
// Run the lints through the diagnostics.
this.kclErrors = this._kclErrors
}
get kclErrors() {
return this._kclErrors
}
set kclErrors(kclErrors) {
if (kclErrors === this._kclErrors && this.lints.length === 0) return
this._kclErrors = kclErrors
let diagnostics = kclErrorsToDiagnostics(kclErrors)
if (this.lints.length > 0) {
diagnostics = diagnostics.concat(this.lints)
}
editorManager.setDiagnostics(diagnostics)
editorManager.addDiagnostics(diagnostics)
this._kclErrorsCallBack(kclErrors)
}
addKclErrors(kclErrors: KCLError[]) {
if (kclErrors.length === 0) return
this.kclErrors = this.kclErrors.concat(kclErrors)
}
get isExecuting() {
return this._isExecuting
}
@ -170,12 +148,12 @@ export class KclManager {
safeParse(code: string): Program | null {
const ast = parse(code)
this.lints = []
this.kclErrors = []
if (!err(ast)) return ast
const kclerror: KCLError = ast as KCLError
this.addKclErrors([kclerror])
console.error('error parsing code', kclerror)
this.kclErrors = [kclerror]
// TODO: re-eval if session should end?
if (kclerror.msg === 'file is empty')
this.engineCommandManager?.endSession()
@ -212,19 +190,16 @@ export class KclManager {
this._cancelTokens.set(currentExecutionId, false)
this.isExecuting = true
// Make sure we clear before starting again. End session will do this.
this.engineCommandManager?.endSession()
await this.ensureWasmInit()
const { logs, errors, programMemory } = await executeAst({
ast,
engineCommandManager: this.engineCommandManager,
})
this.lints = await lintAst({ ast: ast })
editorManager.addDiagnostics(await lintAst({ ast: ast }))
sceneInfra.modelingSend({ type: 'code edit during sketch' })
defaultSelectionFilter(programMemory, this.engineCommandManager)
await this.engineCommandManager.waitForAllCommands()
if (zoomToFit) {
let zoomObjectId: string | undefined = ''
@ -244,15 +219,6 @@ export class KclManager {
padding: 0.1, // padding around the objects
},
})
await this.engineCommandManager.sendSceneCommand({
type: 'modeling_cmd_req',
cmd_id: uuidv4(),
cmd: {
type: 'zoom_to_fit',
object_ids: zoomObjectId ? [zoomObjectId] : [], // leave empty to zoom to all objects
padding: 0.1, // padding around the objects
},
})
}
this.isExecuting = false
@ -262,7 +228,7 @@ export class KclManager {
return
}
this.logs = logs
this.addKclErrors(errors)
this.kclErrors = errors
this.programMemory = programMemory
this.ast = { ...ast }
this._executeCallback()
@ -306,6 +272,8 @@ export class KclManager {
useFakeExecutor: true,
})
editorManager.addDiagnostics(await lintAst({ ast: ast }))
this._logs = logs
this._kclErrors = errors
this._programMemory = programMemory
@ -337,6 +305,7 @@ export class KclManager {
})
}
async executeCode(zoomToFit?: boolean): Promise<void> {
console.log('[kcl/KclSingleton] executeCode')
const ast = this.safeParse(codeManager.code)
if (!ast) {
this.clearAst()

View File

@ -869,7 +869,6 @@ export function hasSketchPipeBeenExtruded(selection: Selection, ast: Program) {
)
if (err(_varDec)) return false
const varDec = _varDec.node
if (varDec.type !== 'VariableDeclarator') return false
let extruded = false
traverse(ast as any, {
enter(node) {

View File

@ -2,7 +2,7 @@ import { Program, SourceRange } from 'lang/wasm'
import { VITE_KC_API_WS_MODELING_URL } from 'env'
import { Models } from '@kittycad/lib'
import { exportSave } from 'lib/exportSave'
import { deferExecution, uuidv4 } from 'lib/utils'
import { uuidv4 } from 'lib/utils'
import { Themes, getThemeColorForEngine, getOppositeTheme } from 'lib/theme'
import { DefaultPlanes } from 'wasm-lib/kcl/bindings/DefaultPlanes'
import {
@ -12,7 +12,6 @@ import {
ResponseMap,
createArtifactMap,
} from 'lang/std/artifactMap'
import { useModelingContext } from 'hooks/useModelingContext'
// TODO(paultag): This ought to be tweakable.
const pingIntervalMs = 10000
@ -1205,8 +1204,6 @@ export class EngineCommandManager extends EventTarget {
private onEngineConnectionNewTrack = ({
detail,
}: CustomEvent<NewTrackArgs>) => {}
modelingSend: ReturnType<typeof useModelingContext>['send'] =
(() => {}) as any
start({
restart,
@ -1552,6 +1549,7 @@ export class EngineCommandManager extends EventTarget {
}
}
async startNewSession() {
this.artifactMap = {}
this.orderedCommands = []
this.responseMap = {}
await this.initPlanes()
@ -1786,14 +1784,6 @@ export class EngineCommandManager extends EventTarget {
this.engineConnection?.send(message.command)
return promise
}
deferredArtifactPopulated = deferExecution((a?: null) => {
this.modelingSend({ type: 'Artifact graph populated' })
}, 200)
deferredArtifactEmptied = deferExecution((a?: null) => {
this.modelingSend({ type: 'Artifact graph emptied' })
}, 200)
/**
* When an execution takes place we want to wait until we've got replies for all of the commands
* When this is done when we build the artifact map synchronously.
@ -1805,16 +1795,21 @@ export class EngineCommandManager extends EventTarget {
responseMap: this.responseMap,
ast: this.getAst(),
})
if (Object.values(this.artifactMap).length) {
this.deferredArtifactEmptied(null)
} else {
this.deferredArtifactPopulated(null)
}
}
private async initPlanes() {
if (this.planesInitialized()) return
const planes = await this.makeDefaultPlanes()
this.defaultPlanes = planes
this.subscribeTo({
event: 'select_with_point',
callback: ({ data }) => {
if (!data?.entity_id) return
if (!planes) return
if (![planes.xy, planes.yz, planes.xz].includes(data.entity_id)) return
this.onPlaneSelectCallback(data.entity_id)
},
})
}
planesInitialized(): boolean {
return (
@ -1825,6 +1820,11 @@ export class EngineCommandManager extends EventTarget {
)
}
onPlaneSelectCallback = (id: string) => {}
onPlaneSelected(callback: (id: string) => void) {
this.onPlaneSelectCallback = callback
}
async setPlaneHidden(id: string, hidden: boolean) {
return await this.sendSceneCommand({
type: 'modeling_cmd_req',

View File

@ -211,7 +211,7 @@ describe('testing addTagForSketchOnFace', () => {
`
const code = genCode(originalLine)
const ast = parse(code)
await enginelessExecutor(ast)
const programMemory = await enginelessExecutor(ast)
const sourceStart = code.indexOf(originalLine)
const sourceRange: [number, number] = [
sourceStart,

View File

@ -24,6 +24,13 @@ export const getRectangleCallExpressions = (
rectangleOrigin: [number, number],
tags: [string, string, string]
) => [
createCallExpressionStdLib('startProfileAt', [
createArrayExpression([
createLiteral(roundOff(rectangleOrigin[0])),
createLiteral(roundOff(rectangleOrigin[1])),
]),
createPipeSubstitution(),
]),
createCallExpressionStdLib('angledLine', [
createArrayExpression([
createLiteral(0), // 0 deg

View File

@ -14,7 +14,6 @@ import {
listProjects,
readAppSettingsFile,
} from './tauri'
import { engineCommandManager } from './singletons'
export const isHidden = (fileOrDir: FileEntry) =>
!!fileOrDir.name?.startsWith('.')
@ -117,23 +116,9 @@ export async function getSettingsFolderPaths(projectPath?: string) {
}
}
export async function createAndOpenNewProject({
onProjectOpen,
navigate,
}: {
onProjectOpen: (
project: {
name: string | null
path: string | null
} | null,
file: FileEntry | null
) => void
export async function createAndOpenNewProject(
navigate: (path: string) => void
}) {
// Clear the scene and end the session.
engineCommandManager.endSession()
// Create a new project with the onboarding project name
) {
const configuration = await readAppSettingsFile()
const projects = await listProjects(configuration)
const nextIndex = getNextProjectIndex(ONBOARDING_PROJECT_NAME, projects)
@ -141,24 +126,6 @@ export async function createAndOpenNewProject({
ONBOARDING_PROJECT_NAME,
nextIndex
)
const newProject = await createNewProjectDirectory(
name,
bracket,
configuration
)
// Prep the LSP and navigate to the onboarding start
onProjectOpen(
{
name: newProject.name,
path: newProject.path,
},
null
)
navigate(
`${paths.FILE}/${encodeURIComponent(newProject.default_file)}${
paths.ONBOARDING.INDEX
}`
)
return newProject
const newFile = await createNewProjectDirectory(name, bracket, configuration)
navigate(`${paths.FILE}/${encodeURIComponent(newFile.path)}`)
}

File diff suppressed because one or more lines are too long

View File

@ -1,11 +1,5 @@
import { useModelingContext } from 'hooks/useModelingContext'
import {
kbdClasses,
OnboardingButtons,
useDemoCode,
useDismiss,
useNextClick,
} from '.'
import { OnboardingButtons, useDemoCode, useDismiss, useNextClick } from '.'
import { onboardingPaths } from 'routes/Onboarding/paths'
export default function OnboardingCodeEditor() {
@ -72,8 +66,8 @@ export default function OnboardingCodeEditor() {
</p>
<p className="my-4">
You can resize the pane by dragging the handle on the right, and you
can collapse it by clicking the X button in the pane's title bar or
pressing <kbd className={kbdClasses}>Shift + C</kbd>.
can collapse it by clicking the title bar or pressing{' '}
<kbd>Shift</kbd> + <kbd>C</kbd>.
</p>
</section>
<OnboardingButtons

View File

@ -19,9 +19,8 @@ export default function Export() {
<section className="flex-1">
<h2 className="text-2xl font-bold">Export</h2>
<p className="my-4">
In addition to the "Export current part" button in the project menu,
you can also click the Export button icon at the bottom of the left
sidebar. Try clicking it now.
Try opening the project menu and clicking the "Export Part" at the
bottom of the pane.
</p>
<p className="my-4">
{APP_NAME} uses{' '}

View File

@ -21,10 +21,9 @@ export default function FutureWork() {
<div className="max-w-full xl:max-w-2xl border border-chalkboard-50 dark:border-chalkboard-80 shadow-lg flex flex-col justify-center bg-chalkboard-10 dark:bg-chalkboard-90 p-8 rounded">
<h1 className="text-2xl font-bold">Future Work</h1>
<p className="my-4">
We have curves, cuts, multi-profile sketch mode, and many more CAD
features coming soon. We want your feedback on this user interface,
and we want to know what features you want to see next. Please message
us in{' '}
We have curves, cuts, and many more CAD features coming soon. We want
your feedback on this user interface, and we want to know what
features you want to see next. Please message us in{' '}
<a
href="https://discord.gg/JQEpHR7Nt2"
target="_blank"

View File

@ -3,126 +3,95 @@ import { onboardingPaths } from 'routes/Onboarding/paths'
import { useSettingsAuthContext } from 'hooks/useSettingsAuthContext'
import { Themes, getSystemTheme } from 'lib/theme'
import { bracket } from 'lib/exampleKcl'
import { createAndOpenNewProject } from 'lib/tauriFS'
import {
getNextProjectIndex,
interpolateProjectNameWithIndex,
} from 'lib/tauriFS'
import { isTauri } from 'lib/isTauri'
import { useNavigate, useRouteLoaderData } from 'react-router-dom'
import { codeManager, kclManager } from 'lib/singletons'
import { APP_NAME } from 'lib/constants'
import { useState } from 'react'
import { useLspContext } from 'components/LspProvider'
import { IndexLoaderData } from 'lib/types'
import { useNavigate } from 'react-router-dom'
import { paths } from 'lib/paths'
import { useFileContext } from 'hooks/useFileContext'
import { codeManager, kclManager } from 'lib/singletons'
import { join } from '@tauri-apps/api/path'
import {
APP_NAME,
ONBOARDING_PROJECT_NAME,
PROJECT_ENTRYPOINT,
} from 'lib/constants'
import { createNewProjectDirectory, listProjects } from 'lib/tauri'
/**
* Show either a welcome screen or a warning screen
* depending on if the user has code in the editor.
*/
export default function OnboardingIntroduction() {
const [shouldShowWarning, setShouldShowWarning] = useState(
codeManager.code !== '' && codeManager.code !== bracket
)
function OnboardingWithNewFile() {
const navigate = useNavigate()
const dismiss = useDismiss()
const next = useNextClick(onboardingPaths.INDEX)
return shouldShowWarning ? (
<OnboardingResetWarning setShouldShowWarning={setShouldShowWarning} />
) : (
<OnboardingIntroductionInner />
)
}
interface OnboardingResetWarningProps {
setShouldShowWarning: (arg: boolean) => void
}
function OnboardingResetWarning(props: OnboardingResetWarningProps) {
async function createAndOpenNewProject() {
const projects = await listProjects()
const nextIndex = getNextProjectIndex(ONBOARDING_PROJECT_NAME, projects)
const name = interpolateProjectNameWithIndex(
ONBOARDING_PROJECT_NAME,
nextIndex
)
const newFile = await createNewProjectDirectory(name, bracket)
navigate(
`${paths.FILE}/${encodeURIComponent(
await join(newFile.path, PROJECT_ENTRYPOINT)
)}${paths.ONBOARDING.INDEX}`
)
}
return (
<div className="fixed inset-0 z-50 grid place-content-center bg-chalkboard-110/50">
<div className="max-w-3xl p-8 rounded bg-chalkboard-10 dark:bg-chalkboard-90">
{!isTauri() ? (
<OnboardingWarningWeb {...props} />
<>
<h1 className="text-3xl font-bold text-warn-80 dark:text-warn-10">
Replaying onboarding resets your code
</h1>
<p className="my-4">
We see you have some of your own code written in this project.
Please save it somewhere else before continuing the onboarding.
</p>
<OnboardingButtons
className="mt-6"
dismiss={dismiss}
next={() => {
// We do want to update both the state and editor here.
codeManager.updateCodeEditor(bracket)
kclManager.executeCode(true)
next()
}}
nextText="Overwrite code and continue"
/>
</>
) : (
<OnboardingWarningDesktop {...props} />
<>
<h1 className="flex flex-wrap items-center gap-4 text-3xl font-bold">
Would you like to create a new project?
</h1>
<section className="my-12">
<p className="my-4">
You have some content in this project that we don't want to
overwrite. If you would like to create a new project, please
click the button below.
</p>
</section>
<OnboardingButtons
className="mt-6"
dismiss={dismiss}
next={() => {
void createAndOpenNewProject()
codeManager.updateCodeEditor(bracket)
dismiss()
}}
nextText="Make a new project"
/>
</>
)}
</div>
</div>
)
}
function OnboardingWarningDesktop(props: OnboardingResetWarningProps) {
const navigate = useNavigate()
const dismiss = useDismiss()
const loaderData = useRouteLoaderData(paths.FILE) as IndexLoaderData
const { context: fileContext } = useFileContext()
const { onProjectClose, onProjectOpen } = useLspContext()
async function onAccept() {
onProjectClose(
loaderData.file || null,
fileContext.project.path || null,
false
)
await createAndOpenNewProject({ onProjectOpen, navigate })
props.setShouldShowWarning(false)
}
return (
<>
<h1 className="flex flex-wrap items-center gap-4 text-3xl font-bold">
Would you like to create a new project?
</h1>
<section className="my-12">
<p className="my-4">
You have some content in this project that we don't want to overwrite.
If you would like to create a new project, please click the button
below.
</p>
</section>
<OnboardingButtons
className="mt-6"
dismiss={dismiss}
next={onAccept}
nextText="Make a new project"
/>
</>
)
}
function OnboardingWarningWeb(props: OnboardingResetWarningProps) {
const dismiss = useDismiss()
return (
<>
<h1 className="text-3xl font-bold text-warn-80 dark:text-warn-10">
Replaying onboarding resets your code
</h1>
<p className="my-4">
We see you have some of your own code written in this project. Please
save it somewhere else before continuing the onboarding.
</p>
<OnboardingButtons
className="mt-6"
dismiss={dismiss}
next={async () => {
// We do want to update both the state and editor here.
codeManager.updateCodeStateEditor(bracket)
await codeManager.writeToFile()
kclManager.isFirstRender = true
await kclManager.executeCode(true).then(() => {
kclManager.isFirstRender = false
})
props.setShouldShowWarning(false)
}}
nextText="Overwrite code and continue"
/>
</>
)
}
function OnboardingIntroductionInner() {
// Reset the code to the bracket code
useDemoCode()
export default function OnboardingIntroduction() {
const {
settings: {
state: {
@ -139,8 +108,12 @@ function OnboardingIntroductionInner() {
: ''
const dismiss = useDismiss()
const next = useNextClick(onboardingPaths.CAMERA)
const currentCode = codeManager.code
const isStarterCode = currentCode === '' || currentCode === bracket
return (
useDemoCode()
return isStarterCode ? (
<div className="fixed inset-0 z-50 grid place-content-center bg-chalkboard-110/50">
<div className="max-w-3xl p-8 rounded bg-chalkboard-10 dark:bg-chalkboard-90">
<h1 className="flex flex-wrap items-center gap-4 text-3xl font-bold">
@ -199,5 +172,7 @@ function OnboardingIntroductionInner() {
/>
</div>
</div>
) : (
<OnboardingWithNewFile />
)
}

View File

@ -20,9 +20,8 @@ export default function ProjectMenu() {
<section className="flex-1">
<h2 className="text-2xl font-bold">Project Menu</h2>
<p className="my-4">
Click on {tauri ? `your part's name` : `the app name`} in the upper
left to open the project menu, where you can open the project
settings and export your current part.
Click on your part's name in the upper left to open the project
menu.
{tauri && (
<> You can click the Zoo logo to quickly navigate home.</>
)}
@ -44,8 +43,8 @@ export default function ProjectMenu() {
) : (
<>
<p className="my-4">
You can't manage separate files and separate projects from the
browser; you have to{' '}
From here you can export your part. You can't manage separate
files and separate projects from the browser; you have to{' '}
<a
href="https://zoo.dev/modeling-app/download"
target="_blank"

Some files were not shown because too many files have changed in this diff Show More