forgecad 0.6.3 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -12
- package/dist/assets/{AdminPage-CeqCUUgu.js → AdminPage-D4bocK4E.js} +250 -151
- package/dist/assets/{BlogPage-P_AJP0v9.js → BlogPage-CJEXL_zJ.js} +94 -70
- package/dist/assets/{DocsPage-CKRV2iq2.js → DocsPage-D3A_g8V3.js} +329 -163
- package/dist/assets/{EditorApp-CnC2k4cW.css → EditorApp-BWYUSpUN.css} +590 -136
- package/dist/assets/EditorApp-Cihhqcsq.js +11692 -0
- package/dist/assets/{EmbedViewer-DBlzmQ5i.js → EmbedViewer-kWjKaC_t.js} +2 -4
- package/dist/assets/LandingPageProofDriven-Bg2IUc3l.css +856 -0
- package/dist/assets/LandingPageProofDriven-DXkKlyhI.js +601 -0
- package/dist/assets/PricingPage-BsU5vzEx.js +232 -0
- package/dist/assets/{SettingsPage-BqCh9JcC.js → SettingsPage-PqvpAKIs.js} +129 -5
- package/dist/assets/{evalWorker-Ql-aKwLA.js → evalWorker-C-hzNUMy.js} +8949 -3161
- package/dist/assets/{Viewport-CoB46f5R.js → index-Pz321YAt.js} +38382 -7501
- package/dist/assets/{index-2hfs_ub0.css → index-ay13WNfa.css} +726 -53
- package/dist/assets/{javascript-DCxGoE5Y.js → javascript-DAl8Gmyo.js} +1 -1
- package/dist/assets/{manifold-CqNMHHKO.js → manifold-BcbjWLIo.js} +4 -3
- package/dist/assets/{manifold-Cce9wRFz.js → manifold-DBckbFgx.js} +1 -1
- package/dist/assets/{manifold-D6BeHIOo.js → manifold-O2AAGXyj.js} +1 -1
- package/dist/assets/{reportWorker-sFEFonXf.js → reportWorker-Dxr-5A7w.js} +8760 -3559
- package/dist/assets/{vendor-react-Dt7-aaJH.js → vendor-react-CG3i_wp0.js} +65 -8
- package/dist/docs/index.html +2 -2
- package/dist/docs-raw/CLI.md +341 -718
- package/dist/docs-raw/generated/assembly.md +699 -112
- package/dist/docs-raw/generated/concepts.md +1834 -1346
- package/dist/docs-raw/generated/core.md +1012 -1059
- package/dist/docs-raw/generated/curves.md +759 -116
- package/dist/docs-raw/generated/lib.md +43 -748
- package/dist/docs-raw/generated/output.md +139 -245
- package/dist/docs-raw/generated/sdf.md +208 -0
- package/dist/docs-raw/generated/sheet-metal.md +473 -21
- package/dist/docs-raw/generated/sketch.md +1518 -362
- package/dist/docs-raw/generated/viewport.md +368 -299
- package/dist/docs-raw/generated/wood.md +104 -0
- package/dist/index.html +2 -2
- package/dist/landing/proof-ams-adapter.png +0 -0
- package/dist/landing/proof-bolt-and-nut.png +0 -0
- package/dist/landing/proof-fillet-enclosure.png +0 -0
- package/dist/landing/proof-glasses.png +0 -0
- package/dist/landing/proof-gyroid.png +0 -0
- package/dist/sitemap.xml +6 -6
- package/dist-cli/forgecad.js +12321 -5700
- package/dist-cli/forgecad.js.map +1 -0
- package/dist-cli/solver-46FFSK2U.js +363 -0
- package/dist-cli/solver-46FFSK2U.js.map +1 -0
- package/dist-skill/CONTEXT.md +4890 -6302
- package/dist-skill/SKILL-dev.md +22 -66
- package/dist-skill/SKILL.md +20 -59
- package/dist-skill/docs/API/core/concepts.md +37 -92
- package/dist-skill/docs/CLI.md +341 -718
- package/dist-skill/docs/generated/assembly.md +699 -112
- package/dist-skill/docs/generated/core.md +1012 -1059
- package/dist-skill/docs/generated/curves.md +759 -116
- package/dist-skill/docs/generated/lib.md +43 -748
- package/dist-skill/docs/generated/output.md +139 -245
- package/dist-skill/docs/generated/sdf.md +208 -0
- package/dist-skill/docs/generated/sheet-metal.md +473 -21
- package/dist-skill/docs/generated/sketch.md +1518 -362
- package/dist-skill/docs/generated/viewport.md +368 -299
- package/dist-skill/docs/generated/wood.md +104 -0
- package/dist-skill/docs/guides/coordinate-system.md +11 -17
- package/dist-skill/docs/guides/geometry-conventions.md +13 -70
- package/dist-skill/docs/guides/joint-design.md +78 -0
- package/dist-skill/docs/guides/modeling-recipes.md +22 -195
- package/dist-skill/docs/guides/positioning.md +88 -147
- package/dist-skill/docs-dev/API/core/concepts.md +78 -0
- package/dist-skill/docs-dev/CLI.md +488 -0
- package/dist-skill/{docs → docs-dev}/blueprint-first.md +5 -0
- package/dist-skill/{docs → docs-dev}/coding-best-practices.md +6 -8
- package/dist-skill/{docs → docs-dev}/coding.md +2 -4
- package/dist-skill/docs-dev/component-model.md +164 -0
- package/dist-skill/docs-dev/generated/assembly.md +779 -0
- package/dist-skill/docs-dev/generated/core.md +1676 -0
- package/dist-skill/docs-dev/generated/curves.md +855 -0
- package/dist-skill/docs-dev/generated/lib.md +55 -0
- package/dist-skill/docs-dev/generated/output.md +234 -0
- package/dist-skill/docs-dev/generated/sdf.md +208 -0
- package/dist-skill/docs-dev/generated/sheet-metal.md +506 -0
- package/dist-skill/docs-dev/generated/sketch.md +1753 -0
- package/dist-skill/docs-dev/generated/viewport.md +513 -0
- package/dist-skill/docs-dev/generated/wood.md +104 -0
- package/dist-skill/docs-dev/guides/coordinate-system.md +46 -0
- package/dist-skill/docs-dev/guides/geometry-conventions.md +52 -0
- package/dist-skill/docs-dev/guides/joint-design.md +78 -0
- package/dist-skill/docs-dev/guides/modeling-recipes.md +77 -0
- package/dist-skill/docs-dev/guides/positioning.md +151 -0
- package/dist-skill/{docs → docs-dev}/guides/skill-maintenance.md +21 -10
- package/dist-skill/{docs → docs-dev}/internals/compiler.md +5 -6
- package/dist-skill/{docs → docs-dev}/internals/constraint-solver-quality.md +0 -1
- package/dist-skill/{docs → docs-dev}/internals/constraint-solver.md +0 -1
- package/dist-skill/{docs → docs-dev}/internals/sketch-2d-pipeline.md +2 -3
- package/examples/api/attachTo-basics.forge.js +8 -8
- package/examples/api/bill-of-materials.forge.js +9 -9
- package/examples/api/bolt-pattern.forge.js +5 -5
- package/examples/api/boolean-operations.forge.js +5 -5
- package/examples/api/bounding-box-visualizer.forge.js +3 -3
- package/examples/api/clone-duplicate.forge.js +2 -2
- package/examples/api/colors-union-vs-array.forge.js +6 -6
- package/examples/api/connector-assembly.forge.js +8 -6
- package/examples/api/connector-basics.forge.js +7 -7
- package/examples/api/constrained-sketch-mechanical.forge.js +4 -4
- package/examples/api/elbow-test.forge.js +3 -3
- package/examples/api/extrude-options.forge.js +8 -14
- package/examples/api/feature-created-faces.forge.js +6 -10
- package/examples/api/fillet-showcase.forge.js +2 -2
- package/examples/api/folded-service-panel-cover.forge.js +2 -2
- package/examples/api/gears-tier1.forge.js +5 -5
- package/examples/api/group-test.forge.js +3 -3
- package/examples/api/group-vs-union.forge.js +1 -1
- package/examples/api/highlight-debug.forge.js +4 -0
- package/examples/api/js-module-pillars.js +1 -1
- package/examples/api/js-module-scene.js +2 -2
- package/examples/api/mesh-import-slats.forge.js +4 -4
- package/examples/api/patterns.forge.js +3 -3
- package/examples/api/pointAlong-orientation.forge.js +3 -3
- package/examples/api/profile-2020-b-slot6.forge.js +4 -5
- package/examples/api/route-perimeter-flange.forge.js +1 -1
- package/examples/api/sdf-rover-demo.forge.js +10 -10
- package/examples/api/sketch-on-face-demo.forge.js +2 -2
- package/examples/api/sketch-regions.forge.js +4 -4
- package/examples/api/sketch-rounding-strategies.forge.js +1 -1
- package/examples/api/smooth-curve-connections.forge.js +1 -1
- package/examples/api/transition-curves.forge.js +4 -4
- package/examples/api/variable-sweep-pure-sdf-test.forge.js +162 -0
- package/examples/api/variable-sweep-test.forge.js +2 -2
- package/examples/api/wood-joinery.forge.js +60 -0
- package/examples/compiler-corpus/enclosure-shell-cuts.forge.js +3 -3
- package/examples/compiler-corpus/fastener-plate-variants.forge.js +2 -2
- package/examples/constraints/01-fully-constrained-rect.forge.js +2 -2
- package/examples/constraints/02-underconstrained-triangle.forge.js +1 -1
- package/examples/constraints/03-redundant-constraints.forge.js +2 -2
- package/examples/constraints/05-parallel-with-linedistance.forge.js +2 -2
- package/examples/constraints/06-complex-spectrogram.forge.js +1 -1
- package/examples/constraints/07-perpendicular-chain.forge.js +4 -4
- package/examples/constraints/08-symmetric-bracket.forge.js +4 -4
- package/examples/constraints/09-stress-spiral.forge.js +1 -1
- package/examples/constraints/10-stress-honeycomb.forge.js +1 -1
- package/examples/constraints/11-surface-grid.forge.js +2 -2
- package/examples/constraints/12-surface-nested.forge.js +4 -4
- package/examples/constraints/13-surface-complex.forge.js +1 -1
- package/examples/exact-arc-housing.forge.js +12 -0
- package/examples/experiments/drone-arm.forge.js +53 -0
- package/examples/furniture/adjustable-table.forge.js +15 -15
- package/examples/furniture/bathroom.forge.js +26 -26
- package/examples/furniture/chair.forge.js +13 -13
- package/examples/furniture/picture-frame.forge.js +6 -6
- package/examples/furniture/shoe-rack-doors.forge.js +8 -8
- package/examples/furniture/shoe-rack.forge.js +7 -7
- package/examples/furniture/table-lamp.forge.js +8 -8
- package/examples/gcode/lissajous-vase.forge.js +4 -4
- package/examples/gcode/math-surface.forge.js +3 -3
- package/examples/gcode/parametric-vase.forge.js +4 -4
- package/examples/gcode/spiral-tower.forge.js +4 -4
- package/examples/generative/crystal-growth.forge.js +9 -9
- package/examples/generative/frost-spires.forge.js +9 -9
- package/examples/generative/golden-spiral-tower.forge.js +11 -11
- package/examples/generative/molten-forge.forge.js +6 -6
- package/examples/generative/neon-coral.forge.js +7 -7
- package/examples/mechanical/3d-printer.forge.js +37 -37
- package/examples/mechanical/5-finger-robot-hand.forge.js +19 -19
- package/examples/mechanical/airplane-propeller.forge.js +9 -9
- package/examples/mechanical/bolt-and-nut.forge.js +10 -10
- package/examples/mechanical/door-with-hinges.forge.js +7 -7
- package/examples/mechanical/fillet-enclosure.forge.js +15 -11
- package/examples/mechanical/headphone-hanger-v2.forge.js +11 -11
- package/examples/mechanical/robot_hand.forge.js +24 -24
- package/examples/mechanical/robot_hand_2.forge.js +26 -26
- package/examples/nurbs-surface.forge.js +8 -0
- package/examples/nurbs-tube.forge.js +7 -0
- package/examples/products/bottle.forge.js +8 -8
- package/examples/products/chess-set.forge.js +25 -25
- package/examples/products/classical-piano.forge.js +20 -20
- package/examples/products/clock.forge.js +33 -33
- package/examples/products/cup.forge.js +5 -5
- package/examples/products/iphone.forge.js +20 -20
- package/examples/products/laptop.forge.js +24 -24
- package/examples/products/laser-cut-box.forge.js +6 -6
- package/examples/products/laser-cut-tray.forge.js +6 -6
- package/examples/products/liquid-soap-dispenser.forge.js +23 -23
- package/examples/products/origami-fish.forge.js +14 -12
- package/examples/products/spiderman-cake.forge.js +6 -6
- package/examples/shelf/container.forge.js +5 -5
- package/examples/shelf/shelf-unit.forge.js +6 -6
- package/examples/toolbox/bolted-joint.forge.js +7 -7
- package/package.json +9 -4
- package/dist/assets/EditorApp-B-vQvgam.js +0 -9888
- package/dist/assets/LandingPage-C5n9hDXI.js +0 -322
- package/dist/assets/PublishedModelPage-Dt7PCVBj.js +0 -146
- package/dist/assets/__vite-browser-external-CURh0WXD.js +0 -8
- package/dist/assets/deserializeRunResult-BLAFoiE0.js +0 -19365
- package/dist/assets/index-1CYp3zUp.js +0 -1455
- package/dist-skill/docs/API/API.md +0 -1666
- package/dist-skill/docs/API/README.md +0 -37
- package/dist-skill/docs/API/assembly/assembly.md +0 -617
- package/dist-skill/docs/API/core/edge-queries.md +0 -130
- package/dist-skill/docs/API/core/parameters.md +0 -122
- package/dist-skill/docs/API/core/reserved-terms.md +0 -137
- package/dist-skill/docs/API/core/sdf.md +0 -326
- package/dist-skill/docs/API/core/skill-cli.md +0 -194
- package/dist-skill/docs/API/core/skill-guide.md +0 -205
- package/dist-skill/docs/API/core/specs.md +0 -186
- package/dist-skill/docs/API/core/topology.md +0 -372
- package/dist-skill/docs/API/entities.md +0 -268
- package/dist-skill/docs/API/output/bom.md +0 -58
- package/dist-skill/docs/API/output/brep-export.md +0 -87
- package/dist-skill/docs/API/output/dimensions.md +0 -67
- package/dist-skill/docs/API/output/export.md +0 -110
- package/dist-skill/docs/API/output/gcode.md +0 -195
- package/dist-skill/docs/API/runtime/viewport.md +0 -420
- package/dist-skill/docs/API/sheet-metal/sheet-metal.md +0 -185
- package/dist-skill/docs/API/sketch/anchor.md +0 -37
- package/dist-skill/docs/API/sketch/booleans.md +0 -91
- package/dist-skill/docs/API/sketch/core.md +0 -73
- package/dist-skill/docs/API/sketch/extrude.md +0 -62
- package/dist-skill/docs/API/sketch/on-face.md +0 -104
- package/dist-skill/docs/API/sketch/operations.md +0 -78
- package/dist-skill/docs/API/sketch/path.md +0 -75
- package/dist-skill/docs/API/sketch/primitives.md +0 -146
- package/dist-skill/docs/API/sketch/regions.md +0 -80
- package/dist-skill/docs/API/sketch/text.md +0 -108
- package/dist-skill/docs/API/sketch/transforms.md +0 -65
- package/dist-skill/docs/API/toolbox/fasteners.md +0 -129
- package/dist-skill/docs/INDEX.md +0 -94
- package/dist-skill/docs/RELEASING.md +0 -55
- package/dist-skill/docs/cli-monetization.md +0 -111
- package/dist-skill/docs/deployment.md +0 -281
- package/dist-skill/docs/generated/concepts.md +0 -2112
- package/dist-skill/docs/internals/shape-from-slices.md +0 -152
- package/dist-skill/docs/platform/admin.md +0 -45
- package/dist-skill/docs/platform/architecture.md +0 -79
- package/dist-skill/docs/platform/auth.md +0 -110
- package/dist-skill/docs/platform/email.md +0 -67
- package/dist-skill/docs/platform/projects.md +0 -111
- package/dist-skill/docs/platform/sharing.md +0 -90
- package/dist-skill/docs/runbook.md +0 -345
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
skill-group: core
|
|
3
|
-
skill-order: 4
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Edge Queries
|
|
7
|
-
|
|
8
|
-
Select and operate on edges of any 3D shape by geometric properties — direction, position, angle, convexity. This is the primary way to apply fillets and chamfers to specific edges without needing tracked topology.
|
|
9
|
-
|
|
10
|
-
## Selecting Edges
|
|
11
|
-
|
|
12
|
-
### `selectEdges(shape, query?)`
|
|
13
|
-
|
|
14
|
-
Find all edges that match a geometric query. Edges are extracted from the mesh as sharp features (dihedral angle > 1°).
|
|
15
|
-
|
|
16
|
-
**Parameters:**
|
|
17
|
-
- `shape` (Shape | TrackedShape) — The solid to query
|
|
18
|
-
- `query` (EdgeQuery, optional) — Filters to apply (see below)
|
|
19
|
-
|
|
20
|
-
**Returns:** `EdgeSegment[]` — Matching edge segments
|
|
21
|
-
|
|
22
|
-
### `selectEdge(shape, query?)`
|
|
23
|
-
|
|
24
|
-
Find the single best-matching edge. When `near` is specified, returns the closest match. Throws if no edges match.
|
|
25
|
-
|
|
26
|
-
**Parameters:** Same as `selectEdges()`
|
|
27
|
-
|
|
28
|
-
**Returns:** `EdgeSegment` — The best-matching edge
|
|
29
|
-
|
|
30
|
-
**Throws:** If no edges match the query
|
|
31
|
-
|
|
32
|
-
### EdgeQuery Filters
|
|
33
|
-
|
|
34
|
-
| Filter | Type | Description |
|
|
35
|
-
|--------|------|-------------|
|
|
36
|
-
| `near` | `[x, y, z]` | Sort by proximity to this point (closest first) |
|
|
37
|
-
| `parallel` | `[x, y, z]` | Edge direction ~parallel to this vector |
|
|
38
|
-
| `perpendicular` | `[x, y, z]` | Edge direction ~perpendicular to this vector |
|
|
39
|
-
| `convex` | `boolean` | Only convex (outside corner) edges |
|
|
40
|
-
| `concave` | `boolean` | Only concave (inside corner) edges |
|
|
41
|
-
| `minAngle` | `number` | Minimum dihedral angle (degrees) |
|
|
42
|
-
| `maxAngle` | `number` | Maximum dihedral angle (degrees) |
|
|
43
|
-
| `minLength` | `number` | Minimum edge length |
|
|
44
|
-
| `maxLength` | `number` | Maximum edge length |
|
|
45
|
-
| `within` | `BoundingRegion` | Edge midpoint must be inside this box |
|
|
46
|
-
| `atZ` | `number` | Edge midpoint Z ≈ this value (shorthand for `within`) |
|
|
47
|
-
| `tolerance` | `number` | Position tolerance. Default: `1.0` |
|
|
48
|
-
| `angleTolerance` | `number` | Angular tolerance in degrees. Default: `10` |
|
|
49
|
-
|
|
50
|
-
**BoundingRegion:** `{ xMin?, xMax?, yMin?, yMax?, zMin?, zMax? }` — any combination of axis bounds.
|
|
51
|
-
|
|
52
|
-
```javascript
|
|
53
|
-
const part = box(50, 30, 20);
|
|
54
|
-
|
|
55
|
-
// All vertical edges
|
|
56
|
-
const verticals = selectEdges(part, { parallel: [0, 0, 1] });
|
|
57
|
-
|
|
58
|
-
// Top-face edges only
|
|
59
|
-
const topEdges = selectEdges(part, { atZ: 20 });
|
|
60
|
-
|
|
61
|
-
// Nearest convex edge to a point
|
|
62
|
-
const nearest = selectEdge(part, { near: [50, 30, 20], convex: true });
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
### `coalesceEdges(segments, tolerance?)`
|
|
66
|
-
|
|
67
|
-
Merge collinear edge segments into longer logical edges. Mesh tessellation often splits a single geometric edge into multiple short segments — this function recombines them.
|
|
68
|
-
|
|
69
|
-
**Parameters:**
|
|
70
|
-
- `segments` (EdgeSegment[]) — Edge segments to merge
|
|
71
|
-
- `tolerance` (number) — Collinearity tolerance. Default: `0.01`
|
|
72
|
-
|
|
73
|
-
**Returns:** `EdgeSegment[]` — Merged edge segments
|
|
74
|
-
|
|
75
|
-
```javascript
|
|
76
|
-
const edges = selectEdges(shape, { parallel: [0, 0, 1] });
|
|
77
|
-
const merged = coalesceEdges(edges);
|
|
78
|
-
// merged has fewer, longer edges
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
## Applying Features
|
|
82
|
-
|
|
83
|
-
### `filletEdgeSegment(shape, segment, radius, segments?)`
|
|
84
|
-
|
|
85
|
-
Apply a fillet (rounded edge) to a mesh-selected edge. Works on any straight edge — not limited to tracked topology.
|
|
86
|
-
|
|
87
|
-
**Parameters:**
|
|
88
|
-
- `shape` (Shape | TrackedShape) — The solid to modify
|
|
89
|
-
- `segment` (EdgeSegment) — From `selectEdge()` / `selectEdges()`
|
|
90
|
-
- `radius` (number) — Fillet radius
|
|
91
|
-
- `segments` (number) — Arc segments. Default: `16`
|
|
92
|
-
|
|
93
|
-
**Returns:** `Shape` — New shape with fillet applied
|
|
94
|
-
|
|
95
|
-
### `chamferEdgeSegment(shape, segment, size)`
|
|
96
|
-
|
|
97
|
-
Apply a chamfer (beveled edge) to a mesh-selected edge.
|
|
98
|
-
|
|
99
|
-
**Parameters:**
|
|
100
|
-
- `shape` (Shape | TrackedShape) — The solid to modify
|
|
101
|
-
- `segment` (EdgeSegment) — From `selectEdge()` / `selectEdges()`
|
|
102
|
-
- `size` (number) — Chamfer distance from edge
|
|
103
|
-
|
|
104
|
-
**Returns:** `Shape` — New shape with chamfer applied
|
|
105
|
-
|
|
106
|
-
```javascript
|
|
107
|
-
const part = box(50, 30, 20);
|
|
108
|
-
|
|
109
|
-
// Fillet all top edges
|
|
110
|
-
const topEdges = selectEdges(part, { atZ: 20, perpendicular: [0, 0, 1] });
|
|
111
|
-
let result = part;
|
|
112
|
-
for (const edge of coalesceEdges(topEdges)) {
|
|
113
|
-
result = filletEdgeSegment(result, edge, 2);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// Chamfer a single bottom edge
|
|
117
|
-
const bottomEdge = selectEdge(part, { near: [25, 0, 0], atZ: 0 });
|
|
118
|
-
result = chamferEdgeSegment(result, bottomEdge, 1.5);
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
> **Callout:** These functions work alongside the tracked-topology `filletEdge()` and `chamferEdge()` (which take an `EdgeRef` from a `TrackedShape`). Use edge queries when you don't have tracked topology — e.g., after boolean operations that strip topology, or on imported shapes.
|
|
122
|
-
|
|
123
|
-
## Comparison: Edge Queries vs. Tracked Topology
|
|
124
|
-
|
|
125
|
-
| Approach | Input | When to use |
|
|
126
|
-
|----------|-------|-------------|
|
|
127
|
-
| `filletEdge(shape, edge, radius)` | `EdgeRef` from `TrackedShape` | Simple boxes/cylinders, before booleans |
|
|
128
|
-
| `filletEdgeSegment(shape, segment, radius)` | `EdgeSegment` from `selectEdge()` | After booleans, complex shapes, imported geometry |
|
|
129
|
-
|
|
130
|
-
Both produce the same result — the query-based approach is more flexible but requires describing the edge geometrically instead of by name.
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
skill-group: core
|
|
3
|
-
skill-order: 2
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Parameters
|
|
7
|
-
|
|
8
|
-
ForgeCAD scripts declare parameters that automatically generate UI controls (sliders, checkboxes, dropdowns). Parameters make models interactive — change a value, see the geometry update.
|
|
9
|
-
|
|
10
|
-
## `param(name, default, options?)`
|
|
11
|
-
|
|
12
|
-
Declare a numeric parameter. Creates a slider in the UI.
|
|
13
|
-
|
|
14
|
-
**Parameters:**
|
|
15
|
-
- `name` (string) — Display name in the parameter panel
|
|
16
|
-
- `default` (number) — Initial value
|
|
17
|
-
- `options` (object, optional):
|
|
18
|
-
- `min` (number) — Minimum slider value. Default: `0`
|
|
19
|
-
- `max` (number) — Maximum slider value. Default: `default * 4`
|
|
20
|
-
- `step` (number) — Slider increment. Auto-calculated if omitted
|
|
21
|
-
- `unit` (string) — Display unit label, e.g. `"mm"`, `"°"`, `"%"`
|
|
22
|
-
- `integer` (boolean) — Round to whole numbers; step defaults to `1`. Use for counts, sides, quantities
|
|
23
|
-
- `reverse` (boolean) — Invert the slider direction
|
|
24
|
-
|
|
25
|
-
**Returns:** `number` — Current parameter value (default or overridden)
|
|
26
|
-
|
|
27
|
-
```javascript
|
|
28
|
-
const width = param("Width", 50);
|
|
29
|
-
const angle = param("Angle", 45, { min: 0, max: 180, unit: "°" });
|
|
30
|
-
const thick = param("Thickness", 2, { min: 0.5, max: 10, step: 0.5, unit: "mm" });
|
|
31
|
-
const sides = param("Sides", 6, { min: 3, max: 12, integer: true });
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
## `boolParam(name, default)`
|
|
35
|
-
|
|
36
|
-
Declare a boolean parameter. Creates a checkbox in the UI.
|
|
37
|
-
|
|
38
|
-
**Parameters:**
|
|
39
|
-
- `name` (string) — Display name in the parameter panel
|
|
40
|
-
- `default` (boolean) — Initial checkbox state
|
|
41
|
-
|
|
42
|
-
**Returns:** `boolean` — Current boolean value
|
|
43
|
-
|
|
44
|
-
```javascript
|
|
45
|
-
const showHoles = boolParam("Show Holes", true);
|
|
46
|
-
const centerOrigin = boolParam("Center at Origin", false);
|
|
47
|
-
|
|
48
|
-
// Conditional geometry
|
|
49
|
-
const plate = box(100, 60, 5);
|
|
50
|
-
if (showHoles) {
|
|
51
|
-
return difference(plate, cylinder(10, 5).translate(50, 30, 0));
|
|
52
|
-
}
|
|
53
|
-
return plate;
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
> **Callout:** `boolParam` was added to complement `param()` for on/off toggles. It renders as a checkbox rather than a slider. Internally the boolean is stored as `0`/`1`.
|
|
57
|
-
|
|
58
|
-
## `choiceParam(name, default, choices)`
|
|
59
|
-
|
|
60
|
-
Declare a string choice parameter. Creates a dropdown in the UI.
|
|
61
|
-
|
|
62
|
-
**Parameters:**
|
|
63
|
-
- `name` (string) — Display name in the parameter panel
|
|
64
|
-
- `default` (string) — Initial selected label. Must exactly match one of the entries in `choices`
|
|
65
|
-
- `choices` (string[]) — Ordered list of allowed labels shown in the dropdown
|
|
66
|
-
|
|
67
|
-
**Returns:** `string` — The currently selected choice label
|
|
68
|
-
|
|
69
|
-
```javascript
|
|
70
|
-
const panStyle = choiceParam("Pan Style", "frying-pan", [
|
|
71
|
-
"frying-pan",
|
|
72
|
-
"saute-pan",
|
|
73
|
-
"saucepan",
|
|
74
|
-
"wok",
|
|
75
|
-
]);
|
|
76
|
-
|
|
77
|
-
const finish = choiceParam("Finish", "stainless", [
|
|
78
|
-
"stainless",
|
|
79
|
-
"cast-iron",
|
|
80
|
-
"copper",
|
|
81
|
-
]);
|
|
82
|
-
|
|
83
|
-
if (panStyle === "wok") {
|
|
84
|
-
return buildWok();
|
|
85
|
-
}
|
|
86
|
-
return buildPan();
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
Use `choiceParam()` when a numeric slider would hide intent. It keeps scripts readable and makes CLI/import overrides self-describing.
|
|
90
|
-
|
|
91
|
-
## Parameter Overrides
|
|
92
|
-
|
|
93
|
-
When importing files with `require()`, you can override their parameters via an optional second argument:
|
|
94
|
-
|
|
95
|
-
```javascript
|
|
96
|
-
const bracket = require("./bracket.forge.js", { Width: 80, Thickness: 3 });
|
|
97
|
-
const logo = require("./logo.forge.js", { Scale: 0.5 });
|
|
98
|
-
const pan = require("./pan.forge.js", { "Pan Style": "wok", "Show Lid": 0 });
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
You can also override parameters from the CLI:
|
|
102
|
-
|
|
103
|
-
```bash
|
|
104
|
-
forgecad run model.forge.js --param "Wall Thickness=3"
|
|
105
|
-
forgecad run model.forge.js --param "Show Lid=0"
|
|
106
|
-
forgecad run model.forge.js --param "Pan Style=wok"
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
Override keys must match the `name` string passed to `param()`, `boolParam()`, or `choiceParam()` in the script.
|
|
110
|
-
|
|
111
|
-
- `param()` expects a number
|
|
112
|
-
- `boolParam()` expects `1`/`0` or `true`/`false` semantics via the UI; in CLI/import overrides, use `1` for true and `0` for false
|
|
113
|
-
- `choiceParam()` accepts either the string label or a numeric index, but the string label is recommended because it is clearer and more stable
|
|
114
|
-
|
|
115
|
-
Use `importSvgSketch()` for SVG files (SVG import does not use param overrides).
|
|
116
|
-
|
|
117
|
-
## Tips
|
|
118
|
-
|
|
119
|
-
- **Avoid recomputation**: Parameters trigger a full script re-execution on every change. Keep expensive operations behind boolean guards when possible.
|
|
120
|
-
- **Use `integer: true`** for discrete quantities (bolt count, polygon sides, array copies) — it prevents fractional values that would produce invalid geometry.
|
|
121
|
-
- **Unit labels are cosmetic**: The `unit` option only affects the UI display; it does not convert values.
|
|
122
|
-
- **Prefer `choiceParam()` for presets and named modes**: dropdown labels such as `"wok"` or `"saute-pan"` are easier to understand than numeric style ids.
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
skill-group: core
|
|
3
|
-
skill-order: 0
|
|
4
|
-
skill-tiers: [standard, one-file]
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Reserved Terms
|
|
8
|
-
|
|
9
|
-
Every `.forge.js` script runs in a sandbox with these names pre-defined as globals.
|
|
10
|
-
**Do not use any of these as variable, parameter, or function names** — your local
|
|
11
|
-
definition will shadow the built-in and silently break things.
|
|
12
|
-
|
|
13
|
-
## Module system
|
|
14
|
-
|
|
15
|
-
`exports`, `module`, `require`, `__filename`, `__dirname`
|
|
16
|
-
|
|
17
|
-
## Primitives (3D)
|
|
18
|
-
|
|
19
|
-
`box`, `cylinder`, `sphere`, `torus`
|
|
20
|
-
|
|
21
|
-
## Boolean operations (3D)
|
|
22
|
-
|
|
23
|
-
`union`, `difference`, `intersection`
|
|
24
|
-
|
|
25
|
-
## Boolean operations (2D)
|
|
26
|
-
|
|
27
|
-
`union2d`, `difference2d`, `intersection2d`
|
|
28
|
-
|
|
29
|
-
## Sketch primitives
|
|
30
|
-
|
|
31
|
-
`rect`, `arcSlot`, `circle2d`, `roundedRect`, `polygon`, `polygonVertices`, `ngon`, `ellipse`, `slot`, `star`, `path`, `stroke`
|
|
32
|
-
|
|
33
|
-
## 2D geometry classes
|
|
34
|
-
|
|
35
|
-
`Point2D`, `Line2D`, `Circle2D`, `Rectangle2D`
|
|
36
|
-
|
|
37
|
-
## Constrained sketch
|
|
38
|
-
|
|
39
|
-
`point`, `line`, `circle`, `Constraint`, `constrainedSketch`
|
|
40
|
-
|
|
41
|
-
## Angles and coordinates
|
|
42
|
-
|
|
43
|
-
`degrees`, `polar`, `radians`
|
|
44
|
-
|
|
45
|
-
## Patterns and layout
|
|
46
|
-
|
|
47
|
-
`linearPattern`, `circularPattern`, `circularLayout`, `linearPattern2d`, `circularPattern2d`, `mirrorCopy`
|
|
48
|
-
|
|
49
|
-
## 2D fillets and chamfers
|
|
50
|
-
|
|
51
|
-
`fillet2d`, `filletCorners`, `filletEdge`, `chamfer2d`, `chamferEdge`
|
|
52
|
-
|
|
53
|
-
## Routing
|
|
54
|
-
|
|
55
|
-
`route`, `routePerimeter`
|
|
56
|
-
|
|
57
|
-
## Curves and surfaces
|
|
58
|
-
|
|
59
|
-
`arcBridgeBetweenRects`, `Curve3D`, `spline2d`, `spline3d`, `loft`, `loftAlongSpine`, `sweep`, `HermiteCurve3D`, `QuinticHermiteCurve3D`, `hermiteTransition`, `hermiteTransitionG2`, `transitionCurve`, `transitionSurface`, `transitionCurveFromPoints`, `connectEdges`, `variableSweep`, `surfacePatch`
|
|
60
|
-
|
|
61
|
-
## Sheet metal
|
|
62
|
-
|
|
63
|
-
`sheetMetal`, `SheetMetalPart`
|
|
64
|
-
|
|
65
|
-
## Parameters
|
|
66
|
-
|
|
67
|
-
`param`, `boolParam`, `choiceParam`
|
|
68
|
-
|
|
69
|
-
## Core classes
|
|
70
|
-
|
|
71
|
-
`sdf`, `Shape`, `Sketch`
|
|
72
|
-
|
|
73
|
-
## Part library
|
|
74
|
-
|
|
75
|
-
`lib`
|
|
76
|
-
|
|
77
|
-
## Assembly and joints
|
|
78
|
-
|
|
79
|
-
`joint`, `Transform`, `composeChain`, `assembly`, `Assembly`, `port`, `connector`, `Points`, `SolvedAssembly`, `bomToCsv`
|
|
80
|
-
|
|
81
|
-
## Section and projection
|
|
82
|
-
|
|
83
|
-
`faceProfile`, `intersectWithPlane`, `projectToPlane`
|
|
84
|
-
|
|
85
|
-
## Edge and face queries
|
|
86
|
-
|
|
87
|
-
`selectEdge`, `selectEdges`, `coalesceEdges`, `filletEdgeSegment`, `chamferEdgeSegment`
|
|
88
|
-
|
|
89
|
-
## 3D fillets, chamfers, and edge features
|
|
90
|
-
|
|
91
|
-
`fillet`, `chamfer`, `draft`, `offsetSolid`
|
|
92
|
-
|
|
93
|
-
## Import
|
|
94
|
-
|
|
95
|
-
`importSvgSketch`, `importMesh`
|
|
96
|
-
|
|
97
|
-
## Text and fonts
|
|
98
|
-
|
|
99
|
-
`text2d`, `textWidth`, `loadFont`
|
|
100
|
-
|
|
101
|
-
## Dimensions and annotations
|
|
102
|
-
|
|
103
|
-
`dim`, `dimLine`
|
|
104
|
-
|
|
105
|
-
## Visualization
|
|
106
|
-
|
|
107
|
-
`highlight`
|
|
108
|
-
|
|
109
|
-
## Export and format
|
|
110
|
-
|
|
111
|
-
`sketchToSvg`, `sketchToDxf`, `bom`, `sheetStock`, `robotExport`
|
|
112
|
-
|
|
113
|
-
## Grouping
|
|
114
|
-
|
|
115
|
-
`group`, `ShapeGroup`
|
|
116
|
-
|
|
117
|
-
## Viewport and scene
|
|
118
|
-
|
|
119
|
-
`console`, `cutPlane`, `explodeView`, `jointsView`, `viewConfig`, `scene`
|
|
120
|
-
|
|
121
|
-
## Verification
|
|
122
|
-
|
|
123
|
-
`verify`, `spec`
|
|
124
|
-
|
|
125
|
-
## G-Code
|
|
126
|
-
|
|
127
|
-
`gcode`, `GCodeBuilder`
|
|
128
|
-
|
|
129
|
-
## Laser kit
|
|
130
|
-
|
|
131
|
-
`flatPanel`, `flatPart`, `fingerJoint`, `tabSlot`, `laserKit`, `assemblyPreview`, `assemblyInstructions`, `formatInstructions`, `fingerJointProfile`, `tabSlotProfile`, `livingHingeProfile`, `snapFitProfile`, `lookupKerf`, `COMMON_KERFS`
|
|
132
|
-
|
|
133
|
-
## Virtual module specifiers
|
|
134
|
-
|
|
135
|
-
These strings can be used with `require()` to import all runtime globals as a module (useful in plain `.js` helper files):
|
|
136
|
-
|
|
137
|
-
`"forgecad"`, `"@forge/runtime"`, `"@forgecad/runtime"`
|