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
|
||||
angleToMatchLengthX(segment_name: TagIdentifier, to: number, sketch_group: SketchGroup) -> number
|
||||
angleToMatchLengthX(tag: TagIdentifier, to: number, sketch_group: SketchGroup) -> number
|
||||
```
|
||||
|
||||
### Examples
|
||||
@ -28,9 +28,63 @@ const extrusion = extrude(5, sketch001)
|
||||
|
||||
### Arguments
|
||||
|
||||
* `segment_name`: `TagIdentifier` (REQUIRED)
|
||||
* `tag`: `TagIdentifier` (REQUIRED)
|
||||
```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,
|
||||
}
|
||||
```
|
||||
|
@ -9,7 +9,7 @@ Returns the angle to match the given length for y.
|
||||
|
||||
|
||||
```js
|
||||
angleToMatchLengthY(segment_name: TagIdentifier, to: number, sketch_group: SketchGroup) -> number
|
||||
angleToMatchLengthY(tag: TagIdentifier, to: number, sketch_group: SketchGroup) -> number
|
||||
```
|
||||
|
||||
### Examples
|
||||
@ -32,9 +32,63 @@ const extrusion = extrude(5, sketch001)
|
||||
|
||||
### Arguments
|
||||
|
||||
* `segment_name`: `TagIdentifier` (REQUIRED)
|
||||
* `tag`: `TagIdentifier` (REQUIRED)
|
||||
```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,
|
||||
}
|
||||
```
|
||||
|
@ -41,6 +41,60 @@ const example = extrude(10, exampleSketch)
|
||||
angle: number,
|
||||
// The tag of the line to intersect with.
|
||||
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,
|
||||
},
|
||||
// The offset from the intersecting line.
|
||||
|
@ -31,10 +31,10 @@ const mountingPlate = extrude(thickness, mountingPlateSketch)
|
||||
|> chamfer({
|
||||
length: chamferLength,
|
||||
tags: [
|
||||
getNextAdjacentEdge(edge1, %),
|
||||
getNextAdjacentEdge(edge2, %),
|
||||
getNextAdjacentEdge(edge3, %),
|
||||
getNextAdjacentEdge(edge4, %)
|
||||
getNextAdjacentEdge(edge1),
|
||||
getNextAdjacentEdge(edge2),
|
||||
getNextAdjacentEdge(edge3),
|
||||
getNextAdjacentEdge(edge4)
|
||||
]
|
||||
}, %)
|
||||
```
|
||||
@ -51,6 +51,60 @@ const mountingPlate = extrude(thickness, mountingPlateSketch)
|
||||
// The tags of the paths you want to chamfer.
|
||||
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,
|
||||
}],
|
||||
}
|
||||
|
@ -31,10 +31,10 @@ const mountingPlate = extrude(thickness, mountingPlateSketch)
|
||||
|> fillet({
|
||||
radius: filletRadius,
|
||||
tags: [
|
||||
getNextAdjacentEdge(edge1, %),
|
||||
getNextAdjacentEdge(edge2, %),
|
||||
getNextAdjacentEdge(edge3, %),
|
||||
getNextAdjacentEdge(edge4, %)
|
||||
getNextAdjacentEdge(edge1),
|
||||
getNextAdjacentEdge(edge2),
|
||||
getNextAdjacentEdge(edge3),
|
||||
getNextAdjacentEdge(edge4)
|
||||
]
|
||||
}, %)
|
||||
```
|
||||
@ -51,6 +51,60 @@ const mountingPlate = extrude(thickness, mountingPlateSketch)
|
||||
// The tags of the paths you want to fillet.
|
||||
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,
|
||||
}],
|
||||
}
|
||||
|
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
|
||||
getNextAdjacentEdge(tag: TagIdentifier, extrude_group: ExtrudeGroup) -> Uuid
|
||||
getNextAdjacentEdge(tag: TagIdentifier) -> Uuid
|
||||
```
|
||||
|
||||
### Examples
|
||||
@ -27,7 +27,7 @@ const exampleSketch = startSketchOn('XZ')
|
||||
const example = extrude(5, exampleSketch)
|
||||
|> fillet({
|
||||
radius: 3,
|
||||
tags: [getNextAdjacentEdge(referenceEdge, %)]
|
||||
tags: [getNextAdjacentEdge(referenceEdge)]
|
||||
}, %)
|
||||
```
|
||||
|
||||
@ -38,115 +38,28 @@ const example = extrude(5, exampleSketch)
|
||||
* `tag`: `TagIdentifier` (REQUIRED)
|
||||
```js
|
||||
{
|
||||
value: string,
|
||||
}
|
||||
```
|
||||
* `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.
|
||||
// Engine information for a tag.
|
||||
info: {
|
||||
// The id of the tagged object.
|
||||
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,
|
||||
// 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,
|
||||
},
|
||||
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: {
|
||||
// The id of the plane.
|
||||
id: uuid,
|
||||
// Origin of the plane.
|
||||
origin: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
// The to point.
|
||||
to: [number, 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: SketchGroup,
|
||||
// The id of the extrusion start cap
|
||||
startCapId: uuid,
|
||||
// The extrude surfaces.
|
||||
value: [{
|
||||
// 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.
|
||||
@ -177,180 +90,9 @@ const example = extrude(5, exampleSketch)
|
||||
value: string,
|
||||
},
|
||||
type: "extrudeArc",
|
||||
}],
|
||||
},
|
||||
// The id of the face.
|
||||
id: uuid,
|
||||
type: "face",
|
||||
// The tag of the face.
|
||||
},
|
||||
value: string,
|
||||
// What should the face’s X axis be?
|
||||
xAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
// What should the face’s Y axis be?
|
||||
yAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
// The z-axis (normal).
|
||||
zAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
},
|
||||
// The starting path.
|
||||
start: {
|
||||
// The from point.
|
||||
from: [number, number],
|
||||
// The tag of the path.
|
||||
tag: {
|
||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||
end: number,
|
||||
start: number,
|
||||
value: string,
|
||||
},
|
||||
// The to point.
|
||||
to: [number, number],
|
||||
},
|
||||
// Tag identifiers that have been declared in this sketch group.
|
||||
tags: {
|
||||
},
|
||||
// The paths in the sketch group.
|
||||
value: [{
|
||||
// The from point.
|
||||
from: [number, number],
|
||||
// The tag of the path.
|
||||
tag: {
|
||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||
end: number,
|
||||
start: number,
|
||||
value: string,
|
||||
},
|
||||
// The to point.
|
||||
to: [number, number],
|
||||
type: "ToPoint",
|
||||
} |
|
||||
{
|
||||
// arc's direction
|
||||
ccw: 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
|
||||
getOppositeEdge(tag: TagIdentifier, extrude_group: ExtrudeGroup) -> Uuid
|
||||
getOppositeEdge(tag: TagIdentifier) -> Uuid
|
||||
```
|
||||
|
||||
### Examples
|
||||
@ -27,7 +27,7 @@ const exampleSketch = startSketchOn('XZ')
|
||||
const example = extrude(5, exampleSketch)
|
||||
|> fillet({
|
||||
radius: 3,
|
||||
tags: [getOppositeEdge(referenceEdge, %)]
|
||||
tags: [getOppositeEdge(referenceEdge)]
|
||||
}, %)
|
||||
```
|
||||
|
||||
@ -38,115 +38,28 @@ const example = extrude(5, exampleSketch)
|
||||
* `tag`: `TagIdentifier` (REQUIRED)
|
||||
```js
|
||||
{
|
||||
value: string,
|
||||
}
|
||||
```
|
||||
* `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.
|
||||
// Engine information for a tag.
|
||||
info: {
|
||||
// The id of the tagged object.
|
||||
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,
|
||||
// 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,
|
||||
},
|
||||
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: {
|
||||
// The id of the plane.
|
||||
id: uuid,
|
||||
// Origin of the plane.
|
||||
origin: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
// The to point.
|
||||
to: [number, 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: SketchGroup,
|
||||
// The id of the extrusion start cap
|
||||
startCapId: uuid,
|
||||
// The extrude surfaces.
|
||||
value: [{
|
||||
// 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.
|
||||
@ -177,180 +90,9 @@ const example = extrude(5, exampleSketch)
|
||||
value: string,
|
||||
},
|
||||
type: "extrudeArc",
|
||||
}],
|
||||
},
|
||||
// The id of the face.
|
||||
id: uuid,
|
||||
type: "face",
|
||||
// The tag of the face.
|
||||
},
|
||||
value: string,
|
||||
// What should the face’s X axis be?
|
||||
xAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
// What should the face’s Y axis be?
|
||||
yAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
// The z-axis (normal).
|
||||
zAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
},
|
||||
// The starting path.
|
||||
start: {
|
||||
// The from point.
|
||||
from: [number, number],
|
||||
// The tag of the path.
|
||||
tag: {
|
||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||
end: number,
|
||||
start: number,
|
||||
value: string,
|
||||
},
|
||||
// The to point.
|
||||
to: [number, number],
|
||||
},
|
||||
// Tag identifiers that have been declared in this sketch group.
|
||||
tags: {
|
||||
},
|
||||
// The paths in the sketch group.
|
||||
value: [{
|
||||
// The from point.
|
||||
from: [number, number],
|
||||
// The tag of the path.
|
||||
tag: {
|
||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||
end: number,
|
||||
start: number,
|
||||
value: string,
|
||||
},
|
||||
// The to point.
|
||||
to: [number, number],
|
||||
type: "ToPoint",
|
||||
} |
|
||||
{
|
||||
// arc's direction
|
||||
ccw: 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
|
||||
getPreviousAdjacentEdge(tag: TagIdentifier, extrude_group: ExtrudeGroup) -> Uuid
|
||||
getPreviousAdjacentEdge(tag: TagIdentifier) -> Uuid
|
||||
```
|
||||
|
||||
### Examples
|
||||
@ -27,9 +27,7 @@ const exampleSketch = startSketchOn('XZ')
|
||||
const example = extrude(5, exampleSketch)
|
||||
|> fillet({
|
||||
radius: 3,
|
||||
tags: [
|
||||
getPreviousAdjacentEdge(referenceEdge, %)
|
||||
]
|
||||
tags: [getPreviousAdjacentEdge(referenceEdge)]
|
||||
}, %)
|
||||
```
|
||||
|
||||
@ -40,115 +38,28 @@ const example = extrude(5, exampleSketch)
|
||||
* `tag`: `TagIdentifier` (REQUIRED)
|
||||
```js
|
||||
{
|
||||
value: string,
|
||||
}
|
||||
```
|
||||
* `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.
|
||||
// Engine information for a tag.
|
||||
info: {
|
||||
// The id of the tagged object.
|
||||
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,
|
||||
// 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,
|
||||
},
|
||||
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: {
|
||||
// The id of the plane.
|
||||
id: uuid,
|
||||
// Origin of the plane.
|
||||
origin: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
// The to point.
|
||||
to: [number, 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: SketchGroup,
|
||||
// The id of the extrusion start cap
|
||||
startCapId: uuid,
|
||||
// The extrude surfaces.
|
||||
value: [{
|
||||
// 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.
|
||||
@ -179,180 +90,9 @@ const example = extrude(5, exampleSketch)
|
||||
value: string,
|
||||
},
|
||||
type: "extrudeArc",
|
||||
}],
|
||||
},
|
||||
// The id of the face.
|
||||
id: uuid,
|
||||
type: "face",
|
||||
// The tag of the face.
|
||||
},
|
||||
value: string,
|
||||
// What should the face’s X axis be?
|
||||
xAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
// What should the face’s Y axis be?
|
||||
yAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
// The z-axis (normal).
|
||||
zAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
},
|
||||
// The starting path.
|
||||
start: {
|
||||
// The from point.
|
||||
from: [number, number],
|
||||
// The tag of the path.
|
||||
tag: {
|
||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||
end: number,
|
||||
start: number,
|
||||
value: string,
|
||||
},
|
||||
// The to point.
|
||||
to: [number, number],
|
||||
},
|
||||
// Tag identifiers that have been declared in this sketch group.
|
||||
tags: {
|
||||
},
|
||||
// The paths in the sketch group.
|
||||
value: [{
|
||||
// The from point.
|
||||
from: [number, number],
|
||||
// The tag of the path.
|
||||
tag: {
|
||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||
end: number,
|
||||
start: number,
|
||||
value: string,
|
||||
},
|
||||
// The to point.
|
||||
to: [number, number],
|
||||
type: "ToPoint",
|
||||
} |
|
||||
{
|
||||
// arc's direction
|
||||
ccw: 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)
|
||||
* [`fillet`](kcl/fillet)
|
||||
* [`floor`](kcl/floor)
|
||||
* [`getEdge`](kcl/getEdge)
|
||||
* [`getNextAdjacentEdge`](kcl/getNextAdjacentEdge)
|
||||
* [`getOppositeEdge`](kcl/getOppositeEdge)
|
||||
* [`getPreviousAdjacentEdge`](kcl/getPreviousAdjacentEdge)
|
||||
|
@ -19,7 +19,7 @@ const sketch001 = startSketchOn('XY')
|
||||
|> startProfileAt([5, 2], %)
|
||||
|> angledLine({ angle: 120, length: 50 }, %, $seg01)
|
||||
|> angledLine({
|
||||
angle: segAng(seg01, %) + 120,
|
||||
angle: segAng(seg01) + 120,
|
||||
length: 50
|
||||
}, %)
|
||||
|> lineTo(profileStart(%), %)
|
||||
|
@ -107,7 +107,7 @@ const sketch001 = startSketchOn(box, "END")
|
||||
|> circle([10, 10], 4, %)
|
||||
|> revolve({
|
||||
angle: 90,
|
||||
axis: getOppositeEdge(revolveAxis, box)
|
||||
axis: getOppositeEdge(revolveAxis)
|
||||
}, %)
|
||||
```
|
||||
|
||||
@ -157,6 +157,60 @@ const part001 = revolve({
|
||||
} |
|
||||
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,
|
||||
},
|
||||
}
|
||||
|
@ -9,7 +9,7 @@ Returns the angle of the segment.
|
||||
|
||||
|
||||
```js
|
||||
segAng(segment_name: TagIdentifier, sketch_group: SketchGroup) -> number
|
||||
segAng(tag: TagIdentifier) -> number
|
||||
```
|
||||
|
||||
### Examples
|
||||
@ -20,9 +20,9 @@ const exampleSketch = startSketchOn('XZ')
|
||||
|> line([10, 0], %)
|
||||
|> line([5, 10], %, $seg01)
|
||||
|> line([-10, 0], %)
|
||||
|> angledLine([segAng(seg01, %), 10], %)
|
||||
|> angledLine([segAng(seg01), 10], %)
|
||||
|> line([-10, 0], %)
|
||||
|> angledLine([segAng(seg01, %), -15], %)
|
||||
|> angledLine([segAng(seg01), -15], %)
|
||||
|> close(%)
|
||||
|
||||
const example = extrude(4, exampleSketch)
|
||||
@ -32,89 +32,15 @@ const example = extrude(4, exampleSketch)
|
||||
|
||||
### Arguments
|
||||
|
||||
* `segment_name`: `TagIdentifier` (REQUIRED)
|
||||
* `tag`: `TagIdentifier` (REQUIRED)
|
||||
```js
|
||||
{
|
||||
value: string,
|
||||
}
|
||||
```
|
||||
* `sketch_group`: `SketchGroup` - A sketch group is a collection of paths. (REQUIRED)
|
||||
```js
|
||||
{
|
||||
// The id of the sketch group.
|
||||
// Engine information for a tag.
|
||||
info: {
|
||||
// The id of the tagged object.
|
||||
id: uuid,
|
||||
// What the sketch is on (can be a plane or a face).
|
||||
on: {
|
||||
// The id of the plane.
|
||||
id: uuid,
|
||||
// Origin of the plane.
|
||||
origin: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
type: "plane",
|
||||
// Type for a plane.
|
||||
value: "XY" | "XZ" | "YZ" | "Custom",
|
||||
// What should the plane’s X axis be?
|
||||
xAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
// What should the plane’s Y axis be?
|
||||
yAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
// The z-axis (normal).
|
||||
zAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
} |
|
||||
{
|
||||
// The extrude group the face is on.
|
||||
extrudeGroup: {
|
||||
// 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 path the tag is on.
|
||||
path: {
|
||||
// The from point.
|
||||
from: [number, number],
|
||||
// The tag of the path.
|
||||
@ -127,109 +53,10 @@ const example = extrude(4, exampleSketch)
|
||||
// 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 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.
|
||||
@ -260,144 +87,9 @@ const example = extrude(4, exampleSketch)
|
||||
value: string,
|
||||
},
|
||||
type: "extrudeArc",
|
||||
}],
|
||||
},
|
||||
// The id of the face.
|
||||
id: uuid,
|
||||
type: "face",
|
||||
// The tag of the face.
|
||||
},
|
||||
value: string,
|
||||
// What should the face’s X axis be?
|
||||
xAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
// What should the face’s Y axis be?
|
||||
yAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
// The z-axis (normal).
|
||||
zAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
},
|
||||
// The starting path.
|
||||
start: {
|
||||
// The from point.
|
||||
from: [number, number],
|
||||
// The tag of the path.
|
||||
tag: {
|
||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||
end: number,
|
||||
start: number,
|
||||
value: string,
|
||||
},
|
||||
// The to point.
|
||||
to: [number, number],
|
||||
},
|
||||
// Tag identifiers that have been declared in this sketch group.
|
||||
tags: {
|
||||
},
|
||||
// The paths in the sketch group.
|
||||
value: [{
|
||||
// The from point.
|
||||
from: [number, number],
|
||||
// The tag of the path.
|
||||
tag: {
|
||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||
end: number,
|
||||
start: number,
|
||||
value: string,
|
||||
},
|
||||
// The to point.
|
||||
to: [number, number],
|
||||
type: "ToPoint",
|
||||
} |
|
||||
{
|
||||
// arc's direction
|
||||
ccw: 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
|
||||
segEndX(segment_name: TagIdentifier, sketch_group: SketchGroup) -> number
|
||||
segEndX(tag: TagIdentifier) -> number
|
||||
```
|
||||
|
||||
### Examples
|
||||
@ -19,7 +19,7 @@ const exampleSketch = startSketchOn('XZ')
|
||||
|> startProfileAt([0, 0], %)
|
||||
|> line([20, 0], %, $thing)
|
||||
|> line([0, 5], %)
|
||||
|> line([segEndX(thing, %), 0], %)
|
||||
|> line([segEndX(thing), 0], %)
|
||||
|> line([-20, 10], %)
|
||||
|> close(%)
|
||||
|
||||
@ -30,89 +30,15 @@ const example = extrude(5, exampleSketch)
|
||||
|
||||
### Arguments
|
||||
|
||||
* `segment_name`: `TagIdentifier` (REQUIRED)
|
||||
* `tag`: `TagIdentifier` (REQUIRED)
|
||||
```js
|
||||
{
|
||||
value: string,
|
||||
}
|
||||
```
|
||||
* `sketch_group`: `SketchGroup` - A sketch group is a collection of paths. (REQUIRED)
|
||||
```js
|
||||
{
|
||||
// The id of the sketch group.
|
||||
// Engine information for a tag.
|
||||
info: {
|
||||
// The id of the tagged object.
|
||||
id: uuid,
|
||||
// What the sketch is on (can be a plane or a face).
|
||||
on: {
|
||||
// The id of the plane.
|
||||
id: uuid,
|
||||
// Origin of the plane.
|
||||
origin: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
type: "plane",
|
||||
// Type for a plane.
|
||||
value: "XY" | "XZ" | "YZ" | "Custom",
|
||||
// What should the plane’s X axis be?
|
||||
xAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
// What should the plane’s Y axis be?
|
||||
yAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
// The z-axis (normal).
|
||||
zAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
} |
|
||||
{
|
||||
// The extrude group the face is on.
|
||||
extrudeGroup: {
|
||||
// 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 path the tag is on.
|
||||
path: {
|
||||
// The from point.
|
||||
from: [number, number],
|
||||
// The tag of the path.
|
||||
@ -125,109 +51,10 @@ const example = extrude(5, exampleSketch)
|
||||
// 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 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.
|
||||
@ -258,144 +85,9 @@ const example = extrude(5, exampleSketch)
|
||||
value: string,
|
||||
},
|
||||
type: "extrudeArc",
|
||||
}],
|
||||
},
|
||||
// The id of the face.
|
||||
id: uuid,
|
||||
type: "face",
|
||||
// The tag of the face.
|
||||
},
|
||||
value: string,
|
||||
// What should the face’s X axis be?
|
||||
xAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
// What should the face’s Y axis be?
|
||||
yAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
// The z-axis (normal).
|
||||
zAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
},
|
||||
// The starting path.
|
||||
start: {
|
||||
// The from point.
|
||||
from: [number, number],
|
||||
// The tag of the path.
|
||||
tag: {
|
||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||
end: number,
|
||||
start: number,
|
||||
value: string,
|
||||
},
|
||||
// The to point.
|
||||
to: [number, number],
|
||||
},
|
||||
// Tag identifiers that have been declared in this sketch group.
|
||||
tags: {
|
||||
},
|
||||
// The paths in the sketch group.
|
||||
value: [{
|
||||
// The from point.
|
||||
from: [number, number],
|
||||
// The tag of the path.
|
||||
tag: {
|
||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||
end: number,
|
||||
start: number,
|
||||
value: string,
|
||||
},
|
||||
// The to point.
|
||||
to: [number, number],
|
||||
type: "ToPoint",
|
||||
} |
|
||||
{
|
||||
// arc's direction
|
||||
ccw: 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
|
||||
segEndY(segment_name: TagIdentifier, sketch_group: SketchGroup) -> number
|
||||
segEndY(tag: TagIdentifier) -> number
|
||||
```
|
||||
|
||||
### Examples
|
||||
@ -20,7 +20,7 @@ const exampleSketch = startSketchOn('XZ')
|
||||
|> line([20, 0], %)
|
||||
|> line([0, 3], %, $thing)
|
||||
|> line([-10, 0], %)
|
||||
|> line([0, segEndY(thing, %)], %)
|
||||
|> line([0, segEndY(thing)], %)
|
||||
|> line([-10, 0], %)
|
||||
|> close(%)
|
||||
|
||||
@ -31,89 +31,15 @@ const example = extrude(5, exampleSketch)
|
||||
|
||||
### Arguments
|
||||
|
||||
* `segment_name`: `TagIdentifier` (REQUIRED)
|
||||
* `tag`: `TagIdentifier` (REQUIRED)
|
||||
```js
|
||||
{
|
||||
value: string,
|
||||
}
|
||||
```
|
||||
* `sketch_group`: `SketchGroup` - A sketch group is a collection of paths. (REQUIRED)
|
||||
```js
|
||||
{
|
||||
// The id of the sketch group.
|
||||
// Engine information for a tag.
|
||||
info: {
|
||||
// The id of the tagged object.
|
||||
id: uuid,
|
||||
// What the sketch is on (can be a plane or a face).
|
||||
on: {
|
||||
// The id of the plane.
|
||||
id: uuid,
|
||||
// Origin of the plane.
|
||||
origin: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
type: "plane",
|
||||
// Type for a plane.
|
||||
value: "XY" | "XZ" | "YZ" | "Custom",
|
||||
// What should the plane’s X axis be?
|
||||
xAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
// What should the plane’s Y axis be?
|
||||
yAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
// The z-axis (normal).
|
||||
zAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
} |
|
||||
{
|
||||
// The extrude group the face is on.
|
||||
extrudeGroup: {
|
||||
// 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 path the tag is on.
|
||||
path: {
|
||||
// The from point.
|
||||
from: [number, number],
|
||||
// The tag of the path.
|
||||
@ -126,109 +52,10 @@ const example = extrude(5, exampleSketch)
|
||||
// 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 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.
|
||||
@ -259,144 +86,9 @@ const example = extrude(5, exampleSketch)
|
||||
value: string,
|
||||
},
|
||||
type: "extrudeArc",
|
||||
}],
|
||||
},
|
||||
// The id of the face.
|
||||
id: uuid,
|
||||
type: "face",
|
||||
// The tag of the face.
|
||||
},
|
||||
value: string,
|
||||
// What should the face’s X axis be?
|
||||
xAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
// What should the face’s Y axis be?
|
||||
yAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
// The z-axis (normal).
|
||||
zAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
},
|
||||
// The starting path.
|
||||
start: {
|
||||
// The from point.
|
||||
from: [number, number],
|
||||
// The tag of the path.
|
||||
tag: {
|
||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||
end: number,
|
||||
start: number,
|
||||
value: string,
|
||||
},
|
||||
// The to point.
|
||||
to: [number, number],
|
||||
},
|
||||
// Tag identifiers that have been declared in this sketch group.
|
||||
tags: {
|
||||
},
|
||||
// The paths in the sketch group.
|
||||
value: [{
|
||||
// The from point.
|
||||
from: [number, number],
|
||||
// The tag of the path.
|
||||
tag: {
|
||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||
end: number,
|
||||
start: number,
|
||||
value: string,
|
||||
},
|
||||
// The to point.
|
||||
to: [number, number],
|
||||
type: "ToPoint",
|
||||
} |
|
||||
{
|
||||
// arc's direction
|
||||
ccw: 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
|
||||
segLen(segment_name: TagIdentifier, sketch_group: SketchGroup) -> number
|
||||
segLen(tag: TagIdentifier) -> number
|
||||
```
|
||||
|
||||
### Examples
|
||||
@ -19,7 +19,7 @@ const exampleSketch = startSketchOn("XZ")
|
||||
|> startProfileAt([0, 0], %)
|
||||
|> angledLine({ angle: 60, length: 10 }, %, $thing)
|
||||
|> tangentialArc({ offset: -120, radius: 5 }, %)
|
||||
|> angledLine({ angle: -60, length: segLen(thing, %) }, %)
|
||||
|> angledLine({ angle: -60, length: segLen(thing) }, %)
|
||||
|> close(%)
|
||||
|
||||
const example = extrude(5, exampleSketch)
|
||||
@ -29,89 +29,15 @@ const example = extrude(5, exampleSketch)
|
||||
|
||||
### Arguments
|
||||
|
||||
* `segment_name`: `TagIdentifier` (REQUIRED)
|
||||
* `tag`: `TagIdentifier` (REQUIRED)
|
||||
```js
|
||||
{
|
||||
value: string,
|
||||
}
|
||||
```
|
||||
* `sketch_group`: `SketchGroup` - A sketch group is a collection of paths. (REQUIRED)
|
||||
```js
|
||||
{
|
||||
// The id of the sketch group.
|
||||
// Engine information for a tag.
|
||||
info: {
|
||||
// The id of the tagged object.
|
||||
id: uuid,
|
||||
// What the sketch is on (can be a plane or a face).
|
||||
on: {
|
||||
// The id of the plane.
|
||||
id: uuid,
|
||||
// Origin of the plane.
|
||||
origin: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
type: "plane",
|
||||
// Type for a plane.
|
||||
value: "XY" | "XZ" | "YZ" | "Custom",
|
||||
// What should the plane’s X axis be?
|
||||
xAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
// What should the plane’s Y axis be?
|
||||
yAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
// The z-axis (normal).
|
||||
zAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
} |
|
||||
{
|
||||
// The extrude group the face is on.
|
||||
extrudeGroup: {
|
||||
// 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 path the tag is on.
|
||||
path: {
|
||||
// The from point.
|
||||
from: [number, number],
|
||||
// The tag of the path.
|
||||
@ -124,109 +50,10 @@ const example = extrude(5, exampleSketch)
|
||||
// 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 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.
|
||||
@ -257,144 +84,9 @@ const example = extrude(5, exampleSketch)
|
||||
value: string,
|
||||
},
|
||||
type: "extrudeArc",
|
||||
}],
|
||||
},
|
||||
// The id of the face.
|
||||
id: uuid,
|
||||
type: "face",
|
||||
// The tag of the face.
|
||||
},
|
||||
value: string,
|
||||
// What should the face’s X axis be?
|
||||
xAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
// What should the face’s Y axis be?
|
||||
yAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
// The z-axis (normal).
|
||||
zAxis: {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
},
|
||||
},
|
||||
// The starting path.
|
||||
start: {
|
||||
// The from point.
|
||||
from: [number, number],
|
||||
// The tag of the path.
|
||||
tag: {
|
||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||
end: number,
|
||||
start: number,
|
||||
value: string,
|
||||
},
|
||||
// The to point.
|
||||
to: [number, number],
|
||||
},
|
||||
// Tag identifiers that have been declared in this sketch group.
|
||||
tags: {
|
||||
},
|
||||
// The paths in the sketch group.
|
||||
value: [{
|
||||
// The from point.
|
||||
from: [number, number],
|
||||
// The tag of the path.
|
||||
tag: {
|
||||
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
|
||||
end: number,
|
||||
start: number,
|
||||
value: string,
|
||||
},
|
||||
// The to point.
|
||||
to: [number, number],
|
||||
type: "ToPoint",
|
||||
} |
|
||||
{
|
||||
// arc's direction
|
||||
ccw: 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.
|
||||
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,
|
||||
}],
|
||||
// The thickness of the shell.
|
||||
|
@ -407,6 +407,60 @@ const a1 = startSketchOn({
|
||||
```js
|
||||
"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,
|
||||
}
|
||||
```
|
||||
|
52730
docs/kcl/std.json
52730
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}, %)
|
||||
|> line([${commonPoints.num1}, 0], %, $seg01)
|
||||
|> line([0, ${commonPoints.num1 + 0.01}], %)
|
||||
|> angledLine([180, segLen(seg01, %)], %)`)
|
||||
|> angledLine([180, segLen(seg01)], %)`)
|
||||
}
|
||||
|
||||
test.describe('Basic sketch', () => {
|
||||
@ -1027,7 +1027,7 @@ test.describe('Editor tests', () => {
|
||||
|> line([0, -10], %)
|
||||
|> close(%)
|
||||
|> revolve({
|
||||
axis: getEdge(revolveAxis, box),
|
||||
axis: revolveAxis,
|
||||
angle: 90
|
||||
}, %)
|
||||
`
|
||||
@ -3169,7 +3169,7 @@ const extrude001 = extrude(10, sketch001)`
|
||||
},
|
||||
{
|
||||
pos: [816, 244],
|
||||
expectedCode: 'angledLine([segAng(seg01, %), yo], %)',
|
||||
expectedCode: 'angledLine([segAng(seg01), yo], %)',
|
||||
},
|
||||
{
|
||||
pos: [1107, 161],
|
||||
@ -4923,13 +4923,13 @@ const part001 = startSketchOn('XZ')
|
||||
|> startProfileAt([-7.54, -26.74], %)
|
||||
|> line([74.36, 130.4], %, $seg01)
|
||||
|> line([78.92, -120.11], %)
|
||||
|> angledLine([segAng(seg01, %), yo], %)
|
||||
|> angledLine([segAng(seg01), yo], %)
|
||||
|> line([41.19, 28.97 + 5], %)
|
||||
const part002 = startSketchOn('XZ')
|
||||
|> startProfileAt([299.05, 231.45], %)
|
||||
|> xLine(-425.34, %, $seg_what)
|
||||
|> yLine(-264.06, %)
|
||||
|> xLine(segLen(seg_what, %), %)
|
||||
|> xLine(segLen(seg_what), %)
|
||||
|> lineTo([profileStartX(%), profileStartY(%)], %)`
|
||||
)
|
||||
})
|
||||
@ -4981,13 +4981,13 @@ const part001 = startSketchOn('XZ')
|
||||
|> startProfileAt([-7.54, -26.74], %)
|
||||
|> line([74.36, 130.4], %, $seg01)
|
||||
|> line([78.92, -120.11], %)
|
||||
|> angledLine([segAng(seg01, %), 78.33], %)
|
||||
|> angledLine([segAng(seg01), 78.33], %)
|
||||
|> line([41.19, 28.97], %)
|
||||
const part002 = startSketchOn('XZ')
|
||||
|> startProfileAt([299.05, 231.45], %)
|
||||
|> xLine(-425.34, %, $seg_what)
|
||||
|> yLine(-264.06, %)
|
||||
|> xLine(segLen(seg_what, %), %)
|
||||
|> xLine(segLen(seg_what), %)
|
||||
|> lineTo([profileStartX(%), profileStartY(%)], %)`
|
||||
)
|
||||
})
|
||||
@ -5052,22 +5052,22 @@ const part002 = startSketchOn('XZ')
|
||||
{
|
||||
testName: 'Add variable',
|
||||
constraint: 'horizontal distance',
|
||||
value: 'segEndX(seg01, %) + xDis001, 61.34',
|
||||
value: 'segEndX(seg01) + xDis001, 61.34',
|
||||
},
|
||||
{
|
||||
testName: 'No variable',
|
||||
constraint: 'horizontal distance',
|
||||
value: 'segEndX(seg01, %) + 88.08, 61.34',
|
||||
value: 'segEndX(seg01) + 88.08, 61.34',
|
||||
},
|
||||
{
|
||||
testName: 'Add variable',
|
||||
constraint: 'vertical distance',
|
||||
value: '154.9, segEndY(seg01, %) - yDis001',
|
||||
value: '154.9, segEndY(seg01) - yDis001',
|
||||
},
|
||||
{
|
||||
testName: 'No variable',
|
||||
constraint: 'vertical distance',
|
||||
value: '154.9, segEndY(seg01, %) - 42.32',
|
||||
value: '154.9, segEndY(seg01) - 42.32',
|
||||
},
|
||||
] as const
|
||||
for (const { testName, value, constraint } of cases) {
|
||||
@ -5086,7 +5086,7 @@ const part002 = startSketchOn('XZ')
|
||||
|> startProfileAt([299.05, 231.45], %)
|
||||
|> xLine(-425.34, %, $seg_what)
|
||||
|> yLine(-264.06, %)
|
||||
|> xLine(segLen(seg_what, %), %)
|
||||
|> xLine(segLen(seg_what), %)
|
||||
|> lineTo([profileStartX(%), profileStartY(%)], %)`
|
||||
)
|
||||
})
|
||||
@ -5192,7 +5192,7 @@ const part002 = startSketchOn('XZ')
|
||||
|> startProfileAt([299.05, 231.45], %)
|
||||
|> xLine(-425.34, %, $seg_what)
|
||||
|> yLine(-264.06, %)
|
||||
|> xLine(segLen(seg_what, %), %)
|
||||
|> xLine(segLen(seg_what), %)
|
||||
|> lineTo([profileStartX(%), profileStartY(%)], %)`
|
||||
)
|
||||
})
|
||||
@ -5262,13 +5262,13 @@ const part002 = startSketchOn('XZ')
|
||||
testName: 'Add variable',
|
||||
addVariable: true,
|
||||
axisSelect: false,
|
||||
value: 'segAng(seg01, %) + angle001',
|
||||
value: 'segAng(seg01) + angle001',
|
||||
},
|
||||
{
|
||||
testName: 'No variable',
|
||||
addVariable: false,
|
||||
axisSelect: false,
|
||||
value: 'segAng(seg01, %) + 22.69',
|
||||
value: 'segAng(seg01) + 22.69',
|
||||
},
|
||||
{
|
||||
testName: 'Add variable, selecting axis',
|
||||
@ -5299,7 +5299,7 @@ const part002 = startSketchOn('XZ')
|
||||
|> startProfileAt([299.05, 231.45], %)
|
||||
|> xLine(-425.34, %, $seg_what)
|
||||
|> yLine(-264.06, %)
|
||||
|> xLine(segLen(seg_what, %), %)
|
||||
|> xLine(segLen(seg_what), %)
|
||||
|> lineTo([profileStartX(%), profileStartY(%)], %)`
|
||||
)
|
||||
})
|
||||
@ -5409,7 +5409,7 @@ const part002 = startSketchOn('XZ')
|
||||
|> startProfileAt([299.05, 231.45], %)
|
||||
|> xLine(-425.34, %, $seg_what)
|
||||
|> yLine(-264.06, %)
|
||||
|> xLine(segLen(seg_what, %), %)
|
||||
|> xLine(segLen(seg_what), %)
|
||||
|> lineTo([profileStartX(%), profileStartY(%)], %)`
|
||||
)
|
||||
})
|
||||
@ -5485,7 +5485,7 @@ const part002 = startSketchOn('XZ')
|
||||
|> startProfileAt([299.05, 231.45], %)
|
||||
|> xLine(-425.34, %, $seg_what)
|
||||
|> yLine(-264.06, %)
|
||||
|> xLine(segLen(seg_what, %), %)
|
||||
|> xLine(segLen(seg_what), %)
|
||||
|> lineTo([profileStartX(%), profileStartY(%)], %)`
|
||||
)
|
||||
})
|
||||
@ -5550,19 +5550,19 @@ const part002 = startSketchOn('XZ')
|
||||
test.describe('Two segment - no modal constraints', () => {
|
||||
const cases = [
|
||||
{
|
||||
codeAfter: `|> angledLine([83, segLen(seg01, %)], %)`,
|
||||
codeAfter: `|> angledLine([83, segLen(seg01)], %)`,
|
||||
constraintName: 'Equal Length',
|
||||
},
|
||||
{
|
||||
codeAfter: `|> angledLine([segAng(seg01, %), 78.33], %)`,
|
||||
codeAfter: `|> angledLine([segAng(seg01), 78.33], %)`,
|
||||
constraintName: 'Parallel',
|
||||
},
|
||||
{
|
||||
codeAfter: `|> lineTo([segEndX(seg01, %), 61.34], %)`,
|
||||
codeAfter: `|> lineTo([segEndX(seg01), 61.34], %)`,
|
||||
constraintName: 'Vertically Align',
|
||||
},
|
||||
{
|
||||
codeAfter: `|> lineTo([154.9, segEndY(seg01, %)], %)`,
|
||||
codeAfter: `|> lineTo([154.9, segEndY(seg01)], %)`,
|
||||
constraintName: 'Horizontally Align',
|
||||
},
|
||||
] as const
|
||||
@ -5581,7 +5581,7 @@ const part002 = startSketchOn('XZ')
|
||||
|> startProfileAt([299.05, 231.45], %)
|
||||
|> xLine(-425.34, %, $seg_what)
|
||||
|> yLine(-264.06, %)
|
||||
|> xLine(segLen(seg_what, %), %)
|
||||
|> xLine(segLen(seg_what), %)
|
||||
|> lineTo([profileStartX(%), profileStartY(%)], %)`
|
||||
)
|
||||
})
|
||||
@ -5658,7 +5658,7 @@ const part002 = startSketchOn('XZ')
|
||||
|> startProfileAt([299.05, 231.45], %)
|
||||
|> xLine(-425.34, %, $seg_what)
|
||||
|> yLine(-264.06, %)
|
||||
|> xLine(segLen(seg_what, %), %)
|
||||
|> xLine(segLen(seg_what), %)
|
||||
|> lineTo([profileStartX(%), profileStartY(%)], %)`
|
||||
)
|
||||
})
|
||||
@ -6826,8 +6826,8 @@ const part001 = startSketchOn('XZ')
|
||||
|> startProfileAt([5, 6], %)
|
||||
|> ${lineToBeDeleted}
|
||||
|> line([-10, -15], %)
|
||||
|> angledLine([-176, segLen(seg01, %)], %)
|
||||
${extraLine ? 'const myVar = segLen(seg01, part001)' : ''}`
|
||||
|> angledLine([-176, segLen(seg01)], %)
|
||||
${extraLine ? 'const myVar = segLen(seg01)' : ''}`
|
||||
)
|
||||
},
|
||||
{
|
||||
@ -6986,7 +6986,7 @@ ${extraLine ? 'const myVar = segLen(seg01, part001)' : ''}`
|
||||
|> startProfileAt([5, 6], %)
|
||||
|> ${lineToBeDeleted}
|
||||
|> line([-10, -15], %)
|
||||
|> angledLine([-176, segLen(seg01, %)], %)`
|
||||
|> angledLine([-176, segLen(seg01)], %)`
|
||||
)
|
||||
},
|
||||
{
|
||||
@ -7561,19 +7561,19 @@ const part001 = startSketchOn('-XZ')
|
||||
offset: -armThick,
|
||||
intersectTag: seg04
|
||||
}, %)
|
||||
|> angledLineToY([segAng(seg04, %) + 180, ZERO], %)
|
||||
|> angledLineToY([segAng(seg04) + 180, ZERO], %)
|
||||
|> angledLineToY({
|
||||
angle: -bottomAng,
|
||||
to: -totalHeightHalf - armThick,
|
||||
}, %, $seg02)
|
||||
|> xLineTo(segEndX(seg03, %) + 0, %)
|
||||
|> yLine(-segLen(seg01, %), %)
|
||||
|> xLineTo(segEndX(seg03) + 0, %)
|
||||
|> yLine(-segLen(seg01), %)
|
||||
|> angledLineThatIntersects({
|
||||
angle: HALF_TURN,
|
||||
offset: -armThick,
|
||||
intersectTag: seg02
|
||||
}, %)
|
||||
|> angledLineToY([segAng(seg02, %) + 180, -baseHeight], %)
|
||||
|> angledLineToY([segAng(seg02) + 180, -baseHeight], %)
|
||||
|> xLineTo(ZERO, %)
|
||||
|> close(%)
|
||||
|> extrude(4, %)`
|
||||
|
@ -64,27 +64,27 @@ const part001 = startSketchOn('-XZ')
|
||||
|> angledLineToY({
|
||||
angle: topAng,
|
||||
to: totalHeightHalf,
|
||||
}, %, 'seg04')
|
||||
|> xLineTo(totalLen, %, 'seg03')
|
||||
|> yLine(-armThick, %, 'seg01')
|
||||
}, %, $seg04)
|
||||
|> xLineTo(totalLen, %, $seg03')
|
||||
|> yLine(-armThick, %, $seg01)
|
||||
|> angledLineThatIntersects({
|
||||
angle: HALF_TURN,
|
||||
offset: -armThick,
|
||||
intersectTag: 'seg04'
|
||||
intersectTag: seg04
|
||||
}, %)
|
||||
|> angledLineToY([segAng('seg04', %) + 180, ZERO], %)
|
||||
|> angledLineToY([segAng(seg04, %) + 180, ZERO], %)
|
||||
|> angledLineToY({
|
||||
angle: -bottomAng,
|
||||
to: -totalHeightHalf - armThick,
|
||||
}, %, 'seg02')
|
||||
|> xLineTo(segEndX('seg03', %) + 0, %)
|
||||
|> yLine(-segLen('seg01', %), %)
|
||||
}, %, $seg02)
|
||||
|> xLineTo(segEndX(seg03, %) + 0, %)
|
||||
|> yLine(-segLen(seg01, %), %)
|
||||
|> angledLineThatIntersects({
|
||||
angle: HALF_TURN,
|
||||
offset: -armThick,
|
||||
intersectTag: 'seg02'
|
||||
intersectTag: seg02
|
||||
}, %)
|
||||
|> angledLineToY([segAng('seg02', %) + 180, -baseHeight], %)
|
||||
|> angledLineToY([segAng(seg02, %) + 180, -baseHeight], %)
|
||||
|> xLineTo(ZERO, %)
|
||||
|> close(%)
|
||||
|> extrude(4, %)`
|
||||
|
@ -1968,7 +1968,7 @@ describe('testing nested call expressions', () => {
|
||||
})
|
||||
|
||||
describe('should recognise callExpresions in binaryExpressions', () => {
|
||||
const code = 'xLineTo(segEndX(seg02, %) + 1, %)'
|
||||
const code = 'xLineTo(segEndX(seg02) + 1, %)'
|
||||
it('should recognise the callExp', () => {
|
||||
const ast = parse(code)
|
||||
if (err(ast)) throw ast
|
||||
@ -1979,12 +1979,12 @@ describe('should recognise callExpresions in binaryExpressions', () => {
|
||||
type: 'BinaryExpression',
|
||||
operator: '+',
|
||||
start: 8,
|
||||
end: 29,
|
||||
end: 26,
|
||||
digest: null,
|
||||
left: {
|
||||
type: 'CallExpression',
|
||||
start: 8,
|
||||
end: 25,
|
||||
end: 22,
|
||||
digest: null,
|
||||
callee: {
|
||||
type: 'Identifier',
|
||||
@ -2001,7 +2001,6 @@ describe('should recognise callExpresions in binaryExpressions', () => {
|
||||
name: 'seg02',
|
||||
digest: null,
|
||||
},
|
||||
{ type: 'PipeSubstitution', start: 23, end: 24, digest: null },
|
||||
],
|
||||
optional: false,
|
||||
},
|
||||
@ -2009,12 +2008,12 @@ describe('should recognise callExpresions in binaryExpressions', () => {
|
||||
type: 'Literal',
|
||||
value: 1,
|
||||
raw: '1',
|
||||
start: 28,
|
||||
end: 29,
|
||||
start: 25,
|
||||
end: 26,
|
||||
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',
|
||||
value: 'p',
|
||||
info: expect.any(Object),
|
||||
},
|
||||
},
|
||||
value: [
|
||||
@ -288,6 +289,7 @@ const sk2 = startSketchOn('XY')
|
||||
],
|
||||
type: 'TagIdentifier',
|
||||
value: 'o',
|
||||
info: expect.any(Object),
|
||||
},
|
||||
},
|
||||
value: [
|
||||
|
@ -166,6 +166,7 @@ const newVar = myVar + 1`
|
||||
],
|
||||
type: 'TagIdentifier',
|
||||
value: 'myPath',
|
||||
info: expect.any(Object),
|
||||
},
|
||||
},
|
||||
value: [
|
||||
@ -369,19 +370,19 @@ describe('testing math operators', () => {
|
||||
` |> startProfileAt([0, 0], %)`,
|
||||
` |> line([3, 4], %, $seg01)`,
|
||||
` |> line([`,
|
||||
` min(segLen(seg01, %), myVar),`,
|
||||
` -legLen(segLen(seg01, %), myVar)`,
|
||||
` min(segLen(seg01), myVar),`,
|
||||
` -legLen(segLen(seg01), myVar)`,
|
||||
`], %)`,
|
||||
``,
|
||||
].join('\n')
|
||||
const mem = await exe(code)
|
||||
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]?.to).toEqual([6, 0])
|
||||
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 removedUnaryExpMemSketch = removedUnaryExpMem.get('part001')
|
||||
|
@ -495,10 +495,10 @@ describe('Testing deleteSegmentFromPipeExpression', () => {
|
||||
|> startProfileAt([54.78, -95.91], %)
|
||||
|> line([306.21, 198.82], %, $b)
|
||||
${!replace1 ? ` |> ${line}\n` : ''} |> angledLine([-65, ${
|
||||
!replace1 ? 'segLen(a, %)' : replace1
|
||||
!replace1 ? 'segLen(a)' : replace1
|
||||
}], %)
|
||||
|> line([306.21, 198.87], %)
|
||||
|> angledLine([65, ${!replace2 ? 'segAng(a, %)' : replace2}], %)
|
||||
|> angledLine([65, ${!replace2 ? 'segAng(a)' : replace2}], %)
|
||||
|> line([-963.39, -154.67], %)
|
||||
`
|
||||
test.each([
|
||||
@ -753,7 +753,7 @@ const sketch002 = startSketchOn(extrude001, seg01)
|
||||
|> startProfileAt([-12.55, 2.89], %)
|
||||
|> line([3.02, 1.9], %)
|
||||
|> line([1.82, -1.49], %, $seg02)
|
||||
|> angledLine([-86, segLen(seg02, %)], %)
|
||||
|> angledLine([-86, segLen(seg02)], %)
|
||||
|> line([-3.97, -0.53], %)
|
||||
|> line([0.3, 0.84], %)
|
||||
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
||||
@ -780,7 +780,7 @@ const sketch002 = startSketchOn({
|
||||
|> startProfileAt([-12.55, 2.89], %)
|
||||
|> line([3.02, 1.9], %)
|
||||
|> line([1.82, -1.49], %, $seg02)
|
||||
|> angledLine([-86, segLen(seg02, %)], %)
|
||||
|> angledLine([-86, segLen(seg02)], %)
|
||||
|> line([-3.97, -0.53], %)
|
||||
|> line([0.3, 0.84], %)
|
||||
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
||||
@ -809,7 +809,7 @@ const sketch002 = startSketchOn(extrude001, seg01)
|
||||
|> startProfileAt([-12.55, 2.89], %)
|
||||
|> line([3.02, 1.9], %)
|
||||
|> line([1.82, -1.49], %, $seg02)
|
||||
|> angledLine([-86, segLen(seg02, %)], %)
|
||||
|> angledLine([-86, segLen(seg02)], %)
|
||||
|> line([-3.97, -0.53], %)
|
||||
|> line([0.3, 0.84], %)
|
||||
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
||||
@ -836,7 +836,7 @@ const sketch002 = startSketchOn({
|
||||
|> startProfileAt([-12.55, 2.89], %)
|
||||
|> line([3.02, 1.9], %)
|
||||
|> line([1.82, -1.49], %, $seg02)
|
||||
|> angledLine([-86, segLen(seg02, %)], %)
|
||||
|> angledLine([-86, segLen(seg02)], %)
|
||||
|> line([-3.97, -0.53], %)
|
||||
|> line([0.3, 0.84], %)
|
||||
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
||||
|
@ -254,9 +254,9 @@ const extrude001 = extrude(-5, sketch001)
|
||||
|> fillet({
|
||||
radius: 1.11,
|
||||
tags: [
|
||||
getOppositeEdge(seg01, %),
|
||||
getOppositeEdge(seg01),
|
||||
seg01,
|
||||
getPreviousAdjacentEdge(seg02, %)
|
||||
getPreviousAdjacentEdge(seg02)
|
||||
]
|
||||
}, %)
|
||||
`
|
||||
|
@ -275,7 +275,7 @@ const part001 = startSketchAt([-1.41, 3.46])
|
||||
|> line([19.49, 1.16], %, $seg01)
|
||||
|> angledLine([-35, length001], %)
|
||||
|> line([-3.22, -7.36], %)
|
||||
|> angledLine([-175, segLen(seg01, %)], %)
|
||||
|> angledLine([-175, segLen(seg01)], %)
|
||||
|> close(%)
|
||||
`
|
||||
const ast = parse(exampleCode)
|
||||
@ -294,7 +294,7 @@ const part001 = startSketchAt([-1.41, 3.46])
|
||||
|> line([19.49, 1.16], %, $seg01)
|
||||
|> angledLine([-35, length001], %)
|
||||
|> line([-3.22, -7.36], %)
|
||||
|> angledLine([-175, segLen(seg01, %)], %)
|
||||
|> angledLine([-175, segLen(seg01)], %)
|
||||
|> close(%)
|
||||
|> extrude(1, %)
|
||||
`
|
||||
@ -314,7 +314,7 @@ const part001 = startSketchAt([-1.41, 3.46])
|
||||
|> line([19.49, 1.16], %, $seg01)
|
||||
|> angledLine([-35, length001], %)
|
||||
|> line([-3.22, -7.36], %)
|
||||
|> angledLine([-175, segLen(seg01, %)], %)
|
||||
|> angledLine([-175, segLen(seg01)], %)
|
||||
`
|
||||
const ast = parse(exampleCode)
|
||||
if (err(ast)) throw ast
|
||||
@ -347,7 +347,7 @@ const part001 = startSketchAt([-1.41, 3.46])
|
||||
|> line([19.49, 1.16], %, $seg01)
|
||||
|> angledLine([-35, length001], %)
|
||||
|> line([-3.22, -7.36], %)
|
||||
|> angledLine([-175, segLen(seg01, %)], %)`
|
||||
|> angledLine([-175, segLen(seg01)], %)`
|
||||
const ast = parse(exampleCode)
|
||||
if (err(ast)) throw ast
|
||||
|
||||
@ -365,7 +365,7 @@ const part001 = startSketchAt([-1.41, 3.46])
|
||||
|> line([19.49, 1.16], %, $seg01)
|
||||
|> angledLine([-35, length001], %)
|
||||
|> line([-3.22, -7.36], %)
|
||||
|> angledLine([-175, segLen(seg01, %)], %)
|
||||
|> angledLine([-175, segLen(seg01)], %)
|
||||
|> extrude(1, %)`
|
||||
const ast = parse(exampleCode)
|
||||
if (err(ast)) throw ast
|
||||
@ -398,9 +398,9 @@ describe('Testing findUsesOfTagInPipe', () => {
|
||||
|> startProfileAt([68.12, 156.65], %)
|
||||
|> line([306.21, 198.82], %)
|
||||
|> line([306.21, 198.85], %, $seg01)
|
||||
|> angledLine([-65, segLen(seg01, %)], %)
|
||||
|> angledLine([-65, segLen(seg01)], %)
|
||||
|> line([306.21, 198.87], %)
|
||||
|> angledLine([65, segLen(seg01, %)], %)`
|
||||
|> angledLine([65, segLen(seg01)], %)`
|
||||
it('finds the current segment', async () => {
|
||||
const ast = parse(exampleCode)
|
||||
if (err(ast)) throw ast
|
||||
|
@ -148,61 +148,61 @@ const part001 = startSketchOn('XY')
|
||||
-angleToMatchLengthY(seg01, myVar, %),
|
||||
myVar
|
||||
], %) // ln-lineTo-yAbsolute should use angleToMatchLengthY helper
|
||||
|> angledLine([45, segLen(seg01, %)], %) // ln-lineTo-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([45, segLen(seg01)], %) // ln-lineTo-free should become angledLine
|
||||
|> angledLine([45, segLen(seg01)], %) // ln-angledLineToX-free should become angledLine
|
||||
|> angledLine([myAng, segLen(seg01)], %) // ln-angledLineToX-angle should become angledLine
|
||||
|> angledLineToX([
|
||||
angleToMatchLengthX(seg01, myVar2, %),
|
||||
myVar2
|
||||
], %) // ln-angledLineToX-xAbsolute should use angleToMatchLengthX to get angle
|
||||
|> angledLine([-45, segLen(seg01, %)], %) // ln-angledLineToY-free should become angledLine
|
||||
|> angledLine([myAng2, segLen(seg01, %)], %) // ln-angledLineToY-angle should become angledLine
|
||||
|> angledLine([-45, segLen(seg01)], %) // ln-angledLineToY-free should become angledLine
|
||||
|> angledLine([myAng2, segLen(seg01)], %) // ln-angledLineToY-angle should become angledLine
|
||||
|> angledLineToY([
|
||||
angleToMatchLengthY(seg01, myVar3, %),
|
||||
myVar3
|
||||
], %) // ln-angledLineToY-yAbsolute should use angleToMatchLengthY to get angle
|
||||
|> line([
|
||||
min(segLen(seg01, %), myVar),
|
||||
legLen(segLen(seg01, %), myVar)
|
||||
min(segLen(seg01), myVar),
|
||||
legLen(segLen(seg01), myVar)
|
||||
], %) // ln-should use legLen for y
|
||||
|> line([
|
||||
min(segLen(seg01, %), myVar),
|
||||
-legLen(segLen(seg01, %), myVar)
|
||||
min(segLen(seg01), myVar),
|
||||
-legLen(segLen(seg01), myVar)
|
||||
], %) // ln-legLen but negative
|
||||
|> angledLine([-112, segLen(seg01, %)], %) // ln-should become angledLine
|
||||
|> angledLine([myVar, segLen(seg01, %)], %) // ln-use segLen for second arg
|
||||
|> angledLine([45, segLen(seg01, %)], %) // ln-segLen again
|
||||
|> angledLine([54, segLen(seg01, %)], %) // ln-should be transformed to angledLine
|
||||
|> angledLine([-112, segLen(seg01)], %) // ln-should become angledLine
|
||||
|> angledLine([myVar, segLen(seg01)], %) // ln-use segLen for second arg
|
||||
|> angledLine([45, segLen(seg01)], %) // ln-segLen again
|
||||
|> angledLine([54, segLen(seg01)], %) // ln-should be transformed to angledLine
|
||||
|> angledLineOfXLength([
|
||||
legAngX(segLen(seg01, %), myVar),
|
||||
min(segLen(seg01, %), myVar)
|
||||
legAngX(segLen(seg01), myVar),
|
||||
min(segLen(seg01), myVar)
|
||||
], %) // ln-should use legAngX to calculate angle
|
||||
|> angledLineOfXLength([
|
||||
180 + legAngX(segLen(seg01, %), myVar),
|
||||
min(segLen(seg01, %), myVar)
|
||||
180 + legAngX(segLen(seg01), myVar),
|
||||
min(segLen(seg01), myVar)
|
||||
], %) // ln-same as above but should have + 180 to match original quadrant
|
||||
|> line([
|
||||
legLen(segLen(seg01, %), myVar),
|
||||
min(segLen(seg01, %), myVar)
|
||||
legLen(segLen(seg01), myVar),
|
||||
min(segLen(seg01), myVar)
|
||||
], %) // ln-legLen again but yRelative
|
||||
|> line([
|
||||
-legLen(segLen(seg01, %), myVar),
|
||||
min(segLen(seg01, %), myVar)
|
||||
-legLen(segLen(seg01), myVar),
|
||||
min(segLen(seg01), myVar)
|
||||
], %) // ln-negative legLen yRelative
|
||||
|> angledLine([58, segLen(seg01, %)], %) // ln-angledLineOfYLength-free should become angledLine
|
||||
|> angledLine([myAng, segLen(seg01, %)], %) // ln-angledLineOfYLength-angle should become angledLine
|
||||
|> angledLine([58, segLen(seg01)], %) // ln-angledLineOfYLength-free should become angledLine
|
||||
|> angledLine([myAng, segLen(seg01)], %) // ln-angledLineOfYLength-angle should become angledLine
|
||||
|> angledLineOfXLength([
|
||||
legAngY(segLen(seg01, %), myVar),
|
||||
min(segLen(seg01, %), myVar)
|
||||
legAngY(segLen(seg01), myVar),
|
||||
min(segLen(seg01), myVar)
|
||||
], %) // ln-angledLineOfYLength-yRelative use legAngY
|
||||
|> angledLineOfXLength([
|
||||
270 + legAngY(segLen(seg01, %), myVar),
|
||||
min(segLen(seg01, %), myVar)
|
||||
270 + legAngY(segLen(seg01), myVar),
|
||||
min(segLen(seg01), myVar)
|
||||
], %) // ln-angledLineOfYLength-yRelative with angle > 90 use binExp
|
||||
|> xLine(segLen(seg01, %), %) // ln-xLine-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
|
||||
|> yLine(segLen(seg01, %), %) // ln-yLineTo-free should convert to yLine
|
||||
|> xLine(segLen(seg01), %) // ln-xLine-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
|
||||
|> yLine(segLen(seg01), %) // ln-yLineTo-free should convert to yLine
|
||||
`
|
||||
it('should transform the ast', async () => {
|
||||
const ast = parse(inputScript)
|
||||
@ -417,10 +417,10 @@ const part001 = startSketchOn('XY')
|
||||
'setVertDistance'
|
||||
)
|
||||
expect(expectedHorizontalCode).toContain(
|
||||
`lineTo([segEndX(seg01, %) + 0.9, 4.59], %) // free`
|
||||
`lineTo([segEndX(seg01) + 0.9, 4.59], %) // free`
|
||||
)
|
||||
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 () => {
|
||||
@ -431,7 +431,7 @@ const part001 = startSketchOn('XY')
|
||||
)
|
||||
expect(expectedCode).toContain(`|> lineTo([
|
||||
lastSegX(%) + myVar,
|
||||
segEndY(seg01, %) + 2.93
|
||||
segEndY(seg01) + 2.93
|
||||
], %) // xRelative`)
|
||||
})
|
||||
it('testing for yRelative to horizontal distance', async () => {
|
||||
@ -441,7 +441,7 @@ const part001 = startSketchOn('XY')
|
||||
'setHorzDistance'
|
||||
)
|
||||
expect(expectedCode).toContain(`|> lineTo([
|
||||
segEndX(seg01, %) + 2.6,
|
||||
segEndX(seg01) + 2.6,
|
||||
lastSegY(%) + myVar
|
||||
], %) // yRelative`)
|
||||
})
|
||||
@ -516,7 +516,7 @@ const part001 = startSketchOn('XY')
|
||||
|> xLine(4.4, %) // partial
|
||||
|> yLine(-1, %) // partial
|
||||
|> 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
|
||||
|> xLine(3.36, %) // partial
|
||||
|> line([-1.49, 1.06], %) // free
|
||||
|
@ -1713,23 +1713,16 @@ export function transformAstSketchLines({
|
||||
}
|
||||
|
||||
function createSegLen(referenceSegName: string): Value {
|
||||
return createCallExpression('segLen', [
|
||||
createIdentifier(referenceSegName),
|
||||
createPipeSubstitution(),
|
||||
])
|
||||
return createCallExpression('segLen', [createIdentifier(referenceSegName)])
|
||||
}
|
||||
|
||||
function createSegAngle(referenceSegName: string): Value {
|
||||
return createCallExpression('segAng', [
|
||||
createIdentifier(referenceSegName),
|
||||
createPipeSubstitution(),
|
||||
])
|
||||
return createCallExpression('segAng', [createIdentifier(referenceSegName)])
|
||||
}
|
||||
|
||||
function createSegEnd(referenceSegName: string, isX: boolean): CallExpression {
|
||||
return createCallExpression(isX ? 'segEndX' : 'segEndY', [
|
||||
createIdentifier(referenceSegName),
|
||||
createPipeSubstitution(),
|
||||
])
|
||||
}
|
||||
|
||||
|
@ -16,7 +16,7 @@ describe('testing angledLineThatIntersects', () => {
|
||||
intersectTag: yo,
|
||||
offset: ${offset},
|
||||
}, %, $yo2)
|
||||
const intersect = segEndX(yo2, part001)`
|
||||
const intersect = segEndX(yo2)`
|
||||
const mem = await enginelessExecutor(parse(code('-1')))
|
||||
expect(mem.get('intersect')?.value).toBe(1 + Math.sqrt(2))
|
||||
const noOffset = await enginelessExecutor(parse(code('0')))
|
||||
|
@ -31,11 +31,11 @@ const bracket = startSketchOn('XY')
|
||||
|> extrude(width, %)
|
||||
|> fillet({
|
||||
radius: filletR,
|
||||
tags: [getPreviousAdjacentEdge(innerEdge, %)]
|
||||
tags: [getPreviousAdjacentEdge(innerEdge)]
|
||||
}, %)
|
||||
|> fillet({
|
||||
radius: filletR + thickness,
|
||||
tags: [getPreviousAdjacentEdge(outerEdge, %)]
|
||||
tags: [getPreviousAdjacentEdge(outerEdge)]
|
||||
}, %)`
|
||||
|
||||
function findLineInExampleCode({
|
||||
|
@ -15,9 +15,9 @@ import { ArrayExpression, CallExpression, PipeExpression } from 'lang/wasm'
|
||||
* Returns AST expressions for this KCL code:
|
||||
* const yo = startSketchOn('XY')
|
||||
* |> startProfileAt([0, 0], %)
|
||||
* |> angledLine([0, 0], %, 'a')
|
||||
* |> angledLine([segAng('a', %) - 90, 0], %, 'b')
|
||||
* |> angledLine([segAng('a', %), -segLen('a', %)], %, 'c')
|
||||
* |> angledLine([0, 0], %, $a)
|
||||
* |> angledLine([segAng(a) - 90, 0], %, $b)
|
||||
* |> angledLine([segAng(a), -segLen(a)], %, $c)
|
||||
* |> close(%)
|
||||
*/
|
||||
export const getRectangleCallExpressions = (
|
||||
@ -42,10 +42,7 @@ export const getRectangleCallExpressions = (
|
||||
createCallExpressionStdLib('angledLine', [
|
||||
createArrayExpression([
|
||||
createBinaryExpression([
|
||||
createCallExpressionStdLib('segAng', [
|
||||
createIdentifier(tags[0]),
|
||||
createPipeSubstitution(),
|
||||
]),
|
||||
createCallExpressionStdLib('segAng', [createIdentifier(tags[0])]),
|
||||
'+',
|
||||
createLiteral(90),
|
||||
]), // 90 offset from the previous line
|
||||
@ -56,15 +53,9 @@ export const getRectangleCallExpressions = (
|
||||
]),
|
||||
createCallExpressionStdLib('angledLine', [
|
||||
createArrayExpression([
|
||||
createCallExpressionStdLib('segAng', [
|
||||
createIdentifier(tags[0]),
|
||||
createPipeSubstitution(),
|
||||
]), // same angle as the first line
|
||||
createCallExpressionStdLib('segAng', [createIdentifier(tags[0])]), // same angle as the first line
|
||||
createUnaryExpression(
|
||||
createCallExpressionStdLib('segLen', [
|
||||
createIdentifier(tags[0]),
|
||||
createPipeSubstitution(),
|
||||
]),
|
||||
createCallExpressionStdLib('segLen', [createIdentifier(tags[0])]),
|
||||
'-'
|
||||
), // negative height
|
||||
]),
|
||||
@ -102,10 +93,7 @@ export function updateRectangleSketch(
|
||||
;((pipeExpression.body[3] as CallExpression)
|
||||
.arguments[0] as ArrayExpression) = createArrayExpression([
|
||||
createBinaryExpression([
|
||||
createCallExpressionStdLib('segAng', [
|
||||
createIdentifier(tag),
|
||||
createPipeSubstitution(),
|
||||
]),
|
||||
createCallExpressionStdLib('segAng', [createIdentifier(tag)]),
|
||||
Math.sign(y) === Math.sign(x) ? '+' : '-',
|
||||
createLiteral(90),
|
||||
]), // 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]]
|
||||
name = "kcl-lib"
|
||||
version = "0.2.0"
|
||||
version = "0.2.1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"approx",
|
||||
@ -1460,7 +1460,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kcl-test-server"
|
||||
version = "0.1.2"
|
||||
version = "0.1.3"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"hyper",
|
||||
|
@ -1,7 +1,7 @@
|
||||
[package]
|
||||
name = "kcl-test-server"
|
||||
description = "A test server for KCL"
|
||||
version = "0.1.2"
|
||||
version = "0.1.3"
|
||||
edition = "2021"
|
||||
license = "MIT"
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
[package]
|
||||
name = "kcl-lib"
|
||||
description = "KittyCAD Language implementation and tools"
|
||||
version = "0.2.0"
|
||||
version = "0.2.1"
|
||||
edition = "2021"
|
||||
license = "MIT"
|
||||
repository = "https://github.com/KittyCAD/modeling-app"
|
||||
|
@ -206,6 +206,19 @@ impl Program {
|
||||
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.
|
||||
pub fn completion_items<'a>(&'a self) -> Result<Vec<CompletionItem>> {
|
||||
let completions = Arc::new(Mutex::new(vec![]));
|
||||
@ -1318,7 +1331,50 @@ impl CallExpression {
|
||||
FunctionKind::Core(func) => {
|
||||
// Attempt to call the function.
|
||||
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)
|
||||
}
|
||||
FunctionKind::Std(func) => {
|
||||
@ -1977,6 +2033,7 @@ impl From<&TagDeclarator> for TagIdentifier {
|
||||
fn from(tag: &TagDeclarator) -> Self {
|
||||
TagIdentifier {
|
||||
value: tag.name.clone(),
|
||||
info: None,
|
||||
meta: vec![Metadata {
|
||||
source_range: tag.into(),
|
||||
}],
|
||||
@ -2048,6 +2105,7 @@ impl TagDeclarator {
|
||||
pub async fn execute(&self, memory: &mut ProgramMemory) -> Result<MemoryItem, KclError> {
|
||||
let memory_item = MemoryItem::TagIdentifier(Box::new(TagIdentifier {
|
||||
value: self.name.clone(),
|
||||
info: None,
|
||||
meta: vec![Metadata {
|
||||
source_range: self.into(),
|
||||
}],
|
||||
@ -4363,10 +4421,10 @@ const scarlett_body = rectShape([0, 0], width, length)
|
||||
|> fillet({
|
||||
radius: radius,
|
||||
tags: [
|
||||
getEdge(edge2, %),
|
||||
getEdge(edge4, %),
|
||||
getOppositeEdge(edge2, %),
|
||||
getOppositeEdge(edge4, %)
|
||||
edge2,
|
||||
edge4,
|
||||
getOppositeEdge(edge2),
|
||||
getOppositeEdge(edge4)
|
||||
]
|
||||
}, %)
|
||||
// build the bracket sketch around the body
|
||||
@ -4396,10 +4454,10 @@ const bracket_body = bracketSketch(width, depth, thk)
|
||||
|> fillet({
|
||||
radius: radius,
|
||||
tags: [
|
||||
getNextAdjacentEdge(edge7, %),
|
||||
getNextAdjacentEdge(edge2, %),
|
||||
getNextAdjacentEdge(edge3, %),
|
||||
getNextAdjacentEdge(edge6, %)
|
||||
getNextAdjacentEdge(edge7),
|
||||
getNextAdjacentEdge(edge2),
|
||||
getNextAdjacentEdge(edge3),
|
||||
getNextAdjacentEdge(edge6)
|
||||
]
|
||||
}, %)
|
||||
// build the tabs of the mounting bracket (right side)
|
||||
@ -4483,10 +4541,10 @@ const scarlett_body = rectShape([0, 0], width, length)
|
||||
|> fillet({
|
||||
radius: radius,
|
||||
tags: [
|
||||
getEdge(edge2, %),
|
||||
getEdge(edge4, %),
|
||||
getOppositeEdge(edge2, %),
|
||||
getOppositeEdge(edge4, %)
|
||||
edge2,
|
||||
edge4,
|
||||
getOppositeEdge(edge2),
|
||||
getOppositeEdge(edge4)
|
||||
]
|
||||
}, %)
|
||||
// build the bracket sketch around the body
|
||||
@ -4516,10 +4574,10 @@ const bracket_body = bracketSketch(width, depth, thk)
|
||||
|> fillet({
|
||||
radius: radius,
|
||||
tags: [
|
||||
getNextAdjacentEdge(edge7, %),
|
||||
getNextAdjacentEdge(edge2, %),
|
||||
getNextAdjacentEdge(edge3, %),
|
||||
getNextAdjacentEdge(edge6, %)
|
||||
getNextAdjacentEdge(edge7),
|
||||
getNextAdjacentEdge(edge2),
|
||||
getNextAdjacentEdge(edge3),
|
||||
getNextAdjacentEdge(edge6)
|
||||
]
|
||||
}, %)
|
||||
// build the tabs of the mounting bracket (right side)
|
||||
|
@ -59,6 +59,12 @@ impl ProgramMemory {
|
||||
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.
|
||||
/// Return Err if not found.
|
||||
pub fn get(&self, var: &str, source_range: SourceRange) -> Result<&MemoryItem, KclError> {
|
||||
@ -249,7 +255,7 @@ pub enum MemoryItem {
|
||||
}
|
||||
|
||||
impl MemoryItem {
|
||||
pub fn get_sketch_group_set(&self) -> Result<SketchGroupSet> {
|
||||
pub(crate) fn get_sketch_group_set(&self) -> Result<SketchGroupSet> {
|
||||
match self {
|
||||
MemoryItem::SketchGroup(s) => Ok(SketchGroupSet::SketchGroup(s.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 {
|
||||
MemoryItem::ExtrudeGroup(e) => Ok(ExtrudeGroupSet::ExtrudeGroup(e.clone())),
|
||||
MemoryItem::ExtrudeGroups { value } => Ok(ExtrudeGroupSet::ExtrudeGroups(value.clone())),
|
||||
@ -563,15 +569,18 @@ pub struct UserVal {
|
||||
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)]
|
||||
#[serde(tag = "type", rename_all = "camelCase")]
|
||||
pub struct TagIdentifier {
|
||||
pub value: String,
|
||||
pub info: Option<TagEngineInfo>,
|
||||
#[serde(rename = "__meta")]
|
||||
pub meta: Vec<Metadata>,
|
||||
}
|
||||
|
||||
impl Eq for TagIdentifier {}
|
||||
|
||||
impl std::fmt::Display for TagIdentifier {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
write!(f, "{}", self.value)
|
||||
@ -584,6 +593,7 @@ impl std::str::FromStr for TagIdentifier {
|
||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||
Ok(Self {
|
||||
value: s.to_string(),
|
||||
info: None,
|
||||
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.
|
||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)]
|
||||
#[ts(export)]
|
||||
@ -852,25 +877,25 @@ pub enum SketchSurface {
|
||||
}
|
||||
|
||||
impl SketchSurface {
|
||||
pub fn id(&self) -> uuid::Uuid {
|
||||
pub(crate) fn id(&self) -> uuid::Uuid {
|
||||
match self {
|
||||
SketchSurface::Plane(plane) => plane.id,
|
||||
SketchSurface::Face(face) => face.id,
|
||||
}
|
||||
}
|
||||
pub fn x_axis(&self) -> Point3d {
|
||||
pub(crate) fn x_axis(&self) -> Point3d {
|
||||
match self {
|
||||
SketchSurface::Plane(plane) => plane.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 {
|
||||
SketchSurface::Plane(plane) => plane.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 {
|
||||
SketchSurface::Plane(plane) => plane.z_axis.clone(),
|
||||
SketchSurface::Face(face) => face.z_axis.clone(),
|
||||
@ -885,39 +910,28 @@ pub struct GetTangentialInfoFromPathsResult {
|
||||
}
|
||||
|
||||
impl SketchGroup {
|
||||
pub fn get_path_by_id(&self, id: &uuid::Uuid) -> Option<&Path> {
|
||||
self.value.iter().find(|p| p.get_id() == *id)
|
||||
}
|
||||
pub(crate) fn add_tag(&mut self, tag: &TagDeclarator, current_path: &Path) {
|
||||
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.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())
|
||||
self.tags.insert(tag.name.to_string(), tag_identifier);
|
||||
}
|
||||
|
||||
/// Get the path most recently sketched.
|
||||
pub fn latest_path(&self) -> Option<&Path> {
|
||||
pub(crate) fn latest_path(&self) -> Option<&Path> {
|
||||
self.value.last()
|
||||
}
|
||||
|
||||
/// The "pen" is an imaginary pen drawing the path.
|
||||
/// 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.
|
||||
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 {
|
||||
return Ok(self.start.to.into());
|
||||
};
|
||||
@ -926,7 +940,7 @@ impl SketchGroup {
|
||||
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 {
|
||||
return GetTangentialInfoFromPathsResult {
|
||||
center_or_tangent_point: self.start.to,
|
||||
@ -978,21 +992,7 @@ pub struct ExtrudeGroup {
|
||||
}
|
||||
|
||||
impl ExtrudeGroup {
|
||||
pub fn get_path_by_id(&self, id: &uuid::Uuid) -> Option<&ExtrudeSurface> {
|
||||
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> {
|
||||
pub(crate) fn get_all_fillet_or_chamfer_ids(&self) -> Vec<uuid::Uuid> {
|
||||
self.fillet_or_chamfers.iter().map(|foc| foc.id()).collect()
|
||||
}
|
||||
}
|
||||
@ -1967,7 +1967,7 @@ const newVar = myVar + 1"#;
|
||||
intersectTag: yo,
|
||||
offset: {},
|
||||
}}, %, $yo2)
|
||||
const intersect = segEndX(yo2, part001)"#,
|
||||
const intersect = segEndX(yo2)"#,
|
||||
offset
|
||||
)
|
||||
};
|
||||
@ -2033,8 +2033,8 @@ const part001 = startSketchOn('XY')
|
||||
|> startProfileAt([0, 0], %)
|
||||
|> line([3, 4], %, $seg01)
|
||||
|> line([
|
||||
min(segLen(seg01, %), myVar),
|
||||
-legLen(segLen(seg01, %), myVar)
|
||||
min(segLen(seg01), myVar),
|
||||
-legLen(segLen(seg01), myVar)
|
||||
], %)
|
||||
"#;
|
||||
|
||||
@ -2048,8 +2048,8 @@ const part001 = startSketchOn('XY')
|
||||
|> startProfileAt([0, 0], %)
|
||||
|> line([3, 4], %, $seg01)
|
||||
|> line([
|
||||
min(segLen(seg01, %), myVar),
|
||||
legLen(segLen(seg01, %), myVar)
|
||||
min(segLen(seg01), myVar),
|
||||
legLen(segLen(seg01), myVar)
|
||||
], %)
|
||||
"#;
|
||||
|
||||
|
@ -1,4 +1,6 @@
|
||||
mod camel_case;
|
||||
mod std_lib_args;
|
||||
|
||||
#[allow(unused_imports)]
|
||||
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::{
|
||||
ast::types::{Value, VariableKind},
|
||||
executor::SourceRange,
|
||||
lint::checks,
|
||||
lsp::{backend::Backend as _, util::IntoDiagnostic},
|
||||
parser::PIPE_OPERATOR,
|
||||
token::TokenType,
|
||||
@ -273,11 +272,7 @@ impl crate::lsp::backend::Backend for Backend {
|
||||
// Update our semantic tokens.
|
||||
self.update_semantic_tokens(&tokens, ¶ms).await;
|
||||
|
||||
let discovered_findings = ast
|
||||
.lint(checks::lint_variables)
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.collect::<Vec<_>>();
|
||||
let discovered_findings = ast.lint_all().into_iter().flatten().collect::<Vec<_>>();
|
||||
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
|
||||
}
|
||||
|
||||
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.
|
||||
pub async fn flush_batch_for_extrude_group_set(
|
||||
&self,
|
||||
@ -188,10 +231,6 @@ impl Args {
|
||||
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> {
|
||||
FromArgs::from_args(self, 0)
|
||||
}
|
||||
@ -279,7 +318,7 @@ impl Args {
|
||||
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)
|
||||
}
|
||||
|
||||
@ -289,7 +328,6 @@ impl Args {
|
||||
|
||||
pub async fn get_adjacent_face_to_tag(
|
||||
&self,
|
||||
extrude_group: &ExtrudeGroup,
|
||||
tag: &TagIdentifier,
|
||||
must_be_planar: bool,
|
||||
) -> Result<uuid::Uuid, KclError> {
|
||||
@ -300,10 +338,16 @@ impl Args {
|
||||
}));
|
||||
}
|
||||
|
||||
if let Some(face_from_surface) = extrude_group
|
||||
.value
|
||||
.iter()
|
||||
.find_map(|extrude_surface| match extrude_surface {
|
||||
let engine_info = self.get_tag_engine_info_check_surface(tag)?;
|
||||
|
||||
let surface = engine_info.surface.as_ref().ok_or_else(|| {
|
||||
KclError::Type(KclErrorDetails {
|
||||
message: format!("Tag `{}` does not have a surface", tag.value),
|
||||
source_ranges: vec![self.source_range],
|
||||
})
|
||||
})?;
|
||||
|
||||
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 {
|
||||
@ -331,13 +375,13 @@ impl Args {
|
||||
None
|
||||
}
|
||||
}
|
||||
})
|
||||
{
|
||||
} {
|
||||
return face_from_surface;
|
||||
}
|
||||
|
||||
// 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 ntag.name == tag.value {
|
||||
Some(Ok(fc.id()))
|
||||
@ -352,7 +396,7 @@ impl Args {
|
||||
self.flush_batch_for_extrude_group_set(extrude_group.into()).await?;
|
||||
|
||||
return face_from_chamfer_fillet;
|
||||
}
|
||||
}*/
|
||||
|
||||
// If we still haven't found the face, return an error.
|
||||
Err(KclError::Type(KclErrorDetails {
|
||||
|
@ -54,10 +54,10 @@ pub async fn chamfer(args: Args) -> Result<MemoryItem, KclError> {
|
||||
/// |> chamfer({
|
||||
/// length: chamferLength,
|
||||
/// tags: [
|
||||
/// getNextAdjacentEdge(edge1, %),
|
||||
/// getNextAdjacentEdge(edge2, %),
|
||||
/// getNextAdjacentEdge(edge3, %),
|
||||
/// getNextAdjacentEdge(edge4, %)
|
||||
/// getNextAdjacentEdge(edge1),
|
||||
/// getNextAdjacentEdge(edge2),
|
||||
/// getNextAdjacentEdge(edge3),
|
||||
/// getNextAdjacentEdge(edge4)
|
||||
/// ],
|
||||
/// }, %)
|
||||
/// ```
|
||||
@ -94,20 +94,7 @@ async fn inner_chamfer(
|
||||
for edge_tag in data.tags {
|
||||
let edge_id = match edge_tag {
|
||||
EdgeReference::Uuid(uuid) => uuid,
|
||||
EdgeReference::Tag(edge_tag) => {
|
||||
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
|
||||
}
|
||||
EdgeReference::Tag(edge_tag) => args.get_tag_engine_info(&edge_tag)?.id,
|
||||
};
|
||||
|
||||
let id = uuid::Uuid::new_v4();
|
||||
|
@ -34,7 +34,7 @@ pub enum EdgeReference {
|
||||
/// A uuid of an edge.
|
||||
Uuid(uuid::Uuid),
|
||||
/// A tag of an edge.
|
||||
Tag(TagIdentifier),
|
||||
Tag(Box<TagIdentifier>),
|
||||
}
|
||||
|
||||
/// Create fillets on tagged paths.
|
||||
@ -64,10 +64,10 @@ pub async fn fillet(args: Args) -> Result<MemoryItem, KclError> {
|
||||
/// |> fillet({
|
||||
/// radius: filletRadius,
|
||||
/// tags: [
|
||||
/// getNextAdjacentEdge(edge1, %),
|
||||
/// getNextAdjacentEdge(edge2, %),
|
||||
/// getNextAdjacentEdge(edge3, %),
|
||||
/// getNextAdjacentEdge(edge4, %)
|
||||
/// getNextAdjacentEdge(edge1),
|
||||
/// getNextAdjacentEdge(edge2),
|
||||
/// getNextAdjacentEdge(edge3),
|
||||
/// getNextAdjacentEdge(edge4)
|
||||
/// ],
|
||||
/// }, %)
|
||||
/// ```
|
||||
@ -94,20 +94,7 @@ async fn inner_fillet(
|
||||
for tag in data.tags {
|
||||
let edge_id = match tag {
|
||||
EdgeReference::Uuid(uuid) => uuid,
|
||||
EdgeReference::Tag(edge_tag) => {
|
||||
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
|
||||
}
|
||||
EdgeReference::Tag(edge_tag) => args.get_tag_engine_info(&edge_tag)?.id,
|
||||
};
|
||||
|
||||
let id = uuid::Uuid::new_v4();
|
||||
@ -138,9 +125,9 @@ async fn inner_fillet(
|
||||
|
||||
/// Get the opposite edge to the edge given.
|
||||
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 {
|
||||
value: serde_json::to_value(edge).map_err(|e| {
|
||||
KclError::Type(KclErrorDetails {
|
||||
@ -176,39 +163,26 @@ pub async fn get_opposite_edge(args: Args) -> Result<MemoryItem, KclError> {
|
||||
/// const example = extrude(5, exampleSketch)
|
||||
/// |> fillet({
|
||||
/// radius: 3,
|
||||
/// tags: [getOppositeEdge(referenceEdge, %)],
|
||||
/// tags: [getOppositeEdge(referenceEdge)],
|
||||
/// }, %)
|
||||
/// ```
|
||||
#[stdlib {
|
||||
name = "getOppositeEdge",
|
||||
}]
|
||||
async fn inner_get_opposite_edge(
|
||||
tag: TagIdentifier,
|
||||
extrude_group: Box<ExtrudeGroup>,
|
||||
args: Args,
|
||||
) -> Result<Uuid, KclError> {
|
||||
async fn inner_get_opposite_edge(tag: TagIdentifier, 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();
|
||||
let tagged_path = args.get_tag_engine_info(&tag)?;
|
||||
|
||||
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
|
||||
.send_modeling_cmd(
|
||||
uuid::Uuid::new_v4(),
|
||||
ModelingCmd::Solid3DGetOppositeEdge {
|
||||
edge_id: tagged_path.geo_meta.id,
|
||||
object_id: extrude_group.id,
|
||||
edge_id: tagged_path.id,
|
||||
object_id: tagged_path.sketch_group,
|
||||
face_id,
|
||||
},
|
||||
)
|
||||
@ -228,9 +202,9 @@ async fn inner_get_opposite_edge(
|
||||
|
||||
/// Get the next adjacent edge to the edge given.
|
||||
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 {
|
||||
value: serde_json::to_value(edge).map_err(|e| {
|
||||
KclError::Type(KclErrorDetails {
|
||||
@ -266,39 +240,26 @@ pub async fn get_next_adjacent_edge(args: Args) -> Result<MemoryItem, KclError>
|
||||
/// const example = extrude(5, exampleSketch)
|
||||
/// |> fillet({
|
||||
/// radius: 3,
|
||||
/// tags: [getNextAdjacentEdge(referenceEdge, %)],
|
||||
/// tags: [getNextAdjacentEdge(referenceEdge)],
|
||||
/// }, %)
|
||||
/// ```
|
||||
#[stdlib {
|
||||
name = "getNextAdjacentEdge",
|
||||
}]
|
||||
async fn inner_get_next_adjacent_edge(
|
||||
tag: TagIdentifier,
|
||||
extrude_group: Box<ExtrudeGroup>,
|
||||
args: Args,
|
||||
) -> Result<Uuid, KclError> {
|
||||
async fn inner_get_next_adjacent_edge(tag: TagIdentifier, 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();
|
||||
let tagged_path = args.get_tag_engine_info(&tag)?;
|
||||
|
||||
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
|
||||
.send_modeling_cmd(
|
||||
uuid::Uuid::new_v4(),
|
||||
ModelingCmd::Solid3DGetPrevAdjacentEdge {
|
||||
edge_id: tagged_path.geo_meta.id,
|
||||
object_id: extrude_group.id,
|
||||
edge_id: tagged_path.id,
|
||||
object_id: tagged_path.sketch_group,
|
||||
face_id,
|
||||
},
|
||||
)
|
||||
@ -323,9 +284,9 @@ async fn inner_get_next_adjacent_edge(
|
||||
|
||||
/// Get the previous adjacent edge to the edge given.
|
||||
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 {
|
||||
value: serde_json::to_value(edge).map_err(|e| {
|
||||
KclError::Type(KclErrorDetails {
|
||||
@ -361,39 +322,26 @@ pub async fn get_previous_adjacent_edge(args: Args) -> Result<MemoryItem, KclErr
|
||||
/// const example = extrude(5, exampleSketch)
|
||||
/// |> fillet({
|
||||
/// radius: 3,
|
||||
/// tags: [getPreviousAdjacentEdge(referenceEdge, %)],
|
||||
/// tags: [getPreviousAdjacentEdge(referenceEdge)],
|
||||
/// }, %)
|
||||
/// ```
|
||||
#[stdlib {
|
||||
name = "getPreviousAdjacentEdge",
|
||||
}]
|
||||
async fn inner_get_previous_adjacent_edge(
|
||||
tag: TagIdentifier,
|
||||
extrude_group: Box<ExtrudeGroup>,
|
||||
args: Args,
|
||||
) -> Result<Uuid, KclError> {
|
||||
async fn inner_get_previous_adjacent_edge(tag: TagIdentifier, 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();
|
||||
let tagged_path = args.get_tag_engine_info(&tag)?;
|
||||
|
||||
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
|
||||
.send_modeling_cmd(
|
||||
uuid::Uuid::new_v4(),
|
||||
ModelingCmd::Solid3DGetNextAdjacentEdge {
|
||||
edge_id: tagged_path.geo_meta.id,
|
||||
object_id: extrude_group.id,
|
||||
edge_id: tagged_path.id,
|
||||
object_id: tagged_path.sketch_group,
|
||||
face_id,
|
||||
},
|
||||
)
|
||||
|
@ -94,7 +94,6 @@ lazy_static! {
|
||||
Box::new(crate::std::helix::Helix),
|
||||
Box::new(crate::std::shell::Shell),
|
||||
Box::new(crate::std::revolve::Revolve),
|
||||
Box::new(crate::std::revolve::GetEdge),
|
||||
Box::new(crate::std::import::Import),
|
||||
Box::new(crate::std::math::Cos),
|
||||
Box::new(crate::std::math::Sin),
|
||||
|
@ -5,11 +5,10 @@ use derive_docs::stdlib;
|
||||
use kittycad::types::ModelingCmd;
|
||||
use schemars::JsonSchema;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use uuid::Uuid;
|
||||
|
||||
use crate::{
|
||||
errors::{KclError, KclErrorDetails},
|
||||
executor::{ExtrudeGroup, MemoryItem, SketchGroup, TagIdentifier, UserVal},
|
||||
executor::{ExtrudeGroup, MemoryItem, SketchGroup},
|
||||
std::{
|
||||
extrude::do_post_extrude,
|
||||
fillet::{EdgeReference, DEFAULT_TOLERANCE},
|
||||
@ -197,7 +196,7 @@ pub async fn revolve(args: Args) -> Result<MemoryItem, KclError> {
|
||||
/// |> circle([10,10], 4, %)
|
||||
/// |> revolve({
|
||||
/// angle: 90,
|
||||
/// axis: getOppositeEdge(revolveAxis, box)
|
||||
/// axis: getOppositeEdge(revolveAxis)
|
||||
/// }, %)
|
||||
/// ```
|
||||
///
|
||||
@ -258,19 +257,7 @@ async fn inner_revolve(
|
||||
RevolveAxis::Edge(edge) => {
|
||||
let edge_id = match edge {
|
||||
EdgeReference::Uuid(uuid) => uuid,
|
||||
EdgeReference::Tag(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()
|
||||
.geo_meta
|
||||
.id
|
||||
}
|
||||
EdgeReference::Tag(tag) => args.get_tag_engine_info(&tag)?.id,
|
||||
};
|
||||
args.batch_modeling_cmd(
|
||||
id,
|
||||
@ -288,65 +275,6 @@ async fn inner_revolve(
|
||||
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)]
|
||||
mod tests {
|
||||
|
||||
|
@ -12,8 +12,8 @@ use crate::{
|
||||
|
||||
/// Returns the segment end of x.
|
||||
pub async fn segment_end_x(args: Args) -> Result<MemoryItem, KclError> {
|
||||
let (segment_name, sketch_group) = args.get_segment_name_sketch_group()?;
|
||||
let result = inner_segment_end_x(&segment_name, sketch_group, args.clone())?;
|
||||
let tag: TagIdentifier = args.get_data()?;
|
||||
let result = inner_segment_end_x(&tag, args.clone())?;
|
||||
|
||||
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], %)
|
||||
/// |> line([20, 0], %, $thing)
|
||||
/// |> line([0, 5], %)
|
||||
/// |> line([segEndX(thing, %), 0], %)
|
||||
/// |> line([segEndX(thing), 0], %)
|
||||
/// |> line([-20, 10], %)
|
||||
/// |> close(%)
|
||||
///
|
||||
@ -34,28 +34,16 @@ pub async fn segment_end_x(args: Args) -> Result<MemoryItem, KclError> {
|
||||
#[stdlib {
|
||||
name = "segEndX",
|
||||
}]
|
||||
fn inner_segment_end_x(
|
||||
segment_name: &TagIdentifier,
|
||||
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],
|
||||
})
|
||||
})?;
|
||||
fn inner_segment_end_x(tag: &TagIdentifier, args: Args) -> Result<f64, KclError> {
|
||||
let line = args.get_tag_engine_info(tag)?;
|
||||
|
||||
Ok(line.to[0])
|
||||
Ok(line.path.to[0])
|
||||
}
|
||||
|
||||
/// Returns the segment end of y.
|
||||
pub async fn segment_end_y(args: Args) -> Result<MemoryItem, KclError> {
|
||||
let (segment_name, sketch_group) = args.get_segment_name_sketch_group()?;
|
||||
let result = inner_segment_end_y(&segment_name, sketch_group, args.clone())?;
|
||||
let tag: TagIdentifier = args.get_data()?;
|
||||
let result = inner_segment_end_y(&tag, args.clone())?;
|
||||
|
||||
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([0, 3], %, $thing)
|
||||
/// |> line([-10, 0], %)
|
||||
/// |> line([0, segEndY(thing, %)], %)
|
||||
/// |> line([0, segEndY(thing)], %)
|
||||
/// |> line([-10, 0], %)
|
||||
/// |> close(%)
|
||||
///
|
||||
@ -77,22 +65,10 @@ pub async fn segment_end_y(args: Args) -> Result<MemoryItem, KclError> {
|
||||
#[stdlib {
|
||||
name = "segEndY",
|
||||
}]
|
||||
fn inner_segment_end_y(
|
||||
segment_name: &TagIdentifier,
|
||||
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],
|
||||
})
|
||||
})?;
|
||||
fn inner_segment_end_y(tag: &TagIdentifier, args: Args) -> Result<f64, KclError> {
|
||||
let line = args.get_tag_engine_info(tag)?;
|
||||
|
||||
Ok(line.to[1])
|
||||
Ok(line.path.to[1])
|
||||
}
|
||||
|
||||
/// 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.
|
||||
pub async fn segment_length(args: Args) -> Result<MemoryItem, KclError> {
|
||||
let (segment_name, sketch_group) = args.get_segment_name_sketch_group()?;
|
||||
let result = inner_segment_length(&segment_name, sketch_group, args.clone())?;
|
||||
let tag: TagIdentifier = args.get_data()?;
|
||||
let result = inner_segment_length(&tag, args.clone())?;
|
||||
args.make_user_val_from_f64(result)
|
||||
}
|
||||
|
||||
@ -201,7 +177,7 @@ pub async fn segment_length(args: Args) -> Result<MemoryItem, KclError> {
|
||||
/// }, %)
|
||||
/// |> angledLine({
|
||||
/// angle: -60,
|
||||
/// length: segLen(thing, %),
|
||||
/// length: segLen(thing),
|
||||
/// }, %)
|
||||
/// |> close(%)
|
||||
///
|
||||
@ -210,32 +186,19 @@ pub async fn segment_length(args: Args) -> Result<MemoryItem, KclError> {
|
||||
#[stdlib {
|
||||
name = "segLen",
|
||||
}]
|
||||
fn inner_segment_length(
|
||||
segment_name: &TagIdentifier,
|
||||
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();
|
||||
fn inner_segment_length(tag: &TagIdentifier, args: Args) -> Result<f64, KclError> {
|
||||
let line = args.get_tag_engine_info(tag)?;
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
/// Returns the angle of the segment.
|
||||
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)
|
||||
}
|
||||
|
||||
@ -247,9 +210,9 @@ pub async fn segment_angle(args: Args) -> Result<MemoryItem, KclError> {
|
||||
/// |> line([10, 0], %)
|
||||
/// |> line([5, 10], %, $seg01)
|
||||
/// |> line([-10, 0], %)
|
||||
/// |> angledLine([segAng(seg01, %), 10], %)
|
||||
/// |> angledLine([segAng(seg01), 10], %)
|
||||
/// |> line([-10, 0], %)
|
||||
/// |> angledLine([segAng(seg01, %), -15], %)
|
||||
/// |> angledLine([segAng(seg01), -15], %)
|
||||
/// |> close(%)
|
||||
///
|
||||
/// const example = extrude(4, exampleSketch)
|
||||
@ -257,31 +220,18 @@ pub async fn segment_angle(args: Args) -> Result<MemoryItem, KclError> {
|
||||
#[stdlib {
|
||||
name = "segAng",
|
||||
}]
|
||||
fn inner_segment_angle(
|
||||
segment_name: &TagIdentifier,
|
||||
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();
|
||||
fn inner_segment_angle(tag: &TagIdentifier, args: Args) -> Result<f64, KclError> {
|
||||
let line = args.get_tag_engine_info(tag)?;
|
||||
|
||||
let result = between(line.from.into(), line.to.into());
|
||||
let result = between(line.path.from.into(), line.path.to.into());
|
||||
|
||||
Ok(result.degrees())
|
||||
}
|
||||
|
||||
/// Returns the angle to match the given length for x.
|
||||
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 result = inner_angle_to_match_length_x(&segment_name, to, sketch_group, args.clone())?;
|
||||
let (tag, to, sketch_group) = args.get_tag_to_number_sketch_group()?;
|
||||
let result = inner_angle_to_match_length_x(&tag, to, sketch_group, args.clone())?;
|
||||
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",
|
||||
}]
|
||||
fn inner_angle_to_match_length_x(
|
||||
segment_name: &TagIdentifier,
|
||||
tag: &TagIdentifier,
|
||||
to: f64,
|
||||
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 line = args.get_tag_engine_info(tag)?;
|
||||
|
||||
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
|
||||
.value
|
||||
@ -348,8 +289,8 @@ fn inner_angle_to_match_length_x(
|
||||
|
||||
/// Returns the angle to match the given length for y.
|
||||
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 result = inner_angle_to_match_length_y(&segment_name, to, sketch_group, args.clone())?;
|
||||
let (tag, to, sketch_group) = args.get_tag_to_number_sketch_group()?;
|
||||
let result = inner_angle_to_match_length_y(&tag, to, sketch_group, args.clone())?;
|
||||
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",
|
||||
}]
|
||||
fn inner_angle_to_match_length_y(
|
||||
segment_name: &TagIdentifier,
|
||||
tag: &TagIdentifier,
|
||||
to: f64,
|
||||
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 line = args.get_tag_engine_info(tag)?;
|
||||
|
||||
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
|
||||
.value
|
||||
|
@ -14,7 +14,7 @@ use crate::{
|
||||
errors::{KclError, KclErrorDetails},
|
||||
executor::{
|
||||
BasePath, ExtrudeGroup, Face, GeoMeta, MemoryItem, Path, Plane, PlaneType, Point2d, Point3d, SketchGroup,
|
||||
SketchGroupSet, SketchSurface, SourceRange, TagIdentifier, UserVal,
|
||||
SketchGroupSet, SketchSurface, SourceRange, TagEngineInfo, TagIdentifier, UserVal,
|
||||
},
|
||||
std::{
|
||||
utils::{
|
||||
@ -26,15 +26,23 @@ use crate::{
|
||||
};
|
||||
|
||||
/// 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)]
|
||||
#[serde(rename_all = "snake_case", untagged)]
|
||||
#[display("{0}")]
|
||||
pub enum FaceTag {
|
||||
StartOrEnd(StartOrEnd),
|
||||
/// A tag for the face.
|
||||
#[display("{0}")]
|
||||
Tag(TagIdentifier),
|
||||
Tag(Box<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 {
|
||||
@ -46,7 +54,7 @@ impl FaceTag {
|
||||
must_be_planar: bool,
|
||||
) -> Result<uuid::Uuid, KclError> {
|
||||
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(|| {
|
||||
KclError::Type(KclErrorDetails {
|
||||
message: "Expected a start face".to_string(),
|
||||
@ -129,16 +137,11 @@ async fn inner_line_to(
|
||||
)
|
||||
.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 {
|
||||
base: BasePath {
|
||||
from: from.into(),
|
||||
to,
|
||||
tag,
|
||||
tag: tag.clone(),
|
||||
geo_meta: GeoMeta {
|
||||
id,
|
||||
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);
|
||||
|
||||
Ok(new_sketch_group)
|
||||
@ -297,16 +305,11 @@ async fn inner_line(
|
||||
)
|
||||
.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 {
|
||||
base: BasePath {
|
||||
from: from.into(),
|
||||
to,
|
||||
tag,
|
||||
tag: tag.clone(),
|
||||
geo_meta: GeoMeta {
|
||||
id,
|
||||
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);
|
||||
|
||||
Ok(new_sketch_group)
|
||||
@ -481,16 +489,11 @@ async fn inner_angled_line(
|
||||
)
|
||||
.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 {
|
||||
base: BasePath {
|
||||
from: from.into(),
|
||||
to,
|
||||
tag,
|
||||
tag: tag.clone(),
|
||||
geo_meta: GeoMeta {
|
||||
id,
|
||||
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);
|
||||
Ok(new_sketch_group)
|
||||
}
|
||||
@ -730,22 +738,11 @@ async fn inner_angled_line_that_intersects(
|
||||
tag: Option<TagDeclarator>,
|
||||
args: Args,
|
||||
) -> Result<Box<SketchGroup>, KclError> {
|
||||
let intersect_path = sketch_group
|
||||
.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 intersect_path = args.get_tag_engine_info(&data.intersect_tag)?;
|
||||
|
||||
let from = sketch_group.current_pen_position()?;
|
||||
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.angle,
|
||||
from,
|
||||
@ -1230,13 +1227,20 @@ pub(crate) async fn inner_start_profile_at(
|
||||
id: path_id,
|
||||
on: sketch_surface.clone(),
|
||||
value: vec![],
|
||||
start: current_path,
|
||||
meta: vec![args.source_range.into()],
|
||||
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 {
|
||||
Default::default()
|
||||
},
|
||||
start: current_path,
|
||||
};
|
||||
Ok(Box::new(sketch_group))
|
||||
}
|
||||
@ -1301,7 +1305,7 @@ pub async fn profile_start(args: Args) -> Result<MemoryItem, KclError> {
|
||||
/// const sketch001 = startSketchOn('XY')
|
||||
/// |> startProfileAt([5, 2], %)
|
||||
/// |> angledLine({ angle: 120, length: 50 }, %, $seg01)
|
||||
/// |> angledLine({ angle: segAng(seg01, %) + 120, length: 50 }, %)
|
||||
/// |> angledLine({ angle: segAng(seg01) + 120, length: 50 }, %)
|
||||
/// |> lineTo(profileStart(%), %)
|
||||
/// |> close(%)
|
||||
/// |> extrude(20, %)
|
||||
@ -1370,21 +1374,24 @@ pub(crate) async fn inner_close(
|
||||
.await?;
|
||||
}
|
||||
|
||||
let mut new_sketch_group = sketch_group.clone();
|
||||
if let Some(ref tag) = tag {
|
||||
new_sketch_group.tags.insert(tag.name.to_string(), tag.into());
|
||||
}
|
||||
new_sketch_group.value.push(Path::ToPoint {
|
||||
let current_path = Path::ToPoint {
|
||||
base: BasePath {
|
||||
from: from.into(),
|
||||
to: to.into(),
|
||||
tag,
|
||||
tag: tag.clone(),
|
||||
geo_meta: GeoMeta {
|
||||
id,
|
||||
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)
|
||||
}
|
||||
@ -1482,16 +1489,11 @@ pub(crate) async fn inner_arc(
|
||||
)
|
||||
.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 {
|
||||
base: BasePath {
|
||||
from: from.into(),
|
||||
to: end.into(),
|
||||
tag,
|
||||
tag: tag.clone(),
|
||||
geo_meta: GeoMeta {
|
||||
id,
|
||||
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);
|
||||
|
||||
Ok(new_sketch_group)
|
||||
@ -1592,16 +1599,11 @@ async fn inner_tangential_arc(
|
||||
|
||||
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 {
|
||||
base: BasePath {
|
||||
from: from.into(),
|
||||
to,
|
||||
tag,
|
||||
tag: tag.clone(),
|
||||
geo_meta: GeoMeta {
|
||||
id,
|
||||
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);
|
||||
|
||||
Ok(new_sketch_group)
|
||||
@ -1700,16 +1707,11 @@ async fn inner_tangential_arc_to(
|
||||
let id = uuid::Uuid::new_v4();
|
||||
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 {
|
||||
base: BasePath {
|
||||
from: from.into(),
|
||||
to,
|
||||
tag,
|
||||
tag: tag.clone(),
|
||||
geo_meta: GeoMeta {
|
||||
id,
|
||||
metadata: args.source_range.into(),
|
||||
@ -1719,6 +1721,11 @@ async fn inner_tangential_arc_to(
|
||||
ccw: result.ccw > 0,
|
||||
};
|
||||
|
||||
let mut new_sketch_group = sketch_group.clone();
|
||||
if let Some(tag) = &tag {
|
||||
new_sketch_group.add_tag(tag, ¤t_path);
|
||||
}
|
||||
|
||||
new_sketch_group.value.push(current_path);
|
||||
|
||||
Ok(new_sketch_group)
|
||||
@ -1805,16 +1812,11 @@ async fn inner_bezier_curve(
|
||||
)
|
||||
.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 {
|
||||
base: BasePath {
|
||||
from: from.into(),
|
||||
to,
|
||||
tag,
|
||||
tag: tag.clone(),
|
||||
geo_meta: GeoMeta {
|
||||
id,
|
||||
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);
|
||||
|
||||
Ok(new_sketch_group)
|
||||
@ -1941,16 +1948,18 @@ mod tests {
|
||||
|
||||
str_json = serde_json::to_string(&TagIdentifier {
|
||||
value: "thing".to_string(),
|
||||
info: None,
|
||||
meta: Default::default(),
|
||||
})
|
||||
.unwrap();
|
||||
let data: crate::std::sketch::FaceTag = serde_json::from_str(&str_json).unwrap();
|
||||
assert_eq!(
|
||||
data,
|
||||
crate::std::sketch::FaceTag::Tag(TagIdentifier {
|
||||
crate::std::sketch::FaceTag::Tag(Box::new(TagIdentifier {
|
||||
value: "thing".to_string(),
|
||||
info: None,
|
||||
meta: Default::default()
|
||||
})
|
||||
}))
|
||||
);
|
||||
|
||||
str_json = "\"END\"".to_string();
|
||||
|
@ -7,7 +7,7 @@ use std::{
|
||||
|
||||
use futures::stream::TryStreamExt;
|
||||
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 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 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);
|
||||
}
|
||||
|
||||
|
@ -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({
|
||||
radius: radius,
|
||||
tags: [
|
||||
getNextAdjacentEdge(bs.tags.edge7, %),
|
||||
getNextAdjacentEdge(bs.tags.edge2, %),
|
||||
getNextAdjacentEdge(bs.tags.edge3, %),
|
||||
getNextAdjacentEdge(bs.tags.edge6, %)
|
||||
getNextAdjacentEdge(bs.tags.edge7),
|
||||
getNextAdjacentEdge(bs.tags.edge2),
|
||||
getNextAdjacentEdge(bs.tags.edge3),
|
||||
getNextAdjacentEdge(bs.tags.edge6)
|
||||
]
|
||||
}, %)
|
||||
|
||||
@ -88,8 +88,8 @@ const tabsR = startSketchOn(tabPlane)
|
||||
|> fillet({
|
||||
radius: holeDiam / 2,
|
||||
tags: [
|
||||
getNextAdjacentEdge(edge12, %),
|
||||
getNextAdjacentEdge(edge13, %)
|
||||
getNextAdjacentEdge(edge12),
|
||||
getNextAdjacentEdge(edge13)
|
||||
]
|
||||
}, %)
|
||||
|> patternLinear3d({
|
||||
@ -113,8 +113,8 @@ const tabsL = startSketchOn(tabPlane)
|
||||
|> fillet({
|
||||
radius: holeDiam / 2,
|
||||
tags: [
|
||||
getNextAdjacentEdge(edge21, %),
|
||||
getNextAdjacentEdge(edge22, %)
|
||||
getNextAdjacentEdge(edge21),
|
||||
getNextAdjacentEdge(edge22)
|
||||
]
|
||||
}, %)
|
||||
|> patternLinear3d({
|
||||
|
@ -18,7 +18,7 @@ fn layer = () => {
|
||||
|> extrude(h, %)
|
||||
// |> fillet({
|
||||
// radius: h / 2.01,
|
||||
// tags: ["tag1", getOppositeEdge(tag1, %)]
|
||||
// tags: [tag1, getOppositeEdge(tag1)]
|
||||
// }, %)
|
||||
}
|
||||
// The vase is 100 layers tall.
|
||||
|
@ -24,7 +24,7 @@ const plumbus1 =
|
||||
|> extrude(plumbusLen, %)
|
||||
|> fillet({
|
||||
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 plumbus0 =
|
||||
@ -32,7 +32,7 @@ const plumbus0 =
|
||||
|> extrude(plumbusLen, %)
|
||||
|> fillet({
|
||||
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, %)
|
||||
|> angledLine([0, 191.26], %, $rectangleSegmentA001)
|
||||
|> angledLine([
|
||||
segAng(rectangleSegmentA001, %) - 90,
|
||||
segAng(rectangleSegmentA001) - 90,
|
||||
196.99
|
||||
], %, $rectangleSegmentB001)
|
||||
|> angledLine([
|
||||
segAng(rectangleSegmentA001, %),
|
||||
-segLen(rectangleSegmentA001, %)
|
||||
segAng(rectangleSegmentA001),
|
||||
-segLen(rectangleSegmentA001)
|
||||
], %, $rectangleSegmentC001)
|
||||
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
||||
|> close(%)
|
||||
|
@ -259,7 +259,7 @@ async fn serial_test_basic_fillet_cube_end() {
|
||||
|> line([0, -10], %, $thing2)
|
||||
|> close(%)
|
||||
|> 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)
|
||||
|> close(%, $thing3)
|
||||
|> 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)
|
||||
|> close(%, $thing3)
|
||||
|> extrude(10, %)
|
||||
|> fillet({radius: 2, tags: [getNextAdjacentEdge(thing3, %)]}, %)
|
||||
|> fillet({radius: 2, tags: [getNextAdjacentEdge(thing3)]}, %)
|
||||
"#;
|
||||
|
||||
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)
|
||||
|> close(%, $thing3)
|
||||
|> extrude(10, %)
|
||||
|> fillet({radius: 2, tags: [getPreviousAdjacentEdge(thing3, %)]}, %)
|
||||
|> fillet({radius: 2, tags: [getPreviousAdjacentEdge(thing3)]}, %)
|
||||
"#;
|
||||
|
||||
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([3.15, -9.85], %, $seg01)
|
||||
|> line([-15.17, -4.1], %)
|
||||
|> angledLine([segAng(seg01, %), 12.35], %)
|
||||
|> angledLine([segAng(seg01), 12.35], %)
|
||||
|> line([-13.02, 10.03], %)
|
||||
|> close(%)
|
||||
|> extrude(4, %)
|
||||
@ -1395,10 +1395,10 @@ const part = rectShape([0, 0], 20, 20)
|
||||
|> fillet({
|
||||
radius: 4,
|
||||
tags: [
|
||||
getNextAdjacentEdge(edge1, %),
|
||||
getNextAdjacentEdge(edge2, %),
|
||||
getNextAdjacentEdge(edge3, %),
|
||||
getNextAdjacentEdge(edge4, %)
|
||||
getNextAdjacentEdge(edge1),
|
||||
getNextAdjacentEdge(edge2),
|
||||
getNextAdjacentEdge(edge3),
|
||||
getNextAdjacentEdge(edge4)
|
||||
]
|
||||
}, %)
|
||||
"#;
|
||||
@ -1627,7 +1627,7 @@ const sketch001 = startSketchOn(box, "end")
|
||||
|> line([2, 0], %)
|
||||
|> line([0, 10], %)
|
||||
|> 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([0, 10], %)
|
||||
|> 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_eq!(
|
||||
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, %)
|
||||
|> revolve({
|
||||
angle: 90,
|
||||
axis: getOppositeEdge(revolveAxis, box)
|
||||
axis: getOppositeEdge(revolveAxis)
|
||||
}, %)
|
||||
"#;
|
||||
|
||||
@ -1804,19 +1804,19 @@ fn pentagon = (len) => {
|
||||
|> startProfileAt([-len / 2, -len / 2], %)
|
||||
|> angledLine({ angle: 0, length: len }, %, $a)
|
||||
|> angledLine({
|
||||
angle: segAng(a, %) + 180 - 108,
|
||||
angle: segAng(a) + 180 - 108,
|
||||
length: len
|
||||
}, %, $b)
|
||||
|> angledLine({
|
||||
angle: segAng(b, %) + 180 - 108,
|
||||
angle: segAng(b) + 180 - 108,
|
||||
length: len
|
||||
}, %, $c)
|
||||
|> angledLine({
|
||||
angle: segAng(c, %) + 180 - 108,
|
||||
angle: segAng(c) + 180 - 108,
|
||||
length: len
|
||||
}, %, $d)
|
||||
|> angledLine({
|
||||
angle: segAng(d, %) + 180 - 108,
|
||||
angle: segAng(d) + 180 - 108,
|
||||
length: len
|
||||
}, %)
|
||||
|
||||
@ -1831,7 +1831,7 @@ const plumbus0 = circle0
|
||||
|> extrude(10, %)
|
||||
|> fillet({
|
||||
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)
|
||||
@ -1839,7 +1839,7 @@ const plumbus1 = circle1
|
||||
|> extrude(10, %)
|
||||
|> fillet({
|
||||
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, %)
|
||||
|> fillet({
|
||||
radius: filletR,
|
||||
tags: [getNextAdjacentEdge(innerEdge, %)]
|
||||
tags: [getNextAdjacentEdge(innerEdge)]
|
||||
}, %)
|
||||
|> fillet({
|
||||
radius: filletR + thickness,
|
||||
tags: [getNextAdjacentEdge(outerEdge, %)]
|
||||
tags: [getNextAdjacentEdge(outerEdge)]
|
||||
}, %)
|
||||
"#;
|
||||
|
||||
@ -1934,7 +1934,7 @@ const bracket = startSketchOn('XY')
|
||||
assert!(result.is_err());
|
||||
assert_eq!(
|
||||
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({
|
||||
radius: filletR,
|
||||
tags: [
|
||||
getPreviousAdjacentEdge(innerEdge, %)
|
||||
getPreviousAdjacentEdge(innerEdge)
|
||||
]
|
||||
}, %)
|
||||
|> fillet({
|
||||
radius: filletR + thickness,
|
||||
tags: [
|
||||
getPreviousAdjacentEdge(outerEdge, %)
|
||||
getPreviousAdjacentEdge(outerEdge)
|
||||
]
|
||||
}, %)
|
||||
|
||||
@ -2247,15 +2247,15 @@ const sketch001 = startSketchOn("XZ")
|
||||
const baseExtrusion = extrude(width, sketch001)
|
||||
|> fillet({
|
||||
radius: cornerFilletRad,
|
||||
tags: [cornerFillet1, cornerFillet2, getOppositeEdge(cornerFillet1, %), getOppositeEdge(cornerFillet2, %)],
|
||||
tags: [cornerFillet1, cornerFillet2, getOppositeEdge(cornerFillet1), getOppositeEdge(cornerFillet2)],
|
||||
}, %)
|
||||
|> fillet({
|
||||
radius: filletRad,
|
||||
tags: [getPreviousAdjacentEdge(fillet1, %), getPreviousAdjacentEdge(fillet2, %)]
|
||||
tags: [getPreviousAdjacentEdge(fillet1), getPreviousAdjacentEdge(fillet2)]
|
||||
}, %)
|
||||
|> fillet({
|
||||
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)
|
||||
|> chamfer({
|
||||
length: cornerChamferRad,
|
||||
tags: [cornerChamfer1, cornerChamfer2, getOppositeEdge(cornerChamfer1, %), getOppositeEdge(cornerChamfer2, %)],
|
||||
tags: [cornerChamfer1, cornerChamfer2, getOppositeEdge(cornerChamfer1), getOppositeEdge(cornerChamfer2)],
|
||||
}, %)
|
||||
|> chamfer({
|
||||
length: chamferRad,
|
||||
tags: [getPreviousAdjacentEdge(chamfer1, %), getPreviousAdjacentEdge(chamfer2, %)]
|
||||
tags: [getPreviousAdjacentEdge(chamfer1), getPreviousAdjacentEdge(chamfer2)]
|
||||
}, %)
|
||||
|> chamfer({
|
||||
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], %)
|
||||
|> xLine(305.11, %, $seg01)
|
||||
|> yLine(-291.85, %)
|
||||
|> xLine(-segLen(seg01, %), %)
|
||||
|> xLine(-segLen(seg01), %)
|
||||
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
||||
|> close(%)
|
||||
|> extrude(40.14, %)
|
||||
@ -2339,7 +2339,7 @@ async fn serial_test_engine_error_source_range_on_last_command() {
|
||||
assert!(result.is_err());
|
||||
assert_eq!(
|
||||
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, %)
|
||||
|> fillet({
|
||||
radius: 10,
|
||||
tags: [getOppositeEdge(line1,%)]
|
||||
tags: [getOppositeEdge(line1)]
|
||||
}, %)
|
||||
|
||||
const pattn1 = patternLinear3d({
|
||||
@ -2394,7 +2394,7 @@ const part001 = cube([0,0], 20)
|
||||
|> extrude(20, %)
|
||||
|> fillet({
|
||||
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)
|
||||
@ -2425,7 +2425,7 @@ const part001 = cube([0,0], 20)
|
||||
|> extrude(20, %)
|
||||
|> chamfer({
|
||||
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)
|
||||
@ -2456,7 +2456,7 @@ const part001 = cube([0,0], 20)
|
||||
|> extrude(20, %)
|
||||
|> chamfer({
|
||||
length: 10,
|
||||
tags: [line1, getOppositeEdge(line1,%)]
|
||||
tags: [line1, getOppositeEdge(line1)]
|
||||
}, %, $chamfer1)
|
||||
|
||||
|
||||
@ -2466,7 +2466,7 @@ const part001 = cube([0,0], 20)
|
||||
assert!(result.is_err());
|
||||
assert_eq!(
|
||||
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
|
||||
}
|
||||
const part001 = cube([0,0], 20)
|
||||
|> close(%, 'line1')
|
||||
|> close(%, $line1)
|
||||
|> extrude(20, %)
|
||||
|> chamfer({
|
||||
length: 10,
|
||||
tags: [getOppositeEdge('line1',%)]
|
||||
}, %, 'chamfer1')
|
||||
tags: [getOppositeEdge(line1)]
|
||||
}, %, $chamfer1)
|
||||
|
||||
const sketch001 = startSketchOn(part001, 'chamfer1')
|
||||
|> startProfileAt([4.28, 3.83], %)
|
||||
@ -2515,11 +2515,11 @@ async fn serial_test_duplicate_tags_should_error() {
|
||||
|> startProfileAt([-len / 2, -len / 2], %)
|
||||
|> angledLine({ angle: 0, length: len }, %, $a)
|
||||
|> angledLine({
|
||||
angle: segAng(a, %) + 120,
|
||||
angle: segAng(a) + 120,
|
||||
length: len
|
||||
}, %, $b)
|
||||
|> angledLine({
|
||||
angle: segAng(b, %) + 120,
|
||||
angle: segAng(b) + 120,
|
||||
length: len
|
||||
}, %, $a)
|
||||
}
|
||||
@ -2531,7 +2531,7 @@ let p = triangle(200)
|
||||
assert!(result.is_err());
|
||||
assert_eq!(
|
||||
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);
|
||||
}
|
||||
|
||||
#[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")]
|
||||
async fn serial_test_pattern_vase() {
|
||||
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