Tag enhancements (#3143)
* start Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * more Signed-off-by: Jess Frazelle <github@jessfraz.com> * enhancements Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * get plane data Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * cleanup Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * more Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * fmt Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * add lint rule Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> --------- Signed-off-by: Jess Frazelle <github@jessfraz.com>
This commit is contained in:
@ -9,7 +9,7 @@ Returns the angle to match the given length for x.
|
|||||||
|
|
||||||
|
|
||||||
```js
|
```js
|
||||||
angleToMatchLengthX(segment_name: TagIdentifier, to: number, sketch_group: SketchGroup) -> number
|
angleToMatchLengthX(tag: TagIdentifier, to: number, sketch_group: SketchGroup) -> number
|
||||||
```
|
```
|
||||||
|
|
||||||
### Examples
|
### Examples
|
||||||
@ -28,9 +28,63 @@ const extrusion = extrude(5, sketch001)
|
|||||||
|
|
||||||
### Arguments
|
### Arguments
|
||||||
|
|
||||||
* `segment_name`: `TagIdentifier` (REQUIRED)
|
* `tag`: `TagIdentifier` (REQUIRED)
|
||||||
```js
|
```js
|
||||||
{
|
{
|
||||||
|
// Engine information for a tag.
|
||||||
|
info: {
|
||||||
|
// The id of the tagged object.
|
||||||
|
id: uuid,
|
||||||
|
// The path the tag is on.
|
||||||
|
path: {
|
||||||
|
// The from point.
|
||||||
|
from: [number, number],
|
||||||
|
// The tag of the path.
|
||||||
|
tag: {
|
||||||
|
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||||
|
end: number,
|
||||||
|
start: number,
|
||||||
|
value: string,
|
||||||
|
},
|
||||||
|
// The to point.
|
||||||
|
to: [number, number],
|
||||||
|
},
|
||||||
|
// The sketch group the tag is on.
|
||||||
|
sketchGroup: uuid,
|
||||||
|
// The surface information for the tag.
|
||||||
|
surface: {
|
||||||
|
// The face id for the extrude plane.
|
||||||
|
faceId: uuid,
|
||||||
|
// The id of the geometry.
|
||||||
|
id: uuid,
|
||||||
|
// The source range.
|
||||||
|
sourceRange: [number, number],
|
||||||
|
// The tag.
|
||||||
|
tag: {
|
||||||
|
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||||
|
end: number,
|
||||||
|
start: number,
|
||||||
|
value: string,
|
||||||
|
},
|
||||||
|
type: "extrudePlane",
|
||||||
|
} |
|
||||||
|
{
|
||||||
|
// The face id for the extrude plane.
|
||||||
|
faceId: uuid,
|
||||||
|
// The id of the geometry.
|
||||||
|
id: uuid,
|
||||||
|
// The source range.
|
||||||
|
sourceRange: [number, number],
|
||||||
|
// The tag.
|
||||||
|
tag: {
|
||||||
|
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||||
|
end: number,
|
||||||
|
start: number,
|
||||||
|
value: string,
|
||||||
|
},
|
||||||
|
type: "extrudeArc",
|
||||||
|
},
|
||||||
|
},
|
||||||
value: string,
|
value: string,
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
@ -9,7 +9,7 @@ Returns the angle to match the given length for y.
|
|||||||
|
|
||||||
|
|
||||||
```js
|
```js
|
||||||
angleToMatchLengthY(segment_name: TagIdentifier, to: number, sketch_group: SketchGroup) -> number
|
angleToMatchLengthY(tag: TagIdentifier, to: number, sketch_group: SketchGroup) -> number
|
||||||
```
|
```
|
||||||
|
|
||||||
### Examples
|
### Examples
|
||||||
@ -32,9 +32,63 @@ const extrusion = extrude(5, sketch001)
|
|||||||
|
|
||||||
### Arguments
|
### Arguments
|
||||||
|
|
||||||
* `segment_name`: `TagIdentifier` (REQUIRED)
|
* `tag`: `TagIdentifier` (REQUIRED)
|
||||||
```js
|
```js
|
||||||
{
|
{
|
||||||
|
// Engine information for a tag.
|
||||||
|
info: {
|
||||||
|
// The id of the tagged object.
|
||||||
|
id: uuid,
|
||||||
|
// The path the tag is on.
|
||||||
|
path: {
|
||||||
|
// The from point.
|
||||||
|
from: [number, number],
|
||||||
|
// The tag of the path.
|
||||||
|
tag: {
|
||||||
|
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||||
|
end: number,
|
||||||
|
start: number,
|
||||||
|
value: string,
|
||||||
|
},
|
||||||
|
// The to point.
|
||||||
|
to: [number, number],
|
||||||
|
},
|
||||||
|
// The sketch group the tag is on.
|
||||||
|
sketchGroup: uuid,
|
||||||
|
// The surface information for the tag.
|
||||||
|
surface: {
|
||||||
|
// The face id for the extrude plane.
|
||||||
|
faceId: uuid,
|
||||||
|
// The id of the geometry.
|
||||||
|
id: uuid,
|
||||||
|
// The source range.
|
||||||
|
sourceRange: [number, number],
|
||||||
|
// The tag.
|
||||||
|
tag: {
|
||||||
|
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||||
|
end: number,
|
||||||
|
start: number,
|
||||||
|
value: string,
|
||||||
|
},
|
||||||
|
type: "extrudePlane",
|
||||||
|
} |
|
||||||
|
{
|
||||||
|
// The face id for the extrude plane.
|
||||||
|
faceId: uuid,
|
||||||
|
// The id of the geometry.
|
||||||
|
id: uuid,
|
||||||
|
// The source range.
|
||||||
|
sourceRange: [number, number],
|
||||||
|
// The tag.
|
||||||
|
tag: {
|
||||||
|
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||||
|
end: number,
|
||||||
|
start: number,
|
||||||
|
value: string,
|
||||||
|
},
|
||||||
|
type: "extrudeArc",
|
||||||
|
},
|
||||||
|
},
|
||||||
value: string,
|
value: string,
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
@ -41,6 +41,60 @@ const example = extrude(10, exampleSketch)
|
|||||||
angle: number,
|
angle: number,
|
||||||
// The tag of the line to intersect with.
|
// The tag of the line to intersect with.
|
||||||
intersectTag: {
|
intersectTag: {
|
||||||
|
// Engine information for a tag.
|
||||||
|
info: {
|
||||||
|
// The id of the tagged object.
|
||||||
|
id: uuid,
|
||||||
|
// The path the tag is on.
|
||||||
|
path: {
|
||||||
|
// The from point.
|
||||||
|
from: [number, number],
|
||||||
|
// The tag of the path.
|
||||||
|
tag: {
|
||||||
|
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||||
|
end: number,
|
||||||
|
start: number,
|
||||||
|
value: string,
|
||||||
|
},
|
||||||
|
// The to point.
|
||||||
|
to: [number, number],
|
||||||
|
},
|
||||||
|
// The sketch group the tag is on.
|
||||||
|
sketchGroup: uuid,
|
||||||
|
// The surface information for the tag.
|
||||||
|
surface: {
|
||||||
|
// The face id for the extrude plane.
|
||||||
|
faceId: uuid,
|
||||||
|
// The id of the geometry.
|
||||||
|
id: uuid,
|
||||||
|
// The source range.
|
||||||
|
sourceRange: [number, number],
|
||||||
|
// The tag.
|
||||||
|
tag: {
|
||||||
|
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||||
|
end: number,
|
||||||
|
start: number,
|
||||||
|
value: string,
|
||||||
|
},
|
||||||
|
type: "extrudePlane",
|
||||||
|
} |
|
||||||
|
{
|
||||||
|
// The face id for the extrude plane.
|
||||||
|
faceId: uuid,
|
||||||
|
// The id of the geometry.
|
||||||
|
id: uuid,
|
||||||
|
// The source range.
|
||||||
|
sourceRange: [number, number],
|
||||||
|
// The tag.
|
||||||
|
tag: {
|
||||||
|
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||||
|
end: number,
|
||||||
|
start: number,
|
||||||
|
value: string,
|
||||||
|
},
|
||||||
|
type: "extrudeArc",
|
||||||
|
},
|
||||||
|
},
|
||||||
value: string,
|
value: string,
|
||||||
},
|
},
|
||||||
// The offset from the intersecting line.
|
// The offset from the intersecting line.
|
||||||
|
@ -31,10 +31,10 @@ const mountingPlate = extrude(thickness, mountingPlateSketch)
|
|||||||
|> chamfer({
|
|> chamfer({
|
||||||
length: chamferLength,
|
length: chamferLength,
|
||||||
tags: [
|
tags: [
|
||||||
getNextAdjacentEdge(edge1, %),
|
getNextAdjacentEdge(edge1),
|
||||||
getNextAdjacentEdge(edge2, %),
|
getNextAdjacentEdge(edge2),
|
||||||
getNextAdjacentEdge(edge3, %),
|
getNextAdjacentEdge(edge3),
|
||||||
getNextAdjacentEdge(edge4, %)
|
getNextAdjacentEdge(edge4)
|
||||||
]
|
]
|
||||||
}, %)
|
}, %)
|
||||||
```
|
```
|
||||||
@ -51,6 +51,60 @@ const mountingPlate = extrude(thickness, mountingPlateSketch)
|
|||||||
// The tags of the paths you want to chamfer.
|
// The tags of the paths you want to chamfer.
|
||||||
tags: [uuid |
|
tags: [uuid |
|
||||||
{
|
{
|
||||||
|
// Engine information for a tag.
|
||||||
|
info: {
|
||||||
|
// The id of the tagged object.
|
||||||
|
id: uuid,
|
||||||
|
// The path the tag is on.
|
||||||
|
path: {
|
||||||
|
// The from point.
|
||||||
|
from: [number, number],
|
||||||
|
// The tag of the path.
|
||||||
|
tag: {
|
||||||
|
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||||
|
end: number,
|
||||||
|
start: number,
|
||||||
|
value: string,
|
||||||
|
},
|
||||||
|
// The to point.
|
||||||
|
to: [number, number],
|
||||||
|
},
|
||||||
|
// The sketch group the tag is on.
|
||||||
|
sketchGroup: uuid,
|
||||||
|
// The surface information for the tag.
|
||||||
|
surface: {
|
||||||
|
// The face id for the extrude plane.
|
||||||
|
faceId: uuid,
|
||||||
|
// The id of the geometry.
|
||||||
|
id: uuid,
|
||||||
|
// The source range.
|
||||||
|
sourceRange: [number, number],
|
||||||
|
// The tag.
|
||||||
|
tag: {
|
||||||
|
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||||
|
end: number,
|
||||||
|
start: number,
|
||||||
|
value: string,
|
||||||
|
},
|
||||||
|
type: "extrudePlane",
|
||||||
|
} |
|
||||||
|
{
|
||||||
|
// The face id for the extrude plane.
|
||||||
|
faceId: uuid,
|
||||||
|
// The id of the geometry.
|
||||||
|
id: uuid,
|
||||||
|
// The source range.
|
||||||
|
sourceRange: [number, number],
|
||||||
|
// The tag.
|
||||||
|
tag: {
|
||||||
|
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||||
|
end: number,
|
||||||
|
start: number,
|
||||||
|
value: string,
|
||||||
|
},
|
||||||
|
type: "extrudeArc",
|
||||||
|
},
|
||||||
|
},
|
||||||
value: string,
|
value: string,
|
||||||
}],
|
}],
|
||||||
}
|
}
|
||||||
|
@ -31,10 +31,10 @@ const mountingPlate = extrude(thickness, mountingPlateSketch)
|
|||||||
|> fillet({
|
|> fillet({
|
||||||
radius: filletRadius,
|
radius: filletRadius,
|
||||||
tags: [
|
tags: [
|
||||||
getNextAdjacentEdge(edge1, %),
|
getNextAdjacentEdge(edge1),
|
||||||
getNextAdjacentEdge(edge2, %),
|
getNextAdjacentEdge(edge2),
|
||||||
getNextAdjacentEdge(edge3, %),
|
getNextAdjacentEdge(edge3),
|
||||||
getNextAdjacentEdge(edge4, %)
|
getNextAdjacentEdge(edge4)
|
||||||
]
|
]
|
||||||
}, %)
|
}, %)
|
||||||
```
|
```
|
||||||
@ -51,6 +51,60 @@ const mountingPlate = extrude(thickness, mountingPlateSketch)
|
|||||||
// The tags of the paths you want to fillet.
|
// The tags of the paths you want to fillet.
|
||||||
tags: [uuid |
|
tags: [uuid |
|
||||||
{
|
{
|
||||||
|
// Engine information for a tag.
|
||||||
|
info: {
|
||||||
|
// The id of the tagged object.
|
||||||
|
id: uuid,
|
||||||
|
// The path the tag is on.
|
||||||
|
path: {
|
||||||
|
// The from point.
|
||||||
|
from: [number, number],
|
||||||
|
// The tag of the path.
|
||||||
|
tag: {
|
||||||
|
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||||
|
end: number,
|
||||||
|
start: number,
|
||||||
|
value: string,
|
||||||
|
},
|
||||||
|
// The to point.
|
||||||
|
to: [number, number],
|
||||||
|
},
|
||||||
|
// The sketch group the tag is on.
|
||||||
|
sketchGroup: uuid,
|
||||||
|
// The surface information for the tag.
|
||||||
|
surface: {
|
||||||
|
// The face id for the extrude plane.
|
||||||
|
faceId: uuid,
|
||||||
|
// The id of the geometry.
|
||||||
|
id: uuid,
|
||||||
|
// The source range.
|
||||||
|
sourceRange: [number, number],
|
||||||
|
// The tag.
|
||||||
|
tag: {
|
||||||
|
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||||
|
end: number,
|
||||||
|
start: number,
|
||||||
|
value: string,
|
||||||
|
},
|
||||||
|
type: "extrudePlane",
|
||||||
|
} |
|
||||||
|
{
|
||||||
|
// The face id for the extrude plane.
|
||||||
|
faceId: uuid,
|
||||||
|
// The id of the geometry.
|
||||||
|
id: uuid,
|
||||||
|
// The source range.
|
||||||
|
sourceRange: [number, number],
|
||||||
|
// The tag.
|
||||||
|
tag: {
|
||||||
|
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||||
|
end: number,
|
||||||
|
start: number,
|
||||||
|
value: string,
|
||||||
|
},
|
||||||
|
type: "extrudeArc",
|
||||||
|
},
|
||||||
|
},
|
||||||
value: string,
|
value: string,
|
||||||
}],
|
}],
|
||||||
}
|
}
|
||||||
|
File diff suppressed because one or more lines are too long
@ -9,7 +9,7 @@ Get the next adjacent edge to the edge given.
|
|||||||
|
|
||||||
|
|
||||||
```js
|
```js
|
||||||
getNextAdjacentEdge(tag: TagIdentifier, extrude_group: ExtrudeGroup) -> Uuid
|
getNextAdjacentEdge(tag: TagIdentifier) -> Uuid
|
||||||
```
|
```
|
||||||
|
|
||||||
### Examples
|
### Examples
|
||||||
@ -27,7 +27,7 @@ const exampleSketch = startSketchOn('XZ')
|
|||||||
const example = extrude(5, exampleSketch)
|
const example = extrude(5, exampleSketch)
|
||||||
|> fillet({
|
|> fillet({
|
||||||
radius: 3,
|
radius: 3,
|
||||||
tags: [getNextAdjacentEdge(referenceEdge, %)]
|
tags: [getNextAdjacentEdge(referenceEdge)]
|
||||||
}, %)
|
}, %)
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -38,115 +38,28 @@ const example = extrude(5, exampleSketch)
|
|||||||
* `tag`: `TagIdentifier` (REQUIRED)
|
* `tag`: `TagIdentifier` (REQUIRED)
|
||||||
```js
|
```js
|
||||||
{
|
{
|
||||||
value: string,
|
// Engine information for a tag.
|
||||||
}
|
info: {
|
||||||
```
|
// The id of the tagged object.
|
||||||
* `extrude_group`: `ExtrudeGroup` - An extrude group is a collection of extrude surfaces. (REQUIRED)
|
|
||||||
```js
|
|
||||||
{
|
|
||||||
// The id of the extrusion end cap
|
|
||||||
endCapId: uuid,
|
|
||||||
// Chamfers or fillets on this extrude group.
|
|
||||||
filletOrChamfers: [{
|
|
||||||
// The engine id of the edge to fillet.
|
|
||||||
edge_id: uuid,
|
|
||||||
// The id of the engine command that called this fillet.
|
|
||||||
id: uuid,
|
id: uuid,
|
||||||
radius: number,
|
// The path the tag is on.
|
||||||
type: "fillet",
|
path: {
|
||||||
} |
|
// The from point.
|
||||||
{
|
from: [number, number],
|
||||||
// The engine id of the edge to chamfer.
|
// The tag of the path.
|
||||||
edge_id: uuid,
|
|
||||||
// The id of the engine command that called this chamfer.
|
|
||||||
id: uuid,
|
|
||||||
length: number,
|
|
||||||
tag: {
|
tag: {
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||||
end: number,
|
end: number,
|
||||||
start: number,
|
start: number,
|
||||||
value: string,
|
value: string,
|
||||||
},
|
},
|
||||||
type: "chamfer",
|
// The to point.
|
||||||
}],
|
to: [number, number],
|
||||||
// The height of the extrude group.
|
|
||||||
height: number,
|
|
||||||
// The id of the extrude group.
|
|
||||||
id: uuid,
|
|
||||||
// The sketch group.
|
|
||||||
sketchGroup: {
|
|
||||||
// The id of the sketch group.
|
|
||||||
id: uuid,
|
|
||||||
// What the sketch is on (can be a plane or a face).
|
|
||||||
on: {
|
|
||||||
// The id of the plane.
|
|
||||||
id: uuid,
|
|
||||||
// Origin of the plane.
|
|
||||||
origin: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
},
|
||||||
type: "plane",
|
// The sketch group the tag is on.
|
||||||
// Type for a plane.
|
sketchGroup: uuid,
|
||||||
value: "XY" | "XZ" | "YZ" | "Custom",
|
// The surface information for the tag.
|
||||||
// What should the plane’s X axis be?
|
surface: {
|
||||||
xAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
// What should the plane’s Y axis be?
|
|
||||||
yAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
// The z-axis (normal).
|
|
||||||
zAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The extrude group the face is on.
|
|
||||||
extrudeGroup: {
|
|
||||||
// The id of the extrusion end cap
|
|
||||||
endCapId: uuid,
|
|
||||||
// Chamfers or fillets on this extrude group.
|
|
||||||
filletOrChamfers: [{
|
|
||||||
// The engine id of the edge to fillet.
|
|
||||||
edge_id: uuid,
|
|
||||||
// The id of the engine command that called this fillet.
|
|
||||||
id: uuid,
|
|
||||||
radius: number,
|
|
||||||
type: "fillet",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The engine id of the edge to chamfer.
|
|
||||||
edge_id: uuid,
|
|
||||||
// The id of the engine command that called this chamfer.
|
|
||||||
id: uuid,
|
|
||||||
length: number,
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
type: "chamfer",
|
|
||||||
}],
|
|
||||||
// The height of the extrude group.
|
|
||||||
height: number,
|
|
||||||
// The id of the extrude group.
|
|
||||||
id: uuid,
|
|
||||||
// The sketch group.
|
|
||||||
sketchGroup: SketchGroup,
|
|
||||||
// The id of the extrusion start cap
|
|
||||||
startCapId: uuid,
|
|
||||||
// The extrude surfaces.
|
|
||||||
value: [{
|
|
||||||
// The face id for the extrude plane.
|
// The face id for the extrude plane.
|
||||||
faceId: uuid,
|
faceId: uuid,
|
||||||
// The id of the geometry.
|
// The id of the geometry.
|
||||||
@ -177,180 +90,9 @@ const example = extrude(5, exampleSketch)
|
|||||||
value: string,
|
value: string,
|
||||||
},
|
},
|
||||||
type: "extrudeArc",
|
type: "extrudeArc",
|
||||||
}],
|
|
||||||
},
|
},
|
||||||
// The id of the face.
|
},
|
||||||
id: uuid,
|
|
||||||
type: "face",
|
|
||||||
// The tag of the face.
|
|
||||||
value: string,
|
value: string,
|
||||||
// What should the face’s X axis be?
|
|
||||||
xAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
// What should the face’s Y axis be?
|
|
||||||
yAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
// The z-axis (normal).
|
|
||||||
zAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
// The starting path.
|
|
||||||
start: {
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
},
|
|
||||||
// Tag identifiers that have been declared in this sketch group.
|
|
||||||
tags: {
|
|
||||||
},
|
|
||||||
// The paths in the sketch group.
|
|
||||||
value: [{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "ToPoint",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// arc's direction
|
|
||||||
ccw: string,
|
|
||||||
// the arc's center
|
|
||||||
center: [number, number],
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "TangentialArcTo",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "TangentialArc",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "Horizontal",
|
|
||||||
// The x coordinate.
|
|
||||||
x: number,
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "AngledLineTo",
|
|
||||||
// The x coordinate.
|
|
||||||
x: number,
|
|
||||||
// The y coordinate.
|
|
||||||
y: number,
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "Base",
|
|
||||||
}],
|
|
||||||
},
|
|
||||||
// The id of the extrusion start cap
|
|
||||||
startCapId: uuid,
|
|
||||||
// The extrude surfaces.
|
|
||||||
value: [{
|
|
||||||
// The face id for the extrude plane.
|
|
||||||
faceId: uuid,
|
|
||||||
// The id of the geometry.
|
|
||||||
id: uuid,
|
|
||||||
// The source range.
|
|
||||||
sourceRange: [number, number],
|
|
||||||
// The tag.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
type: "extrudePlane",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The face id for the extrude plane.
|
|
||||||
faceId: uuid,
|
|
||||||
// The id of the geometry.
|
|
||||||
id: uuid,
|
|
||||||
// The source range.
|
|
||||||
sourceRange: [number, number],
|
|
||||||
// The tag.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
type: "extrudeArc",
|
|
||||||
}],
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ Get the opposite edge to the edge given.
|
|||||||
|
|
||||||
|
|
||||||
```js
|
```js
|
||||||
getOppositeEdge(tag: TagIdentifier, extrude_group: ExtrudeGroup) -> Uuid
|
getOppositeEdge(tag: TagIdentifier) -> Uuid
|
||||||
```
|
```
|
||||||
|
|
||||||
### Examples
|
### Examples
|
||||||
@ -27,7 +27,7 @@ const exampleSketch = startSketchOn('XZ')
|
|||||||
const example = extrude(5, exampleSketch)
|
const example = extrude(5, exampleSketch)
|
||||||
|> fillet({
|
|> fillet({
|
||||||
radius: 3,
|
radius: 3,
|
||||||
tags: [getOppositeEdge(referenceEdge, %)]
|
tags: [getOppositeEdge(referenceEdge)]
|
||||||
}, %)
|
}, %)
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -38,115 +38,28 @@ const example = extrude(5, exampleSketch)
|
|||||||
* `tag`: `TagIdentifier` (REQUIRED)
|
* `tag`: `TagIdentifier` (REQUIRED)
|
||||||
```js
|
```js
|
||||||
{
|
{
|
||||||
value: string,
|
// Engine information for a tag.
|
||||||
}
|
info: {
|
||||||
```
|
// The id of the tagged object.
|
||||||
* `extrude_group`: `ExtrudeGroup` - An extrude group is a collection of extrude surfaces. (REQUIRED)
|
|
||||||
```js
|
|
||||||
{
|
|
||||||
// The id of the extrusion end cap
|
|
||||||
endCapId: uuid,
|
|
||||||
// Chamfers or fillets on this extrude group.
|
|
||||||
filletOrChamfers: [{
|
|
||||||
// The engine id of the edge to fillet.
|
|
||||||
edge_id: uuid,
|
|
||||||
// The id of the engine command that called this fillet.
|
|
||||||
id: uuid,
|
id: uuid,
|
||||||
radius: number,
|
// The path the tag is on.
|
||||||
type: "fillet",
|
path: {
|
||||||
} |
|
// The from point.
|
||||||
{
|
from: [number, number],
|
||||||
// The engine id of the edge to chamfer.
|
// The tag of the path.
|
||||||
edge_id: uuid,
|
|
||||||
// The id of the engine command that called this chamfer.
|
|
||||||
id: uuid,
|
|
||||||
length: number,
|
|
||||||
tag: {
|
tag: {
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||||
end: number,
|
end: number,
|
||||||
start: number,
|
start: number,
|
||||||
value: string,
|
value: string,
|
||||||
},
|
},
|
||||||
type: "chamfer",
|
// The to point.
|
||||||
}],
|
to: [number, number],
|
||||||
// The height of the extrude group.
|
|
||||||
height: number,
|
|
||||||
// The id of the extrude group.
|
|
||||||
id: uuid,
|
|
||||||
// The sketch group.
|
|
||||||
sketchGroup: {
|
|
||||||
// The id of the sketch group.
|
|
||||||
id: uuid,
|
|
||||||
// What the sketch is on (can be a plane or a face).
|
|
||||||
on: {
|
|
||||||
// The id of the plane.
|
|
||||||
id: uuid,
|
|
||||||
// Origin of the plane.
|
|
||||||
origin: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
},
|
||||||
type: "plane",
|
// The sketch group the tag is on.
|
||||||
// Type for a plane.
|
sketchGroup: uuid,
|
||||||
value: "XY" | "XZ" | "YZ" | "Custom",
|
// The surface information for the tag.
|
||||||
// What should the plane’s X axis be?
|
surface: {
|
||||||
xAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
// What should the plane’s Y axis be?
|
|
||||||
yAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
// The z-axis (normal).
|
|
||||||
zAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The extrude group the face is on.
|
|
||||||
extrudeGroup: {
|
|
||||||
// The id of the extrusion end cap
|
|
||||||
endCapId: uuid,
|
|
||||||
// Chamfers or fillets on this extrude group.
|
|
||||||
filletOrChamfers: [{
|
|
||||||
// The engine id of the edge to fillet.
|
|
||||||
edge_id: uuid,
|
|
||||||
// The id of the engine command that called this fillet.
|
|
||||||
id: uuid,
|
|
||||||
radius: number,
|
|
||||||
type: "fillet",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The engine id of the edge to chamfer.
|
|
||||||
edge_id: uuid,
|
|
||||||
// The id of the engine command that called this chamfer.
|
|
||||||
id: uuid,
|
|
||||||
length: number,
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
type: "chamfer",
|
|
||||||
}],
|
|
||||||
// The height of the extrude group.
|
|
||||||
height: number,
|
|
||||||
// The id of the extrude group.
|
|
||||||
id: uuid,
|
|
||||||
// The sketch group.
|
|
||||||
sketchGroup: SketchGroup,
|
|
||||||
// The id of the extrusion start cap
|
|
||||||
startCapId: uuid,
|
|
||||||
// The extrude surfaces.
|
|
||||||
value: [{
|
|
||||||
// The face id for the extrude plane.
|
// The face id for the extrude plane.
|
||||||
faceId: uuid,
|
faceId: uuid,
|
||||||
// The id of the geometry.
|
// The id of the geometry.
|
||||||
@ -177,180 +90,9 @@ const example = extrude(5, exampleSketch)
|
|||||||
value: string,
|
value: string,
|
||||||
},
|
},
|
||||||
type: "extrudeArc",
|
type: "extrudeArc",
|
||||||
}],
|
|
||||||
},
|
},
|
||||||
// The id of the face.
|
},
|
||||||
id: uuid,
|
|
||||||
type: "face",
|
|
||||||
// The tag of the face.
|
|
||||||
value: string,
|
value: string,
|
||||||
// What should the face’s X axis be?
|
|
||||||
xAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
// What should the face’s Y axis be?
|
|
||||||
yAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
// The z-axis (normal).
|
|
||||||
zAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
// The starting path.
|
|
||||||
start: {
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
},
|
|
||||||
// Tag identifiers that have been declared in this sketch group.
|
|
||||||
tags: {
|
|
||||||
},
|
|
||||||
// The paths in the sketch group.
|
|
||||||
value: [{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "ToPoint",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// arc's direction
|
|
||||||
ccw: string,
|
|
||||||
// the arc's center
|
|
||||||
center: [number, number],
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "TangentialArcTo",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "TangentialArc",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "Horizontal",
|
|
||||||
// The x coordinate.
|
|
||||||
x: number,
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "AngledLineTo",
|
|
||||||
// The x coordinate.
|
|
||||||
x: number,
|
|
||||||
// The y coordinate.
|
|
||||||
y: number,
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "Base",
|
|
||||||
}],
|
|
||||||
},
|
|
||||||
// The id of the extrusion start cap
|
|
||||||
startCapId: uuid,
|
|
||||||
// The extrude surfaces.
|
|
||||||
value: [{
|
|
||||||
// The face id for the extrude plane.
|
|
||||||
faceId: uuid,
|
|
||||||
// The id of the geometry.
|
|
||||||
id: uuid,
|
|
||||||
// The source range.
|
|
||||||
sourceRange: [number, number],
|
|
||||||
// The tag.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
type: "extrudePlane",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The face id for the extrude plane.
|
|
||||||
faceId: uuid,
|
|
||||||
// The id of the geometry.
|
|
||||||
id: uuid,
|
|
||||||
// The source range.
|
|
||||||
sourceRange: [number, number],
|
|
||||||
// The tag.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
type: "extrudeArc",
|
|
||||||
}],
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ Get the previous adjacent edge to the edge given.
|
|||||||
|
|
||||||
|
|
||||||
```js
|
```js
|
||||||
getPreviousAdjacentEdge(tag: TagIdentifier, extrude_group: ExtrudeGroup) -> Uuid
|
getPreviousAdjacentEdge(tag: TagIdentifier) -> Uuid
|
||||||
```
|
```
|
||||||
|
|
||||||
### Examples
|
### Examples
|
||||||
@ -27,9 +27,7 @@ const exampleSketch = startSketchOn('XZ')
|
|||||||
const example = extrude(5, exampleSketch)
|
const example = extrude(5, exampleSketch)
|
||||||
|> fillet({
|
|> fillet({
|
||||||
radius: 3,
|
radius: 3,
|
||||||
tags: [
|
tags: [getPreviousAdjacentEdge(referenceEdge)]
|
||||||
getPreviousAdjacentEdge(referenceEdge, %)
|
|
||||||
]
|
|
||||||
}, %)
|
}, %)
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -40,115 +38,28 @@ const example = extrude(5, exampleSketch)
|
|||||||
* `tag`: `TagIdentifier` (REQUIRED)
|
* `tag`: `TagIdentifier` (REQUIRED)
|
||||||
```js
|
```js
|
||||||
{
|
{
|
||||||
value: string,
|
// Engine information for a tag.
|
||||||
}
|
info: {
|
||||||
```
|
// The id of the tagged object.
|
||||||
* `extrude_group`: `ExtrudeGroup` - An extrude group is a collection of extrude surfaces. (REQUIRED)
|
|
||||||
```js
|
|
||||||
{
|
|
||||||
// The id of the extrusion end cap
|
|
||||||
endCapId: uuid,
|
|
||||||
// Chamfers or fillets on this extrude group.
|
|
||||||
filletOrChamfers: [{
|
|
||||||
// The engine id of the edge to fillet.
|
|
||||||
edge_id: uuid,
|
|
||||||
// The id of the engine command that called this fillet.
|
|
||||||
id: uuid,
|
id: uuid,
|
||||||
radius: number,
|
// The path the tag is on.
|
||||||
type: "fillet",
|
path: {
|
||||||
} |
|
// The from point.
|
||||||
{
|
from: [number, number],
|
||||||
// The engine id of the edge to chamfer.
|
// The tag of the path.
|
||||||
edge_id: uuid,
|
|
||||||
// The id of the engine command that called this chamfer.
|
|
||||||
id: uuid,
|
|
||||||
length: number,
|
|
||||||
tag: {
|
tag: {
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||||
end: number,
|
end: number,
|
||||||
start: number,
|
start: number,
|
||||||
value: string,
|
value: string,
|
||||||
},
|
},
|
||||||
type: "chamfer",
|
// The to point.
|
||||||
}],
|
to: [number, number],
|
||||||
// The height of the extrude group.
|
|
||||||
height: number,
|
|
||||||
// The id of the extrude group.
|
|
||||||
id: uuid,
|
|
||||||
// The sketch group.
|
|
||||||
sketchGroup: {
|
|
||||||
// The id of the sketch group.
|
|
||||||
id: uuid,
|
|
||||||
// What the sketch is on (can be a plane or a face).
|
|
||||||
on: {
|
|
||||||
// The id of the plane.
|
|
||||||
id: uuid,
|
|
||||||
// Origin of the plane.
|
|
||||||
origin: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
},
|
||||||
type: "plane",
|
// The sketch group the tag is on.
|
||||||
// Type for a plane.
|
sketchGroup: uuid,
|
||||||
value: "XY" | "XZ" | "YZ" | "Custom",
|
// The surface information for the tag.
|
||||||
// What should the plane’s X axis be?
|
surface: {
|
||||||
xAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
// What should the plane’s Y axis be?
|
|
||||||
yAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
// The z-axis (normal).
|
|
||||||
zAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The extrude group the face is on.
|
|
||||||
extrudeGroup: {
|
|
||||||
// The id of the extrusion end cap
|
|
||||||
endCapId: uuid,
|
|
||||||
// Chamfers or fillets on this extrude group.
|
|
||||||
filletOrChamfers: [{
|
|
||||||
// The engine id of the edge to fillet.
|
|
||||||
edge_id: uuid,
|
|
||||||
// The id of the engine command that called this fillet.
|
|
||||||
id: uuid,
|
|
||||||
radius: number,
|
|
||||||
type: "fillet",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The engine id of the edge to chamfer.
|
|
||||||
edge_id: uuid,
|
|
||||||
// The id of the engine command that called this chamfer.
|
|
||||||
id: uuid,
|
|
||||||
length: number,
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
type: "chamfer",
|
|
||||||
}],
|
|
||||||
// The height of the extrude group.
|
|
||||||
height: number,
|
|
||||||
// The id of the extrude group.
|
|
||||||
id: uuid,
|
|
||||||
// The sketch group.
|
|
||||||
sketchGroup: SketchGroup,
|
|
||||||
// The id of the extrusion start cap
|
|
||||||
startCapId: uuid,
|
|
||||||
// The extrude surfaces.
|
|
||||||
value: [{
|
|
||||||
// The face id for the extrude plane.
|
// The face id for the extrude plane.
|
||||||
faceId: uuid,
|
faceId: uuid,
|
||||||
// The id of the geometry.
|
// The id of the geometry.
|
||||||
@ -179,180 +90,9 @@ const example = extrude(5, exampleSketch)
|
|||||||
value: string,
|
value: string,
|
||||||
},
|
},
|
||||||
type: "extrudeArc",
|
type: "extrudeArc",
|
||||||
}],
|
|
||||||
},
|
},
|
||||||
// The id of the face.
|
},
|
||||||
id: uuid,
|
|
||||||
type: "face",
|
|
||||||
// The tag of the face.
|
|
||||||
value: string,
|
value: string,
|
||||||
// What should the face’s X axis be?
|
|
||||||
xAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
// What should the face’s Y axis be?
|
|
||||||
yAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
// The z-axis (normal).
|
|
||||||
zAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
// The starting path.
|
|
||||||
start: {
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
},
|
|
||||||
// Tag identifiers that have been declared in this sketch group.
|
|
||||||
tags: {
|
|
||||||
},
|
|
||||||
// The paths in the sketch group.
|
|
||||||
value: [{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "ToPoint",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// arc's direction
|
|
||||||
ccw: string,
|
|
||||||
// the arc's center
|
|
||||||
center: [number, number],
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "TangentialArcTo",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "TangentialArc",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "Horizontal",
|
|
||||||
// The x coordinate.
|
|
||||||
x: number,
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "AngledLineTo",
|
|
||||||
// The x coordinate.
|
|
||||||
x: number,
|
|
||||||
// The y coordinate.
|
|
||||||
y: number,
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "Base",
|
|
||||||
}],
|
|
||||||
},
|
|
||||||
// The id of the extrusion start cap
|
|
||||||
startCapId: uuid,
|
|
||||||
// The extrude surfaces.
|
|
||||||
value: [{
|
|
||||||
// The face id for the extrude plane.
|
|
||||||
faceId: uuid,
|
|
||||||
// The id of the geometry.
|
|
||||||
id: uuid,
|
|
||||||
// The source range.
|
|
||||||
sourceRange: [number, number],
|
|
||||||
// The tag.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
type: "extrudePlane",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The face id for the extrude plane.
|
|
||||||
faceId: uuid,
|
|
||||||
// The id of the geometry.
|
|
||||||
id: uuid,
|
|
||||||
// The source range.
|
|
||||||
sourceRange: [number, number],
|
|
||||||
// The tag.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
type: "extrudeArc",
|
|
||||||
}],
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -36,7 +36,6 @@ layout: manual
|
|||||||
* [`extrude`](kcl/extrude)
|
* [`extrude`](kcl/extrude)
|
||||||
* [`fillet`](kcl/fillet)
|
* [`fillet`](kcl/fillet)
|
||||||
* [`floor`](kcl/floor)
|
* [`floor`](kcl/floor)
|
||||||
* [`getEdge`](kcl/getEdge)
|
|
||||||
* [`getNextAdjacentEdge`](kcl/getNextAdjacentEdge)
|
* [`getNextAdjacentEdge`](kcl/getNextAdjacentEdge)
|
||||||
* [`getOppositeEdge`](kcl/getOppositeEdge)
|
* [`getOppositeEdge`](kcl/getOppositeEdge)
|
||||||
* [`getPreviousAdjacentEdge`](kcl/getPreviousAdjacentEdge)
|
* [`getPreviousAdjacentEdge`](kcl/getPreviousAdjacentEdge)
|
||||||
|
@ -19,7 +19,7 @@ const sketch001 = startSketchOn('XY')
|
|||||||
|> startProfileAt([5, 2], %)
|
|> startProfileAt([5, 2], %)
|
||||||
|> angledLine({ angle: 120, length: 50 }, %, $seg01)
|
|> angledLine({ angle: 120, length: 50 }, %, $seg01)
|
||||||
|> angledLine({
|
|> angledLine({
|
||||||
angle: segAng(seg01, %) + 120,
|
angle: segAng(seg01) + 120,
|
||||||
length: 50
|
length: 50
|
||||||
}, %)
|
}, %)
|
||||||
|> lineTo(profileStart(%), %)
|
|> lineTo(profileStart(%), %)
|
||||||
|
@ -107,7 +107,7 @@ const sketch001 = startSketchOn(box, "END")
|
|||||||
|> circle([10, 10], 4, %)
|
|> circle([10, 10], 4, %)
|
||||||
|> revolve({
|
|> revolve({
|
||||||
angle: 90,
|
angle: 90,
|
||||||
axis: getOppositeEdge(revolveAxis, box)
|
axis: getOppositeEdge(revolveAxis)
|
||||||
}, %)
|
}, %)
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -157,6 +157,60 @@ const part001 = revolve({
|
|||||||
} |
|
} |
|
||||||
uuid |
|
uuid |
|
||||||
{
|
{
|
||||||
|
// Engine information for a tag.
|
||||||
|
info: {
|
||||||
|
// The id of the tagged object.
|
||||||
|
id: uuid,
|
||||||
|
// The path the tag is on.
|
||||||
|
path: {
|
||||||
|
// The from point.
|
||||||
|
from: [number, number],
|
||||||
|
// The tag of the path.
|
||||||
|
tag: {
|
||||||
|
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||||
|
end: number,
|
||||||
|
start: number,
|
||||||
|
value: string,
|
||||||
|
},
|
||||||
|
// The to point.
|
||||||
|
to: [number, number],
|
||||||
|
},
|
||||||
|
// The sketch group the tag is on.
|
||||||
|
sketchGroup: uuid,
|
||||||
|
// The surface information for the tag.
|
||||||
|
surface: {
|
||||||
|
// The face id for the extrude plane.
|
||||||
|
faceId: uuid,
|
||||||
|
// The id of the geometry.
|
||||||
|
id: uuid,
|
||||||
|
// The source range.
|
||||||
|
sourceRange: [number, number],
|
||||||
|
// The tag.
|
||||||
|
tag: {
|
||||||
|
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||||
|
end: number,
|
||||||
|
start: number,
|
||||||
|
value: string,
|
||||||
|
},
|
||||||
|
type: "extrudePlane",
|
||||||
|
} |
|
||||||
|
{
|
||||||
|
// The face id for the extrude plane.
|
||||||
|
faceId: uuid,
|
||||||
|
// The id of the geometry.
|
||||||
|
id: uuid,
|
||||||
|
// The source range.
|
||||||
|
sourceRange: [number, number],
|
||||||
|
// The tag.
|
||||||
|
tag: {
|
||||||
|
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||||
|
end: number,
|
||||||
|
start: number,
|
||||||
|
value: string,
|
||||||
|
},
|
||||||
|
type: "extrudeArc",
|
||||||
|
},
|
||||||
|
},
|
||||||
value: string,
|
value: string,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@ Returns the angle of the segment.
|
|||||||
|
|
||||||
|
|
||||||
```js
|
```js
|
||||||
segAng(segment_name: TagIdentifier, sketch_group: SketchGroup) -> number
|
segAng(tag: TagIdentifier) -> number
|
||||||
```
|
```
|
||||||
|
|
||||||
### Examples
|
### Examples
|
||||||
@ -20,9 +20,9 @@ const exampleSketch = startSketchOn('XZ')
|
|||||||
|> line([10, 0], %)
|
|> line([10, 0], %)
|
||||||
|> line([5, 10], %, $seg01)
|
|> line([5, 10], %, $seg01)
|
||||||
|> line([-10, 0], %)
|
|> line([-10, 0], %)
|
||||||
|> angledLine([segAng(seg01, %), 10], %)
|
|> angledLine([segAng(seg01), 10], %)
|
||||||
|> line([-10, 0], %)
|
|> line([-10, 0], %)
|
||||||
|> angledLine([segAng(seg01, %), -15], %)
|
|> angledLine([segAng(seg01), -15], %)
|
||||||
|> close(%)
|
|> close(%)
|
||||||
|
|
||||||
const example = extrude(4, exampleSketch)
|
const example = extrude(4, exampleSketch)
|
||||||
@ -32,89 +32,15 @@ const example = extrude(4, exampleSketch)
|
|||||||
|
|
||||||
### Arguments
|
### Arguments
|
||||||
|
|
||||||
* `segment_name`: `TagIdentifier` (REQUIRED)
|
* `tag`: `TagIdentifier` (REQUIRED)
|
||||||
```js
|
```js
|
||||||
{
|
{
|
||||||
value: string,
|
// Engine information for a tag.
|
||||||
}
|
info: {
|
||||||
```
|
// The id of the tagged object.
|
||||||
* `sketch_group`: `SketchGroup` - A sketch group is a collection of paths. (REQUIRED)
|
|
||||||
```js
|
|
||||||
{
|
|
||||||
// The id of the sketch group.
|
|
||||||
id: uuid,
|
id: uuid,
|
||||||
// What the sketch is on (can be a plane or a face).
|
// The path the tag is on.
|
||||||
on: {
|
path: {
|
||||||
// The id of the plane.
|
|
||||||
id: uuid,
|
|
||||||
// Origin of the plane.
|
|
||||||
origin: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
type: "plane",
|
|
||||||
// Type for a plane.
|
|
||||||
value: "XY" | "XZ" | "YZ" | "Custom",
|
|
||||||
// What should the plane’s X axis be?
|
|
||||||
xAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
// What should the plane’s Y axis be?
|
|
||||||
yAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
// The z-axis (normal).
|
|
||||||
zAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The extrude group the face is on.
|
|
||||||
extrudeGroup: {
|
|
||||||
// The id of the extrusion end cap
|
|
||||||
endCapId: uuid,
|
|
||||||
// Chamfers or fillets on this extrude group.
|
|
||||||
filletOrChamfers: [{
|
|
||||||
// The engine id of the edge to fillet.
|
|
||||||
edge_id: uuid,
|
|
||||||
// The id of the engine command that called this fillet.
|
|
||||||
id: uuid,
|
|
||||||
radius: number,
|
|
||||||
type: "fillet",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The engine id of the edge to chamfer.
|
|
||||||
edge_id: uuid,
|
|
||||||
// The id of the engine command that called this chamfer.
|
|
||||||
id: uuid,
|
|
||||||
length: number,
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
type: "chamfer",
|
|
||||||
}],
|
|
||||||
// The height of the extrude group.
|
|
||||||
height: number,
|
|
||||||
// The id of the extrude group.
|
|
||||||
id: uuid,
|
|
||||||
// The sketch group.
|
|
||||||
sketchGroup: {
|
|
||||||
// The id of the sketch group.
|
|
||||||
id: uuid,
|
|
||||||
// What the sketch is on (can be a plane or a face).
|
|
||||||
on: SketchSurface,
|
|
||||||
// The starting path.
|
|
||||||
start: {
|
|
||||||
// The from point.
|
// The from point.
|
||||||
from: [number, number],
|
from: [number, number],
|
||||||
// The tag of the path.
|
// The tag of the path.
|
||||||
@ -127,109 +53,10 @@ const example = extrude(4, exampleSketch)
|
|||||||
// The to point.
|
// The to point.
|
||||||
to: [number, number],
|
to: [number, number],
|
||||||
},
|
},
|
||||||
// Tag identifiers that have been declared in this sketch group.
|
// The sketch group the tag is on.
|
||||||
tags: {
|
sketchGroup: uuid,
|
||||||
},
|
// The surface information for the tag.
|
||||||
// The paths in the sketch group.
|
surface: {
|
||||||
value: [{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "ToPoint",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// arc's direction
|
|
||||||
ccw: string,
|
|
||||||
// the arc's center
|
|
||||||
center: [number, number],
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "TangentialArcTo",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "TangentialArc",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "Horizontal",
|
|
||||||
// The x coordinate.
|
|
||||||
x: number,
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "AngledLineTo",
|
|
||||||
// The x coordinate.
|
|
||||||
x: number,
|
|
||||||
// The y coordinate.
|
|
||||||
y: number,
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "Base",
|
|
||||||
}],
|
|
||||||
},
|
|
||||||
// The id of the extrusion start cap
|
|
||||||
startCapId: uuid,
|
|
||||||
// The extrude surfaces.
|
|
||||||
value: [{
|
|
||||||
// The face id for the extrude plane.
|
// The face id for the extrude plane.
|
||||||
faceId: uuid,
|
faceId: uuid,
|
||||||
// The id of the geometry.
|
// The id of the geometry.
|
||||||
@ -260,144 +87,9 @@ const example = extrude(4, exampleSketch)
|
|||||||
value: string,
|
value: string,
|
||||||
},
|
},
|
||||||
type: "extrudeArc",
|
type: "extrudeArc",
|
||||||
}],
|
|
||||||
},
|
},
|
||||||
// The id of the face.
|
},
|
||||||
id: uuid,
|
|
||||||
type: "face",
|
|
||||||
// The tag of the face.
|
|
||||||
value: string,
|
value: string,
|
||||||
// What should the face’s X axis be?
|
|
||||||
xAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
// What should the face’s Y axis be?
|
|
||||||
yAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
// The z-axis (normal).
|
|
||||||
zAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
// The starting path.
|
|
||||||
start: {
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
},
|
|
||||||
// Tag identifiers that have been declared in this sketch group.
|
|
||||||
tags: {
|
|
||||||
},
|
|
||||||
// The paths in the sketch group.
|
|
||||||
value: [{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "ToPoint",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// arc's direction
|
|
||||||
ccw: string,
|
|
||||||
// the arc's center
|
|
||||||
center: [number, number],
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "TangentialArcTo",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "TangentialArc",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "Horizontal",
|
|
||||||
// The x coordinate.
|
|
||||||
x: number,
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "AngledLineTo",
|
|
||||||
// The x coordinate.
|
|
||||||
x: number,
|
|
||||||
// The y coordinate.
|
|
||||||
y: number,
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "Base",
|
|
||||||
}],
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ Returns the segment end of x.
|
|||||||
|
|
||||||
|
|
||||||
```js
|
```js
|
||||||
segEndX(segment_name: TagIdentifier, sketch_group: SketchGroup) -> number
|
segEndX(tag: TagIdentifier) -> number
|
||||||
```
|
```
|
||||||
|
|
||||||
### Examples
|
### Examples
|
||||||
@ -19,7 +19,7 @@ const exampleSketch = startSketchOn('XZ')
|
|||||||
|> startProfileAt([0, 0], %)
|
|> startProfileAt([0, 0], %)
|
||||||
|> line([20, 0], %, $thing)
|
|> line([20, 0], %, $thing)
|
||||||
|> line([0, 5], %)
|
|> line([0, 5], %)
|
||||||
|> line([segEndX(thing, %), 0], %)
|
|> line([segEndX(thing), 0], %)
|
||||||
|> line([-20, 10], %)
|
|> line([-20, 10], %)
|
||||||
|> close(%)
|
|> close(%)
|
||||||
|
|
||||||
@ -30,89 +30,15 @@ const example = extrude(5, exampleSketch)
|
|||||||
|
|
||||||
### Arguments
|
### Arguments
|
||||||
|
|
||||||
* `segment_name`: `TagIdentifier` (REQUIRED)
|
* `tag`: `TagIdentifier` (REQUIRED)
|
||||||
```js
|
```js
|
||||||
{
|
{
|
||||||
value: string,
|
// Engine information for a tag.
|
||||||
}
|
info: {
|
||||||
```
|
// The id of the tagged object.
|
||||||
* `sketch_group`: `SketchGroup` - A sketch group is a collection of paths. (REQUIRED)
|
|
||||||
```js
|
|
||||||
{
|
|
||||||
// The id of the sketch group.
|
|
||||||
id: uuid,
|
id: uuid,
|
||||||
// What the sketch is on (can be a plane or a face).
|
// The path the tag is on.
|
||||||
on: {
|
path: {
|
||||||
// The id of the plane.
|
|
||||||
id: uuid,
|
|
||||||
// Origin of the plane.
|
|
||||||
origin: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
type: "plane",
|
|
||||||
// Type for a plane.
|
|
||||||
value: "XY" | "XZ" | "YZ" | "Custom",
|
|
||||||
// What should the plane’s X axis be?
|
|
||||||
xAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
// What should the plane’s Y axis be?
|
|
||||||
yAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
// The z-axis (normal).
|
|
||||||
zAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The extrude group the face is on.
|
|
||||||
extrudeGroup: {
|
|
||||||
// The id of the extrusion end cap
|
|
||||||
endCapId: uuid,
|
|
||||||
// Chamfers or fillets on this extrude group.
|
|
||||||
filletOrChamfers: [{
|
|
||||||
// The engine id of the edge to fillet.
|
|
||||||
edge_id: uuid,
|
|
||||||
// The id of the engine command that called this fillet.
|
|
||||||
id: uuid,
|
|
||||||
radius: number,
|
|
||||||
type: "fillet",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The engine id of the edge to chamfer.
|
|
||||||
edge_id: uuid,
|
|
||||||
// The id of the engine command that called this chamfer.
|
|
||||||
id: uuid,
|
|
||||||
length: number,
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
type: "chamfer",
|
|
||||||
}],
|
|
||||||
// The height of the extrude group.
|
|
||||||
height: number,
|
|
||||||
// The id of the extrude group.
|
|
||||||
id: uuid,
|
|
||||||
// The sketch group.
|
|
||||||
sketchGroup: {
|
|
||||||
// The id of the sketch group.
|
|
||||||
id: uuid,
|
|
||||||
// What the sketch is on (can be a plane or a face).
|
|
||||||
on: SketchSurface,
|
|
||||||
// The starting path.
|
|
||||||
start: {
|
|
||||||
// The from point.
|
// The from point.
|
||||||
from: [number, number],
|
from: [number, number],
|
||||||
// The tag of the path.
|
// The tag of the path.
|
||||||
@ -125,109 +51,10 @@ const example = extrude(5, exampleSketch)
|
|||||||
// The to point.
|
// The to point.
|
||||||
to: [number, number],
|
to: [number, number],
|
||||||
},
|
},
|
||||||
// Tag identifiers that have been declared in this sketch group.
|
// The sketch group the tag is on.
|
||||||
tags: {
|
sketchGroup: uuid,
|
||||||
},
|
// The surface information for the tag.
|
||||||
// The paths in the sketch group.
|
surface: {
|
||||||
value: [{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "ToPoint",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// arc's direction
|
|
||||||
ccw: string,
|
|
||||||
// the arc's center
|
|
||||||
center: [number, number],
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "TangentialArcTo",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "TangentialArc",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "Horizontal",
|
|
||||||
// The x coordinate.
|
|
||||||
x: number,
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "AngledLineTo",
|
|
||||||
// The x coordinate.
|
|
||||||
x: number,
|
|
||||||
// The y coordinate.
|
|
||||||
y: number,
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "Base",
|
|
||||||
}],
|
|
||||||
},
|
|
||||||
// The id of the extrusion start cap
|
|
||||||
startCapId: uuid,
|
|
||||||
// The extrude surfaces.
|
|
||||||
value: [{
|
|
||||||
// The face id for the extrude plane.
|
// The face id for the extrude plane.
|
||||||
faceId: uuid,
|
faceId: uuid,
|
||||||
// The id of the geometry.
|
// The id of the geometry.
|
||||||
@ -258,144 +85,9 @@ const example = extrude(5, exampleSketch)
|
|||||||
value: string,
|
value: string,
|
||||||
},
|
},
|
||||||
type: "extrudeArc",
|
type: "extrudeArc",
|
||||||
}],
|
|
||||||
},
|
},
|
||||||
// The id of the face.
|
},
|
||||||
id: uuid,
|
|
||||||
type: "face",
|
|
||||||
// The tag of the face.
|
|
||||||
value: string,
|
value: string,
|
||||||
// What should the face’s X axis be?
|
|
||||||
xAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
// What should the face’s Y axis be?
|
|
||||||
yAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
// The z-axis (normal).
|
|
||||||
zAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
// The starting path.
|
|
||||||
start: {
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
},
|
|
||||||
// Tag identifiers that have been declared in this sketch group.
|
|
||||||
tags: {
|
|
||||||
},
|
|
||||||
// The paths in the sketch group.
|
|
||||||
value: [{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "ToPoint",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// arc's direction
|
|
||||||
ccw: string,
|
|
||||||
// the arc's center
|
|
||||||
center: [number, number],
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "TangentialArcTo",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "TangentialArc",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "Horizontal",
|
|
||||||
// The x coordinate.
|
|
||||||
x: number,
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "AngledLineTo",
|
|
||||||
// The x coordinate.
|
|
||||||
x: number,
|
|
||||||
// The y coordinate.
|
|
||||||
y: number,
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "Base",
|
|
||||||
}],
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ Returns the segment end of y.
|
|||||||
|
|
||||||
|
|
||||||
```js
|
```js
|
||||||
segEndY(segment_name: TagIdentifier, sketch_group: SketchGroup) -> number
|
segEndY(tag: TagIdentifier) -> number
|
||||||
```
|
```
|
||||||
|
|
||||||
### Examples
|
### Examples
|
||||||
@ -20,7 +20,7 @@ const exampleSketch = startSketchOn('XZ')
|
|||||||
|> line([20, 0], %)
|
|> line([20, 0], %)
|
||||||
|> line([0, 3], %, $thing)
|
|> line([0, 3], %, $thing)
|
||||||
|> line([-10, 0], %)
|
|> line([-10, 0], %)
|
||||||
|> line([0, segEndY(thing, %)], %)
|
|> line([0, segEndY(thing)], %)
|
||||||
|> line([-10, 0], %)
|
|> line([-10, 0], %)
|
||||||
|> close(%)
|
|> close(%)
|
||||||
|
|
||||||
@ -31,89 +31,15 @@ const example = extrude(5, exampleSketch)
|
|||||||
|
|
||||||
### Arguments
|
### Arguments
|
||||||
|
|
||||||
* `segment_name`: `TagIdentifier` (REQUIRED)
|
* `tag`: `TagIdentifier` (REQUIRED)
|
||||||
```js
|
```js
|
||||||
{
|
{
|
||||||
value: string,
|
// Engine information for a tag.
|
||||||
}
|
info: {
|
||||||
```
|
// The id of the tagged object.
|
||||||
* `sketch_group`: `SketchGroup` - A sketch group is a collection of paths. (REQUIRED)
|
|
||||||
```js
|
|
||||||
{
|
|
||||||
// The id of the sketch group.
|
|
||||||
id: uuid,
|
id: uuid,
|
||||||
// What the sketch is on (can be a plane or a face).
|
// The path the tag is on.
|
||||||
on: {
|
path: {
|
||||||
// The id of the plane.
|
|
||||||
id: uuid,
|
|
||||||
// Origin of the plane.
|
|
||||||
origin: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
type: "plane",
|
|
||||||
// Type for a plane.
|
|
||||||
value: "XY" | "XZ" | "YZ" | "Custom",
|
|
||||||
// What should the plane’s X axis be?
|
|
||||||
xAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
// What should the plane’s Y axis be?
|
|
||||||
yAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
// The z-axis (normal).
|
|
||||||
zAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The extrude group the face is on.
|
|
||||||
extrudeGroup: {
|
|
||||||
// The id of the extrusion end cap
|
|
||||||
endCapId: uuid,
|
|
||||||
// Chamfers or fillets on this extrude group.
|
|
||||||
filletOrChamfers: [{
|
|
||||||
// The engine id of the edge to fillet.
|
|
||||||
edge_id: uuid,
|
|
||||||
// The id of the engine command that called this fillet.
|
|
||||||
id: uuid,
|
|
||||||
radius: number,
|
|
||||||
type: "fillet",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The engine id of the edge to chamfer.
|
|
||||||
edge_id: uuid,
|
|
||||||
// The id of the engine command that called this chamfer.
|
|
||||||
id: uuid,
|
|
||||||
length: number,
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
type: "chamfer",
|
|
||||||
}],
|
|
||||||
// The height of the extrude group.
|
|
||||||
height: number,
|
|
||||||
// The id of the extrude group.
|
|
||||||
id: uuid,
|
|
||||||
// The sketch group.
|
|
||||||
sketchGroup: {
|
|
||||||
// The id of the sketch group.
|
|
||||||
id: uuid,
|
|
||||||
// What the sketch is on (can be a plane or a face).
|
|
||||||
on: SketchSurface,
|
|
||||||
// The starting path.
|
|
||||||
start: {
|
|
||||||
// The from point.
|
// The from point.
|
||||||
from: [number, number],
|
from: [number, number],
|
||||||
// The tag of the path.
|
// The tag of the path.
|
||||||
@ -126,109 +52,10 @@ const example = extrude(5, exampleSketch)
|
|||||||
// The to point.
|
// The to point.
|
||||||
to: [number, number],
|
to: [number, number],
|
||||||
},
|
},
|
||||||
// Tag identifiers that have been declared in this sketch group.
|
// The sketch group the tag is on.
|
||||||
tags: {
|
sketchGroup: uuid,
|
||||||
},
|
// The surface information for the tag.
|
||||||
// The paths in the sketch group.
|
surface: {
|
||||||
value: [{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "ToPoint",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// arc's direction
|
|
||||||
ccw: string,
|
|
||||||
// the arc's center
|
|
||||||
center: [number, number],
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "TangentialArcTo",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "TangentialArc",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "Horizontal",
|
|
||||||
// The x coordinate.
|
|
||||||
x: number,
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "AngledLineTo",
|
|
||||||
// The x coordinate.
|
|
||||||
x: number,
|
|
||||||
// The y coordinate.
|
|
||||||
y: number,
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "Base",
|
|
||||||
}],
|
|
||||||
},
|
|
||||||
// The id of the extrusion start cap
|
|
||||||
startCapId: uuid,
|
|
||||||
// The extrude surfaces.
|
|
||||||
value: [{
|
|
||||||
// The face id for the extrude plane.
|
// The face id for the extrude plane.
|
||||||
faceId: uuid,
|
faceId: uuid,
|
||||||
// The id of the geometry.
|
// The id of the geometry.
|
||||||
@ -259,144 +86,9 @@ const example = extrude(5, exampleSketch)
|
|||||||
value: string,
|
value: string,
|
||||||
},
|
},
|
||||||
type: "extrudeArc",
|
type: "extrudeArc",
|
||||||
}],
|
|
||||||
},
|
},
|
||||||
// The id of the face.
|
},
|
||||||
id: uuid,
|
|
||||||
type: "face",
|
|
||||||
// The tag of the face.
|
|
||||||
value: string,
|
value: string,
|
||||||
// What should the face’s X axis be?
|
|
||||||
xAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
// What should the face’s Y axis be?
|
|
||||||
yAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
// The z-axis (normal).
|
|
||||||
zAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
// The starting path.
|
|
||||||
start: {
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
},
|
|
||||||
// Tag identifiers that have been declared in this sketch group.
|
|
||||||
tags: {
|
|
||||||
},
|
|
||||||
// The paths in the sketch group.
|
|
||||||
value: [{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "ToPoint",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// arc's direction
|
|
||||||
ccw: string,
|
|
||||||
// the arc's center
|
|
||||||
center: [number, number],
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "TangentialArcTo",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "TangentialArc",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "Horizontal",
|
|
||||||
// The x coordinate.
|
|
||||||
x: number,
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "AngledLineTo",
|
|
||||||
// The x coordinate.
|
|
||||||
x: number,
|
|
||||||
// The y coordinate.
|
|
||||||
y: number,
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "Base",
|
|
||||||
}],
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ Returns the length of the segment.
|
|||||||
|
|
||||||
|
|
||||||
```js
|
```js
|
||||||
segLen(segment_name: TagIdentifier, sketch_group: SketchGroup) -> number
|
segLen(tag: TagIdentifier) -> number
|
||||||
```
|
```
|
||||||
|
|
||||||
### Examples
|
### Examples
|
||||||
@ -19,7 +19,7 @@ const exampleSketch = startSketchOn("XZ")
|
|||||||
|> startProfileAt([0, 0], %)
|
|> startProfileAt([0, 0], %)
|
||||||
|> angledLine({ angle: 60, length: 10 }, %, $thing)
|
|> angledLine({ angle: 60, length: 10 }, %, $thing)
|
||||||
|> tangentialArc({ offset: -120, radius: 5 }, %)
|
|> tangentialArc({ offset: -120, radius: 5 }, %)
|
||||||
|> angledLine({ angle: -60, length: segLen(thing, %) }, %)
|
|> angledLine({ angle: -60, length: segLen(thing) }, %)
|
||||||
|> close(%)
|
|> close(%)
|
||||||
|
|
||||||
const example = extrude(5, exampleSketch)
|
const example = extrude(5, exampleSketch)
|
||||||
@ -29,89 +29,15 @@ const example = extrude(5, exampleSketch)
|
|||||||
|
|
||||||
### Arguments
|
### Arguments
|
||||||
|
|
||||||
* `segment_name`: `TagIdentifier` (REQUIRED)
|
* `tag`: `TagIdentifier` (REQUIRED)
|
||||||
```js
|
```js
|
||||||
{
|
{
|
||||||
value: string,
|
// Engine information for a tag.
|
||||||
}
|
info: {
|
||||||
```
|
// The id of the tagged object.
|
||||||
* `sketch_group`: `SketchGroup` - A sketch group is a collection of paths. (REQUIRED)
|
|
||||||
```js
|
|
||||||
{
|
|
||||||
// The id of the sketch group.
|
|
||||||
id: uuid,
|
id: uuid,
|
||||||
// What the sketch is on (can be a plane or a face).
|
// The path the tag is on.
|
||||||
on: {
|
path: {
|
||||||
// The id of the plane.
|
|
||||||
id: uuid,
|
|
||||||
// Origin of the plane.
|
|
||||||
origin: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
type: "plane",
|
|
||||||
// Type for a plane.
|
|
||||||
value: "XY" | "XZ" | "YZ" | "Custom",
|
|
||||||
// What should the plane’s X axis be?
|
|
||||||
xAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
// What should the plane’s Y axis be?
|
|
||||||
yAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
// The z-axis (normal).
|
|
||||||
zAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The extrude group the face is on.
|
|
||||||
extrudeGroup: {
|
|
||||||
// The id of the extrusion end cap
|
|
||||||
endCapId: uuid,
|
|
||||||
// Chamfers or fillets on this extrude group.
|
|
||||||
filletOrChamfers: [{
|
|
||||||
// The engine id of the edge to fillet.
|
|
||||||
edge_id: uuid,
|
|
||||||
// The id of the engine command that called this fillet.
|
|
||||||
id: uuid,
|
|
||||||
radius: number,
|
|
||||||
type: "fillet",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The engine id of the edge to chamfer.
|
|
||||||
edge_id: uuid,
|
|
||||||
// The id of the engine command that called this chamfer.
|
|
||||||
id: uuid,
|
|
||||||
length: number,
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
type: "chamfer",
|
|
||||||
}],
|
|
||||||
// The height of the extrude group.
|
|
||||||
height: number,
|
|
||||||
// The id of the extrude group.
|
|
||||||
id: uuid,
|
|
||||||
// The sketch group.
|
|
||||||
sketchGroup: {
|
|
||||||
// The id of the sketch group.
|
|
||||||
id: uuid,
|
|
||||||
// What the sketch is on (can be a plane or a face).
|
|
||||||
on: SketchSurface,
|
|
||||||
// The starting path.
|
|
||||||
start: {
|
|
||||||
// The from point.
|
// The from point.
|
||||||
from: [number, number],
|
from: [number, number],
|
||||||
// The tag of the path.
|
// The tag of the path.
|
||||||
@ -124,109 +50,10 @@ const example = extrude(5, exampleSketch)
|
|||||||
// The to point.
|
// The to point.
|
||||||
to: [number, number],
|
to: [number, number],
|
||||||
},
|
},
|
||||||
// Tag identifiers that have been declared in this sketch group.
|
// The sketch group the tag is on.
|
||||||
tags: {
|
sketchGroup: uuid,
|
||||||
},
|
// The surface information for the tag.
|
||||||
// The paths in the sketch group.
|
surface: {
|
||||||
value: [{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "ToPoint",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// arc's direction
|
|
||||||
ccw: string,
|
|
||||||
// the arc's center
|
|
||||||
center: [number, number],
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "TangentialArcTo",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "TangentialArc",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "Horizontal",
|
|
||||||
// The x coordinate.
|
|
||||||
x: number,
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "AngledLineTo",
|
|
||||||
// The x coordinate.
|
|
||||||
x: number,
|
|
||||||
// The y coordinate.
|
|
||||||
y: number,
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "Base",
|
|
||||||
}],
|
|
||||||
},
|
|
||||||
// The id of the extrusion start cap
|
|
||||||
startCapId: uuid,
|
|
||||||
// The extrude surfaces.
|
|
||||||
value: [{
|
|
||||||
// The face id for the extrude plane.
|
// The face id for the extrude plane.
|
||||||
faceId: uuid,
|
faceId: uuid,
|
||||||
// The id of the geometry.
|
// The id of the geometry.
|
||||||
@ -257,144 +84,9 @@ const example = extrude(5, exampleSketch)
|
|||||||
value: string,
|
value: string,
|
||||||
},
|
},
|
||||||
type: "extrudeArc",
|
type: "extrudeArc",
|
||||||
}],
|
|
||||||
},
|
},
|
||||||
// The id of the face.
|
},
|
||||||
id: uuid,
|
|
||||||
type: "face",
|
|
||||||
// The tag of the face.
|
|
||||||
value: string,
|
value: string,
|
||||||
// What should the face’s X axis be?
|
|
||||||
xAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
// What should the face’s Y axis be?
|
|
||||||
yAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
// The z-axis (normal).
|
|
||||||
zAxis: {
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
z: number,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
// The starting path.
|
|
||||||
start: {
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
},
|
|
||||||
// Tag identifiers that have been declared in this sketch group.
|
|
||||||
tags: {
|
|
||||||
},
|
|
||||||
// The paths in the sketch group.
|
|
||||||
value: [{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "ToPoint",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// arc's direction
|
|
||||||
ccw: string,
|
|
||||||
// the arc's center
|
|
||||||
center: [number, number],
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "TangentialArcTo",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "TangentialArc",
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "Horizontal",
|
|
||||||
// The x coordinate.
|
|
||||||
x: number,
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "AngledLineTo",
|
|
||||||
// The x coordinate.
|
|
||||||
x: number,
|
|
||||||
// The y coordinate.
|
|
||||||
y: number,
|
|
||||||
} |
|
|
||||||
{
|
|
||||||
// The from point.
|
|
||||||
from: [number, number],
|
|
||||||
// The tag of the path.
|
|
||||||
tag: {
|
|
||||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
|
||||||
end: number,
|
|
||||||
start: number,
|
|
||||||
value: string,
|
|
||||||
},
|
|
||||||
// The to point.
|
|
||||||
to: [number, number],
|
|
||||||
type: "Base",
|
|
||||||
}],
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -37,6 +37,60 @@ shell({ faces: ['end'], thickness: 0.25 }, firstSketch)
|
|||||||
// The faces you want removed.
|
// The faces you want removed.
|
||||||
faces: ["start" | "end" |
|
faces: ["start" | "end" |
|
||||||
{
|
{
|
||||||
|
// Engine information for a tag.
|
||||||
|
info: {
|
||||||
|
// The id of the tagged object.
|
||||||
|
id: uuid,
|
||||||
|
// The path the tag is on.
|
||||||
|
path: {
|
||||||
|
// The from point.
|
||||||
|
from: [number, number],
|
||||||
|
// The tag of the path.
|
||||||
|
tag: {
|
||||||
|
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||||
|
end: number,
|
||||||
|
start: number,
|
||||||
|
value: string,
|
||||||
|
},
|
||||||
|
// The to point.
|
||||||
|
to: [number, number],
|
||||||
|
},
|
||||||
|
// The sketch group the tag is on.
|
||||||
|
sketchGroup: uuid,
|
||||||
|
// The surface information for the tag.
|
||||||
|
surface: {
|
||||||
|
// The face id for the extrude plane.
|
||||||
|
faceId: uuid,
|
||||||
|
// The id of the geometry.
|
||||||
|
id: uuid,
|
||||||
|
// The source range.
|
||||||
|
sourceRange: [number, number],
|
||||||
|
// The tag.
|
||||||
|
tag: {
|
||||||
|
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||||
|
end: number,
|
||||||
|
start: number,
|
||||||
|
value: string,
|
||||||
|
},
|
||||||
|
type: "extrudePlane",
|
||||||
|
} |
|
||||||
|
{
|
||||||
|
// The face id for the extrude plane.
|
||||||
|
faceId: uuid,
|
||||||
|
// The id of the geometry.
|
||||||
|
id: uuid,
|
||||||
|
// The source range.
|
||||||
|
sourceRange: [number, number],
|
||||||
|
// The tag.
|
||||||
|
tag: {
|
||||||
|
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||||
|
end: number,
|
||||||
|
start: number,
|
||||||
|
value: string,
|
||||||
|
},
|
||||||
|
type: "extrudeArc",
|
||||||
|
},
|
||||||
|
},
|
||||||
value: string,
|
value: string,
|
||||||
}],
|
}],
|
||||||
// The thickness of the shell.
|
// The thickness of the shell.
|
||||||
|
@ -407,6 +407,60 @@ const a1 = startSketchOn({
|
|||||||
```js
|
```js
|
||||||
"start" | "end" |
|
"start" | "end" |
|
||||||
{
|
{
|
||||||
|
// Engine information for a tag.
|
||||||
|
info: {
|
||||||
|
// The id of the tagged object.
|
||||||
|
id: uuid,
|
||||||
|
// The path the tag is on.
|
||||||
|
path: {
|
||||||
|
// The from point.
|
||||||
|
from: [number, number],
|
||||||
|
// The tag of the path.
|
||||||
|
tag: {
|
||||||
|
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||||
|
end: number,
|
||||||
|
start: number,
|
||||||
|
value: string,
|
||||||
|
},
|
||||||
|
// The to point.
|
||||||
|
to: [number, number],
|
||||||
|
},
|
||||||
|
// The sketch group the tag is on.
|
||||||
|
sketchGroup: uuid,
|
||||||
|
// The surface information for the tag.
|
||||||
|
surface: {
|
||||||
|
// The face id for the extrude plane.
|
||||||
|
faceId: uuid,
|
||||||
|
// The id of the geometry.
|
||||||
|
id: uuid,
|
||||||
|
// The source range.
|
||||||
|
sourceRange: [number, number],
|
||||||
|
// The tag.
|
||||||
|
tag: {
|
||||||
|
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||||
|
end: number,
|
||||||
|
start: number,
|
||||||
|
value: string,
|
||||||
|
},
|
||||||
|
type: "extrudePlane",
|
||||||
|
} |
|
||||||
|
{
|
||||||
|
// The face id for the extrude plane.
|
||||||
|
faceId: uuid,
|
||||||
|
// The id of the geometry.
|
||||||
|
id: uuid,
|
||||||
|
// The source range.
|
||||||
|
sourceRange: [number, number],
|
||||||
|
// The tag.
|
||||||
|
tag: {
|
||||||
|
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||||
|
end: number,
|
||||||
|
start: number,
|
||||||
|
value: string,
|
||||||
|
},
|
||||||
|
type: "extrudeArc",
|
||||||
|
},
|
||||||
|
},
|
||||||
value: string,
|
value: string,
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
55358
docs/kcl/std.json
55358
docs/kcl/std.json
File diff suppressed because it is too large
Load Diff
@ -213,7 +213,7 @@ async function doBasicSketch(page: Page, openPanes: string[]) {
|
|||||||
|> startProfileAt(${commonPoints.startAt}, %)
|
|> startProfileAt(${commonPoints.startAt}, %)
|
||||||
|> line([${commonPoints.num1}, 0], %, $seg01)
|
|> line([${commonPoints.num1}, 0], %, $seg01)
|
||||||
|> line([0, ${commonPoints.num1 + 0.01}], %)
|
|> line([0, ${commonPoints.num1 + 0.01}], %)
|
||||||
|> angledLine([180, segLen(seg01, %)], %)`)
|
|> angledLine([180, segLen(seg01)], %)`)
|
||||||
}
|
}
|
||||||
|
|
||||||
test.describe('Basic sketch', () => {
|
test.describe('Basic sketch', () => {
|
||||||
@ -1027,7 +1027,7 @@ test.describe('Editor tests', () => {
|
|||||||
|> line([0, -10], %)
|
|> line([0, -10], %)
|
||||||
|> close(%)
|
|> close(%)
|
||||||
|> revolve({
|
|> revolve({
|
||||||
axis: getEdge(revolveAxis, box),
|
axis: revolveAxis,
|
||||||
angle: 90
|
angle: 90
|
||||||
}, %)
|
}, %)
|
||||||
`
|
`
|
||||||
@ -3169,7 +3169,7 @@ const extrude001 = extrude(10, sketch001)`
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
pos: [816, 244],
|
pos: [816, 244],
|
||||||
expectedCode: 'angledLine([segAng(seg01, %), yo], %)',
|
expectedCode: 'angledLine([segAng(seg01), yo], %)',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
pos: [1107, 161],
|
pos: [1107, 161],
|
||||||
@ -4923,13 +4923,13 @@ const part001 = startSketchOn('XZ')
|
|||||||
|> startProfileAt([-7.54, -26.74], %)
|
|> startProfileAt([-7.54, -26.74], %)
|
||||||
|> line([74.36, 130.4], %, $seg01)
|
|> line([74.36, 130.4], %, $seg01)
|
||||||
|> line([78.92, -120.11], %)
|
|> line([78.92, -120.11], %)
|
||||||
|> angledLine([segAng(seg01, %), yo], %)
|
|> angledLine([segAng(seg01), yo], %)
|
||||||
|> line([41.19, 28.97 + 5], %)
|
|> line([41.19, 28.97 + 5], %)
|
||||||
const part002 = startSketchOn('XZ')
|
const part002 = startSketchOn('XZ')
|
||||||
|> startProfileAt([299.05, 231.45], %)
|
|> startProfileAt([299.05, 231.45], %)
|
||||||
|> xLine(-425.34, %, $seg_what)
|
|> xLine(-425.34, %, $seg_what)
|
||||||
|> yLine(-264.06, %)
|
|> yLine(-264.06, %)
|
||||||
|> xLine(segLen(seg_what, %), %)
|
|> xLine(segLen(seg_what), %)
|
||||||
|> lineTo([profileStartX(%), profileStartY(%)], %)`
|
|> lineTo([profileStartX(%), profileStartY(%)], %)`
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
@ -4981,13 +4981,13 @@ const part001 = startSketchOn('XZ')
|
|||||||
|> startProfileAt([-7.54, -26.74], %)
|
|> startProfileAt([-7.54, -26.74], %)
|
||||||
|> line([74.36, 130.4], %, $seg01)
|
|> line([74.36, 130.4], %, $seg01)
|
||||||
|> line([78.92, -120.11], %)
|
|> line([78.92, -120.11], %)
|
||||||
|> angledLine([segAng(seg01, %), 78.33], %)
|
|> angledLine([segAng(seg01), 78.33], %)
|
||||||
|> line([41.19, 28.97], %)
|
|> line([41.19, 28.97], %)
|
||||||
const part002 = startSketchOn('XZ')
|
const part002 = startSketchOn('XZ')
|
||||||
|> startProfileAt([299.05, 231.45], %)
|
|> startProfileAt([299.05, 231.45], %)
|
||||||
|> xLine(-425.34, %, $seg_what)
|
|> xLine(-425.34, %, $seg_what)
|
||||||
|> yLine(-264.06, %)
|
|> yLine(-264.06, %)
|
||||||
|> xLine(segLen(seg_what, %), %)
|
|> xLine(segLen(seg_what), %)
|
||||||
|> lineTo([profileStartX(%), profileStartY(%)], %)`
|
|> lineTo([profileStartX(%), profileStartY(%)], %)`
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
@ -5052,22 +5052,22 @@ const part002 = startSketchOn('XZ')
|
|||||||
{
|
{
|
||||||
testName: 'Add variable',
|
testName: 'Add variable',
|
||||||
constraint: 'horizontal distance',
|
constraint: 'horizontal distance',
|
||||||
value: 'segEndX(seg01, %) + xDis001, 61.34',
|
value: 'segEndX(seg01) + xDis001, 61.34',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: 'No variable',
|
testName: 'No variable',
|
||||||
constraint: 'horizontal distance',
|
constraint: 'horizontal distance',
|
||||||
value: 'segEndX(seg01, %) + 88.08, 61.34',
|
value: 'segEndX(seg01) + 88.08, 61.34',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: 'Add variable',
|
testName: 'Add variable',
|
||||||
constraint: 'vertical distance',
|
constraint: 'vertical distance',
|
||||||
value: '154.9, segEndY(seg01, %) - yDis001',
|
value: '154.9, segEndY(seg01) - yDis001',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: 'No variable',
|
testName: 'No variable',
|
||||||
constraint: 'vertical distance',
|
constraint: 'vertical distance',
|
||||||
value: '154.9, segEndY(seg01, %) - 42.32',
|
value: '154.9, segEndY(seg01) - 42.32',
|
||||||
},
|
},
|
||||||
] as const
|
] as const
|
||||||
for (const { testName, value, constraint } of cases) {
|
for (const { testName, value, constraint } of cases) {
|
||||||
@ -5086,7 +5086,7 @@ const part002 = startSketchOn('XZ')
|
|||||||
|> startProfileAt([299.05, 231.45], %)
|
|> startProfileAt([299.05, 231.45], %)
|
||||||
|> xLine(-425.34, %, $seg_what)
|
|> xLine(-425.34, %, $seg_what)
|
||||||
|> yLine(-264.06, %)
|
|> yLine(-264.06, %)
|
||||||
|> xLine(segLen(seg_what, %), %)
|
|> xLine(segLen(seg_what), %)
|
||||||
|> lineTo([profileStartX(%), profileStartY(%)], %)`
|
|> lineTo([profileStartX(%), profileStartY(%)], %)`
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
@ -5192,7 +5192,7 @@ const part002 = startSketchOn('XZ')
|
|||||||
|> startProfileAt([299.05, 231.45], %)
|
|> startProfileAt([299.05, 231.45], %)
|
||||||
|> xLine(-425.34, %, $seg_what)
|
|> xLine(-425.34, %, $seg_what)
|
||||||
|> yLine(-264.06, %)
|
|> yLine(-264.06, %)
|
||||||
|> xLine(segLen(seg_what, %), %)
|
|> xLine(segLen(seg_what), %)
|
||||||
|> lineTo([profileStartX(%), profileStartY(%)], %)`
|
|> lineTo([profileStartX(%), profileStartY(%)], %)`
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
@ -5262,13 +5262,13 @@ const part002 = startSketchOn('XZ')
|
|||||||
testName: 'Add variable',
|
testName: 'Add variable',
|
||||||
addVariable: true,
|
addVariable: true,
|
||||||
axisSelect: false,
|
axisSelect: false,
|
||||||
value: 'segAng(seg01, %) + angle001',
|
value: 'segAng(seg01) + angle001',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: 'No variable',
|
testName: 'No variable',
|
||||||
addVariable: false,
|
addVariable: false,
|
||||||
axisSelect: false,
|
axisSelect: false,
|
||||||
value: 'segAng(seg01, %) + 22.69',
|
value: 'segAng(seg01) + 22.69',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: 'Add variable, selecting axis',
|
testName: 'Add variable, selecting axis',
|
||||||
@ -5299,7 +5299,7 @@ const part002 = startSketchOn('XZ')
|
|||||||
|> startProfileAt([299.05, 231.45], %)
|
|> startProfileAt([299.05, 231.45], %)
|
||||||
|> xLine(-425.34, %, $seg_what)
|
|> xLine(-425.34, %, $seg_what)
|
||||||
|> yLine(-264.06, %)
|
|> yLine(-264.06, %)
|
||||||
|> xLine(segLen(seg_what, %), %)
|
|> xLine(segLen(seg_what), %)
|
||||||
|> lineTo([profileStartX(%), profileStartY(%)], %)`
|
|> lineTo([profileStartX(%), profileStartY(%)], %)`
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
@ -5409,7 +5409,7 @@ const part002 = startSketchOn('XZ')
|
|||||||
|> startProfileAt([299.05, 231.45], %)
|
|> startProfileAt([299.05, 231.45], %)
|
||||||
|> xLine(-425.34, %, $seg_what)
|
|> xLine(-425.34, %, $seg_what)
|
||||||
|> yLine(-264.06, %)
|
|> yLine(-264.06, %)
|
||||||
|> xLine(segLen(seg_what, %), %)
|
|> xLine(segLen(seg_what), %)
|
||||||
|> lineTo([profileStartX(%), profileStartY(%)], %)`
|
|> lineTo([profileStartX(%), profileStartY(%)], %)`
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
@ -5485,7 +5485,7 @@ const part002 = startSketchOn('XZ')
|
|||||||
|> startProfileAt([299.05, 231.45], %)
|
|> startProfileAt([299.05, 231.45], %)
|
||||||
|> xLine(-425.34, %, $seg_what)
|
|> xLine(-425.34, %, $seg_what)
|
||||||
|> yLine(-264.06, %)
|
|> yLine(-264.06, %)
|
||||||
|> xLine(segLen(seg_what, %), %)
|
|> xLine(segLen(seg_what), %)
|
||||||
|> lineTo([profileStartX(%), profileStartY(%)], %)`
|
|> lineTo([profileStartX(%), profileStartY(%)], %)`
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
@ -5550,19 +5550,19 @@ const part002 = startSketchOn('XZ')
|
|||||||
test.describe('Two segment - no modal constraints', () => {
|
test.describe('Two segment - no modal constraints', () => {
|
||||||
const cases = [
|
const cases = [
|
||||||
{
|
{
|
||||||
codeAfter: `|> angledLine([83, segLen(seg01, %)], %)`,
|
codeAfter: `|> angledLine([83, segLen(seg01)], %)`,
|
||||||
constraintName: 'Equal Length',
|
constraintName: 'Equal Length',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
codeAfter: `|> angledLine([segAng(seg01, %), 78.33], %)`,
|
codeAfter: `|> angledLine([segAng(seg01), 78.33], %)`,
|
||||||
constraintName: 'Parallel',
|
constraintName: 'Parallel',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
codeAfter: `|> lineTo([segEndX(seg01, %), 61.34], %)`,
|
codeAfter: `|> lineTo([segEndX(seg01), 61.34], %)`,
|
||||||
constraintName: 'Vertically Align',
|
constraintName: 'Vertically Align',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
codeAfter: `|> lineTo([154.9, segEndY(seg01, %)], %)`,
|
codeAfter: `|> lineTo([154.9, segEndY(seg01)], %)`,
|
||||||
constraintName: 'Horizontally Align',
|
constraintName: 'Horizontally Align',
|
||||||
},
|
},
|
||||||
] as const
|
] as const
|
||||||
@ -5581,7 +5581,7 @@ const part002 = startSketchOn('XZ')
|
|||||||
|> startProfileAt([299.05, 231.45], %)
|
|> startProfileAt([299.05, 231.45], %)
|
||||||
|> xLine(-425.34, %, $seg_what)
|
|> xLine(-425.34, %, $seg_what)
|
||||||
|> yLine(-264.06, %)
|
|> yLine(-264.06, %)
|
||||||
|> xLine(segLen(seg_what, %), %)
|
|> xLine(segLen(seg_what), %)
|
||||||
|> lineTo([profileStartX(%), profileStartY(%)], %)`
|
|> lineTo([profileStartX(%), profileStartY(%)], %)`
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
@ -5658,7 +5658,7 @@ const part002 = startSketchOn('XZ')
|
|||||||
|> startProfileAt([299.05, 231.45], %)
|
|> startProfileAt([299.05, 231.45], %)
|
||||||
|> xLine(-425.34, %, $seg_what)
|
|> xLine(-425.34, %, $seg_what)
|
||||||
|> yLine(-264.06, %)
|
|> yLine(-264.06, %)
|
||||||
|> xLine(segLen(seg_what, %), %)
|
|> xLine(segLen(seg_what), %)
|
||||||
|> lineTo([profileStartX(%), profileStartY(%)], %)`
|
|> lineTo([profileStartX(%), profileStartY(%)], %)`
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
@ -6826,8 +6826,8 @@ const part001 = startSketchOn('XZ')
|
|||||||
|> startProfileAt([5, 6], %)
|
|> startProfileAt([5, 6], %)
|
||||||
|> ${lineToBeDeleted}
|
|> ${lineToBeDeleted}
|
||||||
|> line([-10, -15], %)
|
|> line([-10, -15], %)
|
||||||
|> angledLine([-176, segLen(seg01, %)], %)
|
|> angledLine([-176, segLen(seg01)], %)
|
||||||
${extraLine ? 'const myVar = segLen(seg01, part001)' : ''}`
|
${extraLine ? 'const myVar = segLen(seg01)' : ''}`
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -6986,7 +6986,7 @@ ${extraLine ? 'const myVar = segLen(seg01, part001)' : ''}`
|
|||||||
|> startProfileAt([5, 6], %)
|
|> startProfileAt([5, 6], %)
|
||||||
|> ${lineToBeDeleted}
|
|> ${lineToBeDeleted}
|
||||||
|> line([-10, -15], %)
|
|> line([-10, -15], %)
|
||||||
|> angledLine([-176, segLen(seg01, %)], %)`
|
|> angledLine([-176, segLen(seg01)], %)`
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -7561,19 +7561,19 @@ const part001 = startSketchOn('-XZ')
|
|||||||
offset: -armThick,
|
offset: -armThick,
|
||||||
intersectTag: seg04
|
intersectTag: seg04
|
||||||
}, %)
|
}, %)
|
||||||
|> angledLineToY([segAng(seg04, %) + 180, ZERO], %)
|
|> angledLineToY([segAng(seg04) + 180, ZERO], %)
|
||||||
|> angledLineToY({
|
|> angledLineToY({
|
||||||
angle: -bottomAng,
|
angle: -bottomAng,
|
||||||
to: -totalHeightHalf - armThick,
|
to: -totalHeightHalf - armThick,
|
||||||
}, %, $seg02)
|
}, %, $seg02)
|
||||||
|> xLineTo(segEndX(seg03, %) + 0, %)
|
|> xLineTo(segEndX(seg03) + 0, %)
|
||||||
|> yLine(-segLen(seg01, %), %)
|
|> yLine(-segLen(seg01), %)
|
||||||
|> angledLineThatIntersects({
|
|> angledLineThatIntersects({
|
||||||
angle: HALF_TURN,
|
angle: HALF_TURN,
|
||||||
offset: -armThick,
|
offset: -armThick,
|
||||||
intersectTag: seg02
|
intersectTag: seg02
|
||||||
}, %)
|
}, %)
|
||||||
|> angledLineToY([segAng(seg02, %) + 180, -baseHeight], %)
|
|> angledLineToY([segAng(seg02) + 180, -baseHeight], %)
|
||||||
|> xLineTo(ZERO, %)
|
|> xLineTo(ZERO, %)
|
||||||
|> close(%)
|
|> close(%)
|
||||||
|> extrude(4, %)`
|
|> extrude(4, %)`
|
||||||
|
@ -64,27 +64,27 @@ const part001 = startSketchOn('-XZ')
|
|||||||
|> angledLineToY({
|
|> angledLineToY({
|
||||||
angle: topAng,
|
angle: topAng,
|
||||||
to: totalHeightHalf,
|
to: totalHeightHalf,
|
||||||
}, %, 'seg04')
|
}, %, $seg04)
|
||||||
|> xLineTo(totalLen, %, 'seg03')
|
|> xLineTo(totalLen, %, $seg03')
|
||||||
|> yLine(-armThick, %, 'seg01')
|
|> yLine(-armThick, %, $seg01)
|
||||||
|> angledLineThatIntersects({
|
|> angledLineThatIntersects({
|
||||||
angle: HALF_TURN,
|
angle: HALF_TURN,
|
||||||
offset: -armThick,
|
offset: -armThick,
|
||||||
intersectTag: 'seg04'
|
intersectTag: seg04
|
||||||
}, %)
|
}, %)
|
||||||
|> angledLineToY([segAng('seg04', %) + 180, ZERO], %)
|
|> angledLineToY([segAng(seg04, %) + 180, ZERO], %)
|
||||||
|> angledLineToY({
|
|> angledLineToY({
|
||||||
angle: -bottomAng,
|
angle: -bottomAng,
|
||||||
to: -totalHeightHalf - armThick,
|
to: -totalHeightHalf - armThick,
|
||||||
}, %, 'seg02')
|
}, %, $seg02)
|
||||||
|> xLineTo(segEndX('seg03', %) + 0, %)
|
|> xLineTo(segEndX(seg03, %) + 0, %)
|
||||||
|> yLine(-segLen('seg01', %), %)
|
|> yLine(-segLen(seg01, %), %)
|
||||||
|> angledLineThatIntersects({
|
|> angledLineThatIntersects({
|
||||||
angle: HALF_TURN,
|
angle: HALF_TURN,
|
||||||
offset: -armThick,
|
offset: -armThick,
|
||||||
intersectTag: 'seg02'
|
intersectTag: seg02
|
||||||
}, %)
|
}, %)
|
||||||
|> angledLineToY([segAng('seg02', %) + 180, -baseHeight], %)
|
|> angledLineToY([segAng(seg02, %) + 180, -baseHeight], %)
|
||||||
|> xLineTo(ZERO, %)
|
|> xLineTo(ZERO, %)
|
||||||
|> close(%)
|
|> close(%)
|
||||||
|> extrude(4, %)`
|
|> extrude(4, %)`
|
||||||
|
@ -1968,7 +1968,7 @@ describe('testing nested call expressions', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
describe('should recognise callExpresions in binaryExpressions', () => {
|
describe('should recognise callExpresions in binaryExpressions', () => {
|
||||||
const code = 'xLineTo(segEndX(seg02, %) + 1, %)'
|
const code = 'xLineTo(segEndX(seg02) + 1, %)'
|
||||||
it('should recognise the callExp', () => {
|
it('should recognise the callExp', () => {
|
||||||
const ast = parse(code)
|
const ast = parse(code)
|
||||||
if (err(ast)) throw ast
|
if (err(ast)) throw ast
|
||||||
@ -1979,12 +1979,12 @@ describe('should recognise callExpresions in binaryExpressions', () => {
|
|||||||
type: 'BinaryExpression',
|
type: 'BinaryExpression',
|
||||||
operator: '+',
|
operator: '+',
|
||||||
start: 8,
|
start: 8,
|
||||||
end: 29,
|
end: 26,
|
||||||
digest: null,
|
digest: null,
|
||||||
left: {
|
left: {
|
||||||
type: 'CallExpression',
|
type: 'CallExpression',
|
||||||
start: 8,
|
start: 8,
|
||||||
end: 25,
|
end: 22,
|
||||||
digest: null,
|
digest: null,
|
||||||
callee: {
|
callee: {
|
||||||
type: 'Identifier',
|
type: 'Identifier',
|
||||||
@ -2001,7 +2001,6 @@ describe('should recognise callExpresions in binaryExpressions', () => {
|
|||||||
name: 'seg02',
|
name: 'seg02',
|
||||||
digest: null,
|
digest: null,
|
||||||
},
|
},
|
||||||
{ type: 'PipeSubstitution', start: 23, end: 24, digest: null },
|
|
||||||
],
|
],
|
||||||
optional: false,
|
optional: false,
|
||||||
},
|
},
|
||||||
@ -2009,12 +2008,12 @@ describe('should recognise callExpresions in binaryExpressions', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
value: 1,
|
value: 1,
|
||||||
raw: '1',
|
raw: '1',
|
||||||
start: 28,
|
start: 25,
|
||||||
end: 29,
|
end: 26,
|
||||||
digest: null,
|
digest: null,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{ type: 'PipeSubstitution', start: 31, end: 32, digest: null },
|
{ type: 'PipeSubstitution', start: 28, end: 29, digest: null },
|
||||||
])
|
])
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -195,6 +195,7 @@ const sk2 = startSketchOn('XY')
|
|||||||
],
|
],
|
||||||
type: 'TagIdentifier',
|
type: 'TagIdentifier',
|
||||||
value: 'p',
|
value: 'p',
|
||||||
|
info: expect.any(Object),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
value: [
|
value: [
|
||||||
@ -288,6 +289,7 @@ const sk2 = startSketchOn('XY')
|
|||||||
],
|
],
|
||||||
type: 'TagIdentifier',
|
type: 'TagIdentifier',
|
||||||
value: 'o',
|
value: 'o',
|
||||||
|
info: expect.any(Object),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
value: [
|
value: [
|
||||||
|
@ -166,6 +166,7 @@ const newVar = myVar + 1`
|
|||||||
],
|
],
|
||||||
type: 'TagIdentifier',
|
type: 'TagIdentifier',
|
||||||
value: 'myPath',
|
value: 'myPath',
|
||||||
|
info: expect.any(Object),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
value: [
|
value: [
|
||||||
@ -369,19 +370,19 @@ describe('testing math operators', () => {
|
|||||||
` |> startProfileAt([0, 0], %)`,
|
` |> startProfileAt([0, 0], %)`,
|
||||||
` |> line([3, 4], %, $seg01)`,
|
` |> line([3, 4], %, $seg01)`,
|
||||||
` |> line([`,
|
` |> line([`,
|
||||||
` min(segLen(seg01, %), myVar),`,
|
` min(segLen(seg01), myVar),`,
|
||||||
` -legLen(segLen(seg01, %), myVar)`,
|
` -legLen(segLen(seg01), myVar)`,
|
||||||
`], %)`,
|
`], %)`,
|
||||||
``,
|
``,
|
||||||
].join('\n')
|
].join('\n')
|
||||||
const mem = await exe(code)
|
const mem = await exe(code)
|
||||||
const sketch = mem.get('part001')
|
const sketch = mem.get('part001')
|
||||||
// expect -legLen(segLen('seg01', %), myVar) to equal -4 setting the y value back to 0
|
// expect -legLen(segLen('seg01'), myVar) to equal -4 setting the y value back to 0
|
||||||
expect((sketch as SketchGroup).value?.[1]?.from).toEqual([3, 4])
|
expect((sketch as SketchGroup).value?.[1]?.from).toEqual([3, 4])
|
||||||
expect((sketch as SketchGroup).value?.[1]?.to).toEqual([6, 0])
|
expect((sketch as SketchGroup).value?.[1]?.to).toEqual([6, 0])
|
||||||
const removedUnaryExp = code.replace(
|
const removedUnaryExp = code.replace(
|
||||||
`-legLen(segLen(seg01, %), myVar)`,
|
`-legLen(segLen(seg01), myVar)`,
|
||||||
`legLen(segLen(seg01, %), myVar)`
|
`legLen(segLen(seg01), myVar)`
|
||||||
)
|
)
|
||||||
const removedUnaryExpMem = await exe(removedUnaryExp)
|
const removedUnaryExpMem = await exe(removedUnaryExp)
|
||||||
const removedUnaryExpMemSketch = removedUnaryExpMem.get('part001')
|
const removedUnaryExpMemSketch = removedUnaryExpMem.get('part001')
|
||||||
|
@ -495,10 +495,10 @@ describe('Testing deleteSegmentFromPipeExpression', () => {
|
|||||||
|> startProfileAt([54.78, -95.91], %)
|
|> startProfileAt([54.78, -95.91], %)
|
||||||
|> line([306.21, 198.82], %, $b)
|
|> line([306.21, 198.82], %, $b)
|
||||||
${!replace1 ? ` |> ${line}\n` : ''} |> angledLine([-65, ${
|
${!replace1 ? ` |> ${line}\n` : ''} |> angledLine([-65, ${
|
||||||
!replace1 ? 'segLen(a, %)' : replace1
|
!replace1 ? 'segLen(a)' : replace1
|
||||||
}], %)
|
}], %)
|
||||||
|> line([306.21, 198.87], %)
|
|> line([306.21, 198.87], %)
|
||||||
|> angledLine([65, ${!replace2 ? 'segAng(a, %)' : replace2}], %)
|
|> angledLine([65, ${!replace2 ? 'segAng(a)' : replace2}], %)
|
||||||
|> line([-963.39, -154.67], %)
|
|> line([-963.39, -154.67], %)
|
||||||
`
|
`
|
||||||
test.each([
|
test.each([
|
||||||
@ -753,7 +753,7 @@ const sketch002 = startSketchOn(extrude001, seg01)
|
|||||||
|> startProfileAt([-12.55, 2.89], %)
|
|> startProfileAt([-12.55, 2.89], %)
|
||||||
|> line([3.02, 1.9], %)
|
|> line([3.02, 1.9], %)
|
||||||
|> line([1.82, -1.49], %, $seg02)
|
|> line([1.82, -1.49], %, $seg02)
|
||||||
|> angledLine([-86, segLen(seg02, %)], %)
|
|> angledLine([-86, segLen(seg02)], %)
|
||||||
|> line([-3.97, -0.53], %)
|
|> line([-3.97, -0.53], %)
|
||||||
|> line([0.3, 0.84], %)
|
|> line([0.3, 0.84], %)
|
||||||
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
||||||
@ -780,7 +780,7 @@ const sketch002 = startSketchOn({
|
|||||||
|> startProfileAt([-12.55, 2.89], %)
|
|> startProfileAt([-12.55, 2.89], %)
|
||||||
|> line([3.02, 1.9], %)
|
|> line([3.02, 1.9], %)
|
||||||
|> line([1.82, -1.49], %, $seg02)
|
|> line([1.82, -1.49], %, $seg02)
|
||||||
|> angledLine([-86, segLen(seg02, %)], %)
|
|> angledLine([-86, segLen(seg02)], %)
|
||||||
|> line([-3.97, -0.53], %)
|
|> line([-3.97, -0.53], %)
|
||||||
|> line([0.3, 0.84], %)
|
|> line([0.3, 0.84], %)
|
||||||
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
||||||
@ -809,7 +809,7 @@ const sketch002 = startSketchOn(extrude001, seg01)
|
|||||||
|> startProfileAt([-12.55, 2.89], %)
|
|> startProfileAt([-12.55, 2.89], %)
|
||||||
|> line([3.02, 1.9], %)
|
|> line([3.02, 1.9], %)
|
||||||
|> line([1.82, -1.49], %, $seg02)
|
|> line([1.82, -1.49], %, $seg02)
|
||||||
|> angledLine([-86, segLen(seg02, %)], %)
|
|> angledLine([-86, segLen(seg02)], %)
|
||||||
|> line([-3.97, -0.53], %)
|
|> line([-3.97, -0.53], %)
|
||||||
|> line([0.3, 0.84], %)
|
|> line([0.3, 0.84], %)
|
||||||
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
||||||
@ -836,7 +836,7 @@ const sketch002 = startSketchOn({
|
|||||||
|> startProfileAt([-12.55, 2.89], %)
|
|> startProfileAt([-12.55, 2.89], %)
|
||||||
|> line([3.02, 1.9], %)
|
|> line([3.02, 1.9], %)
|
||||||
|> line([1.82, -1.49], %, $seg02)
|
|> line([1.82, -1.49], %, $seg02)
|
||||||
|> angledLine([-86, segLen(seg02, %)], %)
|
|> angledLine([-86, segLen(seg02)], %)
|
||||||
|> line([-3.97, -0.53], %)
|
|> line([-3.97, -0.53], %)
|
||||||
|> line([0.3, 0.84], %)
|
|> line([0.3, 0.84], %)
|
||||||
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
||||||
|
@ -254,9 +254,9 @@ const extrude001 = extrude(-5, sketch001)
|
|||||||
|> fillet({
|
|> fillet({
|
||||||
radius: 1.11,
|
radius: 1.11,
|
||||||
tags: [
|
tags: [
|
||||||
getOppositeEdge(seg01, %),
|
getOppositeEdge(seg01),
|
||||||
seg01,
|
seg01,
|
||||||
getPreviousAdjacentEdge(seg02, %)
|
getPreviousAdjacentEdge(seg02)
|
||||||
]
|
]
|
||||||
}, %)
|
}, %)
|
||||||
`
|
`
|
||||||
|
@ -275,7 +275,7 @@ const part001 = startSketchAt([-1.41, 3.46])
|
|||||||
|> line([19.49, 1.16], %, $seg01)
|
|> line([19.49, 1.16], %, $seg01)
|
||||||
|> angledLine([-35, length001], %)
|
|> angledLine([-35, length001], %)
|
||||||
|> line([-3.22, -7.36], %)
|
|> line([-3.22, -7.36], %)
|
||||||
|> angledLine([-175, segLen(seg01, %)], %)
|
|> angledLine([-175, segLen(seg01)], %)
|
||||||
|> close(%)
|
|> close(%)
|
||||||
`
|
`
|
||||||
const ast = parse(exampleCode)
|
const ast = parse(exampleCode)
|
||||||
@ -294,7 +294,7 @@ const part001 = startSketchAt([-1.41, 3.46])
|
|||||||
|> line([19.49, 1.16], %, $seg01)
|
|> line([19.49, 1.16], %, $seg01)
|
||||||
|> angledLine([-35, length001], %)
|
|> angledLine([-35, length001], %)
|
||||||
|> line([-3.22, -7.36], %)
|
|> line([-3.22, -7.36], %)
|
||||||
|> angledLine([-175, segLen(seg01, %)], %)
|
|> angledLine([-175, segLen(seg01)], %)
|
||||||
|> close(%)
|
|> close(%)
|
||||||
|> extrude(1, %)
|
|> extrude(1, %)
|
||||||
`
|
`
|
||||||
@ -314,7 +314,7 @@ const part001 = startSketchAt([-1.41, 3.46])
|
|||||||
|> line([19.49, 1.16], %, $seg01)
|
|> line([19.49, 1.16], %, $seg01)
|
||||||
|> angledLine([-35, length001], %)
|
|> angledLine([-35, length001], %)
|
||||||
|> line([-3.22, -7.36], %)
|
|> line([-3.22, -7.36], %)
|
||||||
|> angledLine([-175, segLen(seg01, %)], %)
|
|> angledLine([-175, segLen(seg01)], %)
|
||||||
`
|
`
|
||||||
const ast = parse(exampleCode)
|
const ast = parse(exampleCode)
|
||||||
if (err(ast)) throw ast
|
if (err(ast)) throw ast
|
||||||
@ -347,7 +347,7 @@ const part001 = startSketchAt([-1.41, 3.46])
|
|||||||
|> line([19.49, 1.16], %, $seg01)
|
|> line([19.49, 1.16], %, $seg01)
|
||||||
|> angledLine([-35, length001], %)
|
|> angledLine([-35, length001], %)
|
||||||
|> line([-3.22, -7.36], %)
|
|> line([-3.22, -7.36], %)
|
||||||
|> angledLine([-175, segLen(seg01, %)], %)`
|
|> angledLine([-175, segLen(seg01)], %)`
|
||||||
const ast = parse(exampleCode)
|
const ast = parse(exampleCode)
|
||||||
if (err(ast)) throw ast
|
if (err(ast)) throw ast
|
||||||
|
|
||||||
@ -365,7 +365,7 @@ const part001 = startSketchAt([-1.41, 3.46])
|
|||||||
|> line([19.49, 1.16], %, $seg01)
|
|> line([19.49, 1.16], %, $seg01)
|
||||||
|> angledLine([-35, length001], %)
|
|> angledLine([-35, length001], %)
|
||||||
|> line([-3.22, -7.36], %)
|
|> line([-3.22, -7.36], %)
|
||||||
|> angledLine([-175, segLen(seg01, %)], %)
|
|> angledLine([-175, segLen(seg01)], %)
|
||||||
|> extrude(1, %)`
|
|> extrude(1, %)`
|
||||||
const ast = parse(exampleCode)
|
const ast = parse(exampleCode)
|
||||||
if (err(ast)) throw ast
|
if (err(ast)) throw ast
|
||||||
@ -398,9 +398,9 @@ describe('Testing findUsesOfTagInPipe', () => {
|
|||||||
|> startProfileAt([68.12, 156.65], %)
|
|> startProfileAt([68.12, 156.65], %)
|
||||||
|> line([306.21, 198.82], %)
|
|> line([306.21, 198.82], %)
|
||||||
|> line([306.21, 198.85], %, $seg01)
|
|> line([306.21, 198.85], %, $seg01)
|
||||||
|> angledLine([-65, segLen(seg01, %)], %)
|
|> angledLine([-65, segLen(seg01)], %)
|
||||||
|> line([306.21, 198.87], %)
|
|> line([306.21, 198.87], %)
|
||||||
|> angledLine([65, segLen(seg01, %)], %)`
|
|> angledLine([65, segLen(seg01)], %)`
|
||||||
it('finds the current segment', async () => {
|
it('finds the current segment', async () => {
|
||||||
const ast = parse(exampleCode)
|
const ast = parse(exampleCode)
|
||||||
if (err(ast)) throw ast
|
if (err(ast)) throw ast
|
||||||
|
@ -148,61 +148,61 @@ const part001 = startSketchOn('XY')
|
|||||||
-angleToMatchLengthY(seg01, myVar, %),
|
-angleToMatchLengthY(seg01, myVar, %),
|
||||||
myVar
|
myVar
|
||||||
], %) // ln-lineTo-yAbsolute should use angleToMatchLengthY helper
|
], %) // ln-lineTo-yAbsolute should use angleToMatchLengthY helper
|
||||||
|> angledLine([45, segLen(seg01, %)], %) // ln-lineTo-free should become angledLine
|
|> angledLine([45, segLen(seg01)], %) // ln-lineTo-free should become angledLine
|
||||||
|> angledLine([45, segLen(seg01, %)], %) // ln-angledLineToX-free should become angledLine
|
|> angledLine([45, segLen(seg01)], %) // ln-angledLineToX-free should become angledLine
|
||||||
|> angledLine([myAng, segLen(seg01, %)], %) // ln-angledLineToX-angle should become angledLine
|
|> angledLine([myAng, segLen(seg01)], %) // ln-angledLineToX-angle should become angledLine
|
||||||
|> angledLineToX([
|
|> angledLineToX([
|
||||||
angleToMatchLengthX(seg01, myVar2, %),
|
angleToMatchLengthX(seg01, myVar2, %),
|
||||||
myVar2
|
myVar2
|
||||||
], %) // ln-angledLineToX-xAbsolute should use angleToMatchLengthX to get angle
|
], %) // ln-angledLineToX-xAbsolute should use angleToMatchLengthX to get angle
|
||||||
|> angledLine([-45, segLen(seg01, %)], %) // ln-angledLineToY-free should become angledLine
|
|> angledLine([-45, segLen(seg01)], %) // ln-angledLineToY-free should become angledLine
|
||||||
|> angledLine([myAng2, segLen(seg01, %)], %) // ln-angledLineToY-angle should become angledLine
|
|> angledLine([myAng2, segLen(seg01)], %) // ln-angledLineToY-angle should become angledLine
|
||||||
|> angledLineToY([
|
|> angledLineToY([
|
||||||
angleToMatchLengthY(seg01, myVar3, %),
|
angleToMatchLengthY(seg01, myVar3, %),
|
||||||
myVar3
|
myVar3
|
||||||
], %) // ln-angledLineToY-yAbsolute should use angleToMatchLengthY to get angle
|
], %) // ln-angledLineToY-yAbsolute should use angleToMatchLengthY to get angle
|
||||||
|> line([
|
|> line([
|
||||||
min(segLen(seg01, %), myVar),
|
min(segLen(seg01), myVar),
|
||||||
legLen(segLen(seg01, %), myVar)
|
legLen(segLen(seg01), myVar)
|
||||||
], %) // ln-should use legLen for y
|
], %) // ln-should use legLen for y
|
||||||
|> line([
|
|> line([
|
||||||
min(segLen(seg01, %), myVar),
|
min(segLen(seg01), myVar),
|
||||||
-legLen(segLen(seg01, %), myVar)
|
-legLen(segLen(seg01), myVar)
|
||||||
], %) // ln-legLen but negative
|
], %) // ln-legLen but negative
|
||||||
|> angledLine([-112, segLen(seg01, %)], %) // ln-should become angledLine
|
|> angledLine([-112, segLen(seg01)], %) // ln-should become angledLine
|
||||||
|> angledLine([myVar, segLen(seg01, %)], %) // ln-use segLen for second arg
|
|> angledLine([myVar, segLen(seg01)], %) // ln-use segLen for second arg
|
||||||
|> angledLine([45, segLen(seg01, %)], %) // ln-segLen again
|
|> angledLine([45, segLen(seg01)], %) // ln-segLen again
|
||||||
|> angledLine([54, segLen(seg01, %)], %) // ln-should be transformed to angledLine
|
|> angledLine([54, segLen(seg01)], %) // ln-should be transformed to angledLine
|
||||||
|> angledLineOfXLength([
|
|> angledLineOfXLength([
|
||||||
legAngX(segLen(seg01, %), myVar),
|
legAngX(segLen(seg01), myVar),
|
||||||
min(segLen(seg01, %), myVar)
|
min(segLen(seg01), myVar)
|
||||||
], %) // ln-should use legAngX to calculate angle
|
], %) // ln-should use legAngX to calculate angle
|
||||||
|> angledLineOfXLength([
|
|> angledLineOfXLength([
|
||||||
180 + legAngX(segLen(seg01, %), myVar),
|
180 + legAngX(segLen(seg01), myVar),
|
||||||
min(segLen(seg01, %), myVar)
|
min(segLen(seg01), myVar)
|
||||||
], %) // ln-same as above but should have + 180 to match original quadrant
|
], %) // ln-same as above but should have + 180 to match original quadrant
|
||||||
|> line([
|
|> line([
|
||||||
legLen(segLen(seg01, %), myVar),
|
legLen(segLen(seg01), myVar),
|
||||||
min(segLen(seg01, %), myVar)
|
min(segLen(seg01), myVar)
|
||||||
], %) // ln-legLen again but yRelative
|
], %) // ln-legLen again but yRelative
|
||||||
|> line([
|
|> line([
|
||||||
-legLen(segLen(seg01, %), myVar),
|
-legLen(segLen(seg01), myVar),
|
||||||
min(segLen(seg01, %), myVar)
|
min(segLen(seg01), myVar)
|
||||||
], %) // ln-negative legLen yRelative
|
], %) // ln-negative legLen yRelative
|
||||||
|> angledLine([58, segLen(seg01, %)], %) // ln-angledLineOfYLength-free should become angledLine
|
|> angledLine([58, segLen(seg01)], %) // ln-angledLineOfYLength-free should become angledLine
|
||||||
|> angledLine([myAng, segLen(seg01, %)], %) // ln-angledLineOfYLength-angle should become angledLine
|
|> angledLine([myAng, segLen(seg01)], %) // ln-angledLineOfYLength-angle should become angledLine
|
||||||
|> angledLineOfXLength([
|
|> angledLineOfXLength([
|
||||||
legAngY(segLen(seg01, %), myVar),
|
legAngY(segLen(seg01), myVar),
|
||||||
min(segLen(seg01, %), myVar)
|
min(segLen(seg01), myVar)
|
||||||
], %) // ln-angledLineOfYLength-yRelative use legAngY
|
], %) // ln-angledLineOfYLength-yRelative use legAngY
|
||||||
|> angledLineOfXLength([
|
|> angledLineOfXLength([
|
||||||
270 + legAngY(segLen(seg01, %), myVar),
|
270 + legAngY(segLen(seg01), myVar),
|
||||||
min(segLen(seg01, %), myVar)
|
min(segLen(seg01), myVar)
|
||||||
], %) // ln-angledLineOfYLength-yRelative with angle > 90 use binExp
|
], %) // ln-angledLineOfYLength-yRelative with angle > 90 use binExp
|
||||||
|> xLine(segLen(seg01, %), %) // ln-xLine-free should sub in segLen
|
|> xLine(segLen(seg01), %) // ln-xLine-free should sub in segLen
|
||||||
|> yLine(segLen(seg01, %), %) // ln-yLine-free should sub in segLen
|
|> yLine(segLen(seg01), %) // ln-yLine-free should sub in segLen
|
||||||
|> xLine(segLen(seg01, %), %) // ln-xLineTo-free should convert to xLine
|
|> xLine(segLen(seg01), %) // ln-xLineTo-free should convert to xLine
|
||||||
|> yLine(segLen(seg01, %), %) // ln-yLineTo-free should convert to yLine
|
|> yLine(segLen(seg01), %) // ln-yLineTo-free should convert to yLine
|
||||||
`
|
`
|
||||||
it('should transform the ast', async () => {
|
it('should transform the ast', async () => {
|
||||||
const ast = parse(inputScript)
|
const ast = parse(inputScript)
|
||||||
@ -417,10 +417,10 @@ const part001 = startSketchOn('XY')
|
|||||||
'setVertDistance'
|
'setVertDistance'
|
||||||
)
|
)
|
||||||
expect(expectedHorizontalCode).toContain(
|
expect(expectedHorizontalCode).toContain(
|
||||||
`lineTo([segEndX(seg01, %) + 0.9, 4.59], %) // free`
|
`lineTo([segEndX(seg01) + 0.9, 4.59], %) // free`
|
||||||
)
|
)
|
||||||
expect(expectedVerticalCode).toContain(
|
expect(expectedVerticalCode).toContain(
|
||||||
`lineTo([1.21, segEndY(seg01, %) + 2.92], %) // free`
|
`lineTo([1.21, segEndY(seg01) + 2.92], %) // free`
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
it('testing for xRelative to vertical distance', async () => {
|
it('testing for xRelative to vertical distance', async () => {
|
||||||
@ -431,7 +431,7 @@ const part001 = startSketchOn('XY')
|
|||||||
)
|
)
|
||||||
expect(expectedCode).toContain(`|> lineTo([
|
expect(expectedCode).toContain(`|> lineTo([
|
||||||
lastSegX(%) + myVar,
|
lastSegX(%) + myVar,
|
||||||
segEndY(seg01, %) + 2.93
|
segEndY(seg01) + 2.93
|
||||||
], %) // xRelative`)
|
], %) // xRelative`)
|
||||||
})
|
})
|
||||||
it('testing for yRelative to horizontal distance', async () => {
|
it('testing for yRelative to horizontal distance', async () => {
|
||||||
@ -441,7 +441,7 @@ const part001 = startSketchOn('XY')
|
|||||||
'setHorzDistance'
|
'setHorzDistance'
|
||||||
)
|
)
|
||||||
expect(expectedCode).toContain(`|> lineTo([
|
expect(expectedCode).toContain(`|> lineTo([
|
||||||
segEndX(seg01, %) + 2.6,
|
segEndX(seg01) + 2.6,
|
||||||
lastSegY(%) + myVar
|
lastSegY(%) + myVar
|
||||||
], %) // yRelative`)
|
], %) // yRelative`)
|
||||||
})
|
})
|
||||||
@ -516,7 +516,7 @@ const part001 = startSketchOn('XY')
|
|||||||
|> xLine(4.4, %) // partial
|
|> xLine(4.4, %) // partial
|
||||||
|> yLine(-1, %) // partial
|
|> yLine(-1, %) // partial
|
||||||
|> xLine(-4.2 + 0, %) // full
|
|> xLine(-4.2 + 0, %) // full
|
||||||
|> angledLine([segAng(seg01bing, %) + 180, 1.79], %) // partial
|
|> angledLine([segAng(seg01bing) + 180, 1.79], %) // partial
|
||||||
|> line([1.44, -0.74], %) // free
|
|> line([1.44, -0.74], %) // free
|
||||||
|> xLine(3.36, %) // partial
|
|> xLine(3.36, %) // partial
|
||||||
|> line([-1.49, 1.06], %) // free
|
|> line([-1.49, 1.06], %) // free
|
||||||
|
@ -1713,23 +1713,16 @@ export function transformAstSketchLines({
|
|||||||
}
|
}
|
||||||
|
|
||||||
function createSegLen(referenceSegName: string): Value {
|
function createSegLen(referenceSegName: string): Value {
|
||||||
return createCallExpression('segLen', [
|
return createCallExpression('segLen', [createIdentifier(referenceSegName)])
|
||||||
createIdentifier(referenceSegName),
|
|
||||||
createPipeSubstitution(),
|
|
||||||
])
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function createSegAngle(referenceSegName: string): Value {
|
function createSegAngle(referenceSegName: string): Value {
|
||||||
return createCallExpression('segAng', [
|
return createCallExpression('segAng', [createIdentifier(referenceSegName)])
|
||||||
createIdentifier(referenceSegName),
|
|
||||||
createPipeSubstitution(),
|
|
||||||
])
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function createSegEnd(referenceSegName: string, isX: boolean): CallExpression {
|
function createSegEnd(referenceSegName: string, isX: boolean): CallExpression {
|
||||||
return createCallExpression(isX ? 'segEndX' : 'segEndY', [
|
return createCallExpression(isX ? 'segEndX' : 'segEndY', [
|
||||||
createIdentifier(referenceSegName),
|
createIdentifier(referenceSegName),
|
||||||
createPipeSubstitution(),
|
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ describe('testing angledLineThatIntersects', () => {
|
|||||||
intersectTag: yo,
|
intersectTag: yo,
|
||||||
offset: ${offset},
|
offset: ${offset},
|
||||||
}, %, $yo2)
|
}, %, $yo2)
|
||||||
const intersect = segEndX(yo2, part001)`
|
const intersect = segEndX(yo2)`
|
||||||
const mem = await enginelessExecutor(parse(code('-1')))
|
const mem = await enginelessExecutor(parse(code('-1')))
|
||||||
expect(mem.get('intersect')?.value).toBe(1 + Math.sqrt(2))
|
expect(mem.get('intersect')?.value).toBe(1 + Math.sqrt(2))
|
||||||
const noOffset = await enginelessExecutor(parse(code('0')))
|
const noOffset = await enginelessExecutor(parse(code('0')))
|
||||||
|
@ -31,11 +31,11 @@ const bracket = startSketchOn('XY')
|
|||||||
|> extrude(width, %)
|
|> extrude(width, %)
|
||||||
|> fillet({
|
|> fillet({
|
||||||
radius: filletR,
|
radius: filletR,
|
||||||
tags: [getPreviousAdjacentEdge(innerEdge, %)]
|
tags: [getPreviousAdjacentEdge(innerEdge)]
|
||||||
}, %)
|
}, %)
|
||||||
|> fillet({
|
|> fillet({
|
||||||
radius: filletR + thickness,
|
radius: filletR + thickness,
|
||||||
tags: [getPreviousAdjacentEdge(outerEdge, %)]
|
tags: [getPreviousAdjacentEdge(outerEdge)]
|
||||||
}, %)`
|
}, %)`
|
||||||
|
|
||||||
function findLineInExampleCode({
|
function findLineInExampleCode({
|
||||||
|
@ -15,9 +15,9 @@ import { ArrayExpression, CallExpression, PipeExpression } from 'lang/wasm'
|
|||||||
* Returns AST expressions for this KCL code:
|
* Returns AST expressions for this KCL code:
|
||||||
* const yo = startSketchOn('XY')
|
* const yo = startSketchOn('XY')
|
||||||
* |> startProfileAt([0, 0], %)
|
* |> startProfileAt([0, 0], %)
|
||||||
* |> angledLine([0, 0], %, 'a')
|
* |> angledLine([0, 0], %, $a)
|
||||||
* |> angledLine([segAng('a', %) - 90, 0], %, 'b')
|
* |> angledLine([segAng(a) - 90, 0], %, $b)
|
||||||
* |> angledLine([segAng('a', %), -segLen('a', %)], %, 'c')
|
* |> angledLine([segAng(a), -segLen(a)], %, $c)
|
||||||
* |> close(%)
|
* |> close(%)
|
||||||
*/
|
*/
|
||||||
export const getRectangleCallExpressions = (
|
export const getRectangleCallExpressions = (
|
||||||
@ -42,10 +42,7 @@ export const getRectangleCallExpressions = (
|
|||||||
createCallExpressionStdLib('angledLine', [
|
createCallExpressionStdLib('angledLine', [
|
||||||
createArrayExpression([
|
createArrayExpression([
|
||||||
createBinaryExpression([
|
createBinaryExpression([
|
||||||
createCallExpressionStdLib('segAng', [
|
createCallExpressionStdLib('segAng', [createIdentifier(tags[0])]),
|
||||||
createIdentifier(tags[0]),
|
|
||||||
createPipeSubstitution(),
|
|
||||||
]),
|
|
||||||
'+',
|
'+',
|
||||||
createLiteral(90),
|
createLiteral(90),
|
||||||
]), // 90 offset from the previous line
|
]), // 90 offset from the previous line
|
||||||
@ -56,15 +53,9 @@ export const getRectangleCallExpressions = (
|
|||||||
]),
|
]),
|
||||||
createCallExpressionStdLib('angledLine', [
|
createCallExpressionStdLib('angledLine', [
|
||||||
createArrayExpression([
|
createArrayExpression([
|
||||||
createCallExpressionStdLib('segAng', [
|
createCallExpressionStdLib('segAng', [createIdentifier(tags[0])]), // same angle as the first line
|
||||||
createIdentifier(tags[0]),
|
|
||||||
createPipeSubstitution(),
|
|
||||||
]), // same angle as the first line
|
|
||||||
createUnaryExpression(
|
createUnaryExpression(
|
||||||
createCallExpressionStdLib('segLen', [
|
createCallExpressionStdLib('segLen', [createIdentifier(tags[0])]),
|
||||||
createIdentifier(tags[0]),
|
|
||||||
createPipeSubstitution(),
|
|
||||||
]),
|
|
||||||
'-'
|
'-'
|
||||||
), // negative height
|
), // negative height
|
||||||
]),
|
]),
|
||||||
@ -102,10 +93,7 @@ export function updateRectangleSketch(
|
|||||||
;((pipeExpression.body[3] as CallExpression)
|
;((pipeExpression.body[3] as CallExpression)
|
||||||
.arguments[0] as ArrayExpression) = createArrayExpression([
|
.arguments[0] as ArrayExpression) = createArrayExpression([
|
||||||
createBinaryExpression([
|
createBinaryExpression([
|
||||||
createCallExpressionStdLib('segAng', [
|
createCallExpressionStdLib('segAng', [createIdentifier(tag)]),
|
||||||
createIdentifier(tag),
|
|
||||||
createPipeSubstitution(),
|
|
||||||
]),
|
|
||||||
Math.sign(y) === Math.sign(x) ? '+' : '-',
|
Math.sign(y) === Math.sign(x) ? '+' : '-',
|
||||||
createLiteral(90),
|
createLiteral(90),
|
||||||
]), // 90 offset from the previous line
|
]), // 90 offset from the previous line
|
||||||
|
4
src/wasm-lib/Cargo.lock
generated
4
src/wasm-lib/Cargo.lock
generated
@ -1391,7 +1391,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "kcl-lib"
|
name = "kcl-lib"
|
||||||
version = "0.2.0"
|
version = "0.2.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"approx",
|
"approx",
|
||||||
@ -1460,7 +1460,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "kcl-test-server"
|
name = "kcl-test-server"
|
||||||
version = "0.1.2"
|
version = "0.1.3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"hyper",
|
"hyper",
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "kcl-test-server"
|
name = "kcl-test-server"
|
||||||
description = "A test server for KCL"
|
description = "A test server for KCL"
|
||||||
version = "0.1.2"
|
version = "0.1.3"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "kcl-lib"
|
name = "kcl-lib"
|
||||||
description = "KittyCAD Language implementation and tools"
|
description = "KittyCAD Language implementation and tools"
|
||||||
version = "0.2.0"
|
version = "0.2.1"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
repository = "https://github.com/KittyCAD/modeling-app"
|
repository = "https://github.com/KittyCAD/modeling-app"
|
||||||
|
@ -206,6 +206,19 @@ impl Program {
|
|||||||
Ok(x.clone())
|
Ok(x.clone())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn lint_all(&self) -> Result<Vec<crate::lint::Discovered>> {
|
||||||
|
let rules = vec![
|
||||||
|
crate::lint::checks::lint_variables,
|
||||||
|
crate::lint::checks::lint_call_expressions,
|
||||||
|
];
|
||||||
|
|
||||||
|
let mut findings = vec![];
|
||||||
|
for rule in rules {
|
||||||
|
findings.append(&mut self.lint(rule)?);
|
||||||
|
}
|
||||||
|
Ok(findings)
|
||||||
|
}
|
||||||
|
|
||||||
/// Walk the ast and get all the variables and tags as completion items.
|
/// Walk the ast and get all the variables and tags as completion items.
|
||||||
pub fn completion_items<'a>(&'a self) -> Result<Vec<CompletionItem>> {
|
pub fn completion_items<'a>(&'a self) -> Result<Vec<CompletionItem>> {
|
||||||
let completions = Arc::new(Mutex::new(vec![]));
|
let completions = Arc::new(Mutex::new(vec![]));
|
||||||
@ -1318,7 +1331,50 @@ impl CallExpression {
|
|||||||
FunctionKind::Core(func) => {
|
FunctionKind::Core(func) => {
|
||||||
// Attempt to call the function.
|
// Attempt to call the function.
|
||||||
let args = crate::std::Args::new(fn_args, self.into(), ctx.clone(), memory.clone());
|
let args = crate::std::Args::new(fn_args, self.into(), ctx.clone(), memory.clone());
|
||||||
let result = func.std_lib_fn()(args).await?;
|
let mut result = func.std_lib_fn()(args).await?;
|
||||||
|
|
||||||
|
// If the return result is a sketch group or extrude group, we want to update the
|
||||||
|
// memory for the tags of the group.
|
||||||
|
// TODO: This could probably be done in a better way, but as of now this was my only idea
|
||||||
|
// and it works.
|
||||||
|
match result {
|
||||||
|
MemoryItem::SketchGroup(ref sketch_group) => {
|
||||||
|
for (_, tag) in sketch_group.tags.iter() {
|
||||||
|
memory.update_tag(&tag.value, tag.clone())?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MemoryItem::ExtrudeGroup(ref mut extrude_group) => {
|
||||||
|
for value in &extrude_group.value {
|
||||||
|
if let Some(tag) = value.get_tag() {
|
||||||
|
// Get the past tag and update it.
|
||||||
|
let Some(t) = extrude_group.sketch_group.tags.get(&tag.name) else {
|
||||||
|
return Err(KclError::Semantic(KclErrorDetails {
|
||||||
|
message: format!("Tag {} is not on sketch group", tag.name),
|
||||||
|
source_ranges: vec![tag.into()],
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
|
||||||
|
let Some(ref info) = t.info else {
|
||||||
|
return Err(KclError::Semantic(KclErrorDetails {
|
||||||
|
message: format!("Tag {} does not have path info", tag.name),
|
||||||
|
source_ranges: vec![tag.into()],
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut t = t.clone();
|
||||||
|
let mut info = info.clone();
|
||||||
|
info.surface = Some(value.clone());
|
||||||
|
t.info = Some(info);
|
||||||
|
|
||||||
|
memory.update_tag(&tag.name, t.clone())?;
|
||||||
|
|
||||||
|
// update the sketch group tags.
|
||||||
|
extrude_group.sketch_group.tags.insert(tag.name.clone(), t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
Ok(result)
|
Ok(result)
|
||||||
}
|
}
|
||||||
FunctionKind::Std(func) => {
|
FunctionKind::Std(func) => {
|
||||||
@ -1977,6 +2033,7 @@ impl From<&TagDeclarator> for TagIdentifier {
|
|||||||
fn from(tag: &TagDeclarator) -> Self {
|
fn from(tag: &TagDeclarator) -> Self {
|
||||||
TagIdentifier {
|
TagIdentifier {
|
||||||
value: tag.name.clone(),
|
value: tag.name.clone(),
|
||||||
|
info: None,
|
||||||
meta: vec![Metadata {
|
meta: vec![Metadata {
|
||||||
source_range: tag.into(),
|
source_range: tag.into(),
|
||||||
}],
|
}],
|
||||||
@ -2048,6 +2105,7 @@ impl TagDeclarator {
|
|||||||
pub async fn execute(&self, memory: &mut ProgramMemory) -> Result<MemoryItem, KclError> {
|
pub async fn execute(&self, memory: &mut ProgramMemory) -> Result<MemoryItem, KclError> {
|
||||||
let memory_item = MemoryItem::TagIdentifier(Box::new(TagIdentifier {
|
let memory_item = MemoryItem::TagIdentifier(Box::new(TagIdentifier {
|
||||||
value: self.name.clone(),
|
value: self.name.clone(),
|
||||||
|
info: None,
|
||||||
meta: vec![Metadata {
|
meta: vec![Metadata {
|
||||||
source_range: self.into(),
|
source_range: self.into(),
|
||||||
}],
|
}],
|
||||||
@ -4363,10 +4421,10 @@ const scarlett_body = rectShape([0, 0], width, length)
|
|||||||
|> fillet({
|
|> fillet({
|
||||||
radius: radius,
|
radius: radius,
|
||||||
tags: [
|
tags: [
|
||||||
getEdge(edge2, %),
|
edge2,
|
||||||
getEdge(edge4, %),
|
edge4,
|
||||||
getOppositeEdge(edge2, %),
|
getOppositeEdge(edge2),
|
||||||
getOppositeEdge(edge4, %)
|
getOppositeEdge(edge4)
|
||||||
]
|
]
|
||||||
}, %)
|
}, %)
|
||||||
// build the bracket sketch around the body
|
// build the bracket sketch around the body
|
||||||
@ -4396,10 +4454,10 @@ const bracket_body = bracketSketch(width, depth, thk)
|
|||||||
|> fillet({
|
|> fillet({
|
||||||
radius: radius,
|
radius: radius,
|
||||||
tags: [
|
tags: [
|
||||||
getNextAdjacentEdge(edge7, %),
|
getNextAdjacentEdge(edge7),
|
||||||
getNextAdjacentEdge(edge2, %),
|
getNextAdjacentEdge(edge2),
|
||||||
getNextAdjacentEdge(edge3, %),
|
getNextAdjacentEdge(edge3),
|
||||||
getNextAdjacentEdge(edge6, %)
|
getNextAdjacentEdge(edge6)
|
||||||
]
|
]
|
||||||
}, %)
|
}, %)
|
||||||
// build the tabs of the mounting bracket (right side)
|
// build the tabs of the mounting bracket (right side)
|
||||||
@ -4483,10 +4541,10 @@ const scarlett_body = rectShape([0, 0], width, length)
|
|||||||
|> fillet({
|
|> fillet({
|
||||||
radius: radius,
|
radius: radius,
|
||||||
tags: [
|
tags: [
|
||||||
getEdge(edge2, %),
|
edge2,
|
||||||
getEdge(edge4, %),
|
edge4,
|
||||||
getOppositeEdge(edge2, %),
|
getOppositeEdge(edge2),
|
||||||
getOppositeEdge(edge4, %)
|
getOppositeEdge(edge4)
|
||||||
]
|
]
|
||||||
}, %)
|
}, %)
|
||||||
// build the bracket sketch around the body
|
// build the bracket sketch around the body
|
||||||
@ -4516,10 +4574,10 @@ const bracket_body = bracketSketch(width, depth, thk)
|
|||||||
|> fillet({
|
|> fillet({
|
||||||
radius: radius,
|
radius: radius,
|
||||||
tags: [
|
tags: [
|
||||||
getNextAdjacentEdge(edge7, %),
|
getNextAdjacentEdge(edge7),
|
||||||
getNextAdjacentEdge(edge2, %),
|
getNextAdjacentEdge(edge2),
|
||||||
getNextAdjacentEdge(edge3, %),
|
getNextAdjacentEdge(edge3),
|
||||||
getNextAdjacentEdge(edge6, %)
|
getNextAdjacentEdge(edge6)
|
||||||
]
|
]
|
||||||
}, %)
|
}, %)
|
||||||
// build the tabs of the mounting bracket (right side)
|
// build the tabs of the mounting bracket (right side)
|
||||||
|
@ -59,6 +59,12 @@ impl ProgramMemory {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn update_tag(&mut self, tag: &str, value: TagIdentifier) -> Result<(), KclError> {
|
||||||
|
self.environments[self.current_env.index()].insert(tag.to_string(), MemoryItem::TagIdentifier(Box::new(value)));
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
/// Get a value from the program memory.
|
/// Get a value from the program memory.
|
||||||
/// Return Err if not found.
|
/// Return Err if not found.
|
||||||
pub fn get(&self, var: &str, source_range: SourceRange) -> Result<&MemoryItem, KclError> {
|
pub fn get(&self, var: &str, source_range: SourceRange) -> Result<&MemoryItem, KclError> {
|
||||||
@ -249,7 +255,7 @@ pub enum MemoryItem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl MemoryItem {
|
impl MemoryItem {
|
||||||
pub fn get_sketch_group_set(&self) -> Result<SketchGroupSet> {
|
pub(crate) fn get_sketch_group_set(&self) -> Result<SketchGroupSet> {
|
||||||
match self {
|
match self {
|
||||||
MemoryItem::SketchGroup(s) => Ok(SketchGroupSet::SketchGroup(s.clone())),
|
MemoryItem::SketchGroup(s) => Ok(SketchGroupSet::SketchGroup(s.clone())),
|
||||||
MemoryItem::SketchGroups { value } => Ok(SketchGroupSet::SketchGroups(value.clone())),
|
MemoryItem::SketchGroups { value } => Ok(SketchGroupSet::SketchGroups(value.clone())),
|
||||||
@ -262,7 +268,7 @@ impl MemoryItem {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_extrude_group_set(&self) -> Result<ExtrudeGroupSet> {
|
pub(crate) fn get_extrude_group_set(&self) -> Result<ExtrudeGroupSet> {
|
||||||
match self {
|
match self {
|
||||||
MemoryItem::ExtrudeGroup(e) => Ok(ExtrudeGroupSet::ExtrudeGroup(e.clone())),
|
MemoryItem::ExtrudeGroup(e) => Ok(ExtrudeGroupSet::ExtrudeGroup(e.clone())),
|
||||||
MemoryItem::ExtrudeGroups { value } => Ok(ExtrudeGroupSet::ExtrudeGroups(value.clone())),
|
MemoryItem::ExtrudeGroups { value } => Ok(ExtrudeGroupSet::ExtrudeGroups(value.clone())),
|
||||||
@ -563,15 +569,18 @@ pub struct UserVal {
|
|||||||
pub meta: Vec<Metadata>,
|
pub meta: Vec<Metadata>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, ts_rs::TS, JsonSchema, Eq)]
|
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, ts_rs::TS, JsonSchema)]
|
||||||
#[ts(export)]
|
#[ts(export)]
|
||||||
#[serde(tag = "type", rename_all = "camelCase")]
|
#[serde(tag = "type", rename_all = "camelCase")]
|
||||||
pub struct TagIdentifier {
|
pub struct TagIdentifier {
|
||||||
pub value: String,
|
pub value: String,
|
||||||
|
pub info: Option<TagEngineInfo>,
|
||||||
#[serde(rename = "__meta")]
|
#[serde(rename = "__meta")]
|
||||||
pub meta: Vec<Metadata>,
|
pub meta: Vec<Metadata>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Eq for TagIdentifier {}
|
||||||
|
|
||||||
impl std::fmt::Display for TagIdentifier {
|
impl std::fmt::Display for TagIdentifier {
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
write!(f, "{}", self.value)
|
write!(f, "{}", self.value)
|
||||||
@ -584,6 +593,7 @@ impl std::str::FromStr for TagIdentifier {
|
|||||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
value: s.to_string(),
|
value: s.to_string(),
|
||||||
|
info: None,
|
||||||
meta: Default::default(),
|
meta: Default::default(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -821,6 +831,21 @@ impl MemoryItem {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Engine information for a tag.
|
||||||
|
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)]
|
||||||
|
#[ts(export)]
|
||||||
|
#[serde(tag = "type", rename_all = "camelCase")]
|
||||||
|
pub struct TagEngineInfo {
|
||||||
|
/// The id of the tagged object.
|
||||||
|
pub id: uuid::Uuid,
|
||||||
|
/// The sketch group the tag is on.
|
||||||
|
pub sketch_group: uuid::Uuid,
|
||||||
|
/// The path the tag is on.
|
||||||
|
pub path: BasePath,
|
||||||
|
/// The surface information for the tag.
|
||||||
|
pub surface: Option<ExtrudeSurface>,
|
||||||
|
}
|
||||||
|
|
||||||
/// A sketch group is a collection of paths.
|
/// A sketch group is a collection of paths.
|
||||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)]
|
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)]
|
||||||
#[ts(export)]
|
#[ts(export)]
|
||||||
@ -852,25 +877,25 @@ pub enum SketchSurface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl SketchSurface {
|
impl SketchSurface {
|
||||||
pub fn id(&self) -> uuid::Uuid {
|
pub(crate) fn id(&self) -> uuid::Uuid {
|
||||||
match self {
|
match self {
|
||||||
SketchSurface::Plane(plane) => plane.id,
|
SketchSurface::Plane(plane) => plane.id,
|
||||||
SketchSurface::Face(face) => face.id,
|
SketchSurface::Face(face) => face.id,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn x_axis(&self) -> Point3d {
|
pub(crate) fn x_axis(&self) -> Point3d {
|
||||||
match self {
|
match self {
|
||||||
SketchSurface::Plane(plane) => plane.x_axis.clone(),
|
SketchSurface::Plane(plane) => plane.x_axis.clone(),
|
||||||
SketchSurface::Face(face) => face.x_axis.clone(),
|
SketchSurface::Face(face) => face.x_axis.clone(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn y_axis(&self) -> Point3d {
|
pub(crate) fn y_axis(&self) -> Point3d {
|
||||||
match self {
|
match self {
|
||||||
SketchSurface::Plane(plane) => plane.y_axis.clone(),
|
SketchSurface::Plane(plane) => plane.y_axis.clone(),
|
||||||
SketchSurface::Face(face) => face.y_axis.clone(),
|
SketchSurface::Face(face) => face.y_axis.clone(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn z_axis(&self) -> Point3d {
|
pub(crate) fn z_axis(&self) -> Point3d {
|
||||||
match self {
|
match self {
|
||||||
SketchSurface::Plane(plane) => plane.z_axis.clone(),
|
SketchSurface::Plane(plane) => plane.z_axis.clone(),
|
||||||
SketchSurface::Face(face) => face.z_axis.clone(),
|
SketchSurface::Face(face) => face.z_axis.clone(),
|
||||||
@ -885,39 +910,28 @@ pub struct GetTangentialInfoFromPathsResult {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl SketchGroup {
|
impl SketchGroup {
|
||||||
pub fn get_path_by_id(&self, id: &uuid::Uuid) -> Option<&Path> {
|
pub(crate) fn add_tag(&mut self, tag: &TagDeclarator, current_path: &Path) {
|
||||||
self.value.iter().find(|p| p.get_id() == *id)
|
let mut tag_identifier: TagIdentifier = tag.into();
|
||||||
}
|
let base = current_path.get_base();
|
||||||
|
tag_identifier.info = Some(TagEngineInfo {
|
||||||
|
id: base.geo_meta.id,
|
||||||
|
sketch_group: self.id,
|
||||||
|
path: base.clone(),
|
||||||
|
surface: None,
|
||||||
|
});
|
||||||
|
|
||||||
pub fn get_path_by_tag(&self, tag: &TagIdentifier) -> Option<&Path> {
|
self.tags.insert(tag.name.to_string(), tag_identifier);
|
||||||
self.value.iter().find(|p| {
|
|
||||||
if let Some(ntag) = p.get_tag() {
|
|
||||||
ntag.name == tag.value
|
|
||||||
} else {
|
|
||||||
false
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn get_base_by_tag_or_start(&self, tag: &TagIdentifier) -> Option<&BasePath> {
|
|
||||||
if let Some(ntag) = &self.start.tag {
|
|
||||||
if ntag.name == tag.value {
|
|
||||||
return Some(&self.start);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
self.get_path_by_tag(tag).map(|p| p.get_base())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the path most recently sketched.
|
/// Get the path most recently sketched.
|
||||||
pub fn latest_path(&self) -> Option<&Path> {
|
pub(crate) fn latest_path(&self) -> Option<&Path> {
|
||||||
self.value.last()
|
self.value.last()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The "pen" is an imaginary pen drawing the path.
|
/// The "pen" is an imaginary pen drawing the path.
|
||||||
/// This gets the current point the pen is hovering over, i.e. the point
|
/// This gets the current point the pen is hovering over, i.e. the point
|
||||||
/// where the last path segment ends, and the next path segment will begin.
|
/// where the last path segment ends, and the next path segment will begin.
|
||||||
pub fn current_pen_position(&self) -> Result<Point2d, KclError> {
|
pub(crate) fn current_pen_position(&self) -> Result<Point2d, KclError> {
|
||||||
let Some(path) = self.latest_path() else {
|
let Some(path) = self.latest_path() else {
|
||||||
return Ok(self.start.to.into());
|
return Ok(self.start.to.into());
|
||||||
};
|
};
|
||||||
@ -926,7 +940,7 @@ impl SketchGroup {
|
|||||||
Ok(base.to.into())
|
Ok(base.to.into())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_tangential_info_from_paths(&self) -> GetTangentialInfoFromPathsResult {
|
pub(crate) fn get_tangential_info_from_paths(&self) -> GetTangentialInfoFromPathsResult {
|
||||||
let Some(path) = self.latest_path() else {
|
let Some(path) = self.latest_path() else {
|
||||||
return GetTangentialInfoFromPathsResult {
|
return GetTangentialInfoFromPathsResult {
|
||||||
center_or_tangent_point: self.start.to,
|
center_or_tangent_point: self.start.to,
|
||||||
@ -978,21 +992,7 @@ pub struct ExtrudeGroup {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl ExtrudeGroup {
|
impl ExtrudeGroup {
|
||||||
pub fn get_path_by_id(&self, id: &uuid::Uuid) -> Option<&ExtrudeSurface> {
|
pub(crate) fn get_all_fillet_or_chamfer_ids(&self) -> Vec<uuid::Uuid> {
|
||||||
self.value.iter().find(|p| p.get_id() == *id)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn get_path_by_tag(&self, tag: &TagIdentifier) -> Option<&ExtrudeSurface> {
|
|
||||||
self.value.iter().find(|p| {
|
|
||||||
if let Some(ntag) = p.get_tag() {
|
|
||||||
ntag.name == tag.value
|
|
||||||
} else {
|
|
||||||
false
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn get_all_fillet_or_chamfer_ids(&self) -> Vec<uuid::Uuid> {
|
|
||||||
self.fillet_or_chamfers.iter().map(|foc| foc.id()).collect()
|
self.fillet_or_chamfers.iter().map(|foc| foc.id()).collect()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1967,7 +1967,7 @@ const newVar = myVar + 1"#;
|
|||||||
intersectTag: yo,
|
intersectTag: yo,
|
||||||
offset: {},
|
offset: {},
|
||||||
}}, %, $yo2)
|
}}, %, $yo2)
|
||||||
const intersect = segEndX(yo2, part001)"#,
|
const intersect = segEndX(yo2)"#,
|
||||||
offset
|
offset
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
@ -2033,8 +2033,8 @@ const part001 = startSketchOn('XY')
|
|||||||
|> startProfileAt([0, 0], %)
|
|> startProfileAt([0, 0], %)
|
||||||
|> line([3, 4], %, $seg01)
|
|> line([3, 4], %, $seg01)
|
||||||
|> line([
|
|> line([
|
||||||
min(segLen(seg01, %), myVar),
|
min(segLen(seg01), myVar),
|
||||||
-legLen(segLen(seg01, %), myVar)
|
-legLen(segLen(seg01), myVar)
|
||||||
], %)
|
], %)
|
||||||
"#;
|
"#;
|
||||||
|
|
||||||
@ -2048,8 +2048,8 @@ const part001 = startSketchOn('XY')
|
|||||||
|> startProfileAt([0, 0], %)
|
|> startProfileAt([0, 0], %)
|
||||||
|> line([3, 4], %, $seg01)
|
|> line([3, 4], %, $seg01)
|
||||||
|> line([
|
|> line([
|
||||||
min(segLen(seg01, %), myVar),
|
min(segLen(seg01), myVar),
|
||||||
legLen(segLen(seg01, %), myVar)
|
legLen(segLen(seg01), myVar)
|
||||||
], %)
|
], %)
|
||||||
"#;
|
"#;
|
||||||
|
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
mod camel_case;
|
mod camel_case;
|
||||||
|
mod std_lib_args;
|
||||||
|
|
||||||
#[allow(unused_imports)]
|
#[allow(unused_imports)]
|
||||||
pub use camel_case::{lint_variables, Z0001};
|
pub use camel_case::{lint_variables, Z0001};
|
||||||
|
pub use std_lib_args::{lint_call_expressions, Z0002};
|
||||||
|
145
src/wasm-lib/kcl/src/lint/checks/std_lib_args.rs
Normal file
145
src/wasm-lib/kcl/src/lint/checks/std_lib_args.rs
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
use anyhow::Result;
|
||||||
|
|
||||||
|
use crate::{
|
||||||
|
ast::types::CallExpression,
|
||||||
|
docs::StdLibFn,
|
||||||
|
executor::SourceRange,
|
||||||
|
lint::rule::{def_finding, Discovered, Finding},
|
||||||
|
std::{FunctionKind, StdLib},
|
||||||
|
walk::Node,
|
||||||
|
};
|
||||||
|
|
||||||
|
def_finding!(
|
||||||
|
Z0002,
|
||||||
|
"Too many arguments to stdlib function",
|
||||||
|
"\
|
||||||
|
Previously, we have not been failing when too many arguments are passed to a stdlib function. This is a problem because it can lead to unexpected behavior. We will in the future fail when too many arguments are passed to a function. So fix your code now."
|
||||||
|
);
|
||||||
|
|
||||||
|
fn lint_too_many_args_std_lib_function(f: Box<dyn StdLibFn>, exp: &CallExpression) -> Result<Vec<Discovered>> {
|
||||||
|
let mut findings = vec![];
|
||||||
|
|
||||||
|
if exp.arguments.len() > f.args().len() {
|
||||||
|
findings.push(Z0002.at(
|
||||||
|
format!("expected {} arguments, found {}", f.args().len(), exp.arguments.len()),
|
||||||
|
SourceRange::new(exp.start, exp.end),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(findings)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn lint_call_expressions(exp: Node) -> Result<Vec<Discovered>> {
|
||||||
|
// Yes this is dumb but its only for a temporary amount of time so its fine.
|
||||||
|
let stdlib = Arc::new(StdLib::new());
|
||||||
|
let Node::CallExpression(exp) = exp else {
|
||||||
|
return Ok(vec![]);
|
||||||
|
};
|
||||||
|
|
||||||
|
match stdlib.get_either(&exp.callee.name) {
|
||||||
|
FunctionKind::Core(func) => lint_too_many_args_std_lib_function(func, exp),
|
||||||
|
_ => Ok(vec![]),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::{lint_call_expressions, Z0002};
|
||||||
|
use crate::lint::rule::{test_finding, test_no_finding};
|
||||||
|
|
||||||
|
test_finding!(
|
||||||
|
z0002_full_bad,
|
||||||
|
lint_call_expressions,
|
||||||
|
Z0002,
|
||||||
|
"\
|
||||||
|
// Shelf Bracket
|
||||||
|
// This is a shelf bracket made out of 6061-T6 aluminum sheet metal. The required thickness is calculated based on a point load of 300 lbs applied to the end of the shelf. There are two brackets holding up the shelf, so the moment experienced is divided by 2. The shelf is 1 foot long from the wall.
|
||||||
|
|
||||||
|
// Define our bracket feet lengths
|
||||||
|
const shelfMountL = 8 // The length of the bracket holding up the shelf is 6 inches
|
||||||
|
const wallMountL = 6 // the length of the bracket
|
||||||
|
|
||||||
|
// Define constants required to calculate the thickness needed to support 300 lbs
|
||||||
|
const sigmaAllow = 35000 // psi
|
||||||
|
const width = 6 // inch
|
||||||
|
const p = 300 // Force on shelf - lbs
|
||||||
|
const shelfLength = 12 // inches
|
||||||
|
const moment = shelfLength * p / 2 // Moment experienced at fixed end of bracket
|
||||||
|
const factorOfSafety = 2 // Factor of safety of 2 to be conservative
|
||||||
|
|
||||||
|
// Calculate the thickness off the bending stress and factor of safety
|
||||||
|
const thickness = sqrt(6 * moment * factorOfSafety / (width * sigmaAllow))
|
||||||
|
|
||||||
|
// 0.25 inch fillet radius
|
||||||
|
const filletR = 0.25
|
||||||
|
|
||||||
|
// Sketch the bracket and extrude with fillets
|
||||||
|
const bracket = startSketchOn('XY')
|
||||||
|
|> startProfileAt([0, 0], %)
|
||||||
|
|> line([0, wallMountL], %, $outerEdge)
|
||||||
|
|> line([-shelfMountL, 0], %)
|
||||||
|
|> line([0, -thickness], %)
|
||||||
|
|> line([shelfMountL - thickness, 0], %, $innerEdge)
|
||||||
|
|> line([0, -wallMountL + thickness], %)
|
||||||
|
|> close(%)
|
||||||
|
|> extrude(width, %)
|
||||||
|
|> fillet({
|
||||||
|
radius: filletR,
|
||||||
|
tags: [getPreviousAdjacentEdge(innerEdge, %)]
|
||||||
|
}, %)
|
||||||
|
|> fillet({
|
||||||
|
radius: filletR + thickness,
|
||||||
|
tags: [getPreviousAdjacentEdge(outerEdge, %)]
|
||||||
|
}, %)
|
||||||
|
"
|
||||||
|
);
|
||||||
|
|
||||||
|
test_no_finding!(
|
||||||
|
z0002_full_good,
|
||||||
|
lint_call_expressions,
|
||||||
|
Z0002,
|
||||||
|
"\
|
||||||
|
// Shelf Bracket
|
||||||
|
// This is a shelf bracket made out of 6061-T6 aluminum sheet metal. The required thickness is calculated based on a point load of 300 lbs applied to the end of the shelf. There are two brackets holding up the shelf, so the moment experienced is divided by 2. The shelf is 1 foot long from the wall.
|
||||||
|
|
||||||
|
// Define our bracket feet lengths
|
||||||
|
const shelfMountL = 8 // The length of the bracket holding up the shelf is 6 inches
|
||||||
|
const wallMountL = 6 // the length of the bracket
|
||||||
|
|
||||||
|
// Define constants required to calculate the thickness needed to support 300 lbs
|
||||||
|
const sigmaAllow = 35000 // psi
|
||||||
|
const width = 6 // inch
|
||||||
|
const p = 300 // Force on shelf - lbs
|
||||||
|
const shelfLength = 12 // inches
|
||||||
|
const moment = shelfLength * p / 2 // Moment experienced at fixed end of bracket
|
||||||
|
const factorOfSafety = 2 // Factor of safety of 2 to be conservative
|
||||||
|
|
||||||
|
// Calculate the thickness off the bending stress and factor of safety
|
||||||
|
const thickness = sqrt(6 * moment * factorOfSafety / (width * sigmaAllow))
|
||||||
|
|
||||||
|
// 0.25 inch fillet radius
|
||||||
|
const filletR = 0.25
|
||||||
|
|
||||||
|
// Sketch the bracket and extrude with fillets
|
||||||
|
const bracket = startSketchOn('XY')
|
||||||
|
|> startProfileAt([0, 0], %)
|
||||||
|
|> line([0, wallMountL], %, $outerEdge)
|
||||||
|
|> line([-shelfMountL, 0], %)
|
||||||
|
|> line([0, -thickness], %)
|
||||||
|
|> line([shelfMountL - thickness, 0], %, $innerEdge)
|
||||||
|
|> line([0, -wallMountL + thickness], %)
|
||||||
|
|> close(%)
|
||||||
|
|> extrude(width, %)
|
||||||
|
|> fillet({
|
||||||
|
radius: filletR,
|
||||||
|
tags: [getPreviousAdjacentEdge(innerEdge)]
|
||||||
|
}, %)
|
||||||
|
|> fillet({
|
||||||
|
radius: filletR + thickness,
|
||||||
|
tags: [getPreviousAdjacentEdge(outerEdge)]
|
||||||
|
}, %)
|
||||||
|
"
|
||||||
|
);
|
||||||
|
}
|
@ -42,7 +42,6 @@ use tower_lsp::{
|
|||||||
use crate::{
|
use crate::{
|
||||||
ast::types::{Value, VariableKind},
|
ast::types::{Value, VariableKind},
|
||||||
executor::SourceRange,
|
executor::SourceRange,
|
||||||
lint::checks,
|
|
||||||
lsp::{backend::Backend as _, util::IntoDiagnostic},
|
lsp::{backend::Backend as _, util::IntoDiagnostic},
|
||||||
parser::PIPE_OPERATOR,
|
parser::PIPE_OPERATOR,
|
||||||
token::TokenType,
|
token::TokenType,
|
||||||
@ -273,11 +272,7 @@ impl crate::lsp::backend::Backend for Backend {
|
|||||||
// Update our semantic tokens.
|
// Update our semantic tokens.
|
||||||
self.update_semantic_tokens(&tokens, ¶ms).await;
|
self.update_semantic_tokens(&tokens, ¶ms).await;
|
||||||
|
|
||||||
let discovered_findings = ast
|
let discovered_findings = ast.lint_all().into_iter().flatten().collect::<Vec<_>>();
|
||||||
.lint(checks::lint_variables)
|
|
||||||
.into_iter()
|
|
||||||
.flatten()
|
|
||||||
.collect::<Vec<_>>();
|
|
||||||
self.add_to_diagnostics(¶ms, &discovered_findings, false).await;
|
self.add_to_diagnostics(¶ms, &discovered_findings, false).await;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,6 +65,49 @@ impl Args {
|
|||||||
self.ctx.engine.send_modeling_cmd(id, self.source_range, cmd).await
|
self.ctx.engine.send_modeling_cmd(id, self.source_range, cmd).await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_tag_info_from_memory<'a>(
|
||||||
|
&'a self,
|
||||||
|
tag: &'a TagIdentifier,
|
||||||
|
) -> Result<&'a crate::executor::TagEngineInfo, KclError> {
|
||||||
|
if let MemoryItem::TagIdentifier(t) = self.current_program_memory.get(&tag.value, self.source_range)? {
|
||||||
|
Ok(t.info.as_ref().ok_or_else(|| {
|
||||||
|
KclError::Type(KclErrorDetails {
|
||||||
|
message: format!("Tag `{}` does not have engine info", tag.value),
|
||||||
|
source_ranges: vec![self.source_range],
|
||||||
|
})
|
||||||
|
})?)
|
||||||
|
} else {
|
||||||
|
Err(KclError::Type(KclErrorDetails {
|
||||||
|
message: format!("Tag `{}` does not exist", tag.value),
|
||||||
|
source_ranges: vec![self.source_range],
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn get_tag_engine_info<'a>(
|
||||||
|
&'a self,
|
||||||
|
tag: &'a TagIdentifier,
|
||||||
|
) -> Result<&'a crate::executor::TagEngineInfo, KclError> {
|
||||||
|
if let Some(info) = &tag.info {
|
||||||
|
return Ok(info);
|
||||||
|
}
|
||||||
|
|
||||||
|
self.get_tag_info_from_memory(tag)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_tag_engine_info_check_surface<'a>(
|
||||||
|
&'a self,
|
||||||
|
tag: &'a TagIdentifier,
|
||||||
|
) -> Result<&'a crate::executor::TagEngineInfo, KclError> {
|
||||||
|
if let Some(info) = &tag.info {
|
||||||
|
if info.surface.is_some() {
|
||||||
|
return Ok(info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self.get_tag_info_from_memory(tag)
|
||||||
|
}
|
||||||
|
|
||||||
/// Flush just the fillets and chamfers for this specific ExtrudeGroupSet.
|
/// Flush just the fillets and chamfers for this specific ExtrudeGroupSet.
|
||||||
pub async fn flush_batch_for_extrude_group_set(
|
pub async fn flush_batch_for_extrude_group_set(
|
||||||
&self,
|
&self,
|
||||||
@ -188,10 +231,6 @@ impl Args {
|
|||||||
FromArgs::from_args(self, 0)
|
FromArgs::from_args(self, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_segment_name_sketch_group(&self) -> Result<(TagIdentifier, Box<SketchGroup>), KclError> {
|
|
||||||
FromArgs::from_args(self, 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn get_sketch_groups(&self) -> Result<(SketchGroupSet, Box<SketchGroup>), KclError> {
|
pub fn get_sketch_groups(&self) -> Result<(SketchGroupSet, Box<SketchGroup>), KclError> {
|
||||||
FromArgs::from_args(self, 0)
|
FromArgs::from_args(self, 0)
|
||||||
}
|
}
|
||||||
@ -279,7 +318,7 @@ impl Args {
|
|||||||
FromArgs::from_args(self, 0)
|
FromArgs::from_args(self, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_segment_name_to_number_sketch_group(&self) -> Result<(TagIdentifier, f64, Box<SketchGroup>), KclError> {
|
pub fn get_tag_to_number_sketch_group(&self) -> Result<(TagIdentifier, f64, Box<SketchGroup>), KclError> {
|
||||||
FromArgs::from_args(self, 0)
|
FromArgs::from_args(self, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -289,7 +328,6 @@ impl Args {
|
|||||||
|
|
||||||
pub async fn get_adjacent_face_to_tag(
|
pub async fn get_adjacent_face_to_tag(
|
||||||
&self,
|
&self,
|
||||||
extrude_group: &ExtrudeGroup,
|
|
||||||
tag: &TagIdentifier,
|
tag: &TagIdentifier,
|
||||||
must_be_planar: bool,
|
must_be_planar: bool,
|
||||||
) -> Result<uuid::Uuid, KclError> {
|
) -> Result<uuid::Uuid, KclError> {
|
||||||
@ -300,44 +338,50 @@ impl Args {
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(face_from_surface) = extrude_group
|
let engine_info = self.get_tag_engine_info_check_surface(tag)?;
|
||||||
.value
|
|
||||||
.iter()
|
let surface = engine_info.surface.as_ref().ok_or_else(|| {
|
||||||
.find_map(|extrude_surface| match extrude_surface {
|
KclError::Type(KclErrorDetails {
|
||||||
ExtrudeSurface::ExtrudePlane(extrude_plane) => {
|
message: format!("Tag `{}` does not have a surface", tag.value),
|
||||||
if let Some(plane_tag) = &extrude_plane.tag {
|
source_ranges: vec![self.source_range],
|
||||||
if plane_tag.name == tag.value {
|
|
||||||
Some(Ok(extrude_plane.face_id))
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// The must be planar check must be called before the arc check.
|
|
||||||
ExtrudeSurface::ExtrudeArc(_) if must_be_planar => Some(Err(KclError::Type(KclErrorDetails {
|
|
||||||
message: format!("Tag `{}` is a non-planar surface", tag.value),
|
|
||||||
source_ranges: vec![self.source_range],
|
|
||||||
}))),
|
|
||||||
ExtrudeSurface::ExtrudeArc(extrude_arc) => {
|
|
||||||
if let Some(arc_tag) = &extrude_arc.tag {
|
|
||||||
if arc_tag.name == tag.value {
|
|
||||||
Some(Ok(extrude_arc.face_id))
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
{
|
})?;
|
||||||
|
|
||||||
|
if let Some(face_from_surface) = match surface {
|
||||||
|
ExtrudeSurface::ExtrudePlane(extrude_plane) => {
|
||||||
|
if let Some(plane_tag) = &extrude_plane.tag {
|
||||||
|
if plane_tag.name == tag.value {
|
||||||
|
Some(Ok(extrude_plane.face_id))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// The must be planar check must be called before the arc check.
|
||||||
|
ExtrudeSurface::ExtrudeArc(_) if must_be_planar => Some(Err(KclError::Type(KclErrorDetails {
|
||||||
|
message: format!("Tag `{}` is a non-planar surface", tag.value),
|
||||||
|
source_ranges: vec![self.source_range],
|
||||||
|
}))),
|
||||||
|
ExtrudeSurface::ExtrudeArc(extrude_arc) => {
|
||||||
|
if let Some(arc_tag) = &extrude_arc.tag {
|
||||||
|
if arc_tag.name == tag.value {
|
||||||
|
Some(Ok(extrude_arc.face_id))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} {
|
||||||
return face_from_surface;
|
return face_from_surface;
|
||||||
}
|
}
|
||||||
|
|
||||||
// A face could also be the result of a chamfer or fillet.
|
// A face could also be the result of a chamfer or fillet.
|
||||||
if let Some(face_from_chamfer_fillet) = extrude_group.fillet_or_chamfers.iter().find_map(|fc| {
|
// TODO: come back to this.
|
||||||
|
/* if let Some(face_from_chamfer_fillet) = extrude_group.fillet_or_chamfers.iter().find_map(|fc| {
|
||||||
if let Some(ntag) = &fc.tag() {
|
if let Some(ntag) = &fc.tag() {
|
||||||
if ntag.name == tag.value {
|
if ntag.name == tag.value {
|
||||||
Some(Ok(fc.id()))
|
Some(Ok(fc.id()))
|
||||||
@ -352,7 +396,7 @@ impl Args {
|
|||||||
self.flush_batch_for_extrude_group_set(extrude_group.into()).await?;
|
self.flush_batch_for_extrude_group_set(extrude_group.into()).await?;
|
||||||
|
|
||||||
return face_from_chamfer_fillet;
|
return face_from_chamfer_fillet;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
// If we still haven't found the face, return an error.
|
// If we still haven't found the face, return an error.
|
||||||
Err(KclError::Type(KclErrorDetails {
|
Err(KclError::Type(KclErrorDetails {
|
||||||
|
@ -54,10 +54,10 @@ pub async fn chamfer(args: Args) -> Result<MemoryItem, KclError> {
|
|||||||
/// |> chamfer({
|
/// |> chamfer({
|
||||||
/// length: chamferLength,
|
/// length: chamferLength,
|
||||||
/// tags: [
|
/// tags: [
|
||||||
/// getNextAdjacentEdge(edge1, %),
|
/// getNextAdjacentEdge(edge1),
|
||||||
/// getNextAdjacentEdge(edge2, %),
|
/// getNextAdjacentEdge(edge2),
|
||||||
/// getNextAdjacentEdge(edge3, %),
|
/// getNextAdjacentEdge(edge3),
|
||||||
/// getNextAdjacentEdge(edge4, %)
|
/// getNextAdjacentEdge(edge4)
|
||||||
/// ],
|
/// ],
|
||||||
/// }, %)
|
/// }, %)
|
||||||
/// ```
|
/// ```
|
||||||
@ -94,20 +94,7 @@ async fn inner_chamfer(
|
|||||||
for edge_tag in data.tags {
|
for edge_tag in data.tags {
|
||||||
let edge_id = match edge_tag {
|
let edge_id = match edge_tag {
|
||||||
EdgeReference::Uuid(uuid) => uuid,
|
EdgeReference::Uuid(uuid) => uuid,
|
||||||
EdgeReference::Tag(edge_tag) => {
|
EdgeReference::Tag(edge_tag) => args.get_tag_engine_info(&edge_tag)?.id,
|
||||||
extrude_group
|
|
||||||
.sketch_group
|
|
||||||
.get_path_by_tag(&edge_tag)
|
|
||||||
.ok_or_else(|| {
|
|
||||||
KclError::Type(KclErrorDetails {
|
|
||||||
message: format!("No edge found with tag: `{}`", edge_tag.value),
|
|
||||||
source_ranges: vec![args.source_range],
|
|
||||||
})
|
|
||||||
})?
|
|
||||||
.get_base()
|
|
||||||
.geo_meta
|
|
||||||
.id
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let id = uuid::Uuid::new_v4();
|
let id = uuid::Uuid::new_v4();
|
||||||
|
@ -34,7 +34,7 @@ pub enum EdgeReference {
|
|||||||
/// A uuid of an edge.
|
/// A uuid of an edge.
|
||||||
Uuid(uuid::Uuid),
|
Uuid(uuid::Uuid),
|
||||||
/// A tag of an edge.
|
/// A tag of an edge.
|
||||||
Tag(TagIdentifier),
|
Tag(Box<TagIdentifier>),
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create fillets on tagged paths.
|
/// Create fillets on tagged paths.
|
||||||
@ -64,10 +64,10 @@ pub async fn fillet(args: Args) -> Result<MemoryItem, KclError> {
|
|||||||
/// |> fillet({
|
/// |> fillet({
|
||||||
/// radius: filletRadius,
|
/// radius: filletRadius,
|
||||||
/// tags: [
|
/// tags: [
|
||||||
/// getNextAdjacentEdge(edge1, %),
|
/// getNextAdjacentEdge(edge1),
|
||||||
/// getNextAdjacentEdge(edge2, %),
|
/// getNextAdjacentEdge(edge2),
|
||||||
/// getNextAdjacentEdge(edge3, %),
|
/// getNextAdjacentEdge(edge3),
|
||||||
/// getNextAdjacentEdge(edge4, %)
|
/// getNextAdjacentEdge(edge4)
|
||||||
/// ],
|
/// ],
|
||||||
/// }, %)
|
/// }, %)
|
||||||
/// ```
|
/// ```
|
||||||
@ -94,20 +94,7 @@ async fn inner_fillet(
|
|||||||
for tag in data.tags {
|
for tag in data.tags {
|
||||||
let edge_id = match tag {
|
let edge_id = match tag {
|
||||||
EdgeReference::Uuid(uuid) => uuid,
|
EdgeReference::Uuid(uuid) => uuid,
|
||||||
EdgeReference::Tag(edge_tag) => {
|
EdgeReference::Tag(edge_tag) => args.get_tag_engine_info(&edge_tag)?.id,
|
||||||
extrude_group
|
|
||||||
.sketch_group
|
|
||||||
.get_path_by_tag(&edge_tag)
|
|
||||||
.ok_or_else(|| {
|
|
||||||
KclError::Type(KclErrorDetails {
|
|
||||||
message: format!("No edge found with tag: `{}`", edge_tag.value),
|
|
||||||
source_ranges: vec![args.source_range],
|
|
||||||
})
|
|
||||||
})?
|
|
||||||
.get_base()
|
|
||||||
.geo_meta
|
|
||||||
.id
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let id = uuid::Uuid::new_v4();
|
let id = uuid::Uuid::new_v4();
|
||||||
@ -138,9 +125,9 @@ async fn inner_fillet(
|
|||||||
|
|
||||||
/// Get the opposite edge to the edge given.
|
/// Get the opposite edge to the edge given.
|
||||||
pub async fn get_opposite_edge(args: Args) -> Result<MemoryItem, KclError> {
|
pub async fn get_opposite_edge(args: Args) -> Result<MemoryItem, KclError> {
|
||||||
let (tag, extrude_group) = args.get_tag_and_extrude_group()?;
|
let tag: TagIdentifier = args.get_data()?;
|
||||||
|
|
||||||
let edge = inner_get_opposite_edge(tag, extrude_group, args.clone()).await?;
|
let edge = inner_get_opposite_edge(tag, args.clone()).await?;
|
||||||
Ok(MemoryItem::UserVal(UserVal {
|
Ok(MemoryItem::UserVal(UserVal {
|
||||||
value: serde_json::to_value(edge).map_err(|e| {
|
value: serde_json::to_value(edge).map_err(|e| {
|
||||||
KclError::Type(KclErrorDetails {
|
KclError::Type(KclErrorDetails {
|
||||||
@ -176,39 +163,26 @@ pub async fn get_opposite_edge(args: Args) -> Result<MemoryItem, KclError> {
|
|||||||
/// const example = extrude(5, exampleSketch)
|
/// const example = extrude(5, exampleSketch)
|
||||||
/// |> fillet({
|
/// |> fillet({
|
||||||
/// radius: 3,
|
/// radius: 3,
|
||||||
/// tags: [getOppositeEdge(referenceEdge, %)],
|
/// tags: [getOppositeEdge(referenceEdge)],
|
||||||
/// }, %)
|
/// }, %)
|
||||||
/// ```
|
/// ```
|
||||||
#[stdlib {
|
#[stdlib {
|
||||||
name = "getOppositeEdge",
|
name = "getOppositeEdge",
|
||||||
}]
|
}]
|
||||||
async fn inner_get_opposite_edge(
|
async fn inner_get_opposite_edge(tag: TagIdentifier, args: Args) -> Result<Uuid, KclError> {
|
||||||
tag: TagIdentifier,
|
|
||||||
extrude_group: Box<ExtrudeGroup>,
|
|
||||||
args: Args,
|
|
||||||
) -> Result<Uuid, KclError> {
|
|
||||||
if args.ctx.is_mock {
|
if args.ctx.is_mock {
|
||||||
return Ok(Uuid::new_v4());
|
return Ok(Uuid::new_v4());
|
||||||
}
|
}
|
||||||
let tagged_path = extrude_group
|
let tagged_path = args.get_tag_engine_info(&tag)?;
|
||||||
.sketch_group
|
|
||||||
.get_path_by_tag(&tag)
|
|
||||||
.ok_or_else(|| {
|
|
||||||
KclError::Type(KclErrorDetails {
|
|
||||||
message: format!("No edge found with tag: `{}`", tag.value),
|
|
||||||
source_ranges: vec![args.source_range],
|
|
||||||
})
|
|
||||||
})?
|
|
||||||
.get_base();
|
|
||||||
|
|
||||||
let face_id = args.get_adjacent_face_to_tag(&extrude_group, &tag, false).await?;
|
let face_id = args.get_adjacent_face_to_tag(&tag, false).await?;
|
||||||
|
|
||||||
let resp = args
|
let resp = args
|
||||||
.send_modeling_cmd(
|
.send_modeling_cmd(
|
||||||
uuid::Uuid::new_v4(),
|
uuid::Uuid::new_v4(),
|
||||||
ModelingCmd::Solid3DGetOppositeEdge {
|
ModelingCmd::Solid3DGetOppositeEdge {
|
||||||
edge_id: tagged_path.geo_meta.id,
|
edge_id: tagged_path.id,
|
||||||
object_id: extrude_group.id,
|
object_id: tagged_path.sketch_group,
|
||||||
face_id,
|
face_id,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
@ -228,9 +202,9 @@ async fn inner_get_opposite_edge(
|
|||||||
|
|
||||||
/// Get the next adjacent edge to the edge given.
|
/// Get the next adjacent edge to the edge given.
|
||||||
pub async fn get_next_adjacent_edge(args: Args) -> Result<MemoryItem, KclError> {
|
pub async fn get_next_adjacent_edge(args: Args) -> Result<MemoryItem, KclError> {
|
||||||
let (tag, extrude_group) = args.get_tag_and_extrude_group()?;
|
let tag: TagIdentifier = args.get_data()?;
|
||||||
|
|
||||||
let edge = inner_get_next_adjacent_edge(tag, extrude_group, args.clone()).await?;
|
let edge = inner_get_next_adjacent_edge(tag, args.clone()).await?;
|
||||||
Ok(MemoryItem::UserVal(UserVal {
|
Ok(MemoryItem::UserVal(UserVal {
|
||||||
value: serde_json::to_value(edge).map_err(|e| {
|
value: serde_json::to_value(edge).map_err(|e| {
|
||||||
KclError::Type(KclErrorDetails {
|
KclError::Type(KclErrorDetails {
|
||||||
@ -266,39 +240,26 @@ pub async fn get_next_adjacent_edge(args: Args) -> Result<MemoryItem, KclError>
|
|||||||
/// const example = extrude(5, exampleSketch)
|
/// const example = extrude(5, exampleSketch)
|
||||||
/// |> fillet({
|
/// |> fillet({
|
||||||
/// radius: 3,
|
/// radius: 3,
|
||||||
/// tags: [getNextAdjacentEdge(referenceEdge, %)],
|
/// tags: [getNextAdjacentEdge(referenceEdge)],
|
||||||
/// }, %)
|
/// }, %)
|
||||||
/// ```
|
/// ```
|
||||||
#[stdlib {
|
#[stdlib {
|
||||||
name = "getNextAdjacentEdge",
|
name = "getNextAdjacentEdge",
|
||||||
}]
|
}]
|
||||||
async fn inner_get_next_adjacent_edge(
|
async fn inner_get_next_adjacent_edge(tag: TagIdentifier, args: Args) -> Result<Uuid, KclError> {
|
||||||
tag: TagIdentifier,
|
|
||||||
extrude_group: Box<ExtrudeGroup>,
|
|
||||||
args: Args,
|
|
||||||
) -> Result<Uuid, KclError> {
|
|
||||||
if args.ctx.is_mock {
|
if args.ctx.is_mock {
|
||||||
return Ok(Uuid::new_v4());
|
return Ok(Uuid::new_v4());
|
||||||
}
|
}
|
||||||
let tagged_path = extrude_group
|
let tagged_path = args.get_tag_engine_info(&tag)?;
|
||||||
.sketch_group
|
|
||||||
.get_path_by_tag(&tag)
|
|
||||||
.ok_or_else(|| {
|
|
||||||
KclError::Type(KclErrorDetails {
|
|
||||||
message: format!("No edge found with tag: `{}`", tag.value),
|
|
||||||
source_ranges: vec![args.source_range],
|
|
||||||
})
|
|
||||||
})?
|
|
||||||
.get_base();
|
|
||||||
|
|
||||||
let face_id = args.get_adjacent_face_to_tag(&extrude_group, &tag, false).await?;
|
let face_id = args.get_adjacent_face_to_tag(&tag, false).await?;
|
||||||
|
|
||||||
let resp = args
|
let resp = args
|
||||||
.send_modeling_cmd(
|
.send_modeling_cmd(
|
||||||
uuid::Uuid::new_v4(),
|
uuid::Uuid::new_v4(),
|
||||||
ModelingCmd::Solid3DGetPrevAdjacentEdge {
|
ModelingCmd::Solid3DGetPrevAdjacentEdge {
|
||||||
edge_id: tagged_path.geo_meta.id,
|
edge_id: tagged_path.id,
|
||||||
object_id: extrude_group.id,
|
object_id: tagged_path.sketch_group,
|
||||||
face_id,
|
face_id,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
@ -323,9 +284,9 @@ async fn inner_get_next_adjacent_edge(
|
|||||||
|
|
||||||
/// Get the previous adjacent edge to the edge given.
|
/// Get the previous adjacent edge to the edge given.
|
||||||
pub async fn get_previous_adjacent_edge(args: Args) -> Result<MemoryItem, KclError> {
|
pub async fn get_previous_adjacent_edge(args: Args) -> Result<MemoryItem, KclError> {
|
||||||
let (tag, extrude_group) = args.get_tag_and_extrude_group()?;
|
let tag: TagIdentifier = args.get_data()?;
|
||||||
|
|
||||||
let edge = inner_get_previous_adjacent_edge(tag, extrude_group, args.clone()).await?;
|
let edge = inner_get_previous_adjacent_edge(tag, args.clone()).await?;
|
||||||
Ok(MemoryItem::UserVal(UserVal {
|
Ok(MemoryItem::UserVal(UserVal {
|
||||||
value: serde_json::to_value(edge).map_err(|e| {
|
value: serde_json::to_value(edge).map_err(|e| {
|
||||||
KclError::Type(KclErrorDetails {
|
KclError::Type(KclErrorDetails {
|
||||||
@ -361,39 +322,26 @@ pub async fn get_previous_adjacent_edge(args: Args) -> Result<MemoryItem, KclErr
|
|||||||
/// const example = extrude(5, exampleSketch)
|
/// const example = extrude(5, exampleSketch)
|
||||||
/// |> fillet({
|
/// |> fillet({
|
||||||
/// radius: 3,
|
/// radius: 3,
|
||||||
/// tags: [getPreviousAdjacentEdge(referenceEdge, %)],
|
/// tags: [getPreviousAdjacentEdge(referenceEdge)],
|
||||||
/// }, %)
|
/// }, %)
|
||||||
/// ```
|
/// ```
|
||||||
#[stdlib {
|
#[stdlib {
|
||||||
name = "getPreviousAdjacentEdge",
|
name = "getPreviousAdjacentEdge",
|
||||||
}]
|
}]
|
||||||
async fn inner_get_previous_adjacent_edge(
|
async fn inner_get_previous_adjacent_edge(tag: TagIdentifier, args: Args) -> Result<Uuid, KclError> {
|
||||||
tag: TagIdentifier,
|
|
||||||
extrude_group: Box<ExtrudeGroup>,
|
|
||||||
args: Args,
|
|
||||||
) -> Result<Uuid, KclError> {
|
|
||||||
if args.ctx.is_mock {
|
if args.ctx.is_mock {
|
||||||
return Ok(Uuid::new_v4());
|
return Ok(Uuid::new_v4());
|
||||||
}
|
}
|
||||||
let tagged_path = extrude_group
|
let tagged_path = args.get_tag_engine_info(&tag)?;
|
||||||
.sketch_group
|
|
||||||
.get_path_by_tag(&tag)
|
|
||||||
.ok_or_else(|| {
|
|
||||||
KclError::Type(KclErrorDetails {
|
|
||||||
message: format!("No edge found with tag: `{}`", tag.value),
|
|
||||||
source_ranges: vec![args.source_range],
|
|
||||||
})
|
|
||||||
})?
|
|
||||||
.get_base();
|
|
||||||
|
|
||||||
let face_id = args.get_adjacent_face_to_tag(&extrude_group, &tag, false).await?;
|
let face_id = args.get_adjacent_face_to_tag(&tag, false).await?;
|
||||||
|
|
||||||
let resp = args
|
let resp = args
|
||||||
.send_modeling_cmd(
|
.send_modeling_cmd(
|
||||||
uuid::Uuid::new_v4(),
|
uuid::Uuid::new_v4(),
|
||||||
ModelingCmd::Solid3DGetNextAdjacentEdge {
|
ModelingCmd::Solid3DGetNextAdjacentEdge {
|
||||||
edge_id: tagged_path.geo_meta.id,
|
edge_id: tagged_path.id,
|
||||||
object_id: extrude_group.id,
|
object_id: tagged_path.sketch_group,
|
||||||
face_id,
|
face_id,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -94,7 +94,6 @@ lazy_static! {
|
|||||||
Box::new(crate::std::helix::Helix),
|
Box::new(crate::std::helix::Helix),
|
||||||
Box::new(crate::std::shell::Shell),
|
Box::new(crate::std::shell::Shell),
|
||||||
Box::new(crate::std::revolve::Revolve),
|
Box::new(crate::std::revolve::Revolve),
|
||||||
Box::new(crate::std::revolve::GetEdge),
|
|
||||||
Box::new(crate::std::import::Import),
|
Box::new(crate::std::import::Import),
|
||||||
Box::new(crate::std::math::Cos),
|
Box::new(crate::std::math::Cos),
|
||||||
Box::new(crate::std::math::Sin),
|
Box::new(crate::std::math::Sin),
|
||||||
|
@ -5,11 +5,10 @@ use derive_docs::stdlib;
|
|||||||
use kittycad::types::ModelingCmd;
|
use kittycad::types::ModelingCmd;
|
||||||
use schemars::JsonSchema;
|
use schemars::JsonSchema;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use uuid::Uuid;
|
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
errors::{KclError, KclErrorDetails},
|
errors::{KclError, KclErrorDetails},
|
||||||
executor::{ExtrudeGroup, MemoryItem, SketchGroup, TagIdentifier, UserVal},
|
executor::{ExtrudeGroup, MemoryItem, SketchGroup},
|
||||||
std::{
|
std::{
|
||||||
extrude::do_post_extrude,
|
extrude::do_post_extrude,
|
||||||
fillet::{EdgeReference, DEFAULT_TOLERANCE},
|
fillet::{EdgeReference, DEFAULT_TOLERANCE},
|
||||||
@ -197,7 +196,7 @@ pub async fn revolve(args: Args) -> Result<MemoryItem, KclError> {
|
|||||||
/// |> circle([10,10], 4, %)
|
/// |> circle([10,10], 4, %)
|
||||||
/// |> revolve({
|
/// |> revolve({
|
||||||
/// angle: 90,
|
/// angle: 90,
|
||||||
/// axis: getOppositeEdge(revolveAxis, box)
|
/// axis: getOppositeEdge(revolveAxis)
|
||||||
/// }, %)
|
/// }, %)
|
||||||
/// ```
|
/// ```
|
||||||
///
|
///
|
||||||
@ -258,19 +257,7 @@ async fn inner_revolve(
|
|||||||
RevolveAxis::Edge(edge) => {
|
RevolveAxis::Edge(edge) => {
|
||||||
let edge_id = match edge {
|
let edge_id = match edge {
|
||||||
EdgeReference::Uuid(uuid) => uuid,
|
EdgeReference::Uuid(uuid) => uuid,
|
||||||
EdgeReference::Tag(tag) => {
|
EdgeReference::Tag(tag) => args.get_tag_engine_info(&tag)?.id,
|
||||||
sketch_group
|
|
||||||
.get_path_by_tag(&tag)
|
|
||||||
.ok_or_else(|| {
|
|
||||||
KclError::Type(KclErrorDetails {
|
|
||||||
message: format!("No edge found with tag: `{}`", tag.value),
|
|
||||||
source_ranges: vec![args.source_range],
|
|
||||||
})
|
|
||||||
})?
|
|
||||||
.get_base()
|
|
||||||
.geo_meta
|
|
||||||
.id
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
args.batch_modeling_cmd(
|
args.batch_modeling_cmd(
|
||||||
id,
|
id,
|
||||||
@ -288,65 +275,6 @@ async fn inner_revolve(
|
|||||||
do_post_extrude(sketch_group, 0.0, id, args).await
|
do_post_extrude(sketch_group, 0.0, id, args).await
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get an edge on a 3D solid.
|
|
||||||
pub async fn get_edge(args: Args) -> Result<MemoryItem, KclError> {
|
|
||||||
let (tag, extrude_group) = args.get_tag_and_extrude_group()?;
|
|
||||||
|
|
||||||
let edge = inner_get_edge(tag, extrude_group, args.clone()).await?;
|
|
||||||
Ok(MemoryItem::UserVal(UserVal {
|
|
||||||
value: serde_json::to_value(edge).map_err(|e| {
|
|
||||||
KclError::Type(KclErrorDetails {
|
|
||||||
message: format!("Failed to convert Uuid to json: {}", e),
|
|
||||||
source_ranges: vec![args.source_range],
|
|
||||||
})
|
|
||||||
})?,
|
|
||||||
meta: vec![args.source_range.into()],
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Get an edge on a 3D solid.
|
|
||||||
///
|
|
||||||
/// ```no_run
|
|
||||||
/// const box = startSketchOn('XZ')
|
|
||||||
/// |> startProfileAt([0, 0], %)
|
|
||||||
/// |> line([0, 10], %, $revolveAxis)
|
|
||||||
/// |> line([10, 0], %)
|
|
||||||
/// |> line([0, -10], %)
|
|
||||||
/// |> close(%)
|
|
||||||
/// |> extrude(10, %)
|
|
||||||
///
|
|
||||||
/// const revolution = startSketchOn(box, revolveAxis)
|
|
||||||
/// |> startProfileAt([5, 10], %)
|
|
||||||
/// |> line([0, 10], %)
|
|
||||||
/// |> line([2, 0], %)
|
|
||||||
/// |> line([0, -10], %)
|
|
||||||
/// |> close(%)
|
|
||||||
/// |> revolve({
|
|
||||||
/// axis: getEdge(revolveAxis, box),
|
|
||||||
/// angle: 90
|
|
||||||
/// }, %)
|
|
||||||
/// ```
|
|
||||||
#[stdlib {
|
|
||||||
name = "getEdge",
|
|
||||||
}]
|
|
||||||
async fn inner_get_edge(tag: TagIdentifier, extrude_group: Box<ExtrudeGroup>, args: Args) -> Result<Uuid, KclError> {
|
|
||||||
if args.ctx.is_mock {
|
|
||||||
return Ok(Uuid::new_v4());
|
|
||||||
}
|
|
||||||
let tagged_path = extrude_group
|
|
||||||
.sketch_group
|
|
||||||
.get_path_by_tag(&tag)
|
|
||||||
.ok_or_else(|| {
|
|
||||||
KclError::Type(KclErrorDetails {
|
|
||||||
message: format!("No edge found with tag: `{}`", tag.value),
|
|
||||||
source_ranges: vec![args.source_range],
|
|
||||||
})
|
|
||||||
})?
|
|
||||||
.get_base();
|
|
||||||
|
|
||||||
Ok(tagged_path.geo_meta.id)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
|
||||||
|
@ -12,8 +12,8 @@ use crate::{
|
|||||||
|
|
||||||
/// Returns the segment end of x.
|
/// Returns the segment end of x.
|
||||||
pub async fn segment_end_x(args: Args) -> Result<MemoryItem, KclError> {
|
pub async fn segment_end_x(args: Args) -> Result<MemoryItem, KclError> {
|
||||||
let (segment_name, sketch_group) = args.get_segment_name_sketch_group()?;
|
let tag: TagIdentifier = args.get_data()?;
|
||||||
let result = inner_segment_end_x(&segment_name, sketch_group, args.clone())?;
|
let result = inner_segment_end_x(&tag, args.clone())?;
|
||||||
|
|
||||||
args.make_user_val_from_f64(result)
|
args.make_user_val_from_f64(result)
|
||||||
}
|
}
|
||||||
@ -25,7 +25,7 @@ pub async fn segment_end_x(args: Args) -> Result<MemoryItem, KclError> {
|
|||||||
/// |> startProfileAt([0, 0], %)
|
/// |> startProfileAt([0, 0], %)
|
||||||
/// |> line([20, 0], %, $thing)
|
/// |> line([20, 0], %, $thing)
|
||||||
/// |> line([0, 5], %)
|
/// |> line([0, 5], %)
|
||||||
/// |> line([segEndX(thing, %), 0], %)
|
/// |> line([segEndX(thing), 0], %)
|
||||||
/// |> line([-20, 10], %)
|
/// |> line([-20, 10], %)
|
||||||
/// |> close(%)
|
/// |> close(%)
|
||||||
///
|
///
|
||||||
@ -34,28 +34,16 @@ pub async fn segment_end_x(args: Args) -> Result<MemoryItem, KclError> {
|
|||||||
#[stdlib {
|
#[stdlib {
|
||||||
name = "segEndX",
|
name = "segEndX",
|
||||||
}]
|
}]
|
||||||
fn inner_segment_end_x(
|
fn inner_segment_end_x(tag: &TagIdentifier, args: Args) -> Result<f64, KclError> {
|
||||||
segment_name: &TagIdentifier,
|
let line = args.get_tag_engine_info(tag)?;
|
||||||
sketch_group: Box<SketchGroup>,
|
|
||||||
args: Args,
|
|
||||||
) -> Result<f64, KclError> {
|
|
||||||
let line = sketch_group.get_base_by_tag_or_start(segment_name).ok_or_else(|| {
|
|
||||||
KclError::Type(KclErrorDetails {
|
|
||||||
message: format!(
|
|
||||||
"Expected a segment name that exists in the given SketchGroup, found `{}`",
|
|
||||||
segment_name
|
|
||||||
),
|
|
||||||
source_ranges: vec![args.source_range],
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
|
|
||||||
Ok(line.to[0])
|
Ok(line.path.to[0])
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the segment end of y.
|
/// Returns the segment end of y.
|
||||||
pub async fn segment_end_y(args: Args) -> Result<MemoryItem, KclError> {
|
pub async fn segment_end_y(args: Args) -> Result<MemoryItem, KclError> {
|
||||||
let (segment_name, sketch_group) = args.get_segment_name_sketch_group()?;
|
let tag: TagIdentifier = args.get_data()?;
|
||||||
let result = inner_segment_end_y(&segment_name, sketch_group, args.clone())?;
|
let result = inner_segment_end_y(&tag, args.clone())?;
|
||||||
|
|
||||||
args.make_user_val_from_f64(result)
|
args.make_user_val_from_f64(result)
|
||||||
}
|
}
|
||||||
@ -68,7 +56,7 @@ pub async fn segment_end_y(args: Args) -> Result<MemoryItem, KclError> {
|
|||||||
/// |> line([20, 0], %)
|
/// |> line([20, 0], %)
|
||||||
/// |> line([0, 3], %, $thing)
|
/// |> line([0, 3], %, $thing)
|
||||||
/// |> line([-10, 0], %)
|
/// |> line([-10, 0], %)
|
||||||
/// |> line([0, segEndY(thing, %)], %)
|
/// |> line([0, segEndY(thing)], %)
|
||||||
/// |> line([-10, 0], %)
|
/// |> line([-10, 0], %)
|
||||||
/// |> close(%)
|
/// |> close(%)
|
||||||
///
|
///
|
||||||
@ -77,22 +65,10 @@ pub async fn segment_end_y(args: Args) -> Result<MemoryItem, KclError> {
|
|||||||
#[stdlib {
|
#[stdlib {
|
||||||
name = "segEndY",
|
name = "segEndY",
|
||||||
}]
|
}]
|
||||||
fn inner_segment_end_y(
|
fn inner_segment_end_y(tag: &TagIdentifier, args: Args) -> Result<f64, KclError> {
|
||||||
segment_name: &TagIdentifier,
|
let line = args.get_tag_engine_info(tag)?;
|
||||||
sketch_group: Box<SketchGroup>,
|
|
||||||
args: Args,
|
|
||||||
) -> Result<f64, KclError> {
|
|
||||||
let line = sketch_group.get_base_by_tag_or_start(segment_name).ok_or_else(|| {
|
|
||||||
KclError::Type(KclErrorDetails {
|
|
||||||
message: format!(
|
|
||||||
"Expected a segment name that exists in the given SketchGroup, found `{}`",
|
|
||||||
segment_name
|
|
||||||
),
|
|
||||||
source_ranges: vec![args.source_range],
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
|
|
||||||
Ok(line.to[1])
|
Ok(line.path.to[1])
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the last segment of x.
|
/// Returns the last segment of x.
|
||||||
@ -181,8 +157,8 @@ fn inner_last_segment_y(sketch_group: Box<SketchGroup>, args: Args) -> Result<f6
|
|||||||
|
|
||||||
/// Returns the length of the segment.
|
/// Returns the length of the segment.
|
||||||
pub async fn segment_length(args: Args) -> Result<MemoryItem, KclError> {
|
pub async fn segment_length(args: Args) -> Result<MemoryItem, KclError> {
|
||||||
let (segment_name, sketch_group) = args.get_segment_name_sketch_group()?;
|
let tag: TagIdentifier = args.get_data()?;
|
||||||
let result = inner_segment_length(&segment_name, sketch_group, args.clone())?;
|
let result = inner_segment_length(&tag, args.clone())?;
|
||||||
args.make_user_val_from_f64(result)
|
args.make_user_val_from_f64(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -201,7 +177,7 @@ pub async fn segment_length(args: Args) -> Result<MemoryItem, KclError> {
|
|||||||
/// }, %)
|
/// }, %)
|
||||||
/// |> angledLine({
|
/// |> angledLine({
|
||||||
/// angle: -60,
|
/// angle: -60,
|
||||||
/// length: segLen(thing, %),
|
/// length: segLen(thing),
|
||||||
/// }, %)
|
/// }, %)
|
||||||
/// |> close(%)
|
/// |> close(%)
|
||||||
///
|
///
|
||||||
@ -210,32 +186,19 @@ pub async fn segment_length(args: Args) -> Result<MemoryItem, KclError> {
|
|||||||
#[stdlib {
|
#[stdlib {
|
||||||
name = "segLen",
|
name = "segLen",
|
||||||
}]
|
}]
|
||||||
fn inner_segment_length(
|
fn inner_segment_length(tag: &TagIdentifier, args: Args) -> Result<f64, KclError> {
|
||||||
segment_name: &TagIdentifier,
|
let line = args.get_tag_engine_info(tag)?;
|
||||||
sketch_group: Box<SketchGroup>,
|
|
||||||
args: Args,
|
|
||||||
) -> Result<f64, KclError> {
|
|
||||||
let path = sketch_group.get_path_by_tag(segment_name).ok_or_else(|| {
|
|
||||||
KclError::Type(KclErrorDetails {
|
|
||||||
message: format!(
|
|
||||||
"Expected a segment name that exists in the given SketchGroup, found `{}`",
|
|
||||||
segment_name
|
|
||||||
),
|
|
||||||
source_ranges: vec![args.source_range],
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
let line = path.get_base();
|
|
||||||
|
|
||||||
let result = ((line.from[1] - line.to[1]).powi(2) + (line.from[0] - line.to[0]).powi(2)).sqrt();
|
let result = ((line.path.from[1] - line.path.to[1]).powi(2) + (line.path.from[0] - line.path.to[0]).powi(2)).sqrt();
|
||||||
|
|
||||||
Ok(result)
|
Ok(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the angle of the segment.
|
/// Returns the angle of the segment.
|
||||||
pub async fn segment_angle(args: Args) -> Result<MemoryItem, KclError> {
|
pub async fn segment_angle(args: Args) -> Result<MemoryItem, KclError> {
|
||||||
let (segment_name, sketch_group) = args.get_segment_name_sketch_group()?;
|
let tag: TagIdentifier = args.get_data()?;
|
||||||
|
|
||||||
let result = inner_segment_angle(&segment_name, sketch_group, args.clone())?;
|
let result = inner_segment_angle(&tag, args.clone())?;
|
||||||
args.make_user_val_from_f64(result)
|
args.make_user_val_from_f64(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -247,9 +210,9 @@ pub async fn segment_angle(args: Args) -> Result<MemoryItem, KclError> {
|
|||||||
/// |> line([10, 0], %)
|
/// |> line([10, 0], %)
|
||||||
/// |> line([5, 10], %, $seg01)
|
/// |> line([5, 10], %, $seg01)
|
||||||
/// |> line([-10, 0], %)
|
/// |> line([-10, 0], %)
|
||||||
/// |> angledLine([segAng(seg01, %), 10], %)
|
/// |> angledLine([segAng(seg01), 10], %)
|
||||||
/// |> line([-10, 0], %)
|
/// |> line([-10, 0], %)
|
||||||
/// |> angledLine([segAng(seg01, %), -15], %)
|
/// |> angledLine([segAng(seg01), -15], %)
|
||||||
/// |> close(%)
|
/// |> close(%)
|
||||||
///
|
///
|
||||||
/// const example = extrude(4, exampleSketch)
|
/// const example = extrude(4, exampleSketch)
|
||||||
@ -257,31 +220,18 @@ pub async fn segment_angle(args: Args) -> Result<MemoryItem, KclError> {
|
|||||||
#[stdlib {
|
#[stdlib {
|
||||||
name = "segAng",
|
name = "segAng",
|
||||||
}]
|
}]
|
||||||
fn inner_segment_angle(
|
fn inner_segment_angle(tag: &TagIdentifier, args: Args) -> Result<f64, KclError> {
|
||||||
segment_name: &TagIdentifier,
|
let line = args.get_tag_engine_info(tag)?;
|
||||||
sketch_group: Box<SketchGroup>,
|
|
||||||
args: Args,
|
|
||||||
) -> Result<f64, KclError> {
|
|
||||||
let path = sketch_group.get_path_by_tag(segment_name).ok_or_else(|| {
|
|
||||||
KclError::Type(KclErrorDetails {
|
|
||||||
message: format!(
|
|
||||||
"Expected a segment name that exists in the given SketchGroup, found `{}`",
|
|
||||||
segment_name
|
|
||||||
),
|
|
||||||
source_ranges: vec![args.source_range],
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
let line = path.get_base();
|
|
||||||
|
|
||||||
let result = between(line.from.into(), line.to.into());
|
let result = between(line.path.from.into(), line.path.to.into());
|
||||||
|
|
||||||
Ok(result.degrees())
|
Ok(result.degrees())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the angle to match the given length for x.
|
/// Returns the angle to match the given length for x.
|
||||||
pub async fn angle_to_match_length_x(args: Args) -> Result<MemoryItem, KclError> {
|
pub async fn angle_to_match_length_x(args: Args) -> Result<MemoryItem, KclError> {
|
||||||
let (segment_name, to, sketch_group) = args.get_segment_name_to_number_sketch_group()?;
|
let (tag, to, sketch_group) = args.get_tag_to_number_sketch_group()?;
|
||||||
let result = inner_angle_to_match_length_x(&segment_name, to, sketch_group, args.clone())?;
|
let result = inner_angle_to_match_length_x(&tag, to, sketch_group, args.clone())?;
|
||||||
args.make_user_val_from_f64(result)
|
args.make_user_val_from_f64(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -303,23 +253,14 @@ pub async fn angle_to_match_length_x(args: Args) -> Result<MemoryItem, KclError>
|
|||||||
name = "angleToMatchLengthX",
|
name = "angleToMatchLengthX",
|
||||||
}]
|
}]
|
||||||
fn inner_angle_to_match_length_x(
|
fn inner_angle_to_match_length_x(
|
||||||
segment_name: &TagIdentifier,
|
tag: &TagIdentifier,
|
||||||
to: f64,
|
to: f64,
|
||||||
sketch_group: Box<SketchGroup>,
|
sketch_group: Box<SketchGroup>,
|
||||||
args: Args,
|
args: Args,
|
||||||
) -> Result<f64, KclError> {
|
) -> Result<f64, KclError> {
|
||||||
let path = sketch_group.get_path_by_tag(segment_name).ok_or_else(|| {
|
let line = args.get_tag_engine_info(tag)?;
|
||||||
KclError::Type(KclErrorDetails {
|
|
||||||
message: format!(
|
|
||||||
"Expected a segment name that exists in the given SketchGroup, found `{}`",
|
|
||||||
segment_name
|
|
||||||
),
|
|
||||||
source_ranges: vec![args.source_range],
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
let line = path.get_base();
|
|
||||||
|
|
||||||
let length = ((line.from[1] - line.to[1]).powi(2) + (line.from[0] - line.to[0]).powi(2)).sqrt();
|
let length = ((line.path.from[1] - line.path.to[1]).powi(2) + (line.path.from[0] - line.path.to[0]).powi(2)).sqrt();
|
||||||
|
|
||||||
let last_line = sketch_group
|
let last_line = sketch_group
|
||||||
.value
|
.value
|
||||||
@ -348,8 +289,8 @@ fn inner_angle_to_match_length_x(
|
|||||||
|
|
||||||
/// Returns the angle to match the given length for y.
|
/// Returns the angle to match the given length for y.
|
||||||
pub async fn angle_to_match_length_y(args: Args) -> Result<MemoryItem, KclError> {
|
pub async fn angle_to_match_length_y(args: Args) -> Result<MemoryItem, KclError> {
|
||||||
let (segment_name, to, sketch_group) = args.get_segment_name_to_number_sketch_group()?;
|
let (tag, to, sketch_group) = args.get_tag_to_number_sketch_group()?;
|
||||||
let result = inner_angle_to_match_length_y(&segment_name, to, sketch_group, args.clone())?;
|
let result = inner_angle_to_match_length_y(&tag, to, sketch_group, args.clone())?;
|
||||||
args.make_user_val_from_f64(result)
|
args.make_user_val_from_f64(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -372,23 +313,14 @@ pub async fn angle_to_match_length_y(args: Args) -> Result<MemoryItem, KclError>
|
|||||||
name = "angleToMatchLengthY",
|
name = "angleToMatchLengthY",
|
||||||
}]
|
}]
|
||||||
fn inner_angle_to_match_length_y(
|
fn inner_angle_to_match_length_y(
|
||||||
segment_name: &TagIdentifier,
|
tag: &TagIdentifier,
|
||||||
to: f64,
|
to: f64,
|
||||||
sketch_group: Box<SketchGroup>,
|
sketch_group: Box<SketchGroup>,
|
||||||
args: Args,
|
args: Args,
|
||||||
) -> Result<f64, KclError> {
|
) -> Result<f64, KclError> {
|
||||||
let path = sketch_group.get_path_by_tag(segment_name).ok_or_else(|| {
|
let line = args.get_tag_engine_info(tag)?;
|
||||||
KclError::Type(KclErrorDetails {
|
|
||||||
message: format!(
|
|
||||||
"Expected a segment name that exists in the given SketchGroup, found `{}`",
|
|
||||||
segment_name
|
|
||||||
),
|
|
||||||
source_ranges: vec![args.source_range],
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
let line = path.get_base();
|
|
||||||
|
|
||||||
let length = ((line.from[1] - line.to[1]).powi(2) + (line.from[0] - line.to[0]).powi(2)).sqrt();
|
let length = ((line.path.from[1] - line.path.to[1]).powi(2) + (line.path.from[0] - line.path.to[0]).powi(2)).sqrt();
|
||||||
|
|
||||||
let last_line = sketch_group
|
let last_line = sketch_group
|
||||||
.value
|
.value
|
||||||
|
@ -14,7 +14,7 @@ use crate::{
|
|||||||
errors::{KclError, KclErrorDetails},
|
errors::{KclError, KclErrorDetails},
|
||||||
executor::{
|
executor::{
|
||||||
BasePath, ExtrudeGroup, Face, GeoMeta, MemoryItem, Path, Plane, PlaneType, Point2d, Point3d, SketchGroup,
|
BasePath, ExtrudeGroup, Face, GeoMeta, MemoryItem, Path, Plane, PlaneType, Point2d, Point3d, SketchGroup,
|
||||||
SketchGroupSet, SketchSurface, SourceRange, TagIdentifier, UserVal,
|
SketchGroupSet, SketchSurface, SourceRange, TagEngineInfo, TagIdentifier, UserVal,
|
||||||
},
|
},
|
||||||
std::{
|
std::{
|
||||||
utils::{
|
utils::{
|
||||||
@ -26,15 +26,23 @@ use crate::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
/// A tag for a face.
|
/// A tag for a face.
|
||||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, FromStr, Display)]
|
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)]
|
||||||
#[ts(export)]
|
#[ts(export)]
|
||||||
#[serde(rename_all = "snake_case", untagged)]
|
#[serde(rename_all = "snake_case", untagged)]
|
||||||
#[display("{0}")]
|
|
||||||
pub enum FaceTag {
|
pub enum FaceTag {
|
||||||
StartOrEnd(StartOrEnd),
|
StartOrEnd(StartOrEnd),
|
||||||
/// A tag for the face.
|
/// A tag for the face.
|
||||||
#[display("{0}")]
|
Tag(Box<TagIdentifier>),
|
||||||
Tag(TagIdentifier),
|
}
|
||||||
|
|
||||||
|
impl std::fmt::Display for FaceTag {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
match self {
|
||||||
|
FaceTag::Tag(t) => write!(f, "{}", t),
|
||||||
|
FaceTag::StartOrEnd(StartOrEnd::Start) => write!(f, "start"),
|
||||||
|
FaceTag::StartOrEnd(StartOrEnd::End) => write!(f, "end"),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FaceTag {
|
impl FaceTag {
|
||||||
@ -46,7 +54,7 @@ impl FaceTag {
|
|||||||
must_be_planar: bool,
|
must_be_planar: bool,
|
||||||
) -> Result<uuid::Uuid, KclError> {
|
) -> Result<uuid::Uuid, KclError> {
|
||||||
match self {
|
match self {
|
||||||
FaceTag::Tag(ref t) => args.get_adjacent_face_to_tag(extrude_group, t, must_be_planar).await,
|
FaceTag::Tag(ref t) => args.get_adjacent_face_to_tag(t, must_be_planar).await,
|
||||||
FaceTag::StartOrEnd(StartOrEnd::Start) => extrude_group.start_cap_id.ok_or_else(|| {
|
FaceTag::StartOrEnd(StartOrEnd::Start) => extrude_group.start_cap_id.ok_or_else(|| {
|
||||||
KclError::Type(KclErrorDetails {
|
KclError::Type(KclErrorDetails {
|
||||||
message: "Expected a start face".to_string(),
|
message: "Expected a start face".to_string(),
|
||||||
@ -129,16 +137,11 @@ async fn inner_line_to(
|
|||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
let mut new_sketch_group = sketch_group.clone();
|
|
||||||
if let Some(tag) = &tag {
|
|
||||||
new_sketch_group.tags.insert(tag.name.to_string(), tag.into());
|
|
||||||
}
|
|
||||||
|
|
||||||
let current_path = Path::ToPoint {
|
let current_path = Path::ToPoint {
|
||||||
base: BasePath {
|
base: BasePath {
|
||||||
from: from.into(),
|
from: from.into(),
|
||||||
to,
|
to,
|
||||||
tag,
|
tag: tag.clone(),
|
||||||
geo_meta: GeoMeta {
|
geo_meta: GeoMeta {
|
||||||
id,
|
id,
|
||||||
metadata: args.source_range.into(),
|
metadata: args.source_range.into(),
|
||||||
@ -146,6 +149,11 @@ async fn inner_line_to(
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let mut new_sketch_group = sketch_group.clone();
|
||||||
|
if let Some(tag) = &tag {
|
||||||
|
new_sketch_group.add_tag(tag, ¤t_path);
|
||||||
|
}
|
||||||
|
|
||||||
new_sketch_group.value.push(current_path);
|
new_sketch_group.value.push(current_path);
|
||||||
|
|
||||||
Ok(new_sketch_group)
|
Ok(new_sketch_group)
|
||||||
@ -297,16 +305,11 @@ async fn inner_line(
|
|||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
let mut new_sketch_group = sketch_group.clone();
|
|
||||||
if let Some(tag) = &tag {
|
|
||||||
new_sketch_group.tags.insert(tag.name.to_string(), tag.into());
|
|
||||||
}
|
|
||||||
|
|
||||||
let current_path = Path::ToPoint {
|
let current_path = Path::ToPoint {
|
||||||
base: BasePath {
|
base: BasePath {
|
||||||
from: from.into(),
|
from: from.into(),
|
||||||
to,
|
to,
|
||||||
tag,
|
tag: tag.clone(),
|
||||||
geo_meta: GeoMeta {
|
geo_meta: GeoMeta {
|
||||||
id,
|
id,
|
||||||
metadata: args.source_range.into(),
|
metadata: args.source_range.into(),
|
||||||
@ -314,6 +317,11 @@ async fn inner_line(
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let mut new_sketch_group = sketch_group.clone();
|
||||||
|
if let Some(tag) = &tag {
|
||||||
|
new_sketch_group.add_tag(tag, ¤t_path);
|
||||||
|
}
|
||||||
|
|
||||||
new_sketch_group.value.push(current_path);
|
new_sketch_group.value.push(current_path);
|
||||||
|
|
||||||
Ok(new_sketch_group)
|
Ok(new_sketch_group)
|
||||||
@ -481,16 +489,11 @@ async fn inner_angled_line(
|
|||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
let mut new_sketch_group = sketch_group.clone();
|
|
||||||
if let Some(tag) = &tag {
|
|
||||||
new_sketch_group.tags.insert(tag.name.to_string(), tag.into());
|
|
||||||
}
|
|
||||||
|
|
||||||
let current_path = Path::ToPoint {
|
let current_path = Path::ToPoint {
|
||||||
base: BasePath {
|
base: BasePath {
|
||||||
from: from.into(),
|
from: from.into(),
|
||||||
to,
|
to,
|
||||||
tag,
|
tag: tag.clone(),
|
||||||
geo_meta: GeoMeta {
|
geo_meta: GeoMeta {
|
||||||
id,
|
id,
|
||||||
metadata: args.source_range.into(),
|
metadata: args.source_range.into(),
|
||||||
@ -498,6 +501,11 @@ async fn inner_angled_line(
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let mut new_sketch_group = sketch_group.clone();
|
||||||
|
if let Some(tag) = &tag {
|
||||||
|
new_sketch_group.add_tag(tag, ¤t_path);
|
||||||
|
}
|
||||||
|
|
||||||
new_sketch_group.value.push(current_path);
|
new_sketch_group.value.push(current_path);
|
||||||
Ok(new_sketch_group)
|
Ok(new_sketch_group)
|
||||||
}
|
}
|
||||||
@ -730,22 +738,11 @@ async fn inner_angled_line_that_intersects(
|
|||||||
tag: Option<TagDeclarator>,
|
tag: Option<TagDeclarator>,
|
||||||
args: Args,
|
args: Args,
|
||||||
) -> Result<Box<SketchGroup>, KclError> {
|
) -> Result<Box<SketchGroup>, KclError> {
|
||||||
let intersect_path = sketch_group
|
let intersect_path = args.get_tag_engine_info(&data.intersect_tag)?;
|
||||||
.get_path_by_tag(&data.intersect_tag)
|
|
||||||
.ok_or_else(|| {
|
|
||||||
KclError::Type(KclErrorDetails {
|
|
||||||
message: format!(
|
|
||||||
"Expected a line to exist in the given SketchGroup with tag `{}`",
|
|
||||||
data.intersect_tag.value
|
|
||||||
),
|
|
||||||
source_ranges: vec![args.source_range],
|
|
||||||
})
|
|
||||||
})?
|
|
||||||
.get_base();
|
|
||||||
|
|
||||||
let from = sketch_group.current_pen_position()?;
|
let from = sketch_group.current_pen_position()?;
|
||||||
let to = intersection_with_parallel_line(
|
let to = intersection_with_parallel_line(
|
||||||
&[intersect_path.from.into(), intersect_path.to.into()],
|
&[intersect_path.path.from.into(), intersect_path.path.to.into()],
|
||||||
data.offset.unwrap_or_default(),
|
data.offset.unwrap_or_default(),
|
||||||
data.angle,
|
data.angle,
|
||||||
from,
|
from,
|
||||||
@ -1230,13 +1227,20 @@ pub(crate) async fn inner_start_profile_at(
|
|||||||
id: path_id,
|
id: path_id,
|
||||||
on: sketch_surface.clone(),
|
on: sketch_surface.clone(),
|
||||||
value: vec![],
|
value: vec![],
|
||||||
start: current_path,
|
|
||||||
meta: vec![args.source_range.into()],
|
meta: vec![args.source_range.into()],
|
||||||
tags: if let Some(tag) = &tag {
|
tags: if let Some(tag) = &tag {
|
||||||
HashMap::from([(tag.name.to_string(), tag.into())])
|
let mut tag_identifier: TagIdentifier = tag.into();
|
||||||
|
tag_identifier.info = Some(TagEngineInfo {
|
||||||
|
id: current_path.geo_meta.id,
|
||||||
|
sketch_group: path_id,
|
||||||
|
path: current_path.clone(),
|
||||||
|
surface: None,
|
||||||
|
});
|
||||||
|
HashMap::from([(tag.name.to_string(), tag_identifier)])
|
||||||
} else {
|
} else {
|
||||||
Default::default()
|
Default::default()
|
||||||
},
|
},
|
||||||
|
start: current_path,
|
||||||
};
|
};
|
||||||
Ok(Box::new(sketch_group))
|
Ok(Box::new(sketch_group))
|
||||||
}
|
}
|
||||||
@ -1301,7 +1305,7 @@ pub async fn profile_start(args: Args) -> Result<MemoryItem, KclError> {
|
|||||||
/// const sketch001 = startSketchOn('XY')
|
/// const sketch001 = startSketchOn('XY')
|
||||||
/// |> startProfileAt([5, 2], %)
|
/// |> startProfileAt([5, 2], %)
|
||||||
/// |> angledLine({ angle: 120, length: 50 }, %, $seg01)
|
/// |> angledLine({ angle: 120, length: 50 }, %, $seg01)
|
||||||
/// |> angledLine({ angle: segAng(seg01, %) + 120, length: 50 }, %)
|
/// |> angledLine({ angle: segAng(seg01) + 120, length: 50 }, %)
|
||||||
/// |> lineTo(profileStart(%), %)
|
/// |> lineTo(profileStart(%), %)
|
||||||
/// |> close(%)
|
/// |> close(%)
|
||||||
/// |> extrude(20, %)
|
/// |> extrude(20, %)
|
||||||
@ -1370,21 +1374,24 @@ pub(crate) async fn inner_close(
|
|||||||
.await?;
|
.await?;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut new_sketch_group = sketch_group.clone();
|
let current_path = Path::ToPoint {
|
||||||
if let Some(ref tag) = tag {
|
|
||||||
new_sketch_group.tags.insert(tag.name.to_string(), tag.into());
|
|
||||||
}
|
|
||||||
new_sketch_group.value.push(Path::ToPoint {
|
|
||||||
base: BasePath {
|
base: BasePath {
|
||||||
from: from.into(),
|
from: from.into(),
|
||||||
to: to.into(),
|
to: to.into(),
|
||||||
tag,
|
tag: tag.clone(),
|
||||||
geo_meta: GeoMeta {
|
geo_meta: GeoMeta {
|
||||||
id,
|
id,
|
||||||
metadata: args.source_range.into(),
|
metadata: args.source_range.into(),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
};
|
||||||
|
|
||||||
|
let mut new_sketch_group = sketch_group.clone();
|
||||||
|
if let Some(tag) = &tag {
|
||||||
|
new_sketch_group.add_tag(tag, ¤t_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
new_sketch_group.value.push(current_path);
|
||||||
|
|
||||||
Ok(new_sketch_group)
|
Ok(new_sketch_group)
|
||||||
}
|
}
|
||||||
@ -1482,16 +1489,11 @@ pub(crate) async fn inner_arc(
|
|||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
let mut new_sketch_group = sketch_group.clone();
|
|
||||||
if let Some(tag) = &tag {
|
|
||||||
new_sketch_group.tags.insert(tag.name.to_string(), tag.into());
|
|
||||||
}
|
|
||||||
|
|
||||||
let current_path = Path::ToPoint {
|
let current_path = Path::ToPoint {
|
||||||
base: BasePath {
|
base: BasePath {
|
||||||
from: from.into(),
|
from: from.into(),
|
||||||
to: end.into(),
|
to: end.into(),
|
||||||
tag,
|
tag: tag.clone(),
|
||||||
geo_meta: GeoMeta {
|
geo_meta: GeoMeta {
|
||||||
id,
|
id,
|
||||||
metadata: args.source_range.into(),
|
metadata: args.source_range.into(),
|
||||||
@ -1499,6 +1501,11 @@ pub(crate) async fn inner_arc(
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let mut new_sketch_group = sketch_group.clone();
|
||||||
|
if let Some(tag) = &tag {
|
||||||
|
new_sketch_group.add_tag(tag, ¤t_path);
|
||||||
|
}
|
||||||
|
|
||||||
new_sketch_group.value.push(current_path);
|
new_sketch_group.value.push(current_path);
|
||||||
|
|
||||||
Ok(new_sketch_group)
|
Ok(new_sketch_group)
|
||||||
@ -1592,16 +1599,11 @@ async fn inner_tangential_arc(
|
|||||||
|
|
||||||
let to = [from.x + to[0], from.y + to[1]];
|
let to = [from.x + to[0], from.y + to[1]];
|
||||||
|
|
||||||
let mut new_sketch_group = sketch_group.clone();
|
|
||||||
if let Some(tag) = &tag {
|
|
||||||
new_sketch_group.tags.insert(tag.name.to_string(), tag.into());
|
|
||||||
}
|
|
||||||
|
|
||||||
let current_path = Path::TangentialArc {
|
let current_path = Path::TangentialArc {
|
||||||
base: BasePath {
|
base: BasePath {
|
||||||
from: from.into(),
|
from: from.into(),
|
||||||
to,
|
to,
|
||||||
tag,
|
tag: tag.clone(),
|
||||||
geo_meta: GeoMeta {
|
geo_meta: GeoMeta {
|
||||||
id,
|
id,
|
||||||
metadata: args.source_range.into(),
|
metadata: args.source_range.into(),
|
||||||
@ -1609,6 +1611,11 @@ async fn inner_tangential_arc(
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let mut new_sketch_group = sketch_group.clone();
|
||||||
|
if let Some(tag) = &tag {
|
||||||
|
new_sketch_group.add_tag(tag, ¤t_path);
|
||||||
|
}
|
||||||
|
|
||||||
new_sketch_group.value.push(current_path);
|
new_sketch_group.value.push(current_path);
|
||||||
|
|
||||||
Ok(new_sketch_group)
|
Ok(new_sketch_group)
|
||||||
@ -1700,16 +1707,11 @@ async fn inner_tangential_arc_to(
|
|||||||
let id = uuid::Uuid::new_v4();
|
let id = uuid::Uuid::new_v4();
|
||||||
args.batch_modeling_cmd(id, tan_arc_to(&sketch_group, &delta)).await?;
|
args.batch_modeling_cmd(id, tan_arc_to(&sketch_group, &delta)).await?;
|
||||||
|
|
||||||
let mut new_sketch_group = sketch_group.clone();
|
|
||||||
if let Some(tag) = &tag {
|
|
||||||
new_sketch_group.tags.insert(tag.name.to_string(), tag.into());
|
|
||||||
}
|
|
||||||
|
|
||||||
let current_path = Path::TangentialArcTo {
|
let current_path = Path::TangentialArcTo {
|
||||||
base: BasePath {
|
base: BasePath {
|
||||||
from: from.into(),
|
from: from.into(),
|
||||||
to,
|
to,
|
||||||
tag,
|
tag: tag.clone(),
|
||||||
geo_meta: GeoMeta {
|
geo_meta: GeoMeta {
|
||||||
id,
|
id,
|
||||||
metadata: args.source_range.into(),
|
metadata: args.source_range.into(),
|
||||||
@ -1719,6 +1721,11 @@ async fn inner_tangential_arc_to(
|
|||||||
ccw: result.ccw > 0,
|
ccw: result.ccw > 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let mut new_sketch_group = sketch_group.clone();
|
||||||
|
if let Some(tag) = &tag {
|
||||||
|
new_sketch_group.add_tag(tag, ¤t_path);
|
||||||
|
}
|
||||||
|
|
||||||
new_sketch_group.value.push(current_path);
|
new_sketch_group.value.push(current_path);
|
||||||
|
|
||||||
Ok(new_sketch_group)
|
Ok(new_sketch_group)
|
||||||
@ -1805,16 +1812,11 @@ async fn inner_bezier_curve(
|
|||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
let mut new_sketch_group = sketch_group.clone();
|
|
||||||
if let Some(tag) = &tag {
|
|
||||||
new_sketch_group.tags.insert(tag.name.to_string(), tag.into());
|
|
||||||
}
|
|
||||||
|
|
||||||
let current_path = Path::ToPoint {
|
let current_path = Path::ToPoint {
|
||||||
base: BasePath {
|
base: BasePath {
|
||||||
from: from.into(),
|
from: from.into(),
|
||||||
to,
|
to,
|
||||||
tag,
|
tag: tag.clone(),
|
||||||
geo_meta: GeoMeta {
|
geo_meta: GeoMeta {
|
||||||
id,
|
id,
|
||||||
metadata: args.source_range.into(),
|
metadata: args.source_range.into(),
|
||||||
@ -1822,6 +1824,11 @@ async fn inner_bezier_curve(
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let mut new_sketch_group = sketch_group.clone();
|
||||||
|
if let Some(tag) = &tag {
|
||||||
|
new_sketch_group.add_tag(tag, ¤t_path);
|
||||||
|
}
|
||||||
|
|
||||||
new_sketch_group.value.push(current_path);
|
new_sketch_group.value.push(current_path);
|
||||||
|
|
||||||
Ok(new_sketch_group)
|
Ok(new_sketch_group)
|
||||||
@ -1941,16 +1948,18 @@ mod tests {
|
|||||||
|
|
||||||
str_json = serde_json::to_string(&TagIdentifier {
|
str_json = serde_json::to_string(&TagIdentifier {
|
||||||
value: "thing".to_string(),
|
value: "thing".to_string(),
|
||||||
|
info: None,
|
||||||
meta: Default::default(),
|
meta: Default::default(),
|
||||||
})
|
})
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let data: crate::std::sketch::FaceTag = serde_json::from_str(&str_json).unwrap();
|
let data: crate::std::sketch::FaceTag = serde_json::from_str(&str_json).unwrap();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
data,
|
data,
|
||||||
crate::std::sketch::FaceTag::Tag(TagIdentifier {
|
crate::std::sketch::FaceTag::Tag(Box::new(TagIdentifier {
|
||||||
value: "thing".to_string(),
|
value: "thing".to_string(),
|
||||||
|
info: None,
|
||||||
meta: Default::default()
|
meta: Default::default()
|
||||||
})
|
}))
|
||||||
);
|
);
|
||||||
|
|
||||||
str_json = "\"END\"".to_string();
|
str_json = "\"END\"".to_string();
|
||||||
|
@ -7,7 +7,7 @@ use std::{
|
|||||||
|
|
||||||
use futures::stream::TryStreamExt;
|
use futures::stream::TryStreamExt;
|
||||||
use gloo_utils::format::JsValueSerdeExt;
|
use gloo_utils::format::JsValueSerdeExt;
|
||||||
use kcl_lib::{coredump::CoreDump, engine::EngineManager, executor::ExecutorSettings, lint::checks};
|
use kcl_lib::{coredump::CoreDump, engine::EngineManager, executor::ExecutorSettings};
|
||||||
use tower_lsp::{LspService, Server};
|
use tower_lsp::{LspService, Server};
|
||||||
use wasm_bindgen::prelude::*;
|
use wasm_bindgen::prelude::*;
|
||||||
|
|
||||||
@ -66,7 +66,7 @@ pub async fn kcl_lint(program_str: &str) -> Result<JsValue, String> {
|
|||||||
|
|
||||||
let program: kcl_lib::ast::types::Program = serde_json::from_str(program_str).map_err(|e| e.to_string())?;
|
let program: kcl_lib::ast::types::Program = serde_json::from_str(program_str).map_err(|e| e.to_string())?;
|
||||||
let mut findings = vec![];
|
let mut findings = vec![];
|
||||||
for discovered_finding in program.lint(checks::lint_variables).into_iter().flatten() {
|
for discovered_finding in program.lint_all().into_iter().flatten() {
|
||||||
findings.push(discovered_finding);
|
findings.push(discovered_finding);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,74 @@
|
|||||||
|
// A mounting bracket for the Focusrite Scarlett Solo audio interface
|
||||||
|
// This is a bracket that holds an audio device underneath a desk or shelf. The audio device has dimensions of 144mm wide, 80mm length and 45mm depth with fillets of 6mm. This mounting bracket is designed to be 3D printed with PLA material
|
||||||
|
|
||||||
|
|
||||||
|
// define constants in mm
|
||||||
|
const radius = 6.0
|
||||||
|
const width = 144.0
|
||||||
|
const length = 80.0
|
||||||
|
const depth = 45.0
|
||||||
|
const thk = 4
|
||||||
|
const holeDiam = 5
|
||||||
|
const tabLength = 25
|
||||||
|
const tabWidth = 12
|
||||||
|
const tabThk = 4
|
||||||
|
|
||||||
|
// define a rectangular shape func
|
||||||
|
fn rectShape = (pos, w, l) => {
|
||||||
|
const rr = startSketchOn('xy')
|
||||||
|
|> startProfileAt([pos[0] - (w / 2), pos[1] - (l / 2)], %)
|
||||||
|
|> lineTo([pos[0] + w / 2, pos[1] - (l / 2)], %, $edge01)
|
||||||
|
|> lineTo([pos[0] + w / 2, pos[1] + l / 2], %, $edge02)
|
||||||
|
|> lineTo([pos[0] - (w / 2), pos[1] + l / 2], %, $edge03)
|
||||||
|
|> close(%, $edge04)
|
||||||
|
return rr
|
||||||
|
}
|
||||||
|
|
||||||
|
// define the bracket plane
|
||||||
|
const bracketPlane = {
|
||||||
|
plane: {
|
||||||
|
origin: { x: 0, y: length / 2 + thk, z: 0 },
|
||||||
|
x_axis: { x: 1, y: 0, z: 0 },
|
||||||
|
y_axis: { x: 0, y: 0, z: 1 },
|
||||||
|
z_axis: { x: 0, y: -1, z: 0 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// build the bracket sketch around the body
|
||||||
|
fn bracketSketch = (w, d, t) => {
|
||||||
|
const s = startSketchOn(bracketPlane)
|
||||||
|
|> startProfileAt([-w / 2 - t, d + t], %)
|
||||||
|
|> lineTo([-w / 2 - t, -t], %, $edge1)
|
||||||
|
|> lineTo([w / 2 + t, -t], %, $edge2)
|
||||||
|
|> lineTo([w / 2 + t, d + t], %, $edge3)
|
||||||
|
|> lineTo([w / 2, d + t], %, $edge4)
|
||||||
|
|> lineTo([w / 2, 0], %, $edge5)
|
||||||
|
|> lineTo([-w / 2, 0], %, $edge6)
|
||||||
|
|> lineTo([-w / 2, d + t], %, $edge7)
|
||||||
|
|> close(%, $edge8)
|
||||||
|
|> extrude(length + 2 * thk, %)
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
// build the body of the bracket
|
||||||
|
const bs = bracketSketch(width, depth, thk)
|
||||||
|
const bracketBody = bs
|
||||||
|
|> fillet({
|
||||||
|
radius: radius,
|
||||||
|
tags: [
|
||||||
|
getNextAdjacentEdge(bs.sketchGroup.tags.edge7),
|
||||||
|
getNextAdjacentEdge(bs.sketchGroup.tags.edge2),
|
||||||
|
getNextAdjacentEdge(bs.sketchGroup.tags.edge3),
|
||||||
|
getNextAdjacentEdge(bs.sketchGroup.tags.edge6)
|
||||||
|
]
|
||||||
|
}, %)
|
||||||
|
|
||||||
|
|
||||||
|
// sketch on the face
|
||||||
|
const retBack = startSketchOn(bs, bs.sketchGroup.tags.edge4)
|
||||||
|
|> startProfileAt([length / 2 + thk, 0], %)
|
||||||
|
|> line([0, thk], %)
|
||||||
|
|> line([-thk, 0], %)
|
||||||
|
|> line([0, -thk], %)
|
||||||
|
|> close(%)
|
||||||
|
|> extrude(width - 40, %)
|
@ -56,10 +56,10 @@ const bracketBody = bs
|
|||||||
|> fillet({
|
|> fillet({
|
||||||
radius: radius,
|
radius: radius,
|
||||||
tags: [
|
tags: [
|
||||||
getNextAdjacentEdge(bs.tags.edge7, %),
|
getNextAdjacentEdge(bs.tags.edge7),
|
||||||
getNextAdjacentEdge(bs.tags.edge2, %),
|
getNextAdjacentEdge(bs.tags.edge2),
|
||||||
getNextAdjacentEdge(bs.tags.edge3, %),
|
getNextAdjacentEdge(bs.tags.edge3),
|
||||||
getNextAdjacentEdge(bs.tags.edge6, %)
|
getNextAdjacentEdge(bs.tags.edge6)
|
||||||
]
|
]
|
||||||
}, %)
|
}, %)
|
||||||
|
|
||||||
@ -88,8 +88,8 @@ const tabsR = startSketchOn(tabPlane)
|
|||||||
|> fillet({
|
|> fillet({
|
||||||
radius: holeDiam / 2,
|
radius: holeDiam / 2,
|
||||||
tags: [
|
tags: [
|
||||||
getNextAdjacentEdge(edge12, %),
|
getNextAdjacentEdge(edge12),
|
||||||
getNextAdjacentEdge(edge13, %)
|
getNextAdjacentEdge(edge13)
|
||||||
]
|
]
|
||||||
}, %)
|
}, %)
|
||||||
|> patternLinear3d({
|
|> patternLinear3d({
|
||||||
@ -113,8 +113,8 @@ const tabsL = startSketchOn(tabPlane)
|
|||||||
|> fillet({
|
|> fillet({
|
||||||
radius: holeDiam / 2,
|
radius: holeDiam / 2,
|
||||||
tags: [
|
tags: [
|
||||||
getNextAdjacentEdge(edge21, %),
|
getNextAdjacentEdge(edge21),
|
||||||
getNextAdjacentEdge(edge22, %)
|
getNextAdjacentEdge(edge22)
|
||||||
]
|
]
|
||||||
}, %)
|
}, %)
|
||||||
|> patternLinear3d({
|
|> patternLinear3d({
|
||||||
|
@ -18,7 +18,7 @@ fn layer = () => {
|
|||||||
|> extrude(h, %)
|
|> extrude(h, %)
|
||||||
// |> fillet({
|
// |> fillet({
|
||||||
// radius: h / 2.01,
|
// radius: h / 2.01,
|
||||||
// tags: ["tag1", getOppositeEdge(tag1, %)]
|
// tags: [tag1, getOppositeEdge(tag1)]
|
||||||
// }, %)
|
// }, %)
|
||||||
}
|
}
|
||||||
// The vase is 100 layers tall.
|
// The vase is 100 layers tall.
|
||||||
|
@ -24,7 +24,7 @@ const plumbus1 =
|
|||||||
|> extrude(plumbusLen, %)
|
|> extrude(plumbusLen, %)
|
||||||
|> fillet({
|
|> fillet({
|
||||||
radius: 5,
|
radius: 5,
|
||||||
tags: [c1.tags.arc_tag, getOppositeEdge(c1.tags.arc_tag, %)]
|
tags: [c1.tags.arc_tag, getOppositeEdge(c1.tags.arc_tag)]
|
||||||
}, %)
|
}, %)
|
||||||
const c2 = circl(200, a)
|
const c2 = circl(200, a)
|
||||||
const plumbus0 =
|
const plumbus0 =
|
||||||
@ -32,7 +32,7 @@ const plumbus0 =
|
|||||||
|> extrude(plumbusLen, %)
|
|> extrude(plumbusLen, %)
|
||||||
|> fillet({
|
|> fillet({
|
||||||
radius: 5,
|
radius: 5,
|
||||||
tags: [c2.tags.arc_tag, getOppositeEdge(c2.tags.arc_tag, %)]
|
tags: [c2.tags.arc_tag, getOppositeEdge(c2.tags.arc_tag)]
|
||||||
}, %)
|
}, %)
|
||||||
|
|
||||||
|
|
||||||
|
@ -3,12 +3,12 @@ fn rect = (origin) => {
|
|||||||
|> startProfileAt(origin, %)
|
|> startProfileAt(origin, %)
|
||||||
|> angledLine([0, 191.26], %, $rectangleSegmentA001)
|
|> angledLine([0, 191.26], %, $rectangleSegmentA001)
|
||||||
|> angledLine([
|
|> angledLine([
|
||||||
segAng(rectangleSegmentA001, %) - 90,
|
segAng(rectangleSegmentA001) - 90,
|
||||||
196.99
|
196.99
|
||||||
], %, $rectangleSegmentB001)
|
], %, $rectangleSegmentB001)
|
||||||
|> angledLine([
|
|> angledLine([
|
||||||
segAng(rectangleSegmentA001, %),
|
segAng(rectangleSegmentA001),
|
||||||
-segLen(rectangleSegmentA001, %)
|
-segLen(rectangleSegmentA001)
|
||||||
], %, $rectangleSegmentC001)
|
], %, $rectangleSegmentC001)
|
||||||
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
||||||
|> close(%)
|
|> close(%)
|
||||||
|
@ -259,7 +259,7 @@ async fn serial_test_basic_fillet_cube_end() {
|
|||||||
|> line([0, -10], %, $thing2)
|
|> line([0, -10], %, $thing2)
|
||||||
|> close(%)
|
|> close(%)
|
||||||
|> extrude(10, %)
|
|> extrude(10, %)
|
||||||
|> fillet({radius: 2, tags: [thing, getOppositeEdge(thing, %)]}, %)
|
|> fillet({radius: 2, tags: [thing, getOppositeEdge(thing)]}, %)
|
||||||
|
|
||||||
"#;
|
"#;
|
||||||
|
|
||||||
@ -276,7 +276,7 @@ async fn serial_test_basic_fillet_cube_close_opposite() {
|
|||||||
|> line([0, -10], %, $thing2)
|
|> line([0, -10], %, $thing2)
|
||||||
|> close(%, $thing3)
|
|> close(%, $thing3)
|
||||||
|> extrude(10, %)
|
|> extrude(10, %)
|
||||||
|> fillet({radius: 2, tags: [thing3, getOppositeEdge(thing3, %)]}, %)
|
|> fillet({radius: 2, tags: [thing3, getOppositeEdge(thing3)]}, %)
|
||||||
|
|
||||||
"#;
|
"#;
|
||||||
|
|
||||||
@ -297,7 +297,7 @@ async fn serial_test_basic_fillet_cube_next_adjacent() {
|
|||||||
|> line([0, -10], %, $thing2)
|
|> line([0, -10], %, $thing2)
|
||||||
|> close(%, $thing3)
|
|> close(%, $thing3)
|
||||||
|> extrude(10, %)
|
|> extrude(10, %)
|
||||||
|> fillet({radius: 2, tags: [getNextAdjacentEdge(thing3, %)]}, %)
|
|> fillet({radius: 2, tags: [getNextAdjacentEdge(thing3)]}, %)
|
||||||
"#;
|
"#;
|
||||||
|
|
||||||
let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap();
|
let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap();
|
||||||
@ -317,7 +317,7 @@ async fn serial_test_basic_fillet_cube_previous_adjacent() {
|
|||||||
|> line([0, -10], %, $thing2)
|
|> line([0, -10], %, $thing2)
|
||||||
|> close(%, $thing3)
|
|> close(%, $thing3)
|
||||||
|> extrude(10, %)
|
|> extrude(10, %)
|
||||||
|> fillet({radius: 2, tags: [getPreviousAdjacentEdge(thing3, %)]}, %)
|
|> fillet({radius: 2, tags: [getPreviousAdjacentEdge(thing3)]}, %)
|
||||||
"#;
|
"#;
|
||||||
|
|
||||||
let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap();
|
let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap();
|
||||||
@ -380,7 +380,7 @@ async fn serial_test_execute_with_angled_line() {
|
|||||||
|> line([15.1, 2.48], %)
|
|> line([15.1, 2.48], %)
|
||||||
|> line([3.15, -9.85], %, $seg01)
|
|> line([3.15, -9.85], %, $seg01)
|
||||||
|> line([-15.17, -4.1], %)
|
|> line([-15.17, -4.1], %)
|
||||||
|> angledLine([segAng(seg01, %), 12.35], %)
|
|> angledLine([segAng(seg01), 12.35], %)
|
||||||
|> line([-13.02, 10.03], %)
|
|> line([-13.02, 10.03], %)
|
||||||
|> close(%)
|
|> close(%)
|
||||||
|> extrude(4, %)
|
|> extrude(4, %)
|
||||||
@ -1395,10 +1395,10 @@ const part = rectShape([0, 0], 20, 20)
|
|||||||
|> fillet({
|
|> fillet({
|
||||||
radius: 4,
|
radius: 4,
|
||||||
tags: [
|
tags: [
|
||||||
getNextAdjacentEdge(edge1, %),
|
getNextAdjacentEdge(edge1),
|
||||||
getNextAdjacentEdge(edge2, %),
|
getNextAdjacentEdge(edge2),
|
||||||
getNextAdjacentEdge(edge3, %),
|
getNextAdjacentEdge(edge3),
|
||||||
getNextAdjacentEdge(edge4, %)
|
getNextAdjacentEdge(edge4)
|
||||||
]
|
]
|
||||||
}, %)
|
}, %)
|
||||||
"#;
|
"#;
|
||||||
@ -1627,7 +1627,7 @@ const sketch001 = startSketchOn(box, "end")
|
|||||||
|> line([2, 0], %)
|
|> line([2, 0], %)
|
||||||
|> line([0, 10], %)
|
|> line([0, 10], %)
|
||||||
|> close(%)
|
|> close(%)
|
||||||
|> revolve({ axis: getOppositeEdge(revolveAxis, box), angle: 90 }, %)
|
|> revolve({ axis: getOppositeEdge(revolveAxis), angle: 90 }, %)
|
||||||
|
|
||||||
"#;
|
"#;
|
||||||
|
|
||||||
@ -1651,7 +1651,7 @@ const sketch001 = startSketchOn(box, revolveAxis)
|
|||||||
|> line([2, 0], %)
|
|> line([2, 0], %)
|
||||||
|> line([0, 10], %)
|
|> line([0, 10], %)
|
||||||
|> close(%)
|
|> close(%)
|
||||||
|> revolve({ axis: getEdge(revolveAxis, box), angle: 90 }, %)
|
|> revolve({ axis: revolveAxis, angle: 90 }, %)
|
||||||
|
|
||||||
"#;
|
"#;
|
||||||
|
|
||||||
@ -1660,7 +1660,7 @@ const sketch001 = startSketchOn(box, revolveAxis)
|
|||||||
assert!(result.is_err());
|
assert!(result.is_err());
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
result.err().unwrap().to_string(),
|
result.err().unwrap().to_string(),
|
||||||
r#"engine: KclErrorDetails { source_ranges: [SourceRange([346, 404])], message: "Modeling command failed: [ApiError { error_code: InternalEngine, message: \"Solid3D revolve failed: sketch profile must lie entirely on one side of the revolution axis\" }]" }"#
|
r#"engine: KclErrorDetails { source_ranges: [SourceRange([346, 390])], message: "Modeling command failed: [ApiError { error_code: InternalEngine, message: \"Solid3D revolve failed: sketch profile must lie entirely on one side of the revolution axis\" }]" }"#
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1678,7 +1678,7 @@ const sketch001 = startSketchOn(box, "END")
|
|||||||
|> circle([10,10], 4, %)
|
|> circle([10,10], 4, %)
|
||||||
|> revolve({
|
|> revolve({
|
||||||
angle: 90,
|
angle: 90,
|
||||||
axis: getOppositeEdge(revolveAxis, box)
|
axis: getOppositeEdge(revolveAxis)
|
||||||
}, %)
|
}, %)
|
||||||
"#;
|
"#;
|
||||||
|
|
||||||
@ -1804,19 +1804,19 @@ fn pentagon = (len) => {
|
|||||||
|> startProfileAt([-len / 2, -len / 2], %)
|
|> startProfileAt([-len / 2, -len / 2], %)
|
||||||
|> angledLine({ angle: 0, length: len }, %, $a)
|
|> angledLine({ angle: 0, length: len }, %, $a)
|
||||||
|> angledLine({
|
|> angledLine({
|
||||||
angle: segAng(a, %) + 180 - 108,
|
angle: segAng(a) + 180 - 108,
|
||||||
length: len
|
length: len
|
||||||
}, %, $b)
|
}, %, $b)
|
||||||
|> angledLine({
|
|> angledLine({
|
||||||
angle: segAng(b, %) + 180 - 108,
|
angle: segAng(b) + 180 - 108,
|
||||||
length: len
|
length: len
|
||||||
}, %, $c)
|
}, %, $c)
|
||||||
|> angledLine({
|
|> angledLine({
|
||||||
angle: segAng(c, %) + 180 - 108,
|
angle: segAng(c) + 180 - 108,
|
||||||
length: len
|
length: len
|
||||||
}, %, $d)
|
}, %, $d)
|
||||||
|> angledLine({
|
|> angledLine({
|
||||||
angle: segAng(d, %) + 180 - 108,
|
angle: segAng(d) + 180 - 108,
|
||||||
length: len
|
length: len
|
||||||
}, %)
|
}, %)
|
||||||
|
|
||||||
@ -1831,7 +1831,7 @@ const plumbus0 = circle0
|
|||||||
|> extrude(10, %)
|
|> extrude(10, %)
|
||||||
|> fillet({
|
|> fillet({
|
||||||
radius: 0.5,
|
radius: 0.5,
|
||||||
tags: [circle0.tags.arc1, getOppositeEdge(circle0.tags.arc1, %)]
|
tags: [circle0.tags.arc1, getOppositeEdge(circle0.tags.arc1)]
|
||||||
}, %)
|
}, %)
|
||||||
|
|
||||||
const circle1 = make_circle(p, p.sketchGroup.tags.b, [0, 0], 2.5)
|
const circle1 = make_circle(p, p.sketchGroup.tags.b, [0, 0], 2.5)
|
||||||
@ -1839,7 +1839,7 @@ const plumbus1 = circle1
|
|||||||
|> extrude(10, %)
|
|> extrude(10, %)
|
||||||
|> fillet({
|
|> fillet({
|
||||||
radius: 0.5,
|
radius: 0.5,
|
||||||
tags: [circle1.tags.arc1, getOppositeEdge(circle1.tags.arc1, %)]
|
tags: [circle1.tags.arc1, getOppositeEdge(circle1.tags.arc1)]
|
||||||
}, %)
|
}, %)
|
||||||
"#;
|
"#;
|
||||||
|
|
||||||
@ -1922,11 +1922,11 @@ const bracket = startSketchOn('XY')
|
|||||||
|> extrude(width, %)
|
|> extrude(width, %)
|
||||||
|> fillet({
|
|> fillet({
|
||||||
radius: filletR,
|
radius: filletR,
|
||||||
tags: [getNextAdjacentEdge(innerEdge, %)]
|
tags: [getNextAdjacentEdge(innerEdge)]
|
||||||
}, %)
|
}, %)
|
||||||
|> fillet({
|
|> fillet({
|
||||||
radius: filletR + thickness,
|
radius: filletR + thickness,
|
||||||
tags: [getNextAdjacentEdge(outerEdge, %)]
|
tags: [getNextAdjacentEdge(outerEdge)]
|
||||||
}, %)
|
}, %)
|
||||||
"#;
|
"#;
|
||||||
|
|
||||||
@ -1934,7 +1934,7 @@ const bracket = startSketchOn('XY')
|
|||||||
assert!(result.is_err());
|
assert!(result.is_err());
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
result.err().unwrap().to_string(),
|
result.err().unwrap().to_string(),
|
||||||
r#"engine: KclErrorDetails { source_ranges: [SourceRange([1332, 1436])], message: "Modeling command failed: [ApiError { error_code: BadRequest, message: \"Fillet failed\" }]" }"#
|
r#"engine: KclErrorDetails { source_ranges: [SourceRange([1329, 1430])], message: "Modeling command failed: [ApiError { error_code: BadRequest, message: \"Fillet failed\" }]" }"#
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2147,13 +2147,13 @@ const bracket = startSketchOn('XY')
|
|||||||
|> fillet({
|
|> fillet({
|
||||||
radius: filletR,
|
radius: filletR,
|
||||||
tags: [
|
tags: [
|
||||||
getPreviousAdjacentEdge(innerEdge, %)
|
getPreviousAdjacentEdge(innerEdge)
|
||||||
]
|
]
|
||||||
}, %)
|
}, %)
|
||||||
|> fillet({
|
|> fillet({
|
||||||
radius: filletR + thickness,
|
radius: filletR + thickness,
|
||||||
tags: [
|
tags: [
|
||||||
getPreviousAdjacentEdge(outerEdge, %)
|
getPreviousAdjacentEdge(outerEdge)
|
||||||
]
|
]
|
||||||
}, %)
|
}, %)
|
||||||
|
|
||||||
@ -2247,15 +2247,15 @@ const sketch001 = startSketchOn("XZ")
|
|||||||
const baseExtrusion = extrude(width, sketch001)
|
const baseExtrusion = extrude(width, sketch001)
|
||||||
|> fillet({
|
|> fillet({
|
||||||
radius: cornerFilletRad,
|
radius: cornerFilletRad,
|
||||||
tags: [cornerFillet1, cornerFillet2, getOppositeEdge(cornerFillet1, %), getOppositeEdge(cornerFillet2, %)],
|
tags: [cornerFillet1, cornerFillet2, getOppositeEdge(cornerFillet1), getOppositeEdge(cornerFillet2)],
|
||||||
}, %)
|
}, %)
|
||||||
|> fillet({
|
|> fillet({
|
||||||
radius: filletRad,
|
radius: filletRad,
|
||||||
tags: [getPreviousAdjacentEdge(fillet1, %), getPreviousAdjacentEdge(fillet2, %)]
|
tags: [getPreviousAdjacentEdge(fillet1), getPreviousAdjacentEdge(fillet2)]
|
||||||
}, %)
|
}, %)
|
||||||
|> fillet({
|
|> fillet({
|
||||||
radius: filletRad + thickness,
|
radius: filletRad + thickness,
|
||||||
tags: [getNextAdjacentEdge(fillet1, %), getNextAdjacentEdge(fillet2, %)],
|
tags: [getNextAdjacentEdge(fillet1), getNextAdjacentEdge(fillet2)],
|
||||||
}, %)
|
}, %)
|
||||||
"#;
|
"#;
|
||||||
|
|
||||||
@ -2299,15 +2299,15 @@ const sketch001 = startSketchOn("XZ")
|
|||||||
const baseExtrusion = extrude(width, sketch001)
|
const baseExtrusion = extrude(width, sketch001)
|
||||||
|> chamfer({
|
|> chamfer({
|
||||||
length: cornerChamferRad,
|
length: cornerChamferRad,
|
||||||
tags: [cornerChamfer1, cornerChamfer2, getOppositeEdge(cornerChamfer1, %), getOppositeEdge(cornerChamfer2, %)],
|
tags: [cornerChamfer1, cornerChamfer2, getOppositeEdge(cornerChamfer1), getOppositeEdge(cornerChamfer2)],
|
||||||
}, %)
|
}, %)
|
||||||
|> chamfer({
|
|> chamfer({
|
||||||
length: chamferRad,
|
length: chamferRad,
|
||||||
tags: [getPreviousAdjacentEdge(chamfer1, %), getPreviousAdjacentEdge(chamfer2, %)]
|
tags: [getPreviousAdjacentEdge(chamfer1), getPreviousAdjacentEdge(chamfer2)]
|
||||||
}, %)
|
}, %)
|
||||||
|> chamfer({
|
|> chamfer({
|
||||||
length: chamferRad + thickness,
|
length: chamferRad + thickness,
|
||||||
tags: [getNextAdjacentEdge(chamfer1, %), getNextAdjacentEdge(chamfer2, %)],
|
tags: [getNextAdjacentEdge(chamfer1), getNextAdjacentEdge(chamfer2)],
|
||||||
}, %)
|
}, %)
|
||||||
"#;
|
"#;
|
||||||
|
|
||||||
@ -2325,7 +2325,7 @@ async fn serial_test_engine_error_source_range_on_last_command() {
|
|||||||
|> startProfileAt([61.74, 206.13], %)
|
|> startProfileAt([61.74, 206.13], %)
|
||||||
|> xLine(305.11, %, $seg01)
|
|> xLine(305.11, %, $seg01)
|
||||||
|> yLine(-291.85, %)
|
|> yLine(-291.85, %)
|
||||||
|> xLine(-segLen(seg01, %), %)
|
|> xLine(-segLen(seg01), %)
|
||||||
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
||||||
|> close(%)
|
|> close(%)
|
||||||
|> extrude(40.14, %)
|
|> extrude(40.14, %)
|
||||||
@ -2339,7 +2339,7 @@ async fn serial_test_engine_error_source_range_on_last_command() {
|
|||||||
assert!(result.is_err());
|
assert!(result.is_err());
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
result.err().unwrap().to_string(),
|
result.err().unwrap().to_string(),
|
||||||
r#"engine: KclErrorDetails { source_ranges: [SourceRange([259, 315])], message: "Modeling command failed: [ApiError { error_code: InternalEngine, message: \"Invalid brep after shell operation\" }]" }"#
|
r#"engine: KclErrorDetails { source_ranges: [SourceRange([256, 312])], message: "Modeling command failed: [ApiError { error_code: InternalEngine, message: \"Invalid brep after shell operation\" }]" }"#
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2359,7 +2359,7 @@ const part001 = cube([0,0], 20)
|
|||||||
|> extrude(20, %)
|
|> extrude(20, %)
|
||||||
|> fillet({
|
|> fillet({
|
||||||
radius: 10,
|
radius: 10,
|
||||||
tags: [getOppositeEdge(line1,%)]
|
tags: [getOppositeEdge(line1)]
|
||||||
}, %)
|
}, %)
|
||||||
|
|
||||||
const pattn1 = patternLinear3d({
|
const pattn1 = patternLinear3d({
|
||||||
@ -2394,7 +2394,7 @@ const part001 = cube([0,0], 20)
|
|||||||
|> extrude(20, %)
|
|> extrude(20, %)
|
||||||
|> fillet({
|
|> fillet({
|
||||||
radius: 10,
|
radius: 10,
|
||||||
tags: [getOppositeEdge(line1,%)]
|
tags: [getOppositeEdge(line1)]
|
||||||
}, %)
|
}, %)
|
||||||
|
|
||||||
const pattn2 = patternCircular3d({axis: [0,0, 1], center: [-20, -20, -20], repetitions: 4, arcDegrees: 360, rotateDuplicates: false}, part001)
|
const pattn2 = patternCircular3d({axis: [0,0, 1], center: [-20, -20, -20], repetitions: 4, arcDegrees: 360, rotateDuplicates: false}, part001)
|
||||||
@ -2425,7 +2425,7 @@ const part001 = cube([0,0], 20)
|
|||||||
|> extrude(20, %)
|
|> extrude(20, %)
|
||||||
|> chamfer({
|
|> chamfer({
|
||||||
length: 10,
|
length: 10,
|
||||||
tags: [getOppositeEdge(line1,%)]
|
tags: [getOppositeEdge(line1)]
|
||||||
}, %)
|
}, %)
|
||||||
|
|
||||||
const pattn2 = patternCircular3d({axis: [0,0, 1], center: [-20, -20, -20], repetitions: 4, arcDegrees: 360, rotateDuplicates: false}, part001)
|
const pattn2 = patternCircular3d({axis: [0,0, 1], center: [-20, -20, -20], repetitions: 4, arcDegrees: 360, rotateDuplicates: false}, part001)
|
||||||
@ -2456,7 +2456,7 @@ const part001 = cube([0,0], 20)
|
|||||||
|> extrude(20, %)
|
|> extrude(20, %)
|
||||||
|> chamfer({
|
|> chamfer({
|
||||||
length: 10,
|
length: 10,
|
||||||
tags: [line1, getOppositeEdge(line1,%)]
|
tags: [line1, getOppositeEdge(line1)]
|
||||||
}, %, $chamfer1)
|
}, %, $chamfer1)
|
||||||
|
|
||||||
|
|
||||||
@ -2466,7 +2466,7 @@ const part001 = cube([0,0], 20)
|
|||||||
assert!(result.is_err());
|
assert!(result.is_err());
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
result.err().unwrap().to_string(),
|
result.err().unwrap().to_string(),
|
||||||
r#"type: KclErrorDetails { source_ranges: [SourceRange([271, 359])], message: "You can only tag one edge at a time with a tagged chamfer. Either delete the tag for the chamfer fn if you don't need it OR separate into individual chamfer functions for each tag." }"#
|
r#"type: KclErrorDetails { source_ranges: [SourceRange([271, 357])], message: "You can only tag one edge at a time with a tagged chamfer. Either delete the tag for the chamfer fn if you don't need it OR separate into individual chamfer functions for each tag." }"#
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2483,12 +2483,12 @@ async fn serial_test_sketch_on_face_of_chamfer() {
|
|||||||
return sg
|
return sg
|
||||||
}
|
}
|
||||||
const part001 = cube([0,0], 20)
|
const part001 = cube([0,0], 20)
|
||||||
|> close(%, 'line1')
|
|> close(%, $line1)
|
||||||
|> extrude(20, %)
|
|> extrude(20, %)
|
||||||
|> chamfer({
|
|> chamfer({
|
||||||
length: 10,
|
length: 10,
|
||||||
tags: [getOppositeEdge('line1',%)]
|
tags: [getOppositeEdge(line1)]
|
||||||
}, %, 'chamfer1')
|
}, %, $chamfer1)
|
||||||
|
|
||||||
const sketch001 = startSketchOn(part001, 'chamfer1')
|
const sketch001 = startSketchOn(part001, 'chamfer1')
|
||||||
|> startProfileAt([4.28, 3.83], %)
|
|> startProfileAt([4.28, 3.83], %)
|
||||||
@ -2515,11 +2515,11 @@ async fn serial_test_duplicate_tags_should_error() {
|
|||||||
|> startProfileAt([-len / 2, -len / 2], %)
|
|> startProfileAt([-len / 2, -len / 2], %)
|
||||||
|> angledLine({ angle: 0, length: len }, %, $a)
|
|> angledLine({ angle: 0, length: len }, %, $a)
|
||||||
|> angledLine({
|
|> angledLine({
|
||||||
angle: segAng(a, %) + 120,
|
angle: segAng(a) + 120,
|
||||||
length: len
|
length: len
|
||||||
}, %, $b)
|
}, %, $b)
|
||||||
|> angledLine({
|
|> angledLine({
|
||||||
angle: segAng(b, %) + 120,
|
angle: segAng(b) + 120,
|
||||||
length: len
|
length: len
|
||||||
}, %, $a)
|
}, %, $a)
|
||||||
}
|
}
|
||||||
@ -2531,7 +2531,7 @@ let p = triangle(200)
|
|||||||
assert!(result.is_err());
|
assert!(result.is_err());
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
result.err().unwrap().to_string(),
|
result.err().unwrap().to_string(),
|
||||||
r#"value already defined: KclErrorDetails { source_ranges: [SourceRange([317, 319]), SourceRange([332, 345])], message: "Cannot redefine `a`" }"#
|
r#"value already defined: KclErrorDetails { source_ranges: [SourceRange([311, 313]), SourceRange([326, 339])], message: "Cannot redefine `a`" }"#
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2542,6 +2542,17 @@ async fn serial_test_global_tags() {
|
|||||||
twenty_twenty::assert_image("tests/executor/outputs/global_tags.png", &result, MIN_DIFF);
|
twenty_twenty::assert_image("tests/executor/outputs/global_tags.png", &result, MIN_DIFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test(flavor = "multi_thread")]
|
||||||
|
async fn serial_test_extrude_inside_fn_with_tags() {
|
||||||
|
let code = include_str!("inputs/extrude-inside-fn-with-tags.kcl");
|
||||||
|
let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap();
|
||||||
|
twenty_twenty::assert_image(
|
||||||
|
"tests/executor/outputs/extrude-inside-fn-with-tags.png",
|
||||||
|
&result,
|
||||||
|
MIN_DIFF,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::test(flavor = "multi_thread")]
|
#[tokio::test(flavor = "multi_thread")]
|
||||||
async fn serial_test_pattern_vase() {
|
async fn serial_test_pattern_vase() {
|
||||||
let code = include_str!("inputs/pattern_vase.kcl");
|
let code = include_str!("inputs/pattern_vase.kcl");
|
||||||
|
Binary file not shown.
After Width: | Height: | Size: 120 KiB |
Reference in New Issue
Block a user