forgecad 0.10.2 → 0.10.3
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 +7 -6
- package/dist/assets/{AdminPage-CHY6ZN-p.js → AdminPage-CK7ObBz3.js} +1 -1
- package/dist/assets/{BenchmarkPage-BcRT5iGN.js → BenchmarkPage-Ds7Z2doN.js} +1 -1
- package/dist/assets/{BlogPage-BssBbnb-.js → BlogPage-DlPbpt6A.js} +1 -1
- package/dist/assets/{DocsPage-DsvdiRNK.js → DocsPage-vZb3b3Y0.js} +9 -14
- package/dist/assets/{EditorApp-BpjZgzk0.css → EditorApp-C5f24ZN9.css} +8 -0
- package/dist/assets/{EditorApp-Bfd3jbtC.js → EditorApp-HLoKfe15.js} +141 -12
- package/dist/assets/{EmbedViewer-D5t8WamV.js → EmbedViewer--KnqBKrJ.js} +2 -2
- package/dist/assets/{LandingPageProofDriven-DbN7o-Be.js → LandingPageProofDriven-C_LssmnA.js} +1 -1
- package/dist/assets/{LegalPage-DNGrrY0p.js → LegalPage-DGsyo4n1.js} +1 -1
- package/dist/assets/{PricingPage-Nczr3pRz.js → PricingPage-BOE27B-R.js} +1 -1
- package/dist/assets/{SettingsPage-DZlyu4d4.js → SettingsPage-f47cnk39.js} +1 -1
- package/dist/assets/{app-C9ct2hRD.js → app-D6ccu2Xx.js} +6854 -7373
- package/dist/assets/{backendInit-ymjonyQp.js → backendInit-DbTkQN9J.js} +2557 -809
- package/dist/assets/cli/{render-B_0lQwKU.js → render-BsngirjC.js} +114 -9
- package/dist/assets/{constructionHistoryWorker-CZ42Dksy.js → constructionHistoryWorker-PCwXrTDB.js} +175 -36
- package/dist/assets/{evalWorker-C2pm8LHP.js → evalWorker-CS63PfZu.js} +1125 -447
- package/dist/assets/{forgecad_geometry-BlMtqluF.js → forgecad_geometry-CZ_IfuvA.js} +1 -9
- package/dist/assets/{forgecad_geometry_bg-BllP_WiL.wasm → forgecad_geometry_bg-C3rQHfwg.wasm} +0 -0
- package/dist/assets/{inspectWorker-D5T5VbfK.js → inspectWorker-Y4cOzNyA.js} +4345 -373
- package/dist/assets/{jointPose-4r8ed8_5.js → jointPose-AMvCywzS.js} +1 -1
- package/dist/assets/{manifold-C4r6B-XY.js → manifold-CBry38ly.js} +2 -2
- package/dist/assets/{manifold-5PP1eGLN.js → manifold-Crd_F2qx.js} +1 -1
- package/dist/assets/{manifold-DjBkyIc8.js → manifold-k2kRcc85.js} +1 -1
- package/dist/assets/{reportWorker-CwenM7wB.js → reportWorker-CWvn0CEv.js} +1095 -400
- package/dist/cli/render.html +1 -1
- package/dist/docs/index.html +2 -2
- package/dist/docs-raw/AI/usage.md +2 -4
- package/dist/docs-raw/CLI.md +9 -7
- package/dist/docs-raw/README.md +1 -1
- package/dist/docs-raw/component-model.md +1 -1
- package/dist/docs-raw/generated/assembly.md +1 -1
- package/dist/docs-raw/generated/concepts.md +5 -3
- package/dist/docs-raw/generated/core.md +70 -1
- package/dist/docs-raw/generated/curves.md +8 -1
- package/dist/docs-raw/generated/output.md +0 -64
- package/dist/docs-raw/generated/runtime-names.md +6 -6
- package/dist/docs-raw/generated/viewport.md +3 -12
- package/dist/docs-raw/guides/inspection-bundles.md +1 -1
- package/dist/docs-raw/simulation-workflow.md +58 -0
- package/dist/docs-raw/skills/forgecad-blockout-model.md +1 -1
- package/dist/docs-raw/skills/forgecad-image-replicator.md +2 -2
- package/dist/docs-raw/skills/forgecad-mujoco-verify.md +78 -0
- package/dist/docs-raw/skills/forgecad-spec-by-walking-through-it.md +145 -0
- package/dist/docs-raw/skills/forgecad-visual-spec.md +1 -1
- package/dist/docs-raw/skills/forgecad.md +24 -24
- package/dist/docs-raw/skills/index.md +2 -3
- package/dist/index.html +1 -1
- package/dist/sitemap.xml +15 -15
- package/dist-cli/{check-compiler-SP7FAL7R.js → check-compiler-HPF2T2FS.js} +1 -1
- package/dist-cli/{check-query-propagation-BRLSHP22.js → check-query-propagation-HYSLTXAB.js} +1 -1
- package/dist-cli/{chunk-RQQ42YCP.js → chunk-WLUKAW3H.js} +1025 -158
- package/dist-cli/forgecad.js +2621 -232
- package/dist-cli/{forgecad_geometry-7TVSNVUB.js → forgecad_geometry-2IMYCUWW.js} +0 -8
- package/dist-cli/forgecad_geometry_bg.wasm +0 -0
- package/dist-skill/CONTEXT.md +85 -73
- package/dist-skill/SKILL.md +1 -1
- package/dist-skill/docs/CLI.md +9 -7
- package/dist-skill/docs/generated/assembly.md +1 -1
- package/dist-skill/docs/generated/core.md +70 -1
- package/dist-skill/docs/generated/curves.md +8 -1
- package/dist-skill/docs/generated/output.md +0 -64
- package/dist-skill/docs/generated/runtime-names.md +6 -6
- package/dist-skill/docs/generated/viewport.md +3 -12
- package/dist-skill/docs/guides/inspection-bundles.md +1 -1
- package/dist-skill/library/README.md +2 -3
- package/dist-skill/library/forgecad-blockout-model/SKILL.md +1 -1
- package/dist-skill/library/forgecad-image-replicator/SKILL.md +2 -2
- package/dist-skill/library/forgecad-mujoco-verify/SKILL.md +66 -0
- package/dist-skill/library/forgecad-mujoco-verify/scripts/mujoco_verify.py +385 -0
- package/dist-skill/library/forgecad-spec-by-walking-through-it/SKILL.md +132 -0
- package/dist-skill/library/forgecad-visual-spec/SKILL.md +1 -1
- package/dist-skill/website/skills/forgecad-blockout-model.md +1 -1
- package/dist-skill/website/skills/forgecad-image-replicator.md +2 -2
- package/dist-skill/website/skills/forgecad-mujoco-verify.md +78 -0
- package/dist-skill/website/skills/forgecad-spec-by-walking-through-it.md +145 -0
- package/dist-skill/website/skills/forgecad-visual-spec.md +1 -1
- package/dist-skill/website/skills/forgecad.md +24 -24
- package/dist-skill/website/skills/index.md +2 -3
- package/examples/analysis/clearance-fit.forge.js +31 -0
- package/examples/analysis/lever-arm-actuator.forge.js +43 -0
- package/examples/analysis/tipping-tripod.forge.js +35 -0
- package/examples/products/sportscar.forge.js +77 -0
- package/package.json +1 -3
- package/dist/docs-raw/skills/forgecad-high-level-spec.md +0 -101
- package/dist/docs-raw/skills/forgecad-lld.md +0 -41
- package/dist/docs-raw/skills/forgecad-prepare-prompt.md +0 -63
- package/dist-skill/library/forgecad-high-level-spec/SKILL.md +0 -94
- package/dist-skill/library/forgecad-lld/SKILL.md +0 -34
- package/dist-skill/library/forgecad-prepare-prompt/SKILL.md +0 -50
- package/dist-skill/website/skills/forgecad-high-level-spec.md +0 -101
- package/dist-skill/website/skills/forgecad-lld.md +0 -41
- package/dist-skill/website/skills/forgecad-prepare-prompt.md +0 -63
- /package/dist-skill/library/{forgecad-prepare-prompt → forgecad-spec-by-walking-through-it}/references/default-profiles.md +0 -0
- /package/dist-skill/library/{forgecad-prepare-prompt → forgecad-spec-by-walking-through-it}/references/master-prompt.md +0 -0
|
@@ -31,13 +31,6 @@ function geometry_chamfer_edges(handle, spec_json) {
|
|
|
31
31
|
}
|
|
32
32
|
return ret[0] >>> 0;
|
|
33
33
|
}
|
|
34
|
-
function geometry_clone(handle) {
|
|
35
|
-
const ret = wasm.geometry_clone(handle);
|
|
36
|
-
if (ret[2]) {
|
|
37
|
-
throw takeFromExternrefTable0(ret[1]);
|
|
38
|
-
}
|
|
39
|
-
return ret[0] >>> 0;
|
|
40
|
-
}
|
|
41
34
|
function geometry_create_box(width, depth, height) {
|
|
42
35
|
const ret = wasm.geometry_create_box(width, depth, height);
|
|
43
36
|
return ret >>> 0;
|
|
@@ -889,7 +882,6 @@ export {
|
|
|
889
882
|
geometry_boolean,
|
|
890
883
|
geometry_capabilities,
|
|
891
884
|
geometry_chamfer_edges,
|
|
892
|
-
geometry_clone,
|
|
893
885
|
geometry_create_box,
|
|
894
886
|
geometry_create_cylinder,
|
|
895
887
|
geometry_create_empty,
|
|
Binary file
|
package/dist-skill/CONTEXT.md
CHANGED
|
@@ -141,12 +141,12 @@ lib, Line2D, linearPattern, linearPattern2d, loadFont, loft, Loft, mirrorCopy
|
|
|
141
141
|
mock, ngon, NurbsCurve3D, NurbsSurface, offsetSolid, param, Param, path
|
|
142
142
|
Point2D, Points, polygon, polygonVertices, port, Product, ProductPanelBuilder, ProductRibbonBuilder
|
|
143
143
|
ProductSkin, ProductSkinBuilder, ProductStationBuilder, ProductSurfaceBuilder, ProductSurfaceRef, projectToPlane, queueMicrotask, rect
|
|
144
|
-
Rectangle2D,
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
144
|
+
Rectangle2D, roundedRect, Route3D, scene, Sculpt, sdf, SdfShape, selectEdge
|
|
145
|
+
selectEdges, self, setActiveBackend, setImmediate, setInterval, setTimeout, Shape, ShapeGroup
|
|
146
|
+
sheetMetal, SheetMetalPart, sheetStock, Sim, Sketch, sketchToDxf, sketchToSvg, slot
|
|
147
|
+
SolvedAssembly, spec, sphere, spline2d, stroke, Surface, SurfaceBody, SurfaceMembers
|
|
148
|
+
sweep, text2d, textWidth, torus, toShape, Transform, union, union2d
|
|
149
|
+
variableSweep, verify, Viewport, window, Wood
|
|
150
150
|
```
|
|
151
151
|
|
|
152
152
|
`showLabels` is also a runtime global, but it is not part of the top-level collision check. Avoid reusing it unless you intentionally want a local value with that name.
|
|
@@ -176,6 +176,10 @@ union2d, variableSweep, verify, Viewport, window, Wood
|
|
|
176
176
|
- [SurfacePattern](#surfacepattern)
|
|
177
177
|
- [Pattern2D](#pattern2d)
|
|
178
178
|
- [Pattern2DBuilder](#pattern2dbuilder)
|
|
179
|
+
- [Sheet](#sheet)
|
|
180
|
+
- [CurveNetBuilder](#curvenetbuilder)
|
|
181
|
+
- [MatchEdgeBuilder](#matchedgebuilder)
|
|
182
|
+
- [BridgeBuilder](#bridgebuilder)
|
|
179
183
|
- [ShapeRef](#shaperef)
|
|
180
184
|
- [ANCHOR3D_NAMES](#anchor3d-names)
|
|
181
185
|
- [verify](#verify)
|
|
@@ -860,7 +864,7 @@ Supports transforms (translate, rotate, scale, mirror, transform, rotateAround,
|
|
|
860
864
|
|
|
861
865
|
Returns a new Shape with the specified material properties merged on top of any previously set properties. All properties are optional — omitted keys retain their current value. Material properties survive transforms and boolean operations.
|
|
862
866
|
|
|
863
|
-
Use `.color()` to set the base diffuse color; `.material()` controls how that color behaves under light (metalness, roughness, clearcoat) and can add emissive glow independent of lighting.
|
|
867
|
+
Use `.color()` to set the base diffuse color; `.material()` controls how that color behaves under light (metalness, roughness, clearcoat) and can add emissive glow independent of lighting.
|
|
864
868
|
|
|
865
869
|
```js
|
|
866
870
|
box(50, 50, 50).material({ metalness: 0.9, roughness: 0.1 }); // polished metal
|
|
@@ -1485,6 +1489,71 @@ const bracket = group(
|
|
|
1485
1489
|
| `depth?` | `number` | Thread groove depth in millimeters. Default: 0.8. |
|
|
1486
1490
|
| `underScale?` | `number` | Relative height of the under-crossing thread. Default: 0.15. |
|
|
1487
1491
|
|
|
1492
|
+
### `Sheet`
|
|
1493
|
+
|
|
1494
|
+
A parametric open surface value (control grid + knots + analytic differential geometry).
|
|
1495
|
+
|
|
1496
|
+
**Properties:**
|
|
1497
|
+
|
|
1498
|
+
| Property | Type | Description |
|
|
1499
|
+
|----------|------|-------------|
|
|
1500
|
+
| `surface` | `BSplineSurface` | — |
|
|
1501
|
+
|
|
1502
|
+
**Methods:**
|
|
1503
|
+
|
|
1504
|
+
#### `get frontEdge(): SheetEdge` — Edge naming follows parameter direction (documented): front=v0, rear=v1, left=u0, right=u1.
|
|
1505
|
+
|
|
1506
|
+
#### `thicken(wall: number, options?: { resolution?: number; }): Shape` — Offset the sheet along its analytic normals into a watertight solid shell of the given wall thickness. Throws if the wall would self-intersect on a concave region (no silent degenerate solid).
|
|
1507
|
+
|
|
1508
|
+
#### `matchEdge(edge: SheetEdge): MatchEdgeBuilder` — Per-edge continuity match against a neighbor (returns a NEW Sheet).
|
|
1509
|
+
|
|
1510
|
+
**`SheetEdge`**
|
|
1511
|
+
- `fixed: "u" | "v"` — Which parameter is held fixed along this edge.
|
|
1512
|
+
- `value: 0 | 1` — The fixed value (0 or 1).
|
|
1513
|
+
- Also: `sheet: Sheet`.
|
|
1514
|
+
|
|
1515
|
+
- `get rearEdge(): SheetEdge`
|
|
1516
|
+
- `get leftEdge(): SheetEdge`
|
|
1517
|
+
- `get rightEdge(): SheetEdge`
|
|
1518
|
+
- `pointAt(u: number, v: number): Vec3`
|
|
1519
|
+
- `normalAt(u: number, v: number): Vec3`
|
|
1520
|
+
- `curvatureAt(u: number, v: number): SurfaceCurvature`
|
|
1521
|
+
|
|
1522
|
+
### `CurveNetBuilder`
|
|
1523
|
+
|
|
1524
|
+
#### `toSheet(): Sheet` — Build (once) and return the Sheet.
|
|
1525
|
+
|
|
1526
|
+
- `lengthwise(...curves: CurveInput[]): this`
|
|
1527
|
+
- `crosswise(...curves: CurveInput[]): this`
|
|
1528
|
+
- `alongRails(railA: CurveInput, railB: CurveInput): this`
|
|
1529
|
+
- `sections(...curves: CurveInput[]): this`
|
|
1530
|
+
- `cage(grid: Vec3[][]): this`
|
|
1531
|
+
- `degree(u: number, v: number): this`
|
|
1532
|
+
- `get frontEdge(): SheetEdge`
|
|
1533
|
+
- `get rearEdge(): SheetEdge`
|
|
1534
|
+
- `get leftEdge(): SheetEdge`
|
|
1535
|
+
- `get rightEdge(): SheetEdge`
|
|
1536
|
+
- `get surface(): BSplineSurface`
|
|
1537
|
+
- `pointAt(u: number, v: number): Vec3`
|
|
1538
|
+
- `normalAt(u: number, v: number): Vec3`
|
|
1539
|
+
- `curvatureAt(u: number, v: number): SurfaceCurvature`
|
|
1540
|
+
- `thicken(wall: number, options?: { resolution?: number; }): Shape`
|
|
1541
|
+
- `matchEdge(edge: SheetEdge): MatchEdgeBuilder`
|
|
1542
|
+
|
|
1543
|
+
### `MatchEdgeBuilder`
|
|
1544
|
+
|
|
1545
|
+
- `toG0(neighbor: SheetEdge): Sheet`
|
|
1546
|
+
- `toG1(neighbor: SheetEdge): Sheet`
|
|
1547
|
+
- `toG2(neighbor: SheetEdge): Sheet`
|
|
1548
|
+
|
|
1549
|
+
### `BridgeBuilder`
|
|
1550
|
+
|
|
1551
|
+
#### `bulge(a: number, b: number): this` — Tune the influence of each side (Rhino-style bulge).
|
|
1552
|
+
|
|
1553
|
+
- `g0(): Sheet`
|
|
1554
|
+
- `g1(): Sheet`
|
|
1555
|
+
- `g2(): Sheet`
|
|
1556
|
+
|
|
1488
1557
|
### `ShapeRef`
|
|
1489
1558
|
|
|
1490
1559
|
A first-class reference path over a shape's semantic faces and face relationships.
|
|
@@ -3025,7 +3094,11 @@ const outlet = route.port("outlet");
|
|
|
3025
3094
|
|
|
3026
3095
|
#### `pointAt(u: number, v: number): Vec3` — Evaluate the surface at parameters (u, v) ∈ [0, 1]². Uses tensor product evaluation: evaluate basis functions in U and V independently.
|
|
3027
3096
|
|
|
3028
|
-
#### `normalAt(u: number, v: number): Vec3` — Evaluate the surface normal at (u, v)
|
|
3097
|
+
#### `normalAt(u: number, v: number): Vec3` — Evaluate the surface unit normal at (u, v) from analytic first derivatives.
|
|
3098
|
+
|
|
3099
|
+
Uses Algorithm A2.3 basis-function derivatives with the rational quotient rule, so the normal is exact (no finite-difference epsilon, no error near the boundary). Constant chain-rule factors from the parameter remap scale Su and Sv positively and cancel under normalization, so they are omitted.
|
|
3100
|
+
|
|
3101
|
+
#### `derivativesAt(u: number, v: number): { S: Vec3; Su: Vec3; Sv: Vec3; }` — Analytic first partial derivatives S_u, S_v (rational quotient rule).
|
|
3029
3102
|
|
|
3030
3103
|
#### `tessellate(resU?: number, resV?: number): { positions: Vec3[]; normals: Vec3[]; indices: number[]; }` — Tessellate the surface into a triangle mesh. Returns positions, normals, and triangle indices.
|
|
3031
3104
|
|
|
@@ -3764,16 +3837,19 @@ Members (full entries under [Curves & Surfacing](#curves-surfacing)): `Curve.Ble
|
|
|
3764
3837
|
- `Trim(shape: Shape, tool: Shape | SurfacePlaneOp): Shape`
|
|
3765
3838
|
- `Split(shape: Shape, tool: Shape | SurfacePlaneOp): [ Shape, Shape ]`
|
|
3766
3839
|
- `Match(shape: Shape, options: { edge: "u0" | "u1" | "v0" | "v1"; target: EdgeRef; continuity?: SurfaceContinuity; }): Shape`
|
|
3840
|
+
- `Net(): CurveNet` — Begin a curve-network (Gordon) surface — the class-A keystone. Chain `.lengthwise(...)/.crosswise(...)` (or `.alongRails(a,b).sections(...)`, or `.cage(grid)`), then `.thicken(wall)` to get a solid Shape. Returns a fluent [`Sheet`](/docs/core#sheet) builder with analytic point/normal/curvature queries and named edges.
|
|
3767
3841
|
|
|
3768
3842
|
### `Blend`
|
|
3769
3843
|
|
|
3770
3844
|
- `Edge(options: BlendEdgeOptions): Shape`
|
|
3771
3845
|
- `Surface(options: BlendSurfaceOptions): Shape`
|
|
3846
|
+
- `Bridge(edgeA: SheetEdge, edgeB: SheetEdge): BridgeBuilder` — Build a transition strip between two `Surface.Net` sheet edges. Chain `.bulge(a, b)` then `.g0()/.g1()/.g2()` for the continuity order. Returns a [`Sheet`](/docs/core#sheet); verify the seam with `Analysis.EdgeMatch`.
|
|
3772
3847
|
|
|
3773
3848
|
### `Analysis`
|
|
3774
3849
|
|
|
3775
3850
|
- `EdgeContinuity(shape: Shape, options?: EdgeContinuityThresholds): EdgeContinuityReport`
|
|
3776
3851
|
- `SurfaceContinuity(shape: Shape, options?: EdgeContinuityThresholds): EdgeContinuityReport`
|
|
3852
|
+
- `EdgeMatch(edgeA: SheetEdge, edgeB: SheetEdge, options?: { samples?: number; }): ContinuityReport` — Measure G0/G1/G2 agreement between two `Surface.Net` sheet edges: worst position gap, cross-boundary tangent angle (0 = G1), and normal-curvature mismatch (0 = G2). The reflection/fairness check for matched panel seams.
|
|
3777
3853
|
- `CurvatureComb(input: NurbsCurve3D | EdgeRef, options?: { samples?: number; }): CurvatureSample[]`
|
|
3778
3854
|
- `SurfaceHealth(shape: Shape, options?: { tinyEdgeThreshold?: number; sliverThreshold?: number; }): SurfaceHealthReport`
|
|
3779
3855
|
- `BRepValidity(shape: Shape, options?: BRepValidityOptions): BRepValidityReport` — Validate B-rep/shell/solid structure and return closedness, manifoldness, orientation, and issue diagnostics.
|
|
@@ -4226,7 +4302,7 @@ return mech.solve({ theta: 45 });
|
|
|
4226
4302
|
|
|
4227
4303
|
#### `withSimulation(options: SimAssemblySimulationOptions): Assembly` — Attach the root simulation contract for this assembly.
|
|
4228
4304
|
|
|
4229
|
-
Use this after adding physical parts and joints. Robot-body profiles require `rootPart`; asset profiles can describe one-part or multi-part physical assets. URDF/SDF exporters and `forgecad check simready` read this contract directly
|
|
4305
|
+
Use this after adding physical parts and joints. Robot-body profiles require `rootPart`; asset profiles can describe one-part or multi-part physical assets. URDF/SDF/MJCF/USD exporters and `forgecad check simready` read this contract directly from the returned assembly.
|
|
4230
4306
|
|
|
4231
4307
|
`SimAssemblySimulationOptions`: `{ profile: SimProfileDef, rootPart?: string, controllers?: SimControllerDef[] }`
|
|
4232
4308
|
|
|
@@ -4498,70 +4574,6 @@ bom(tubeLen, "rectangular steel tube", {
|
|
|
4498
4574
|
| `notes?` | `string` | Free-form notes |
|
|
4499
4575
|
| `grain?` | `string` | Wood grain direction, e.g. "long", "cross" |
|
|
4500
4576
|
|
|
4501
|
-
#### `robotExport(options: RobotExportOptions): CollectedRobotExport` — Compatibility shim for SDF/URDF robot package metadata.
|
|
4502
|
-
|
|
4503
|
-
Prefer returning `assembly(...).withSimulation(...)` with `Sim.body(...)`, `Sim.drive.*(...)`, and `Sim.controller.*(...)` metadata. The CLI commands `forgecad export sdf` and `forgecad export urdf` now read that assembly simulation contract directly.
|
|
4504
|
-
|
|
4505
|
-
`robotExport()` remains available for one compatibility window. It converts the legacy descriptor into the same internal simulation model used by source-authored `Sim` metadata and produces a robot package with:
|
|
4506
|
-
|
|
4507
|
-
- Mesh-based inertia tensors (full 6-component, not bounding-box approximations)
|
|
4508
|
-
- Separate collision meshes
|
|
4509
|
-
- Joint limits, effort/velocity/damping/friction metadata from assembly joints
|
|
4510
|
-
|
|
4511
|
-
**Collision mesh modes** (set per-link via `links["PartName"].collision`):
|
|
4512
|
-
|
|
4513
|
-
| Mode | Description | Default |
|
|
4514
|
-
|------|-------------|---------|
|
|
4515
|
-
| `'convex'` | Convex hull (separate `_collision.stl`) | Yes |
|
|
4516
|
-
| `'box'` | AABB primitive — fastest physics | |
|
|
4517
|
-
| `'visual'` | Same mesh as visual — exact but slow | |
|
|
4518
|
-
| `'none'` | No collision geometry | |
|
|
4519
|
-
|
|
4520
|
-
**Unit conventions:**
|
|
4521
|
-
|
|
4522
|
-
- Revolute `velocity` is in degrees/second in Forge; exporters convert to rad/s.
|
|
4523
|
-
- Prismatic distances are in mm in Forge; exported in meters.
|
|
4524
|
-
- `massKg` is preferred; `densityKgM3` is used when mass is unknown.
|
|
4525
|
-
- Compatibility coupling metadata, when present, maps only the primary term (largest ratio) to `<mimic>` — SDF/URDF support single-leader mimic only. Dropped terms emit a warning.
|
|
4526
|
-
|
|
4527
|
-
**Legacy example**
|
|
4528
|
-
|
|
4529
|
-
```ts
|
|
4530
|
-
robotExport({
|
|
4531
|
-
assembly: rover, // assembly() with parts + revolute wheel joints
|
|
4532
|
-
modelName: "Scout",
|
|
4533
|
-
links: { Chassis: { massKg: 10 }, "Left Wheel": { massKg: 0.8 } },
|
|
4534
|
-
plugins: {
|
|
4535
|
-
diffDrive: {
|
|
4536
|
-
leftJoints: ["leftWheel"], rightJoints: ["rightWheel"],
|
|
4537
|
-
wheelSeparationMm: 280, wheelRadiusMm: 60,
|
|
4538
|
-
},
|
|
4539
|
-
},
|
|
4540
|
-
world: { generateDemoWorld: true },
|
|
4541
|
-
});
|
|
4542
|
-
```
|
|
4543
|
-
|
|
4544
|
-
**Preferred CLI usage**
|
|
4545
|
-
|
|
4546
|
-
```bash
|
|
4547
|
-
forgecad export sdf model.forge.js # SDF package (Gazebo/Ignition)
|
|
4548
|
-
forgecad export urdf model.forge.js # URDF package (ROS/PyBullet/MuJoCo)
|
|
4549
|
-
```
|
|
4550
|
-
|
|
4551
|
-
**`RobotExportOptions`**: `assembly: Assembly`, `modelName?: string`, `state?: JointState`, `static?: boolean`, `selfCollide?: boolean`, `allowAutoDisable?: boolean`, `links?: Record<string, RobotLinkExportOptions>`, `joints?: Record<string, RobotJointExportOptions>`, `plugins?: { diffDrive?: RobotDiffDrivePluginOptions; jointStatePublisher?: RobotJointStatePublisherOptions; }`, `world?: RobotWorldOptions`
|
|
4552
|
-
|
|
4553
|
-
`RobotLinkExportOptions`: `{ massKg?: number, densityKgM3?: number, collision?: "visual" | "convex" | "box" | "none" }`
|
|
4554
|
-
|
|
4555
|
-
`RobotJointExportOptions`: `{ effort?: number, velocity?: number, damping?: number, friction?: number }`
|
|
4556
|
-
|
|
4557
|
-
**`RobotDiffDrivePluginOptions`**: `leftJoints: string[]`, `rightJoints: string[]`, `wheelSeparationMm: number`, `wheelRadiusMm: number`, `topic?: string`, `odomTopic?: string`, `tfTopic?: string`, `frameId?: string`, `odomFrameId?: string`, `maxLinearVelocity?: number`, `maxAngularVelocity?: number`, `linearAcceleration?: number`, `angularAcceleration?: number`
|
|
4558
|
-
|
|
4559
|
-
`RobotJointStatePublisherOptions`: `{ enabled?: boolean, joints?: string[], topic?: string, updateRate?: number }`
|
|
4560
|
-
|
|
4561
|
-
`RobotWorldOptions`: `{ name?: string, generateDemoWorld?: boolean, spawnPose?: RobotPose6, keyboardTeleop?: RobotWorldKeyboardTeleopOptions }`
|
|
4562
|
-
|
|
4563
|
-
`RobotWorldKeyboardTeleopOptions`: `{ enabled?: boolean, linearStep?: number, angularStep?: number }`
|
|
4564
|
-
|
|
4565
4577
|
#### `dim()` — Add a dimension annotation between two points, or along an entity.
|
|
4566
4578
|
|
|
4567
4579
|
Overloads:
|
package/dist-skill/SKILL.md
CHANGED
|
@@ -65,7 +65,7 @@ Smooth curves, Hermite splines, lofted and swept solids. For straps, inlays, gua
|
|
|
65
65
|
|
|
66
66
|
### 5. Assemblies and Mechanisms (for joints or kinematics)
|
|
67
67
|
|
|
68
|
-
Assembly graph, joint types, couplings, validation,
|
|
68
|
+
Assembly graph, joint types, couplings, validation, and simulation export.
|
|
69
69
|
|
|
70
70
|
- `{{SKILL_DIR}}/docs/generated/assembly.md`
|
|
71
71
|
|
package/dist-skill/docs/CLI.md
CHANGED
|
@@ -265,7 +265,7 @@ forgecad render section model.forge.js --output out/section.svg --plane XZ --off
|
|
|
265
265
|
|
|
266
266
|
### Cross-cutting flags
|
|
267
267
|
|
|
268
|
-
These flags work across run
|
|
268
|
+
These flags work across script-backed run, render, export, capture, inspect, and check commands that evaluate `.forge.js` files. Use `--param Key=Value` for parameter overrides; repeat it for multiple parameters.
|
|
269
269
|
|
|
270
270
|
| Option | Description |
|
|
271
271
|
|--------|-------------|
|
|
@@ -306,39 +306,41 @@ Export to every format you need.
|
|
|
306
306
|
|
|
307
307
|
```bash
|
|
308
308
|
# Sheet material
|
|
309
|
-
forgecad cut-list shelf.forge.js
|
|
309
|
+
forgecad cut-list shelf.forge.js --param Material=plywood
|
|
310
310
|
forgecad export cutting-layout shelf.forge.js --sheet-width 420 --sheet-height 594 --kerf 3
|
|
311
311
|
forgecad export cutting-layout shelf.forge.js --output out/layout.dxf
|
|
312
312
|
|
|
313
313
|
# 3D printing
|
|
314
314
|
forgecad check print bracket.forge.js
|
|
315
|
-
forgecad export stl bracket.forge.js
|
|
315
|
+
forgecad export stl bracket.forge.js --param Width=42
|
|
316
316
|
forgecad export 3mf bracket.forge.js --quality high
|
|
317
317
|
|
|
318
318
|
# CAD interchange
|
|
319
|
-
forgecad export step bracket.forge.js
|
|
319
|
+
forgecad export step bracket.forge.js --param Width=42
|
|
320
320
|
|
|
321
321
|
# Technical drawings
|
|
322
322
|
forgecad export report bracket.forge.js --output out/report.pdf
|
|
323
323
|
|
|
324
324
|
# Robot simulation
|
|
325
325
|
forgecad export sdf rover.forge.js --output out/forge_scout
|
|
326
|
-
forgecad export mjcf rover.forge.js --output out/forge_scout_mjcf
|
|
326
|
+
forgecad export mjcf rover.forge.js --param Wheelbase=180 --output out/forge_scout_mjcf
|
|
327
327
|
forgecad export usd rover.forge.js --output out/forge_scout_usd
|
|
328
328
|
```
|
|
329
329
|
|
|
330
|
+
Script-backed exports accept repeatable `--param Key=Value` overrides before the model is evaluated. The MuJoCo/MJX package export command is `export mjcf`.
|
|
331
|
+
|
|
330
332
|
<details>
|
|
331
333
|
<summary>Export flags</summary>
|
|
332
334
|
|
|
333
335
|
| Option | Description |
|
|
334
336
|
|--------|-------------|
|
|
337
|
+
| `--param <Key=Value>` | Override a parameter value (Key=Value). Repeatable. |
|
|
338
|
+
| `-p <Key=Value>` | Shorthand for --param |
|
|
335
339
|
| `--joint <JointName=Value>` | Override a Motion tab joint value (JointName=Value). Repeatable. |
|
|
336
340
|
| `--output <path>` | Output SVG path for a single input |
|
|
337
341
|
| `--backend <occt\|truck>` | Exact BREP exporter: occt (default) or truck (native analytic kernel) |
|
|
338
342
|
| `--quality <default\|live\|high>` | Forge quality preset |
|
|
339
343
|
| `-o <path>` | Shorthand for --output |
|
|
340
|
-
| `--param <Key=Value>` | Override a parameter value (Key=Value). Repeatable. |
|
|
341
|
-
| `-p <Key=Value>` | Shorthand for --param |
|
|
342
344
|
| `--format <json\|webgpu-brick>` | Implicit artifact format |
|
|
343
345
|
| `-q <live\|default\|high>` | Shorthand for --quality |
|
|
344
346
|
| `--workgroup-size <x>x<y>x<z>` | WebGPU compute workgroup size |
|
|
@@ -356,7 +356,7 @@ return mech.solve({ theta: 45 });
|
|
|
356
356
|
|
|
357
357
|
#### `withSimulation(options: SimAssemblySimulationOptions): Assembly` — Attach the root simulation contract for this assembly.
|
|
358
358
|
|
|
359
|
-
Use this after adding physical parts and joints. Robot-body profiles require `rootPart`; asset profiles can describe one-part or multi-part physical assets. URDF/SDF exporters and `forgecad check simready` read this contract directly
|
|
359
|
+
Use this after adding physical parts and joints. Robot-body profiles require `rootPart`; asset profiles can describe one-part or multi-part physical assets. URDF/SDF/MJCF/USD exporters and `forgecad check simready` read this contract directly from the returned assembly.
|
|
360
360
|
|
|
361
361
|
`SimAssemblySimulationOptions`: `{ profile: SimProfileDef, rootPart?: string, controllers?: SimControllerDef[] }`
|
|
362
362
|
|
|
@@ -24,6 +24,10 @@ skill-order: 100
|
|
|
24
24
|
- [SurfacePattern](#surfacepattern)
|
|
25
25
|
- [Pattern2D](#pattern2d)
|
|
26
26
|
- [Pattern2DBuilder](#pattern2dbuilder)
|
|
27
|
+
- [Sheet](#sheet)
|
|
28
|
+
- [CurveNetBuilder](#curvenetbuilder)
|
|
29
|
+
- [MatchEdgeBuilder](#matchedgebuilder)
|
|
30
|
+
- [BridgeBuilder](#bridgebuilder)
|
|
27
31
|
- [ShapeRef](#shaperef)
|
|
28
32
|
- [ANCHOR3D_NAMES](#anchor3d-names)
|
|
29
33
|
- [verify](#verify)
|
|
@@ -708,7 +712,7 @@ Supports transforms (translate, rotate, scale, mirror, transform, rotateAround,
|
|
|
708
712
|
|
|
709
713
|
Returns a new Shape with the specified material properties merged on top of any previously set properties. All properties are optional — omitted keys retain their current value. Material properties survive transforms and boolean operations.
|
|
710
714
|
|
|
711
|
-
Use `.color()` to set the base diffuse color; `.material()` controls how that color behaves under light (metalness, roughness, clearcoat) and can add emissive glow independent of lighting.
|
|
715
|
+
Use `.color()` to set the base diffuse color; `.material()` controls how that color behaves under light (metalness, roughness, clearcoat) and can add emissive glow independent of lighting.
|
|
712
716
|
|
|
713
717
|
```js
|
|
714
718
|
box(50, 50, 50).material({ metalness: 0.9, roughness: 0.1 }); // polished metal
|
|
@@ -1333,6 +1337,71 @@ const bracket = group(
|
|
|
1333
1337
|
| `depth?` | `number` | Thread groove depth in millimeters. Default: 0.8. |
|
|
1334
1338
|
| `underScale?` | `number` | Relative height of the under-crossing thread. Default: 0.15. |
|
|
1335
1339
|
|
|
1340
|
+
### `Sheet`
|
|
1341
|
+
|
|
1342
|
+
A parametric open surface value (control grid + knots + analytic differential geometry).
|
|
1343
|
+
|
|
1344
|
+
**Properties:**
|
|
1345
|
+
|
|
1346
|
+
| Property | Type | Description |
|
|
1347
|
+
|----------|------|-------------|
|
|
1348
|
+
| `surface` | `BSplineSurface` | — |
|
|
1349
|
+
|
|
1350
|
+
**Methods:**
|
|
1351
|
+
|
|
1352
|
+
#### `get frontEdge(): SheetEdge` — Edge naming follows parameter direction (documented): front=v0, rear=v1, left=u0, right=u1.
|
|
1353
|
+
|
|
1354
|
+
#### `thicken(wall: number, options?: { resolution?: number; }): Shape` — Offset the sheet along its analytic normals into a watertight solid shell of the given wall thickness. Throws if the wall would self-intersect on a concave region (no silent degenerate solid).
|
|
1355
|
+
|
|
1356
|
+
#### `matchEdge(edge: SheetEdge): MatchEdgeBuilder` — Per-edge continuity match against a neighbor (returns a NEW Sheet).
|
|
1357
|
+
|
|
1358
|
+
**`SheetEdge`**
|
|
1359
|
+
- `fixed: "u" | "v"` — Which parameter is held fixed along this edge.
|
|
1360
|
+
- `value: 0 | 1` — The fixed value (0 or 1).
|
|
1361
|
+
- Also: `sheet: Sheet`.
|
|
1362
|
+
|
|
1363
|
+
- `get rearEdge(): SheetEdge`
|
|
1364
|
+
- `get leftEdge(): SheetEdge`
|
|
1365
|
+
- `get rightEdge(): SheetEdge`
|
|
1366
|
+
- `pointAt(u: number, v: number): Vec3`
|
|
1367
|
+
- `normalAt(u: number, v: number): Vec3`
|
|
1368
|
+
- `curvatureAt(u: number, v: number): SurfaceCurvature`
|
|
1369
|
+
|
|
1370
|
+
### `CurveNetBuilder`
|
|
1371
|
+
|
|
1372
|
+
#### `toSheet(): Sheet` — Build (once) and return the Sheet.
|
|
1373
|
+
|
|
1374
|
+
- `lengthwise(...curves: CurveInput[]): this`
|
|
1375
|
+
- `crosswise(...curves: CurveInput[]): this`
|
|
1376
|
+
- `alongRails(railA: CurveInput, railB: CurveInput): this`
|
|
1377
|
+
- `sections(...curves: CurveInput[]): this`
|
|
1378
|
+
- `cage(grid: Vec3[][]): this`
|
|
1379
|
+
- `degree(u: number, v: number): this`
|
|
1380
|
+
- `get frontEdge(): SheetEdge`
|
|
1381
|
+
- `get rearEdge(): SheetEdge`
|
|
1382
|
+
- `get leftEdge(): SheetEdge`
|
|
1383
|
+
- `get rightEdge(): SheetEdge`
|
|
1384
|
+
- `get surface(): BSplineSurface`
|
|
1385
|
+
- `pointAt(u: number, v: number): Vec3`
|
|
1386
|
+
- `normalAt(u: number, v: number): Vec3`
|
|
1387
|
+
- `curvatureAt(u: number, v: number): SurfaceCurvature`
|
|
1388
|
+
- `thicken(wall: number, options?: { resolution?: number; }): Shape`
|
|
1389
|
+
- `matchEdge(edge: SheetEdge): MatchEdgeBuilder`
|
|
1390
|
+
|
|
1391
|
+
### `MatchEdgeBuilder`
|
|
1392
|
+
|
|
1393
|
+
- `toG0(neighbor: SheetEdge): Sheet`
|
|
1394
|
+
- `toG1(neighbor: SheetEdge): Sheet`
|
|
1395
|
+
- `toG2(neighbor: SheetEdge): Sheet`
|
|
1396
|
+
|
|
1397
|
+
### `BridgeBuilder`
|
|
1398
|
+
|
|
1399
|
+
#### `bulge(a: number, b: number): this` — Tune the influence of each side (Rhino-style bulge).
|
|
1400
|
+
|
|
1401
|
+
- `g0(): Sheet`
|
|
1402
|
+
- `g1(): Sheet`
|
|
1403
|
+
- `g2(): Sheet`
|
|
1404
|
+
|
|
1336
1405
|
### `ShapeRef`
|
|
1337
1406
|
|
|
1338
1407
|
A first-class reference path over a shape's semantic faces and face relationships.
|
|
@@ -426,7 +426,11 @@ const outlet = route.port("outlet");
|
|
|
426
426
|
|
|
427
427
|
#### `pointAt(u: number, v: number): Vec3` — Evaluate the surface at parameters (u, v) ∈ [0, 1]². Uses tensor product evaluation: evaluate basis functions in U and V independently.
|
|
428
428
|
|
|
429
|
-
#### `normalAt(u: number, v: number): Vec3` — Evaluate the surface normal at (u, v)
|
|
429
|
+
#### `normalAt(u: number, v: number): Vec3` — Evaluate the surface unit normal at (u, v) from analytic first derivatives.
|
|
430
|
+
|
|
431
|
+
Uses Algorithm A2.3 basis-function derivatives with the rational quotient rule, so the normal is exact (no finite-difference epsilon, no error near the boundary). Constant chain-rule factors from the parameter remap scale Su and Sv positively and cancel under normalization, so they are omitted.
|
|
432
|
+
|
|
433
|
+
#### `derivativesAt(u: number, v: number): { S: Vec3; Su: Vec3; Sv: Vec3; }` — Analytic first partial derivatives S_u, S_v (rational quotient rule).
|
|
430
434
|
|
|
431
435
|
#### `tessellate(resU?: number, resV?: number): { positions: Vec3[]; normals: Vec3[]; indices: number[]; }` — Tessellate the surface into a triangle mesh. Returns positions, normals, and triangle indices.
|
|
432
436
|
|
|
@@ -1165,16 +1169,19 @@ Members (full entries under [Curves & Surfacing](#curves-surfacing)): `Curve.Ble
|
|
|
1165
1169
|
- `Trim(shape: Shape, tool: Shape | SurfacePlaneOp): Shape`
|
|
1166
1170
|
- `Split(shape: Shape, tool: Shape | SurfacePlaneOp): [ Shape, Shape ]`
|
|
1167
1171
|
- `Match(shape: Shape, options: { edge: "u0" | "u1" | "v0" | "v1"; target: EdgeRef; continuity?: SurfaceContinuity; }): Shape`
|
|
1172
|
+
- `Net(): CurveNet` — Begin a curve-network (Gordon) surface — the class-A keystone. Chain `.lengthwise(...)/.crosswise(...)` (or `.alongRails(a,b).sections(...)`, or `.cage(grid)`), then `.thicken(wall)` to get a solid Shape. Returns a fluent [`Sheet`](/docs/core#sheet) builder with analytic point/normal/curvature queries and named edges.
|
|
1168
1173
|
|
|
1169
1174
|
### `Blend`
|
|
1170
1175
|
|
|
1171
1176
|
- `Edge(options: BlendEdgeOptions): Shape`
|
|
1172
1177
|
- `Surface(options: BlendSurfaceOptions): Shape`
|
|
1178
|
+
- `Bridge(edgeA: SheetEdge, edgeB: SheetEdge): BridgeBuilder` — Build a transition strip between two `Surface.Net` sheet edges. Chain `.bulge(a, b)` then `.g0()/.g1()/.g2()` for the continuity order. Returns a [`Sheet`](/docs/core#sheet); verify the seam with `Analysis.EdgeMatch`.
|
|
1173
1179
|
|
|
1174
1180
|
### `Analysis`
|
|
1175
1181
|
|
|
1176
1182
|
- `EdgeContinuity(shape: Shape, options?: EdgeContinuityThresholds): EdgeContinuityReport`
|
|
1177
1183
|
- `SurfaceContinuity(shape: Shape, options?: EdgeContinuityThresholds): EdgeContinuityReport`
|
|
1184
|
+
- `EdgeMatch(edgeA: SheetEdge, edgeB: SheetEdge, options?: { samples?: number; }): ContinuityReport` — Measure G0/G1/G2 agreement between two `Surface.Net` sheet edges: worst position gap, cross-boundary tangent angle (0 = G1), and normal-curvature mismatch (0 = G2). The reflection/fairness check for matched panel seams.
|
|
1178
1185
|
- `CurvatureComb(input: NurbsCurve3D | EdgeRef, options?: { samples?: number; }): CurvatureSample[]`
|
|
1179
1186
|
- `SurfaceHealth(shape: Shape, options?: { tinyEdgeThreshold?: number; sliverThreshold?: number; }): SurfaceHealthReport`
|
|
1180
1187
|
- `BRepValidity(shape: Shape, options?: BRepValidityOptions): BRepValidityReport` — Validate B-rep/shell/solid structure and return closedness, manifoldness, orientation, and issue diagnostics.
|
|
@@ -58,70 +58,6 @@ bom(tubeLen, "rectangular steel tube", {
|
|
|
58
58
|
| `notes?` | `string` | Free-form notes |
|
|
59
59
|
| `grain?` | `string` | Wood grain direction, e.g. "long", "cross" |
|
|
60
60
|
|
|
61
|
-
#### `robotExport(options: RobotExportOptions): CollectedRobotExport` — Compatibility shim for SDF/URDF robot package metadata.
|
|
62
|
-
|
|
63
|
-
Prefer returning `assembly(...).withSimulation(...)` with `Sim.body(...)`, `Sim.drive.*(...)`, and `Sim.controller.*(...)` metadata. The CLI commands `forgecad export sdf` and `forgecad export urdf` now read that assembly simulation contract directly.
|
|
64
|
-
|
|
65
|
-
`robotExport()` remains available for one compatibility window. It converts the legacy descriptor into the same internal simulation model used by source-authored `Sim` metadata and produces a robot package with:
|
|
66
|
-
|
|
67
|
-
- Mesh-based inertia tensors (full 6-component, not bounding-box approximations)
|
|
68
|
-
- Separate collision meshes
|
|
69
|
-
- Joint limits, effort/velocity/damping/friction metadata from assembly joints
|
|
70
|
-
|
|
71
|
-
**Collision mesh modes** (set per-link via `links["PartName"].collision`):
|
|
72
|
-
|
|
73
|
-
| Mode | Description | Default |
|
|
74
|
-
|------|-------------|---------|
|
|
75
|
-
| `'convex'` | Convex hull (separate `_collision.stl`) | Yes |
|
|
76
|
-
| `'box'` | AABB primitive — fastest physics | |
|
|
77
|
-
| `'visual'` | Same mesh as visual — exact but slow | |
|
|
78
|
-
| `'none'` | No collision geometry | |
|
|
79
|
-
|
|
80
|
-
**Unit conventions:**
|
|
81
|
-
|
|
82
|
-
- Revolute `velocity` is in degrees/second in Forge; exporters convert to rad/s.
|
|
83
|
-
- Prismatic distances are in mm in Forge; exported in meters.
|
|
84
|
-
- `massKg` is preferred; `densityKgM3` is used when mass is unknown.
|
|
85
|
-
- Compatibility coupling metadata, when present, maps only the primary term (largest ratio) to `<mimic>` — SDF/URDF support single-leader mimic only. Dropped terms emit a warning.
|
|
86
|
-
|
|
87
|
-
**Legacy example**
|
|
88
|
-
|
|
89
|
-
```ts
|
|
90
|
-
robotExport({
|
|
91
|
-
assembly: rover, // assembly() with parts + revolute wheel joints
|
|
92
|
-
modelName: "Scout",
|
|
93
|
-
links: { Chassis: { massKg: 10 }, "Left Wheel": { massKg: 0.8 } },
|
|
94
|
-
plugins: {
|
|
95
|
-
diffDrive: {
|
|
96
|
-
leftJoints: ["leftWheel"], rightJoints: ["rightWheel"],
|
|
97
|
-
wheelSeparationMm: 280, wheelRadiusMm: 60,
|
|
98
|
-
},
|
|
99
|
-
},
|
|
100
|
-
world: { generateDemoWorld: true },
|
|
101
|
-
});
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
**Preferred CLI usage**
|
|
105
|
-
|
|
106
|
-
```bash
|
|
107
|
-
forgecad export sdf model.forge.js # SDF package (Gazebo/Ignition)
|
|
108
|
-
forgecad export urdf model.forge.js # URDF package (ROS/PyBullet/MuJoCo)
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
**`RobotExportOptions`**: `assembly: Assembly`, `modelName?: string`, `state?: JointState`, `static?: boolean`, `selfCollide?: boolean`, `allowAutoDisable?: boolean`, `links?: Record<string, RobotLinkExportOptions>`, `joints?: Record<string, RobotJointExportOptions>`, `plugins?: { diffDrive?: RobotDiffDrivePluginOptions; jointStatePublisher?: RobotJointStatePublisherOptions; }`, `world?: RobotWorldOptions`
|
|
112
|
-
|
|
113
|
-
`RobotLinkExportOptions`: `{ massKg?: number, densityKgM3?: number, collision?: "visual" | "convex" | "box" | "none" }`
|
|
114
|
-
|
|
115
|
-
`RobotJointExportOptions`: `{ effort?: number, velocity?: number, damping?: number, friction?: number }`
|
|
116
|
-
|
|
117
|
-
**`RobotDiffDrivePluginOptions`**: `leftJoints: string[]`, `rightJoints: string[]`, `wheelSeparationMm: number`, `wheelRadiusMm: number`, `topic?: string`, `odomTopic?: string`, `tfTopic?: string`, `frameId?: string`, `odomFrameId?: string`, `maxLinearVelocity?: number`, `maxAngularVelocity?: number`, `linearAcceleration?: number`, `angularAcceleration?: number`
|
|
118
|
-
|
|
119
|
-
`RobotJointStatePublisherOptions`: `{ enabled?: boolean, joints?: string[], topic?: string, updateRate?: number }`
|
|
120
|
-
|
|
121
|
-
`RobotWorldOptions`: `{ name?: string, generateDemoWorld?: boolean, spawnPose?: RobotPose6, keyboardTeleop?: RobotWorldKeyboardTeleopOptions }`
|
|
122
|
-
|
|
123
|
-
`RobotWorldKeyboardTeleopOptions`: `{ enabled?: boolean, linearStep?: number, angularStep?: number }`
|
|
124
|
-
|
|
125
61
|
#### `dim()` — Add a dimension annotation between two points, or along an entity.
|
|
126
62
|
|
|
127
63
|
Overloads:
|
|
@@ -24,12 +24,12 @@ lib, Line2D, linearPattern, linearPattern2d, loadFont, loft, Loft, mirrorCopy
|
|
|
24
24
|
mock, ngon, NurbsCurve3D, NurbsSurface, offsetSolid, param, Param, path
|
|
25
25
|
Point2D, Points, polygon, polygonVertices, port, Product, ProductPanelBuilder, ProductRibbonBuilder
|
|
26
26
|
ProductSkin, ProductSkinBuilder, ProductStationBuilder, ProductSurfaceBuilder, ProductSurfaceRef, projectToPlane, queueMicrotask, rect
|
|
27
|
-
Rectangle2D,
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
27
|
+
Rectangle2D, roundedRect, Route3D, scene, Sculpt, sdf, SdfShape, selectEdge
|
|
28
|
+
selectEdges, self, setActiveBackend, setImmediate, setInterval, setTimeout, Shape, ShapeGroup
|
|
29
|
+
sheetMetal, SheetMetalPart, sheetStock, Sim, Sketch, sketchToDxf, sketchToSvg, slot
|
|
30
|
+
SolvedAssembly, spec, sphere, spline2d, stroke, Surface, SurfaceBody, SurfaceMembers
|
|
31
|
+
sweep, text2d, textWidth, torus, toShape, Transform, union, union2d
|
|
32
|
+
variableSweep, verify, Viewport, window, Wood
|
|
33
33
|
```
|
|
34
34
|
|
|
35
35
|
`showLabels` is also a runtime global, but it is not part of the top-level collision check. Avoid reusing it unless you intentionally want a local value with that name.
|
|
@@ -79,7 +79,7 @@ return b;
|
|
|
79
79
|
|
|
80
80
|
#### `scene(options: SceneOptions): void` — Configure the scene environment for the current script execution.
|
|
81
81
|
|
|
82
|
-
Controls camera, named render views, guided journeys, lighting, background, fog, environment maps,
|
|
82
|
+
Controls camera, named render views, guided journeys, lighting, background, fog, environment maps, capture defaults, and the joint-control helper overlay (`jointOverlay` — axis arrows and arc indicators, renderer-only). Multiple `scene()` calls merge per-key — later values win — so configuration can be split across calls.
|
|
83
83
|
|
|
84
84
|
Two behavioral cliffs:
|
|
85
85
|
|
|
@@ -90,7 +90,7 @@ Named views are repeatable cameras checked in with the model code. Canonical sha
|
|
|
90
90
|
|
|
91
91
|
Journeys are ordered `steps`, each focusing a returned object by name/tree path with an optional caption and camera. In the viewer they are opt-in (an Explore control; the camera does not move until started). Inspect resolved targets with `forgecad run --journeys`.
|
|
92
92
|
|
|
93
|
-
Post-processing
|
|
93
|
+
Post-processing is disabled for now while the browser EffectComposer flicker path is being rebuilt. Existing scripts that pass `postProcessing` continue running, but the option is not part of the active scene API.
|
|
94
94
|
|
|
95
95
|
All numeric values accept `param()` expressions.
|
|
96
96
|
|
|
@@ -109,7 +109,6 @@ scene({
|
|
|
109
109
|
{ type: 'directional', position: [50, -30, 200], color: '#ffd60a', intensity: 1.2 },
|
|
110
110
|
],
|
|
111
111
|
fog: { color: '#000814', near: 100, far: 450 },
|
|
112
|
-
postProcessing: { bloom: { intensity: param('bloom', 1.5, 0, 4) } },
|
|
113
112
|
jointOverlay: { axisColor: '#13dfff', arcColor: '#ff7a1a' },
|
|
114
113
|
});
|
|
115
114
|
```
|
|
@@ -120,7 +119,7 @@ scene({
|
|
|
120
119
|
|--------|------|-------------|
|
|
121
120
|
| `capture?` | `SceneCaptureConfig` | Default capture parameters for `forgecad capture` — CLI flags override these. |
|
|
122
121
|
|
|
123
|
-
Also: `background?: string | SceneBackgroundGradient`, `camera?: SceneCameraConfig`, `views?: Record<string, SceneViewInputConfig>`, `journeys?: Record<string, SceneJourneyConfig>`, `lights?: SceneLightConfig[]`, `environment?: SceneEnvironmentConfig`, `fog?: SceneFogConfig`, `
|
|
122
|
+
Also: `background?: string | SceneBackgroundGradient`, `camera?: SceneCameraConfig`, `views?: Record<string, SceneViewInputConfig>`, `journeys?: Record<string, SceneJourneyConfig>`, `lights?: SceneLightConfig[]`, `environment?: SceneEnvironmentConfig`, `fog?: SceneFogConfig`, `ground?: SceneGroundConfig`.
|
|
124
123
|
|
|
125
124
|
`SceneBackgroundGradient`: `{ top: string, bottom: string }`
|
|
126
125
|
|
|
@@ -174,14 +173,6 @@ Also: `type: SceneLightType`, `color?: string`, `intensity?: number`, `position?
|
|
|
174
173
|
- `density?: number` — Exponential fog density (if set, uses FogExp2 instead of linear Fog)
|
|
175
174
|
- Also: `color?: string`.
|
|
176
175
|
|
|
177
|
-
`ScenePostProcessingConfig`: `{ bloom?: SceneBloomConfig, vignette?: SceneVignetteConfig, grain?: SceneGrainConfig, toneMappingExposure?: number }`
|
|
178
|
-
|
|
179
|
-
`SceneBloomConfig`: `{ intensity?: number, threshold?: number, radius?: number }`
|
|
180
|
-
|
|
181
|
-
`SceneVignetteConfig`: `{ darkness?: number, offset?: number }`
|
|
182
|
-
|
|
183
|
-
`SceneGrainConfig`: `{ intensity?: number }`
|
|
184
|
-
|
|
185
176
|
**`SceneGroundConfig`**
|
|
186
177
|
|
|
187
178
|
| Option | Type | Description |
|
|
@@ -5,7 +5,7 @@ skill-order: 2
|
|
|
5
5
|
|
|
6
6
|
# Inspection Bundles — Evidence Contract
|
|
7
7
|
|
|
8
|
-
`forgecad inspect <family> <mode>` writes a deterministic bundle: evidence PNGs under `evidence/<type>/` plus a root `manifest.json`. **The manifest is the authoritative contract** — take file paths, encodings, per-view ranges, thresholds, tolerances, and identity maps from it; never hard-code bundle layout or infer object identity from object order. The PNGs are a visual index for locating findings, not standalone artifacts. Command tree, flags, and `--focus`/`--hide` filtering live in `docs/
|
|
8
|
+
`forgecad inspect <family> <mode>` writes a deterministic bundle: evidence PNGs under `evidence/<type>/` plus a root `manifest.json`. **The manifest is the authoritative contract** — take file paths, encodings, per-view ranges, thresholds, tolerances, and identity maps from it; never hard-code bundle layout or infer object identity from object order. The PNGs are a visual index for locating findings, not standalone artifacts. Command tree, flags, and `--focus`/`--hide` filtering live in `docs/skill/CLI.md` and `forgecad inspect evidence`; the inspection workflow lives in the `forgecad-render-inspect` skill. Model-authored `scene()` background, lights, fog, and exposure are ignored for inspection captures so evidence stays stable; named scene views remain available via `--view`.
|
|
9
9
|
|
|
10
10
|
Manifest evidence keys are evidence-oriented and stable for bundle readers: e.g. `fit interference` writes `manifest.evidence.collisions`, `physical components` writes `manifest.evidence.connectivity`.
|
|
11
11
|
|
|
@@ -11,13 +11,12 @@ The installed skill names are namespaced to avoid collisions with a user's exist
|
|
|
11
11
|
- `forgecad-3d-reconstruction`
|
|
12
12
|
- `forgecad-blockout-model`
|
|
13
13
|
- `forgecad-component-model`
|
|
14
|
-
- `forgecad-high-level-spec`
|
|
15
14
|
- `forgecad-image-replicator`
|
|
16
|
-
- `forgecad-lld`
|
|
17
15
|
- `forgecad-make-a-model`
|
|
18
16
|
- `forgecad-model-grader`
|
|
19
|
-
- `forgecad-
|
|
17
|
+
- `forgecad-mujoco-verify`
|
|
20
18
|
- `forgecad-project`
|
|
21
19
|
- `forgecad-reconstruction-benchmark`
|
|
22
20
|
- `forgecad-render-inspect`
|
|
21
|
+
- `forgecad-spec-by-walking-through-it`
|
|
23
22
|
- `forgecad-visual-spec`
|
|
@@ -11,7 +11,7 @@ A blockout is a spatial planning artifact: 3-7 simple masses that answer where p
|
|
|
11
11
|
| Need | Skill |
|
|
12
12
|
|------|-------|
|
|
13
13
|
| High-level 3D idea using simple masses | `forgecad-blockout-model` |
|
|
14
|
-
| Written concept or architecture before CAD | `forgecad-
|
|
14
|
+
| Written concept or architecture before CAD | `forgecad-spec-by-walking-through-it` |
|
|
15
15
|
| Accurate, detailed, parametric ForgeCAD model | `forgecad-make-a-model` |
|
|
16
16
|
|
|
17
17
|
## Method
|