Files
modeling-app/docs/kcl/patternTransform.md

449 lines
458 KiB
Markdown
Raw Normal View History

2024-06-27 22:20:51 -05:00
---
title: "patternTransform"
excerpt: "A linear pattern on a 3D solid."
layout: manual
---
A linear pattern on a 3D solid.
Each repetition of the pattern can be transformed (e.g. scaled, translated, hidden, etc).
```js
patternTransform(num_repetitions: u32, transform_function: FunctionParam, extrude_group_set: ExtrudeGroupSet) -> [ExtrudeGroup]
```
### Examples
```js
// Parameters
const r = 50 // base radius
const h = 10 // layer height
const t = 0.005 // taper factor [0-1)
// Defines how to modify each layer of the vase.
// Each replica is shifted up the Z axis, and has a smoothly-varying radius
fn transform = (replicaId) => {
let scale = r * abs(1 - (t * replicaId)) * (5 + cos(replicaId / 8))
return {
translate: [0, 0, replicaId * 10],
scale: [scale, scale, 0]
}
}
// Each layer is just a pretty thin cylinder.
fn layer = () => {
return startSketchOn("XY")
// or some other plane idk
|> circle([0, 0], 1, %, $tag1)
|> extrude(h, %)
}
// The vase is 100 layers tall.
// The 100 layers are replica of each other, with a slight transformation applied to each.
let vase = layer()
|> patternTransform(100, transform, %)
```
![Rendered example of patternTransform 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAU5I0lEQVR4Ae3gAZAkSZIkSRKLqpm7R0REZmZmVlVVVVV3d3d3d/fMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMdHd3d3dXV1VVVVVmZkZGRIS7m5kKz0xmV3d1d3dPz8zMzMxMYn3Qgx7EVVddddVVV1111VVXXXXVVVddddVVV131fxKVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrvoPdc011zyYZzpz5syDeaZrrrnmwTzAmTNnHsRzueaaax7Mc7nmmmsezAtx5syZB/Of7OzZs7fyAtx333238nzcd999t/IAZ8+efQYPcN99993KM509e/ZWnum+++67lauuuuqqq6666qqr/qOgBz3oQVx11VVXXXXVVVddBddcc82DAc6cOfNggGuuuebBZ86ceRDPdM011zwY4Jprrnkwz3TmzJkHA1xzzTUP5t/oD//wD3luly5d4rnt7e3xwkgC4NKlS/x7HDt2jBfFzs4Oz8/Ozg4AkgB4lVd5Ff6t7rvvvlt5prNnz94KcN99993KM9133323nj179hk803333XcrwNmzZ2+97777buWqq6666qqrrrrqKvSgBz2Iq6666qqrrrrqqv9rrrnmmgcDnDlz5sHXXHPNg8+cOfMgnumaa6558DXXXPPgM2fOPBjgmmuueTAvwF/8xV9w8eJFNjY2ALh06RIAe3t73O/SpUsA7O3t8Z9NEv+TSOI/w87ODg+0s7MDwLFjx7jfzs4Ofd8D8HIv93K8IPfdd9+tAGfPnr31vvvuuxXgvvvuu/Xs2bPPALjvvvtuBfiHf/iH3+aqq6666qqrrrrq/x70oAc9iKuuuuqqq6666qr/Ta655poHA7zYi73Ya585c+ZBANdcc82Dr7nmmgefOXPmwddcc82D77vvvluvueaaB/NMf/mXf8lyuQRgb2+PS5cuAbC3t8fe3h7/k0jifxpJ/E8jiX/Jzs4OADs7OwDs7OwAsLOzQ9/3vNzLvRwPdN99990KcPbs2Vvvu+++WwH+4R/+4XcA7rvvvlvPnj1763333XcrV1111VVXXXXVVf97oAc96EFcddVVV1111VVX/U9zzTXXPPjMmTMPfrEXe7HXAnjxF3/x1z5z5syDr7nmmgfzAH/5l3/Jcrlkb2+PS5cuAXD77bfz3CTxP40k/ieRxP80kvivtLOzA8DOzg47Ozvs7Owwm8142Zd9We5333333Qpw9uzZW++7775b/+Ef/uF37rvvvlvPnj1763333XcrV1111VVXXXXVVf+zoAc96EFcddVVV1111VVX/Xe55pprHnzmzJkHv9iLvdhrXXPNNQ++5pprHvxiL/Zir80z/eVf/iXL5ZK9vT0uXbrE7bffzgsjif9JJPE/jST+p5HE/0SSeG47OzsA3HTTTQCcPn2al33ZlwXgvvvuuxXgH/7hH377H/7hH37nvvvuu/Uf/uEffpurrrrqqquuuuqq/z7oQQ96EFddddVVV1111VX/Va655poHv/Zrv/Z7AbzTO73TZ/NMv/Ebv8F8Puf222/n9ttv518iif9JJPE/jST+J5LE/zSS+I+ws7PDzs4OOzs7nD59mpd92ZcF4L777rv1H/7hH377H/7hH37nvvvuu/Uf/uEffpurrrrqqquuuuqq/xroQQ96EFddddVVV1111VX/ma655poHv9iLvdhrv+M7vuNnXXPNNQ/+y7/8S5bLJbfffju33347L4gk/qeRxP80kvifSBL/E0niv9LOzg4AN910E6dPn+ZlX/Zlue+++279rd/6re/+h3/4h9/5h3/4h9/mqquuuuqqq6666j8PetCDHsRVV1111VVXXXXVf4Z3fMd3/KzXeZ3Xee9rrrnmwb/0S7/EpUuXuP3223lukvifRhL/E0nifxpJ/E8lif+Jjh07xmMe8xhe+ZVfmfvuu+/W3/qt3/ruH/3RH/0crrrqqquuuuqqq/7joQc96EFcddVVV1111VVX/Ue65pprHvzhH/7h33XDDTe89h//8R/z93//9wBI4n8aSfxPJIn/iSTxP5Ek/qeSxAtz00038bIv+7IcHR399md+5me+DlddddVVV1111VX/sSjHjx/nqquuuuqqq6666j/S+7zP+3zVxsbGW//Yj/0YZ8+eRRKS+O8mCUlIQhKS+J9AEpKQhCQk8T+BJCQhCUlI4n8CSUhCEpKQxP8UkpCEJCQhiX/J3t4eT3ziEzlz5syDb7rpJv7hH/7hd7jqqquuuuqqq676j0Nw1VVXXXXVVVdd9R+s67oH899IEpKQhCQkIYn/bpKQhCQkIQlJ/E8gCUlIQhKS+J9AEpKQhCQk8T+FJCQhCUlI4t9jZ2eHBz/4we99zTXXPJirrrrqqquuuuqq/zgEV1111VVXXXXVVf+Brrnmmgf
2024-06-27 22:20:51 -05:00
### Arguments
* `num_repetitions`: `u32` (REQUIRED)
* `transform_function`: `FunctionParam` (REQUIRED)
* `extrude_group_set`: `ExtrudeGroupSet` - A extrude group or a group of extrude groups. (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.
edgeId: uuid,
2024-06-27 22:20:51 -05:00
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
tag: {
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
end: number,
start: number,
value: string,
},
2024-06-27 22:20:51 -05:00
type: "fillet",
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
2024-06-27 22:20:51 -05:00
// 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],
2024-06-27 22:20:51 -05:00
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 (this will change when the engine's reference to it changes.
2024-06-27 22:20:51 -05:00
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 planes X axis be?
xAxis: {
x: number,
y: number,
z: number,
},
// What should the planes 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.
edgeId: uuid,
2024-06-27 22:20:51 -05:00
// The id of the engine command that called this fillet.
id: uuid,
radius: number,
tag: {
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
end: number,
start: number,
value: string,
},
2024-06-27 22:20:51 -05:00
type: "fillet",
} |
{
// The engine id of the edge to chamfer.
edgeId: uuid,
2024-06-27 22:20:51 -05:00
// 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],
2024-06-27 22:20:51 -05:00
end: number,
start: number,
value: string,
},
type: "chamfer",
}],
// The height of the extrude group.
height: number,
// The id of the extrude group.
id: uuid,
// The sketch group.
sketchGroup: SketchGroup,
// The id of the extrusion start cap
startCapId: uuid,
// The extrude surfaces.
value: [{
// The face id for the extrude plane.
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],
2024-06-27 22:20:51 -05:00
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],
2024-06-27 22:20:51 -05:00
end: number,
start: number,
value: string,
},
type: "extrudeArc",
} |
{
// The id for the chamfer surface.
faceId: uuid,
// The id of the geometry.
id: uuid,
// The source range.
sourceRange: [number, number],
// The tag.
tag: {
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
end: number,
start: number,
value: string,
},
type: "chamfer",
} |
{
// The id for the fillet surface.
faceId: uuid,
// The id of the geometry.
id: uuid,
// The source range.
sourceRange: [number, number],
// The tag.
tag: {
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
end: number,
start: number,
value: string,
},
type: "fillet",
2024-06-27 22:20:51 -05:00
}],
},
// The id of the face.
id: uuid,
type: "face",
// The tag of the face.
value: string,
// What should the faces X axis be?
xAxis: {
x: number,
y: number,
z: number,
},
// What should the faces 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],
2024-06-27 22:20:51 -05:00
end: number,
start: number,
value: string,
},
// The to point.
to: [number, number],
},
// Tag identifiers that have been declared in this sketch group.
tags: {
2024-06-27 22:20:51 -05:00
},
// 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],
2024-06-27 22:20:51 -05:00
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],
2024-06-27 22:20:51 -05:00
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],
2024-06-27 22:20:51 -05:00
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],
2024-06-27 22:20:51 -05:00
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],
2024-06-27 22:20:51 -05:00
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],
2024-06-27 22:20:51 -05:00
end: number,
start: number,
value: string,
},
// The to point.
to: [number, number],
type: "Base",
}],
},
// The id of the extrusion start cap
startCapId: uuid,
type: "extrudeGroup",
// 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],
2024-06-27 22:20:51 -05:00
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],
2024-06-27 22:20:51 -05:00
end: number,
start: number,
value: string,
},
type: "extrudeArc",
} |
{
// The id for the chamfer surface.
faceId: uuid,
// The id of the geometry.
id: uuid,
// The source range.
sourceRange: [number, number],
// The tag.
tag: {
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
end: number,
start: number,
value: string,
},
type: "chamfer",
} |
{
// The id for the fillet surface.
faceId: uuid,
// The id of the geometry.
id: uuid,
// The source range.
sourceRange: [number, number],
// The tag.
tag: {
digest: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number],
end: number,
start: number,
value: string,
},
type: "fillet",
2024-06-27 22:20:51 -05:00
}],
} |
{
type: "extrudeGroups",
}
```
### Returns
`[ExtrudeGroup]`