forgecad 0.10.4 → 0.11.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/dist/assets/{AdminPage-B3L3W1Uo.js → AdminPage-B1nIvqLS.js} +1 -1
- package/dist/assets/{BenchmarkPage-DXKVXMrJ.js → BenchmarkPage-YZJbw5nd.js} +2 -2
- package/dist/assets/{BlogPage-B7BWxOCg.js → BlogPage-DIWRApKS.js} +1 -1
- package/dist/assets/{DocsPage-BPGGwht1.js → DocsPage-ClL6X1hR.js} +8 -22
- package/dist/assets/EditorApp-CYBDvSyT.js +17067 -0
- package/dist/assets/{EmbedViewer-DygByZS2.js → EmbedViewer-Dmfu_LIw.js} +2 -2
- package/dist/assets/{LandingPageProofDriven-BoVE7JGY.js → LandingPageProofDriven-XYTiYxfM.js} +2 -2
- package/dist/assets/{LegalPage-Din8wv8d.js → LegalPage-D5Z3CscF.js} +2 -2
- package/dist/assets/{PricingPage-C2PMzmDc.js → PricingPage-BP4lIGio.js} +2 -2
- package/dist/assets/{SettingsPage-BlJDCRe8.js → SettingsPage-D3bcPBsC.js} +1 -1
- package/dist/assets/{app-BsRYSfxY.js → app-BKjogwIZ.js} +3288 -512
- package/dist/assets/{backendInit-6C0DLgH0.js → backendInit-6a9-ilom.js} +80498 -74979
- package/dist/assets/cli/{render-XXol_ET7.js → render-CMNudGb0.js} +1264 -113
- package/dist/assets/{constructionHistoryWorker-cTHWRJEi.js → constructionHistoryWorker-BuZgc606.js} +8369 -6839
- package/dist/assets/{evalWorker-BssDYW9u.js → evalWorker-DQ82ueGu.js} +45438 -39996
- package/dist/assets/{forgecad_geometry-CZ_IfuvA.js → forgecad_geometry-D8rWX7nQ.js} +1 -1
- package/dist/assets/{forgecad_geometry_bg-C3rQHfwg.wasm → forgecad_geometry_bg-ObqfqjJT.wasm} +0 -0
- package/dist/assets/{inspectWorker-ymhBV4Ll.js → inspectWorker-Cuby2qfT.js} +4899 -1303
- package/dist/assets/{jointPose-B0blBj9A.js → jointPose-CFql5I-u.js} +1 -1
- package/dist/assets/{landing-proof-driven-Cpf-MIbI.css → landing-proof-driven-_u4v_xQb.css} +2 -2
- package/dist/assets/{manifold-CYlIm-M6.js → manifold-02pmr7O7.js} +2 -2
- package/dist/assets/{manifold-B_7QXpGB.js → manifold-C6KU0oII.js} +1 -1
- package/dist/assets/{manifold-CNShmpEJ.js → manifold-P1yF3GKn.js} +1 -1
- package/dist/assets/{reportWorker-Cb5eyM7D.js → reportWorker-kg065BVL.js} +76583 -65731
- package/dist/cli/render.html +1 -1
- package/dist/docs/index.html +2 -2
- package/dist/docs-raw/AI/usage.md +6 -8
- package/dist/docs-raw/CLI.md +14 -12
- package/dist/docs-raw/component-model.md +28 -9
- package/dist/docs-raw/generated/assembly.md +76 -3
- package/dist/docs-raw/generated/concepts.md +43 -7
- package/dist/docs-raw/generated/core.md +399 -73
- package/dist/docs-raw/generated/curves.md +357 -6
- package/dist/docs-raw/generated/runtime-names.md +12 -12
- package/dist/docs-raw/generated/sketch.md +16 -3
- package/dist/docs-raw/guides/inspection-bundles.md +5 -3
- package/dist/docs-raw/guides/structural-fea.md +235 -0
- package/dist/docs-raw/skills/forgecad-build-model.md +70 -147
- package/dist/docs-raw/skills/forgecad-image-prompt.md +1 -1
- package/dist/docs-raw/skills/forgecad-project-sync.md +3 -3
- package/dist/docs-raw/skills/forgecad-reconstruct-cad-file.md +2 -2
- package/dist/docs-raw/skills/forgecad-reconstruct-from-images.md +4 -5
- package/dist/docs-raw/skills/forgecad.md +4 -1
- package/dist/docs-raw/skills/index.md +1 -5
- package/dist/docs-raw/welcome.md +3 -4
- package/dist/index.html +1 -1
- package/dist/llms.txt +1 -2
- package/dist/sitemap.xml +15 -15
- package/dist-cli/{check-compiler-4RPB6SB5.js → check-compiler-UJWUEIDC.js} +1 -1
- package/dist-cli/{check-query-propagation-KN3DFQTX.js → check-query-propagation-O2EPDJSY.js} +1 -1
- package/dist-cli/{chunk-UHBRMYA6.js → chunk-MNDROM7T.js} +78926 -73392
- package/dist-cli/forgecad.js +6306 -1061
- package/dist-cli/forgecad_geometry_bg.wasm +0 -0
- package/dist-skill/CONTEXT.md +1257 -110
- package/dist-skill/SKILL.md +4 -1
- package/dist-skill/docs/API/core/concepts.md +31 -4
- package/dist-skill/docs/CLI.md +14 -12
- package/dist-skill/docs/generated/assembly.md +73 -3
- package/dist-skill/docs/generated/core.md +395 -74
- package/dist-skill/docs/generated/curves.md +356 -6
- package/dist-skill/docs/generated/runtime-names.md +12 -12
- package/dist-skill/docs/generated/sketch.md +16 -3
- package/dist-skill/docs/guides/inspection-bundles.md +5 -3
- package/dist-skill/docs/guides/manual-parameters.md +130 -0
- package/dist-skill/docs/guides/structural-fea.md +235 -0
- package/dist-skill/library/README.md +0 -4
- package/dist-skill/library/forgecad-build-model/SKILL.md +57 -150
- package/dist-skill/library/forgecad-build-model/references/inspection-feedback.md +58 -0
- package/dist-skill/library/forgecad-build-model/references/module-contracts.md +53 -0
- package/dist-skill/library/forgecad-build-model/references/parameter-controls.md +22 -0
- package/dist-skill/library/forgecad-build-model/references/readiness-review.md +43 -0
- package/dist-skill/library/forgecad-build-model/references/simulation-feedback.md +49 -0
- package/dist-skill/library/forgecad-build-model/references/stage-1-design-intent.md +21 -0
- package/dist-skill/library/forgecad-build-model/references/stage-2-architecture-plan.md +23 -0
- package/dist-skill/library/forgecad-build-model/references/stage-3-build-slices.md +39 -0
- package/dist-skill/library/forgecad-build-model/references/stage-4-feedback-iteration.md +24 -0
- package/dist-skill/library/forgecad-build-model/references/stage-5-readiness-package.md +34 -0
- package/dist-skill/library/forgecad-image-prompt/SKILL.md +1 -1
- package/dist-skill/library/forgecad-project-sync/SKILL.md +3 -3
- package/dist-skill/library/forgecad-reconstruct-cad-file/SKILL.md +2 -2
- package/dist-skill/library/forgecad-reconstruct-from-images/SKILL.md +4 -5
- package/dist-skill/website/skills/forgecad-build-model.md +70 -147
- package/dist-skill/website/skills/forgecad-image-prompt.md +1 -1
- package/dist-skill/website/skills/forgecad-project-sync.md +3 -3
- package/dist-skill/website/skills/forgecad-reconstruct-cad-file.md +2 -2
- package/dist-skill/website/skills/forgecad-reconstruct-from-images.md +4 -5
- package/dist-skill/website/skills/forgecad.md +4 -1
- package/dist-skill/website/skills/index.md +1 -5
- package/examples/analysis/structural-stress-fea.forge.js +19 -0
- package/examples/api/blend-full-round.forge.js +37 -0
- package/examples/api/blend-variable-radius.forge.js +51 -0
- package/examples/api/curve-project-and-intersect.forge.js +59 -0
- package/examples/api/extrude-up-to-face.forge.js +47 -0
- package/examples/api/param-path2d.forge.js +65 -0
- package/examples/api/param-placement2d.forge.js +80 -0
- package/examples/api/param-spline2d-g-continuity.forge.js +57 -0
- package/examples/api/spoon-full-tang-handle.forge.js +188 -0
- package/examples/api/surface-boundarynet-dished-bowl.forge.js +63 -0
- package/examples/api/surface-fill-interior-constraints.forge.js +59 -0
- package/examples/api/surface-variable-thickness-panel.forge.js +62 -0
- package/examples/mechanical/airplane-propeller.forge.js +81 -28
- package/package.json +5 -2
- package/dist/assets/EditorApp-BWUGCdD5.js +0 -16610
- package/dist/docs-raw/skills/forgecad-design-spec.md +0 -145
- package/dist/docs-raw/skills/forgecad-grade-model.md +0 -84
- package/dist/docs-raw/skills/forgecad-inspect-model.md +0 -80
- package/dist/docs-raw/skills/forgecad-verify-mujoco.md +0 -78
- package/dist-skill/library/forgecad-design-spec/SKILL.md +0 -132
- package/dist-skill/library/forgecad-design-spec/references/default-profiles.md +0 -99
- package/dist-skill/library/forgecad-design-spec/references/master-prompt.md +0 -73
- package/dist-skill/library/forgecad-grade-model/SKILL.md +0 -72
- package/dist-skill/library/forgecad-grade-model/agents/openai.yaml +0 -4
- package/dist-skill/library/forgecad-inspect-model/SKILL.md +0 -68
- package/dist-skill/library/forgecad-verify-mujoco/SKILL.md +0 -66
- package/dist-skill/website/skills/forgecad-design-spec.md +0 -145
- package/dist-skill/website/skills/forgecad-grade-model.md +0 -84
- package/dist-skill/website/skills/forgecad-inspect-model.md +0 -80
- package/dist-skill/website/skills/forgecad-verify-mujoco.md +0 -78
- /package/dist/assets/{landing-proof-driven-BxZZh5r5.js → landing-proof-driven-DNPRKL_p.js} +0 -0
- /package/dist-skill/library/{forgecad-verify-mujoco → forgecad-build-model}/scripts/mujoco_verify.py +0 -0
- /package/dist-skill/library/{forgecad-inspect-model → forgecad-build-model/scripts}/summarize_manifest.py +0 -0
|
@@ -50,7 +50,6 @@ forgecad studio .
|
|
|
50
50
|
|
|
51
51
|
```bash
|
|
52
52
|
npm install -g forgecad
|
|
53
|
-
forgecad login
|
|
54
53
|
mkdir enclosure-bracket
|
|
55
54
|
cd enclosure-bracket
|
|
56
55
|
forgecad project init "Enclosure Bracket" --visibility private
|
|
@@ -58,7 +57,7 @@ forgecad new bracket --template part
|
|
|
58
57
|
forgecad studio .
|
|
59
58
|
```
|
|
60
59
|
|
|
61
|
-
`forgecad project init`
|
|
60
|
+
`forgecad project init` writes local project metadata to `forgecad.json`; it does not create anything on the server. After local validation, run `forgecad login` and `forgecad project push`. The first push creates the hosted project if needed, uploads local model files, helper code, Markdown notes, SVG/DXF assets, and other supported text project files, then records server file IDs. Later pushes sync local changes to the hosted project.
|
|
62
61
|
|
|
63
62
|
`forgecad project push` does not initialize a random folder. If the folder has no `forgecad.json`, the command fails and tells you to run `forgecad project init` or `forgecad project clone <slug>` first.
|
|
64
63
|
|
|
@@ -97,7 +96,7 @@ To verify installation, ask the agent:
|
|
|
97
96
|
What ForgeCAD skills are available?
|
|
98
97
|
```
|
|
99
98
|
|
|
100
|
-
You should see `forgecad` plus companion skills such as `forgecad-build-model`, `forgecad-
|
|
99
|
+
You should see `forgecad` plus companion skills such as `forgecad-build-model`, `forgecad-project-sync`, and `forgecad-reconstruct-cad-file`.
|
|
101
100
|
|
|
102
101
|
If you only want the core modeling skill without companion workflows:
|
|
103
102
|
|
|
@@ -206,13 +205,12 @@ For the full command reference, see [ForgeCAD CLI](../CLI.md).
|
|
|
206
205
|
| Skill | Use it for |
|
|
207
206
|
|---|---|
|
|
208
207
|
| `forgecad` | Core model authoring, editing, debugging, imports, assembly, render/export commands, and CLI validation. |
|
|
209
|
-
| `forgecad-
|
|
210
|
-
| `forgecad-build-model` | Creating a new `.forge.js` model in the active ForgeCAD project, including multi-part assembly discipline and validation. |
|
|
208
|
+
| `forgecad-build-model` | Creating a new `.forge.js` model in the active ForgeCAD project with design-first planning, staged files, multi-part assembly discipline, and validation. |
|
|
211
209
|
| `forgecad-reconstruct-cad-file` | Reconstructing a readable parametric ForgeCAD model from an existing STL, OBJ, 3MF, STEP, or STP file. |
|
|
212
210
|
| `forgecad-reconstruct-from-images` | Recreating an object from reference images as real ForgeCAD geometry through camera-calibrated render/compare/iterate loops. |
|
|
213
|
-
| `forgecad-
|
|
214
|
-
| `forgecad-
|
|
215
|
-
| `forgecad-
|
|
211
|
+
| `forgecad-build-model` inspection feedback reference | Generating and interpreting `forgecad inspect <family> <mode>` bundles for fit interference, wall thickness, connectivity, masks, depth, normals, and sections. |
|
|
212
|
+
| `forgecad-build-model` readiness review reference | Reviewing a model against a requirement, brief, prompt, reference, or acceptance criteria with evidence. |
|
|
213
|
+
| `forgecad-build-model` simulation feedback reference | Verifying MJCF exports in MuJoCo with dynamics, contacts, controls, joint travel, FEA, and rendered evidence. |
|
|
216
214
|
| `forgecad-image-prompt` | Producing builder-honest image prompts from a concrete model, HLD, LLD, or build brief. |
|
|
217
215
|
| `forgecad-project-sync` | Managing forgecad.io projects from the CLI: init, clone, pull, push, file commands, members, publish, and shares. |
|
|
218
216
|
|
package/dist/docs-raw/CLI.md
CHANGED
|
@@ -13,8 +13,7 @@ Create projects, open local studios, run, inspect, export, publish, and sync `.f
|
|
|
13
13
|
# 1. Install
|
|
14
14
|
npm install -g forgecad
|
|
15
15
|
|
|
16
|
-
# 2.
|
|
17
|
-
forgecad login
|
|
16
|
+
# 2. Create a dedicated local project folder
|
|
18
17
|
mkdir spool-adapter
|
|
19
18
|
cd spool-adapter
|
|
20
19
|
forgecad project init "Spool Adapter" --visibility private
|
|
@@ -25,14 +24,15 @@ forgecad new adapter --template part
|
|
|
25
24
|
# 4. Open the local editor
|
|
26
25
|
forgecad studio .
|
|
27
26
|
|
|
28
|
-
# 5. Validate, export, and push to the browser
|
|
27
|
+
# 5. Validate, export, sign in, and push to the browser
|
|
29
28
|
forgecad run adapter.forge.js
|
|
30
29
|
forgecad export stl adapter.forge.js
|
|
30
|
+
forgecad login
|
|
31
31
|
forgecad project push
|
|
32
32
|
forgecad project open
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
-
Local modeling, inspection, export, and skill-install commands do not require a ForgeCAD account. Hosted project sync, publishing, token management, and license activation require sign-in: run `forgecad login` and choose email/password or API token (for GitHub/Google accounts, create a token in Settings > API Tokens first). Use `FORGECAD_TOKEN=fc_pat_... forgecad <hosted-command>` only for CI/CD and one-off automation. `forgecad studio` always requires an explicit project path; use `.` for the current project.
|
|
35
|
+
Local modeling, project initialization, inspection, export, and skill-install commands do not require a ForgeCAD account. Hosted project sync, publishing, token management, and license activation require sign-in: run `forgecad login` and choose email/password or API token (for GitHub/Google accounts, create a token in Settings > API Tokens first). Use `FORGECAD_TOKEN=fc_pat_... forgecad <hosted-command>` only for CI/CD and one-off automation. `forgecad studio` always requires an explicit project path; use `.` for the current project.
|
|
36
36
|
|
|
37
37
|
You can also start from the hosted starter project with `forgecad project clone start-here`, then `cd start-here` and `forgecad studio .`.
|
|
38
38
|
|
|
@@ -74,7 +74,7 @@ The fast validation command: runs the script with the real geometry kernel (no b
|
|
|
74
74
|
|
|
75
75
|
A bare `forgecad run` skips expensive diagnostics. Opt in with `--details` (volumes/bounds), `--history` (construction tree), `--features` (feature tallies), `--solver-profile` (constraint solver timing), or `--connectivity` (physical connected components — bbox contact is evidence, exact geometry is checked by default). `--quality live|default|high` selects the same geometry quality profile as the editor and export tools; `live` is fastest for large models.
|
|
76
76
|
|
|
77
|
-
Direct `.stl`/`.obj`/`.3mf`/`.step`/`.stp` inputs are imported automatically; STEP/STP auto-selects OCCT unless you pass `--backend`. For deeper confidence gates, prefer `inspect mechanical-integrity`, `check print`, or `inspect fit interference` instead of turning `run` into a catch-all audit command.
|
|
77
|
+
Direct `.stl`/`.obj`/`.3mf`/`.step`/`.stp` inputs are imported automatically; STEP/STP auto-selects OCCT unless you pass `--backend`. Use `--project-root <dir>` when running a file inside a larger uninitialized folder and you intentionally want relative imports to resolve against that root. For deeper confidence gates, prefer `inspect mechanical-integrity`, `check print`, or `inspect fit interference` instead of turning `run` into a catch-all audit command.
|
|
78
78
|
|
|
79
79
|
```bash
|
|
80
80
|
forgecad run model.forge.js
|
|
@@ -136,7 +136,8 @@ Inspect a model by asking for one explicit kind of evidence.
|
|
|
136
136
|
- `inspect surface zebra|roughness` — surface continuity and roughness evidence
|
|
137
137
|
- `inspect physical components|floating|gaps` — physical component graph evidence
|
|
138
138
|
- `inspect fit interference` — positive-volume overlap evidence
|
|
139
|
-
- `inspect manufacture thickness` — wall-thickness evidence
|
|
139
|
+
- `inspect manufacture thickness|through-thickness` — wall-thickness and minimum solid span evidence
|
|
140
|
+
- `inspect structural stress` — solver-produced structural stress scalar-field evidence
|
|
140
141
|
- `inspect compare overlay` — candidate-vs-reference visual mismatch evidence
|
|
141
142
|
- `inspect sections at|stack|sample` — exact section evidence for precise cuts, dense scans, or sparse samples
|
|
142
143
|
- `inspect mechanical-integrity` — model-focused integrity audit for generated assemblies
|
|
@@ -292,6 +293,7 @@ Export to every format you need.
|
|
|
292
293
|
| `export svg` | SVG | 2D vector output from sketches |
|
|
293
294
|
| `export sketch-pdf` **\[Production\]** | PDF | Sketch with dimensions and constraints |
|
|
294
295
|
| `export step` **\[Production\]** | STEP | CAD interchange (exact geometry) |
|
|
296
|
+
| `export fea` **\[Production\]** | FEA package | Exact STEP plus authored structural load-case metadata |
|
|
295
297
|
| `export brep` **\[Production\]** | BREP | Boundary representation |
|
|
296
298
|
| `export 3mf` | 3MF | 3D printing (color, multi-part) |
|
|
297
299
|
| `export stl` | STL | 3D printing |
|
|
@@ -356,16 +358,16 @@ Script-backed exports accept repeatable `--param Key=Value` overrides before the
|
|
|
356
358
|
|
|
357
359
|
ForgeCAD has a hosted platform at [forgecad.io](https://forgecad.io). The CLI connects a dedicated local project folder to it.
|
|
358
360
|
|
|
359
|
-
A project is a local folder
|
|
361
|
+
A project is a local folder marked by `forgecad.json`; after the first push, that same file also links it to the hosted app. Use `forgecad project clone <slug>` to download an existing hosted project into a local folder, or run `forgecad project init` inside a folder that should become a new ForgeCAD project. Open local projects with `forgecad studio <project-path>`.
|
|
360
362
|
|
|
361
363
|
Keep the project root small and intentional. Do not run the editor from `~`, downloads, desktop, or a huge source tree. ForgeCAD scans project files such as `.forge.js`, `.js`, `.svg`, and `.dxf`; broad roots make local workflows and AI-agent context slow and confusing.
|
|
362
364
|
|
|
363
|
-
First-time setup (
|
|
365
|
+
First-time setup (init, studio, login, push) is the [Quick Start](#quick-start) sequence above. `forgecad project init` writes a local `forgecad.json` with the project name, slug, server, and visibility. It does not contact the server. The first `forgecad project push` creates the hosted project if `forgecad.json` has no project ID yet, uploads local source files, and records server file IDs. Later pushes sync the already linked hosted project. `forgecad project push` still requires `forgecad.json`; it does not initialize a random folder.
|
|
364
366
|
|
|
365
367
|
### Sync
|
|
366
368
|
|
|
367
369
|
```bash
|
|
368
|
-
forgecad project push #
|
|
370
|
+
forgecad project push # Create hosted project if needed; upload changes
|
|
369
371
|
forgecad project pull # Download remote changes
|
|
370
372
|
forgecad project status # See what's different
|
|
371
373
|
```
|
|
@@ -393,10 +395,10 @@ Shares are live references — always the current version, not a snapshot.
|
|
|
393
395
|
|
|
394
396
|
| Command | Description |
|
|
395
397
|
|---------|-------------|
|
|
396
|
-
| `project init` | Initialize the current directory as a ForgeCAD project
|
|
398
|
+
| `project init` | Initialize the current directory as a local ForgeCAD project. |
|
|
397
399
|
| `project clone` | Download a remote project into a new local directory. |
|
|
398
400
|
| `project pull` | Download remote changes into the current project. |
|
|
399
|
-
| `project push` |
|
|
401
|
+
| `project push` | Create the hosted project if needed, then upload local changes. |
|
|
400
402
|
| `project status` | Show differences between local and remote project files. |
|
|
401
403
|
| `project list` | List your remote projects. |
|
|
402
404
|
| `project open` | Open the current project in the browser. |
|
|
@@ -543,7 +545,7 @@ The CLI is free for personal non-commercial use. Pro covers human-operated comme
|
|
|
543
545
|
|
|
544
546
|
| Free | Production outputs | Pro | Enterprise |
|
|
545
547
|
|------|--------------------|-----|------------|
|
|
546
|
-
| `run`, `dev`, `studio`, `render 3d`, `export stl`, `export 3mf`, `export svg`, `compare 3d`, `check print`, `inspect fit interference`, `inspect mechanical-integrity` for personal non-commercial use | `cut-list`, `export sketch-pdf`, `export step`, `export brep`, `export gcode`, `export implicit`, `export sdf`, `export mjcf`, `export urdf`, `export usd`, `export report`, `export cutting-layout` are free to run for personal non-commercial use; Pro covers human-operated commercial CAD work | `render hq`, `capture gif`, `capture mp4` plus commercial coverage for client/customer work | Backend, hosted, embedded, or application workflows that call ForgeCAD automatically |
|
|
548
|
+
| `run`, `dev`, `studio`, `render 3d`, `export stl`, `export 3mf`, `export svg`, `compare 3d`, `check print`, `inspect fit interference`, `inspect mechanical-integrity` for personal non-commercial use | `cut-list`, `export sketch-pdf`, `export step`, `export fea`, `export brep`, `export gcode`, `export implicit`, `export sdf`, `export mjcf`, `export urdf`, `export usd`, `export report`, `export cutting-layout` are free to run for personal non-commercial use; Pro covers human-operated commercial CAD work | `render hq`, `capture gif`, `capture mp4` plus commercial coverage for client/customer work | Backend, hosted, embedded, or application workflows that call ForgeCAD automatically |
|
|
547
549
|
|
|
548
550
|
```bash
|
|
549
551
|
forgecad license # Check local license status
|
|
@@ -5,7 +5,7 @@ skill-order: 4
|
|
|
5
5
|
|
|
6
6
|
# The Component Model
|
|
7
7
|
|
|
8
|
-
Long-form rationale for ForgeCAD's multi-part architecture. The public rule sheet is embedded where agents need it: `forgecad-build-model` for authoring and
|
|
8
|
+
Long-form rationale for ForgeCAD's multi-part architecture. The public rule sheet is embedded where agents need it: `forgecad-build-model` for authoring and readiness review. Connector and joint mechanics (frame semantics, mating, mirrored-revolute handedness) live in the assembly JSDoc, surfaced in `docs/skill/generated/assembly.md`.
|
|
9
9
|
|
|
10
10
|
## The Principle
|
|
11
11
|
|
|
@@ -19,20 +19,39 @@ ForgeCAD applies the same principle to mechanical design. Before: parts compute
|
|
|
19
19
|
|
|
20
20
|
Data flows in one direction, from parent (assembly) to children (parts):
|
|
21
21
|
|
|
22
|
-
- **Props flow down.** The assembly owns
|
|
23
|
-
- **
|
|
22
|
+
- **Props flow down.** The assembly owns `param()` calls and cross-cutting decisions (base height, wall thickness, servo model), then passes ordinary values into child builder functions.
|
|
23
|
+
- **Builders are the child contract.** Reusable part files return builder functions such as `return { buildMount }`. When opened directly, they may define preview-only params inside `if (require.main === module)`.
|
|
24
|
+
- **Metadata flows up.** Builders return shape + connectors + any computed data siblings need (`return { shape, boltPattern, pinionZ }`).
|
|
24
25
|
- **Siblings never import each other.** The cover plate doesn't import the motor mount to read bolt positions; the assembly reads the mount's bolt pattern and passes it to the cover plate. The parent mediates all sibling communication.
|
|
25
26
|
|
|
26
27
|
```js
|
|
27
|
-
const
|
|
28
|
-
const
|
|
29
|
-
|
|
28
|
+
const mountModule = require('./motor-mount.forge.js');
|
|
29
|
+
const coverModule = require('./cover-plate.forge.js');
|
|
30
|
+
|
|
31
|
+
const mount = mountModule.buildMount({ wall });
|
|
32
|
+
const cover = coverModule.buildCover({
|
|
33
|
+
wall,
|
|
34
|
+
boltPattern: mount.boltPattern, // parent routes mount's data to a sibling
|
|
30
35
|
});
|
|
31
36
|
```
|
|
32
37
|
|
|
38
|
+
```js
|
|
39
|
+
// motor-mount.forge.js
|
|
40
|
+
function buildMount({ wall }) {
|
|
41
|
+
const shape = box(80, 40, wall);
|
|
42
|
+
return { shape, boltPattern: { dia: 5.3, positions: [[-25, 0], [25, 0]] } };
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (require.main === module) {
|
|
46
|
+
return buildMount({ wall: param('Wall', 3) }).shape;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return { buildMount };
|
|
50
|
+
```
|
|
51
|
+
|
|
33
52
|
## Why This Matters
|
|
34
53
|
|
|
35
|
-
**For humans.** Each part file tells a complete story: geometry, connectors,
|
|
54
|
+
**For humans.** Each part file tells a complete story: geometry, connectors, preview controls, verifications — no chasing imports across eight files, no 266-line shared-dims.js to internalize. Modifying one part doesn't break siblings, because connectors are the contract: change the mount's internal cavity and nothing else moves, as long as the flange connector stays put.
|
|
36
55
|
|
|
37
56
|
**For AIs.** Each part file is self-contained context. An agent generates `base-body.forge.js` without reading `jaw-unit.forge.js`. The assembly file is a high-level plan generatable from a natural-language description, and props are an explicit interface contract — the agent knows exactly what each part needs and provides.
|
|
38
57
|
|
|
@@ -40,8 +59,8 @@ const cover = require('./cover-plate.forge.js', {
|
|
|
40
59
|
|
|
41
60
|
## File Granularity
|
|
42
61
|
|
|
43
|
-
|
|
62
|
+
Complex models should be expressible as a tree of small, independently previewable modules. A reusable `.forge.js` module returns builder functions or a module interface; direct-run preview controls live under `if (require.main === module)`. The system entry point, usually `main.forge.js`, composes high-level modules instead of importing every leaf file.
|
|
44
63
|
|
|
45
64
|
## Enforcement
|
|
46
65
|
|
|
47
|
-
The anti-pattern list and design gate are enforced by the public build
|
|
66
|
+
The anti-pattern list and design gate are enforced by the public build-model workflow; every multi-part example and agent-built assembly must pass that gate.
|
|
@@ -27,12 +27,14 @@ Assembly-owned links, constraints, connectors, solved poses, and source-level si
|
|
|
27
27
|
|
|
28
28
|
#### `Sim.body(options: SimBodyOptions): SimBodyDef` — Describe one assembly part as a physical body with mass/density, material, collider intent, and optional contact surfaces.
|
|
29
29
|
|
|
30
|
-
**`SimBodyOptions`**: `massKg?: number`, `densityKgM3?: number`, `material?: SimMaterialDef`, `collider?: SimColliderDef`, `contacts?: Record<string, SimContactDef
|
|
30
|
+
**`SimBodyOptions`**: `massKg?: number`, `densityKgM3?: number`, `material?: SimMaterialDef`, `collider?: SimColliderDef`, `contacts?: Record<string, SimContactDef>`, `motion?: SimMotionDef`
|
|
31
31
|
|
|
32
|
-
`SimColliderDef`: `{ kind: "collider", mode: SimColliderMode, reason?: string }`
|
|
32
|
+
`SimColliderDef`: `{ kind: "collider", mode: SimColliderMode, reason?: string, sdfResolution?: number }`
|
|
33
33
|
|
|
34
34
|
`SimContactDef`: `{ kind: "wheelSurface" | "gripperSurface", connectorName: string }`
|
|
35
35
|
|
|
36
|
+
`SimMotionDef`: `{ kind: "motion", mode: SimMotionMode }`
|
|
37
|
+
|
|
36
38
|
|
|
37
39
|
`SimBodyDef`: `{ kind: "body" }`
|
|
38
40
|
|
|
@@ -41,8 +43,15 @@ Assembly-owned links, constraints, connectors, solved poses, and source-level si
|
|
|
41
43
|
- `Sim.collider.convexHull(): SimColliderDef` — Use a generated collision mesh for the part. This is the default fast rigid-body collider for irregular parts.
|
|
42
44
|
- `Sim.collider.boundingBox(): SimColliderDef` — Use the part bounding box as the collision geometry. This is fastest and works well for chassis and simple blocks.
|
|
43
45
|
- `Sim.collider.visualMesh(): SimColliderDef` — Use the visual mesh as collision geometry. This is exact but usually slower in physics engines.
|
|
46
|
+
- `Sim.collider.sdfMesh: (options?: { resolution?: number` — Use an SDF mesh collider for complex concave contact geometry. Exporters warn when their target cannot encode it.
|
|
44
47
|
- `Sim.collider.none(reason: string): SimColliderDef` — Disable collision for a part with an explicit reason, such as a sensor-only or decorative object.
|
|
45
48
|
|
|
49
|
+
#### `Sim.motion` — Body motion-state intent for simulation export. Dynamic is the default when omitted.
|
|
50
|
+
|
|
51
|
+
- `Sim.motion.dynamic(): SimMotionDef` — Simulate this body as a normal dynamic rigid body with mass and inertia.
|
|
52
|
+
- `Sim.motion.kinematic(): SimMotionDef` — Simulate this body as kinematic: moved by the simulator/user, but not force-integrated.
|
|
53
|
+
- `Sim.motion.static(): SimMotionDef` — Keep this body fixed in the world as a static collision/environment body.
|
|
54
|
+
|
|
46
55
|
#### `Sim.drive` — Joint-drive intent constructors for passive or powered assembly joints.
|
|
47
56
|
|
|
48
57
|
- `Sim.drive.passive(options?: SimPassiveDriveOptions): SimDriveDef` — Mark a joint as passive while preserving damping and friction metadata for simulation export.
|
|
@@ -75,6 +84,60 @@ Assembly-owned links, constraints, connectors, solved poses, and source-level si
|
|
|
75
84
|
|
|
76
85
|
`SimDiffDriveControllerDef`: `{ kind: "diffDrive" }`
|
|
77
86
|
|
|
87
|
+
#### `Fea.material(name: string, options: FeaMaterialOptions): FeaMaterialDef` — Create a named linear-elastic structural material for static stress studies.
|
|
88
|
+
|
|
89
|
+
#### `Fea.body(options: FeaBodyOptions): FeaBodyDef` — Mark one assembly part as a structural body with a `Fea.material(...)` value.
|
|
90
|
+
|
|
91
|
+
#### `Fea.region` — Stable explicit region references for solver package manifests.
|
|
92
|
+
|
|
93
|
+
- `Fea.region.face(partName: string, faceName: string): FeaPartFaceRegionRef` — Reference a named face on a named assembly part without relying on object identity.
|
|
94
|
+
- `Fea.region.plane(partName: string, faceName: string, options: FeaPlaneRegionOptions): FeaPartPlaneRegionRef` — Reference a planar face by a point on the face and its outward normal in part-local coordinates.
|
|
95
|
+
|
|
96
|
+
`FeaPartFaceRegionRef`: `{ kind: "fea-region-face", partName: string, faceName: string }`
|
|
97
|
+
|
|
98
|
+
`FeaPlaneRegionOptions`: `{ center: Vec3, normal: Vec3 }`
|
|
99
|
+
|
|
100
|
+
`FeaPartPlaneRegionRef`: `{ kind: "fea-region-plane", partName: string, faceName: string, center: Vec3, normal: Vec3 }`
|
|
101
|
+
|
|
102
|
+
#### `Fea.fix` — Fixture constructors over authored face/region references.
|
|
103
|
+
|
|
104
|
+
- `Fea.fix.fixed(region: FeaRegionRef): FeaFixedFixtureDef` — Fully fix all translational degrees of freedom on a face/region.
|
|
105
|
+
|
|
106
|
+
`FeaFixedFixtureDef`: `{ kind: "fixed", region: FeaRegionRef }`
|
|
107
|
+
|
|
108
|
+
#### `Fea.load` — Load constructors over authored face/region references.
|
|
109
|
+
|
|
110
|
+
- `Fea.load.force(region: FeaRegionRef, options: FeaForceLoadOptions): FeaForceLoadDef` — Apply a force with magnitude in newtons along the given direction vector.
|
|
111
|
+
|
|
112
|
+
`FeaForceLoadOptions`: `{ newtons: number, direction: Vec3 }`
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
`FeaForceLoadDef`: `{ kind: "force", region: FeaRegionRef }`
|
|
116
|
+
|
|
117
|
+
#### `Fea.target` — Study target constructors used by feedback and pass/fail gates.
|
|
118
|
+
|
|
119
|
+
- `Fea.target.minSafetyFactor(value: number): FeaMinSafetyFactorTargetDef` — Require the solved minimum safety factor to be at least `value`.
|
|
120
|
+
|
|
121
|
+
`FeaMinSafetyFactorTargetDef`: `{ kind: "minSafetyFactor", value: number }`
|
|
122
|
+
|
|
123
|
+
#### `Fea.mesh` — Volume mesh intent. V1 structural stress uses second-order tetrahedra only.
|
|
124
|
+
|
|
125
|
+
- `Fea.mesh.quadraticTets(options: FeaQuadraticTetMeshOptions): FeaQuadraticTetMeshDef` — Request quadratic tetrahedral C3D10 elements with a maximum size in mm.
|
|
126
|
+
|
|
127
|
+
`FeaQuadraticTetMeshOptions`: `{ maxSizeMm: number, minQuality?: number }`
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
`FeaQuadraticTetMeshDef`: `{ kind: "quadraticTets", order: 2, element: "C3D10" }`
|
|
131
|
+
|
|
132
|
+
#### `Fea.study` — Study constructors.
|
|
133
|
+
|
|
134
|
+
- `Fea.study.staticStress(name: string, options: FeaStaticStressStudyOptions): FeaStaticStressStudyDef` — Create a linear static structural stress study.
|
|
135
|
+
|
|
136
|
+
`FeaStaticStressStudyOptions`: `{ fixtures: FeaFixtureDef[], loads: FeaLoadDef[], target?: FeaTargetDef, mesh: FeaMeshDef }`
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
`FeaStaticStressStudyDef`: `{ kind: "staticStress", name: string }`
|
|
140
|
+
|
|
78
141
|
#### `assembly(name?: string): Assembly` — Create an assembly container with named parts, connectors, and kinematic links.
|
|
79
142
|
|
|
80
143
|
**Use this from iteration 1 for any model with moving parts.** Do not build one static pose and retrofit motion later.
|
|
@@ -208,7 +271,7 @@ const housing = group(
|
|
|
208
271
|
assembly.addPart("Base Assembly", housing);
|
|
209
272
|
```
|
|
210
273
|
|
|
211
|
-
**`PartOptions`**: `transform?: TransformInput`, `metadata?: PartMetadata`, `sim?: SimBodyDef`, `mate?: AssemblyPartMateInput | AssemblyPartMateInput[]`, `bindToFrame?: string`
|
|
274
|
+
**`PartOptions`**: `transform?: TransformInput`, `metadata?: PartMetadata`, `sim?: SimBodyDef`, `fea?: FeaBodyDef`, `mate?: AssemblyPartMateInput | AssemblyPartMateInput[]`, `bindToFrame?: string`
|
|
212
275
|
|
|
213
276
|
**`PartMetadata`**
|
|
214
277
|
|
|
@@ -218,6 +281,12 @@ assembly.addPart("Base Assembly", housing);
|
|
|
218
281
|
|
|
219
282
|
Also: `material?: string`, `process?: string`, `tolerance?: string`, `qty?: number`, `notes?: string`, `densityKgM3?: number`, `massKg?: number`.
|
|
220
283
|
|
|
284
|
+
`FeaBodyDef`: `{ kind: "fea-body", material: FeaMaterialDef }`
|
|
285
|
+
|
|
286
|
+
`FeaMaterialOptions`: `{ densityKgM3: number, youngsModulusMPa: number, poissonRatio: number, yieldStrengthMPa: number }`
|
|
287
|
+
|
|
288
|
+
`FeaMaterialDef`: `{ kind: "fea-material", name: string }`
|
|
289
|
+
|
|
221
290
|
**`AssemblyPartMateInput`**
|
|
222
291
|
- `connector: string` — Name of a connector declared on the part (via `withConnectors()`).
|
|
223
292
|
- `toLink: string` — Name of the link this connector's origin is pinned to.
|
|
@@ -377,6 +446,10 @@ Use this after adding physical parts and joints. Robot-body profiles require `ro
|
|
|
377
446
|
|
|
378
447
|
`SimAssemblySimulationOptions`: `{ profile: SimProfileDef, rootPart?: string, controllers?: SimControllerDef[] }`
|
|
379
448
|
|
|
449
|
+
#### `withFeaStudy(study: FeaStudyDef): Assembly` — Attach a structural FEA study to this assembly.
|
|
450
|
+
|
|
451
|
+
The study is authored with `Fea.study.staticStress(...)` and consumed by `forgecad export fea`. This records load-case intent only; ForgeCAD refuses to invent fixtures, loads, mesh order, or region tags during export.
|
|
452
|
+
|
|
380
453
|
#### `edgeBetweenFrames(a: string, b: string, options?: AssemblyFrameEdgeOptions): Assembly` — Add a visual skeleton edge between two rig frame origins.
|
|
381
454
|
|
|
382
455
|
Frame edges follow the solved frame poses produced by `fixedJoint()`, `revoluteJoint()`, and `prismaticJoint()`. They do not add constraints, degrees of freedom, parts, or geometry; use them to make a frame-only rig readable in the Motion/rig inspection overlay.
|
|
@@ -7,14 +7,14 @@ Every public API function belongs to one of 16 fundamental concepts. This is an
|
|
|
7
7
|
- **[C1: Primitive Construction](#c1-primitive-construction)** — Create geometry from parameters — no input geometry required. *(66 functions)*
|
|
8
8
|
- **[C2: Boolean Combination](#c2-boolean-combination)** — Combine same-dimension geometry using CSG set operations. *(6 functions)*
|
|
9
9
|
- **[C3: Rigid Transform](#c3-rigid-transform)** — Reposition or reorient geometry without changing its shape. *(0 functions)*
|
|
10
|
-
- **[C4: Dimensional Promotion](#c4-dimensional-promotion)** — Convert a 2D profile into a 3D solid (extrude, revolve, loft, sweep). *(
|
|
10
|
+
- **[C4: Dimensional Promotion](#c4-dimensional-promotion)** — Convert a 2D profile into a 3D solid (extrude, revolve, loft, sweep). *(69 functions)*
|
|
11
11
|
- **[C5: Topology Query](#c5-topology-query)** — Select or inspect named faces and edges on a shape. *(3 functions)*
|
|
12
12
|
- **[C6: Edge Feature](#c6-edge-feature)** — Modify edges of a solid — fillets, chamfers, draft, offset. *(4 functions)*
|
|
13
13
|
- **[C7: Pattern Replication](#c7-pattern-replication)** — Duplicate geometry in regular arrangements (linear, circular, mirror). *(6 functions)*
|
|
14
14
|
- **[C8: Constraint Solving](#c8-constraint-solving)** — Define geometry by relationships and let a solver find positions. *(1 functions)*
|
|
15
15
|
- **[C9: Spatial Placement](#c9-spatial-placement)** — Position geometry relative to other geometry using semantic anchors. *(6 functions)*
|
|
16
|
-
- **[C10: Assembly & Kinematics](#c10-assembly-kinematics)** — Compose parts with joints for kinematic simulation. *(
|
|
17
|
-
- **[C11: Parameterization & UI](#c11-parameterization-ui)** — Declare user-facing controls that drive model geometry. *(
|
|
16
|
+
- **[C10: Assembly & Kinematics](#c10-assembly-kinematics)** — Compose parts with joints for kinematic simulation. *(28 functions)*
|
|
17
|
+
- **[C11: Parameterization & UI](#c11-parameterization-ui)** — Declare user-facing controls that drive model geometry. *(10 functions)*
|
|
18
18
|
- **[C12: Dimensional Demotion](#c12-dimensional-demotion)** — Extract 2D geometry from a 3D solid (section, projection). *(3 functions)*
|
|
19
19
|
- **[C13: Export & Output](#c13-export-output)** — Convert geometry to external formats (STL, 3MF, SVG, DXF, G-code, PDF). *(14 functions)*
|
|
20
20
|
- **[C14: Visual & Debugging](#c14-visual-debugging)** — Control viewport appearance and debugging aids. *(39 functions)*
|
|
@@ -123,12 +123,21 @@ Convert a 2D profile into a 3D solid (extrude, revolve, loft, sweep).
|
|
|
123
123
|
|
|
124
124
|
- `Curve.Blend(start, end)` — Create an exact G1 blend curve between two directed endpoints. → [curves](/docs/curves#curve)
|
|
125
125
|
- `Curve.BlendG2(start, end)` — Create an exact G2 blend curve between two directed endpoints. → [curves](/docs/curves#curve)
|
|
126
|
+
- `Curve.Bridge(options)` — Bridge two existing curve endpoints with inferred tangent or curvature continuity. → [curves](/docs/curves#curve)
|
|
126
127
|
- `Curve.Arc(options)` — Create an exact circular 3D arc from start, end, and start tangent. → [curves](/docs/curves#curve)
|
|
127
128
|
- `Curve.Line(start, end)` — Create an exact straight 3D NURBS line segment. → [curves](/docs/curves#curve)
|
|
128
129
|
- `Curve.Nurbs(points, options?)` — Create an exact NURBS 3D curve from control points, weights, knots, and degree. → [curves](/docs/curves#curve)
|
|
129
130
|
- `Curve.Fit(points, options?)` — Fit a non-rational NURBS curve that interpolates every input point. → [curves](/docs/curves#curve)
|
|
131
|
+
- `Curve.ProjectOnSurface(curve, sheet, options?)` — Project a curve onto a `Sheet` along the surface normal and return the exact NURBS foot curve. → [curves](/docs/curves#curve)
|
|
132
|
+
- `Curve.Intersect(sheetA, sheetB, options?)` — Intersect two `Sheet` surfaces and return the exact NURBS intersection branches. → [curves](/docs/curves#curve)
|
|
130
133
|
- `Curve.Trim(curve, start, end)` — Extract an exact curve segment from normalized parameter `start` to `end`. → [curves](/docs/curves#curve)
|
|
131
134
|
- `Curve.Reverse(curve)` — Reverse an exact curve without changing its geometry. → [curves](/docs/curves#curve)
|
|
135
|
+
- `Curve.closestParameter(curve, point, options?)` — Find the normalized parameter on an exact curve closest to a world point. → [curves](/docs/curves#curve)
|
|
136
|
+
- `Curve.join(curves, options?)` — Join touching curve segments into one sampled sweep path. → [curves](/docs/curves#curve)
|
|
137
|
+
- `Curve.placeOnXY(path, z?, options?)` — Place a 2D path onto the XY plane at world Z. → [curves](/docs/curves#curve)
|
|
138
|
+
- `Curve.placeOnXZ(path, y?, options?)` — Place a 2D path onto the XZ plane at world Y. → [curves](/docs/curves#curve)
|
|
139
|
+
- `Curve.placeOnYZ(path, x?, options?)` — Place a 2D path onto the YZ plane at world X. → [curves](/docs/curves#curve)
|
|
140
|
+
- `Curve.placeOnPlane(path, options)` — Place a 2D path onto an arbitrary world plane. → [curves](/docs/curves#curve)
|
|
132
141
|
- `Curve.Route` — Build analytic 3D line/arc routes for sweeps. → [curves](/docs/curves#curve)
|
|
133
142
|
- `Curve.Helix(options)` — Build helical paths and swept coils. → [curves](/docs/curves#curve)
|
|
134
143
|
- `Loft.station(profile, position)` — Create a loft station from a 2D profile and an axis position. → [curves](/docs/curves#curves-surfacing)
|
|
@@ -148,19 +157,23 @@ Convert a 2D profile into a 3D solid (extrude, revolve, loft, sweep).
|
|
|
148
157
|
- `Analysis.CurvatureComb(input, options?)` → [curves](/docs/curves#analysis)
|
|
149
158
|
- `Analysis.SurfaceHealth(shape, options?)` → [curves](/docs/curves#analysis)
|
|
150
159
|
- `Analysis.BRepValidity(shape, options?)` — Validate B-rep/shell/solid structure and return closedness, manifoldness, orientation, and issue diagnostics. → [curves](/docs/curves#analysis)
|
|
151
|
-
- `Blend.Edge(options)` → [curves](/docs/curves#blend)
|
|
160
|
+
- `Blend.Edge(options)` — Fillet one or more edges with constant or variable radius. → [curves](/docs/curves#blend)
|
|
152
161
|
- `Blend.Surface(options)` → [curves](/docs/curves#blend)
|
|
153
162
|
- `Blend.Bridge(edgeA, edgeB)` — Build a transition strip between two `Surface.Net` sheet edges. → [curves](/docs/curves#blend)
|
|
163
|
+
- `Blend.Face(options)` — Fillet every edge SHARED by a pair of faces — a "face fillet". → [curves](/docs/curves#blend)
|
|
164
|
+
- `Blend.FullRound(options)` — Full round — roll a blend over a narrow center face so it is consumed and its two neighbouring faces meet tangentially (classic 3-face full round). → [curves](/docs/curves#blend)
|
|
154
165
|
- `Surface.Plane(options)` — Create a finite analytic plane sheet that can be trimmed, sewn, thickened, or used as a low-level face. → [curves](/docs/curves#surface)
|
|
155
166
|
- `Surface.Cylinder(options)` — Create a finite analytic cylindrical sheet, optionally bounded by start/end angles. → [curves](/docs/curves#surface)
|
|
156
167
|
- `Surface.Cone(options)` — Create a finite analytic conical or frustum sheet, optionally bounded by start/end angles. → [curves](/docs/curves#surface)
|
|
157
168
|
- `Surface.Sphere(options)` — Create a finite analytic spherical sheet bounded by longitude and latitude ranges. → [curves](/docs/curves#surface)
|
|
158
169
|
- `Surface.Torus(options)` — Create a finite analytic torus sheet bounded by major and tube angle ranges. → [curves](/docs/curves#surface)
|
|
170
|
+
- `Surface.Sweep(profile, spine, options?)` — Sweep an open 2D profile path along a 3D spine to create an open surface sheet. → [curves](/docs/curves#surface)
|
|
171
|
+
- `Surface.Loft(input)` — Loft an open surface sheet through ordered profile stations. → [curves](/docs/curves#surface)
|
|
159
172
|
- `Surface.Nurbs(controlGrid, options?)` — Create an exact NURBS surface from a grid of control points. → [curves](/docs/curves#surface)
|
|
160
173
|
- `Surface.Ruled(curveA, curveB, options?)` → [curves](/docs/curves#surface)
|
|
161
174
|
- `Surface.Patch(curves, options?)` — Create a smooth open surface sheet from 4 boundary curves (Coons patch). → [curves](/docs/curves#surface)
|
|
162
175
|
- `Surface.Boundary(input)` → [curves](/docs/curves#surface)
|
|
163
|
-
- `Surface.Fill(input)` → [curves](/docs/curves#surface)
|
|
176
|
+
- `Surface.Fill(input)` — Create an n-sided open surface sheet from 3 or more boundary curves (energy-minimizing constrained fill). → [curves](/docs/curves#surface)
|
|
164
177
|
- `Surface.Sew(shapes, options?)` → [curves](/docs/curves#surface)
|
|
165
178
|
- `Surface.Solid(input, options?)` — Sew surface faces or consume an existing sewn shell and make a solid B-rep. → [curves](/docs/curves#surface)
|
|
166
179
|
- `Surface.Extend(shape, options)` → [curves](/docs/curves#surface)
|
|
@@ -168,6 +181,12 @@ Convert a 2D profile into a 3D solid (extrude, revolve, loft, sweep).
|
|
|
168
181
|
- `Surface.Split(shape, tool)` → [curves](/docs/curves#surface)
|
|
169
182
|
- `Surface.Match(shape, options)` → [curves](/docs/curves#surface)
|
|
170
183
|
- `Surface.Net()` — Begin a curve-network (Gordon) surface — the class-A keystone. → [curves](/docs/curves#surface)
|
|
184
|
+
- `Surface.BoundaryNet()` — Begin a **Boundary Surface** — the canonical class-A surfacing primitive (SolidWorks "Boundary Boss/Base", Onshape "Boundary surface", Rhino NetworkSrf). → [curves](/docs/curves#surface)
|
|
185
|
+
- `Thickness.constant(thickness)` — Use the same wall thickness everywhere on the sheet. → [curves](/docs/curves#thickness)
|
|
186
|
+
- `Thickness.alongU(profile)` — Vary wall thickness across the sheet U direction. → [curves](/docs/curves#thickness)
|
|
187
|
+
- `Thickness.alongV(profile)` — Vary wall thickness across the sheet V direction. → [curves](/docs/curves#thickness)
|
|
188
|
+
- `Thickness.grid(values, options?)` — Bilinearly interpolate wall thickness from a rectangular UV grid. → [curves](/docs/curves#thickness)
|
|
189
|
+
- `Thickness.nurbs(values, options?)` — Interpolate wall thickness from a scalar tensor-product B-spline over sheet UV. → [curves](/docs/curves#thickness)
|
|
171
190
|
- `loft(profiles, heights, options?)` — Loft between multiple sketches along Z stations. → [curves](/docs/curves#loft)
|
|
172
191
|
- `sweep(profile, path, options?)` → [curves](/docs/curves#sweep)
|
|
173
192
|
- `variableSweep(spine, sections, options?)` — Sweep a variable cross-section along a 3D spine curve. → [curves](/docs/curves#variablesweep)
|
|
@@ -233,12 +252,25 @@ Position geometry relative to other geometry using semantic anchors.
|
|
|
233
252
|
|
|
234
253
|
Compose parts with joints for kinematic simulation.
|
|
235
254
|
|
|
255
|
+
- `Fea.material(name, options)` — Create a named linear-elastic structural material for static stress studies. → [assembly](/docs/assembly#assembly-joints)
|
|
256
|
+
- `Fea.body(options)` — Mark one assembly part as a structural body with a `Fea.material(...)` value. → [assembly](/docs/assembly#assembly-joints)
|
|
257
|
+
- `Fea.region.face(partName, faceName)` — Reference a named face on a named assembly part without relying on object identity. → [assembly](/docs/assembly#assembly-joints)
|
|
258
|
+
- `Fea.region.plane(partName, faceName, options)` — Reference a planar face by a point on the face and its outward normal in part-local coordinates. → [assembly](/docs/assembly#assembly-joints)
|
|
259
|
+
- `Fea.fix.fixed(region)` — Fully fix all translational degrees of freedom on a face/region. → [assembly](/docs/assembly#assembly-joints)
|
|
260
|
+
- `Fea.load.force(region, options)` — Apply a force with magnitude in newtons along the given direction vector. → [assembly](/docs/assembly#assembly-joints)
|
|
261
|
+
- `Fea.target.minSafetyFactor(value)` — Require the solved minimum safety factor to be at least `value`. → [assembly](/docs/assembly#assembly-joints)
|
|
262
|
+
- `Fea.mesh.quadraticTets(options)` — Request quadratic tetrahedral C3D10 elements with a maximum size in mm. → [assembly](/docs/assembly#assembly-joints)
|
|
263
|
+
- `Fea.study.staticStress(name, options)` — Create a linear static structural stress study. → [assembly](/docs/assembly#assembly-joints)
|
|
236
264
|
- `Sim.material(name, options?)` — Create a named physical material with density and contact coefficients for simulation export and checks. → [assembly](/docs/assembly#assembly-joints)
|
|
237
265
|
- `Sim.body(options)` — Describe one assembly part as a physical body with mass/density, material, collider intent, and optional contact surfaces. → [assembly](/docs/assembly#assembly-joints)
|
|
238
266
|
- `Sim.collider.convexHull()` — Use a generated collision mesh for the part. → [assembly](/docs/assembly#assembly-joints)
|
|
239
267
|
- `Sim.collider.boundingBox()` — Use the part bounding box as the collision geometry. → [assembly](/docs/assembly#assembly-joints)
|
|
240
268
|
- `Sim.collider.visualMesh()` — Use the visual mesh as collision geometry. → [assembly](/docs/assembly#assembly-joints)
|
|
269
|
+
- `Sim.collider.sdfMesh` — Use an SDF mesh collider for complex concave contact geometry. → [assembly](/docs/assembly#assembly-joints)
|
|
241
270
|
- `Sim.collider.none(reason)` — Disable collision for a part with an explicit reason, such as a sensor-only or decorative object. → [assembly](/docs/assembly#assembly-joints)
|
|
271
|
+
- `Sim.motion.dynamic()` — Simulate this body as a normal dynamic rigid body with mass and inertia. → [assembly](/docs/assembly#assembly-joints)
|
|
272
|
+
- `Sim.motion.kinematic()` — Simulate this body as kinematic: moved by the simulator/user, but not force-integrated. → [assembly](/docs/assembly#assembly-joints)
|
|
273
|
+
- `Sim.motion.static()` — Keep this body fixed in the world as a static collision/environment body. → [assembly](/docs/assembly#assembly-joints)
|
|
242
274
|
- `Sim.drive.passive(options?)` — Mark a joint as passive while preserving damping and friction metadata for simulation export. → [assembly](/docs/assembly#assembly-joints)
|
|
243
275
|
- `Sim.drive.velocity(options)` — Mark a revolute joint as velocity-driven with torque and speed limits. → [assembly](/docs/assembly#assembly-joints)
|
|
244
276
|
- `Sim.contact.wheelSurface(connectorName)` — Mark a connector as the wheel tread contact surface for offline checks and downstream simulation metadata. → [assembly](/docs/assembly#assembly-joints)
|
|
@@ -255,11 +287,15 @@ Compose parts with joints for kinematic simulation.
|
|
|
255
287
|
|
|
256
288
|
Declare user-facing controls that drive model geometry.
|
|
257
289
|
|
|
290
|
+
- `Param.anchor` — Viewport anchor builders for spatial parameter editing. → [core](/docs/core#parameters)
|
|
258
291
|
- `Param.number(name, defaultValue, opts?)` — Declare a numeric parameter that renders as a slider in the UI. → [core](/docs/core#parameters)
|
|
259
292
|
- `Param.string(name, defaultValue, opts?)` — Declare a string parameter that renders as a text input in the UI. → [core](/docs/core#parameters)
|
|
260
|
-
- `Param.bool(name, defaultValue)` — Declare a boolean parameter that renders as a checkbox in the UI. → [core](/docs/core#parameters)
|
|
261
|
-
- `Param.choice(name, defaultValue, choices)` — Declare a choice parameter that renders as a dropdown in the UI. → [core](/docs/core#parameters)
|
|
293
|
+
- `Param.bool(name, defaultValue, opts?)` — Declare a boolean parameter that renders as a checkbox in the UI. → [core](/docs/core#parameters)
|
|
294
|
+
- `Param.choice(name, defaultValue, choices, opts?)` — Declare a choice parameter that renders as a dropdown in the UI. → [core](/docs/core#parameters)
|
|
262
295
|
- `Param.list(name, defaultItems, opts)` — Declare a list parameter — an array of struct items with per-field UI controls. → [core](/docs/core#parameters)
|
|
296
|
+
- `Param.path2d(name, defaultPoints, opts?)` — Declare an editable 2D path parameter. → [core](/docs/core#parameters)
|
|
297
|
+
- `Param.spline2d(name, defaultPoints, opts?)` — Declare an editable 2D spline parameter. → [core](/docs/core#parameters)
|
|
298
|
+
- `Param.placement2d(name, spec)` — Declare an editable 2D placement sheet parameter. → [core](/docs/core#parameters)
|
|
263
299
|
- `dim(line, opts?)` — Add a dimension annotation between two points, or along an entity. → [output](/docs/output#dim)
|
|
264
300
|
|
|
265
301
|
---
|