forgecad 0.10.3 → 0.10.5
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-CK7ObBz3.js → AdminPage-raksfnNA.js} +1 -1
- package/dist/assets/{BenchmarkPage-Ds7Z2doN.js → BenchmarkPage-DP3RxhPs.js} +2 -2
- package/dist/assets/{BlogPage-DlPbpt6A.js → BlogPage-D7Dos-vl.js} +1 -1
- package/dist/assets/{DocsPage-vZb3b3Y0.js → DocsPage-DO1kvBns.js} +34 -43
- package/dist/assets/{EditorApp-HLoKfe15.js → EditorApp-DQJmcmRT.js} +51 -17
- package/dist/assets/{EmbedViewer--KnqBKrJ.js → EmbedViewer-DFDUhOma.js} +2 -2
- package/dist/assets/{LandingPageProofDriven-C_LssmnA.js → LandingPageProofDriven-DbE_tp8-.js} +54 -36
- package/dist/assets/{LegalPage-DGsyo4n1.js → LegalPage-CominSso.js} +2 -2
- package/dist/assets/{PricingPage-BOE27B-R.js → PricingPage-CcVIN9yj.js} +2 -2
- package/dist/assets/{SettingsPage-f47cnk39.js → SettingsPage-DLWcP289.js} +1 -1
- package/dist/assets/{app-D6ccu2Xx.js → app-xW3hOdq9.js} +1343 -4004
- package/dist/assets/{backendInit-DbTkQN9J.js → backendInit-mDHk97u7.js} +12346 -3803
- package/dist/assets/cli/{render-BsngirjC.js → render--SIU27W_.js} +1909 -146
- package/dist/assets/{constructionHistoryWorker-PCwXrTDB.js → constructionHistoryWorker-uEe_Q7Kg.js} +2362 -835
- package/dist/assets/{evalWorker-CS63PfZu.js → evalWorker-BqyDHDcI.js} +7755 -3127
- 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-Y4cOzNyA.js → inspectWorker-UXMxlcR8.js} +6550 -2943
- package/dist/assets/{jointPose-AMvCywzS.js → jointPose-bYMlwU3v.js} +1 -1
- package/dist/assets/{landing-proof-driven-ORyigZ6p.css → landing-proof-driven-_u4v_xQb.css} +71 -11
- package/dist/assets/{manifold-Crd_F2qx.js → manifold-BR7UYI4P.js} +1 -1
- package/dist/assets/{manifold-CBry38ly.js → manifold-CyOV5B9S.js} +2 -2
- package/dist/assets/{manifold-k2kRcc85.js → manifold-D4d5NQst.js} +1 -1
- package/dist/assets/{reportWorker-CWvn0CEv.js → reportWorker-DsaICZsn.js} +7320 -2827
- package/dist/cli/render.html +1 -1
- package/dist/docs/index.html +2 -2
- package/dist/docs-raw/AI/usage.md +17 -15
- package/dist/docs-raw/CLI.md +4 -2
- package/dist/docs-raw/component-model.md +2 -2
- package/dist/docs-raw/generated/assembly.md +76 -3
- package/dist/docs-raw/generated/concepts.md +36 -5
- package/dist/docs-raw/generated/core.md +185 -21
- package/dist/docs-raw/generated/curves.md +344 -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 +224 -0
- package/dist/docs-raw/simulation-workflow.md +1 -1
- package/dist/docs-raw/skills/{forgecad-make-a-model.md → forgecad-build-model.md} +18 -8
- package/dist/docs-raw/skills/{forgecad-spec-by-walking-through-it.md → forgecad-design-spec.md} +6 -6
- package/dist/docs-raw/skills/{forgecad-model-grader.md → forgecad-grade-model.md} +8 -6
- package/{dist-skill/website/skills/forgecad-visual-spec.md → dist/docs-raw/skills/forgecad-image-prompt.md} +7 -7
- package/dist/docs-raw/skills/{forgecad-render-inspect.md → forgecad-inspect-model.md} +6 -6
- package/{dist-skill/website/skills/forgecad-project.md → dist/docs-raw/skills/forgecad-project-sync.md} +5 -5
- package/dist/docs-raw/skills/{forgecad-3d-reconstruction.md → forgecad-reconstruct-cad-file.md} +7 -7
- package/dist/docs-raw/skills/{forgecad-image-replicator.md → forgecad-reconstruct-from-images.md} +12 -12
- package/dist/docs-raw/skills/{forgecad-mujoco-verify.md → forgecad-verify-mujoco.md} +6 -6
- package/dist/docs-raw/skills/forgecad.md +1 -0
- package/dist/docs-raw/skills/index.md +9 -12
- package/dist/index.html +9 -9
- package/dist/llms.txt +7 -7
- package/dist/sitemap.xml +16 -16
- package/dist-cli/{check-compiler-HPF2T2FS.js → check-compiler-7YAHVXYM.js} +1 -1
- package/dist-cli/{check-query-propagation-HYSLTXAB.js → check-query-propagation-ZRR6IOJW.js} +1 -1
- package/dist-cli/{chunk-WLUKAW3H.js → chunk-VNM67DIV.js} +29671 -24865
- package/dist-cli/forgecad.js +5906 -714
- package/dist-cli/forgecad_geometry_bg.wasm +0 -0
- package/dist-skill/CONTEXT.md +853 -45
- package/dist-skill/SKILL.md +1 -0
- package/dist-skill/docs/CLI.md +4 -2
- package/dist-skill/docs/generated/assembly.md +73 -3
- package/dist-skill/docs/generated/core.md +185 -21
- package/dist-skill/docs/generated/curves.md +343 -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/structural-fea.md +224 -0
- package/dist-skill/library/README.md +9 -12
- package/dist-skill/library/{forgecad-make-a-model → forgecad-build-model}/SKILL.md +16 -6
- package/dist-skill/library/{forgecad-spec-by-walking-through-it → forgecad-design-spec}/SKILL.md +4 -4
- package/dist-skill/library/{forgecad-spec-by-walking-through-it → forgecad-design-spec}/references/master-prompt.md +1 -1
- package/dist-skill/library/{forgecad-model-grader → forgecad-grade-model}/SKILL.md +6 -4
- package/dist-skill/library/forgecad-grade-model/agents/openai.yaml +4 -0
- package/dist-skill/library/{forgecad-visual-spec → forgecad-image-prompt}/SKILL.md +5 -5
- package/dist-skill/library/forgecad-image-prompt/agents/openai.yaml +4 -0
- package/dist-skill/library/{forgecad-render-inspect → forgecad-inspect-model}/SKILL.md +4 -4
- package/dist-skill/library/{forgecad-project → forgecad-project-sync}/SKILL.md +3 -3
- package/dist-skill/library/{forgecad-3d-reconstruction → forgecad-reconstruct-cad-file}/SKILL.md +5 -5
- package/dist-skill/library/forgecad-reconstruct-cad-file/agents/openai.yaml +4 -0
- package/dist-skill/library/{forgecad-image-replicator → forgecad-reconstruct-from-images}/SKILL.md +10 -10
- package/dist-skill/library/forgecad-reconstruct-from-images/agents/openai.yaml +4 -0
- package/dist-skill/library/{forgecad-mujoco-verify → forgecad-verify-mujoco}/SKILL.md +4 -4
- package/dist-skill/website/skills/{forgecad-make-a-model.md → forgecad-build-model.md} +18 -8
- package/dist-skill/website/skills/{forgecad-spec-by-walking-through-it.md → forgecad-design-spec.md} +6 -6
- package/dist-skill/website/skills/{forgecad-model-grader.md → forgecad-grade-model.md} +8 -6
- package/{dist/docs-raw/skills/forgecad-visual-spec.md → dist-skill/website/skills/forgecad-image-prompt.md} +7 -7
- package/dist-skill/website/skills/{forgecad-render-inspect.md → forgecad-inspect-model.md} +6 -6
- package/{dist/docs-raw/skills/forgecad-project.md → dist-skill/website/skills/forgecad-project-sync.md} +5 -5
- package/dist-skill/website/skills/{forgecad-3d-reconstruction.md → forgecad-reconstruct-cad-file.md} +7 -7
- package/dist-skill/website/skills/{forgecad-image-replicator.md → forgecad-reconstruct-from-images.md} +12 -12
- package/dist-skill/website/skills/{forgecad-mujoco-verify.md → forgecad-verify-mujoco.md} +6 -6
- package/dist-skill/website/skills/forgecad.md +1 -0
- package/dist-skill/website/skills/index.md +9 -12
- 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/spoon-full-tang-handle.forge.js +148 -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/texture-projection.forge.js +75 -0
- package/examples/assets/uv-grid.png +0 -0
- package/package.json +4 -1
- package/dist/docs-raw/skills/forgecad-blockout-model.md +0 -49
- package/dist/docs-raw/skills/forgecad-component-model.md +0 -53
- package/dist/docs-raw/skills/forgecad-reconstruction-benchmark.md +0 -60
- package/dist-skill/library/forgecad-3d-reconstruction/agents/openai.yaml +0 -4
- package/dist-skill/library/forgecad-blockout-model/SKILL.md +0 -42
- package/dist-skill/library/forgecad-component-model/SKILL.md +0 -46
- package/dist-skill/library/forgecad-image-replicator/agents/openai.yaml +0 -4
- package/dist-skill/library/forgecad-model-grader/agents/openai.yaml +0 -4
- package/dist-skill/library/forgecad-reconstruction-benchmark/SKILL.md +0 -48
- package/dist-skill/library/forgecad-reconstruction-benchmark/agents/openai.yaml +0 -4
- package/dist-skill/library/forgecad-visual-spec/agents/openai.yaml +0 -4
- package/dist-skill/website/skills/forgecad-blockout-model.md +0 -49
- package/dist-skill/website/skills/forgecad-component-model.md +0 -53
- package/dist-skill/website/skills/forgecad-reconstruction-benchmark.md +0 -60
- /package/dist/assets/{landing-proof-driven-DiGqdtWa.js → landing-proof-driven-DNPRKL_p.js} +0 -0
- /package/dist-skill/library/{forgecad-spec-by-walking-through-it → forgecad-design-spec}/references/default-profiles.md +0 -0
- /package/dist-skill/library/{forgecad-render-inspect → forgecad-inspect-model}/summarize_manifest.py +0 -0
- /package/dist-skill/library/{forgecad-image-replicator → forgecad-reconstruct-from-images}/scripts/compare_images.py +0 -0
- /package/dist-skill/library/{forgecad-mujoco-verify → forgecad-verify-mujoco}/scripts/mujoco_verify.py +0 -0
|
@@ -18,13 +18,12 @@ skill-order: 100
|
|
|
18
18
|
- [Grouping & Local Coordinates](#grouping-local-coordinates)
|
|
19
19
|
- [Section & Projection](#section-projection)
|
|
20
20
|
- [Verification](#verification)
|
|
21
|
-
- [Shape](#shape) — Appearance, Face Topology, Edge Topology, Transforms, Booleans & Cutting, Features, Placement, Connectors, References, Measurement
|
|
21
|
+
- [Shape](#shape) — Freeform Construction, Appearance, Face Topology, Edge Topology, Transforms, Booleans & Cutting, Features, Placement, Connectors, References, Measurement
|
|
22
22
|
- [Transform](#transform)
|
|
23
23
|
- [ShapeGroup](#shapegroup) — Children, Transforms, Placement, Connectors, References
|
|
24
24
|
- [SurfacePattern](#surfacepattern)
|
|
25
25
|
- [Pattern2D](#pattern2d)
|
|
26
26
|
- [Pattern2DBuilder](#pattern2dbuilder)
|
|
27
|
-
- [Sheet](#sheet)
|
|
28
27
|
- [CurveNetBuilder](#curvenetbuilder)
|
|
29
28
|
- [MatchEdgeBuilder](#matchedgebuilder)
|
|
30
29
|
- [BridgeBuilder](#bridgebuilder)
|
|
@@ -34,6 +33,7 @@ skill-order: 100
|
|
|
34
33
|
- [Points](#points)
|
|
35
34
|
- [connector](#connector)
|
|
36
35
|
- [Import](#import)
|
|
36
|
+
- [Wrap](#wrap)
|
|
37
37
|
|
|
38
38
|
## Functions
|
|
39
39
|
|
|
@@ -704,6 +704,96 @@ Supports transforms (translate, rotate, scale, mirror, transform, rotateAround,
|
|
|
704
704
|
|----------|------|-------------|
|
|
705
705
|
| `materialProps` | `ShapeMaterialProps \| undefined` | — |
|
|
706
706
|
|
|
707
|
+
**Freeform Construction**
|
|
708
|
+
|
|
709
|
+
#### `slicePerpendicularToX(x: number, profile: Sketch, options?: FromSlicesAxisSliceOptions): FromSlicesSlice` — Create a slice descriptor perpendicular to the X axis.
|
|
710
|
+
|
|
711
|
+
The profile is drawn in the YZ plane. `options.center` is `[y, z]`, so authors can place changing section centers without manually translating sketches in ForgeCAD's internal plane axes.
|
|
712
|
+
|
|
713
|
+
```js
|
|
714
|
+
Shape.fromSlices([
|
|
715
|
+
Shape.slicePerpendicularToX(-20, ellipse(10, 2), { center: [0, 3] }),
|
|
716
|
+
Shape.slicePerpendicularToX(20, ellipse(8, 1.5), { center: [0, 6] }),
|
|
717
|
+
]);
|
|
718
|
+
```
|
|
719
|
+
|
|
720
|
+
**`FromSlicesAxisSliceOptions`**
|
|
721
|
+
- `center?: FromSlicesVec2` — Plane-local profile center. XY uses [x, y], XZ uses [x, z], YZ uses [y, z].
|
|
722
|
+
|
|
723
|
+
#### `slicePerpendicularToY(y: number, profile: Sketch, options?: FromSlicesAxisSliceOptions): FromSlicesSlice` — Create a slice descriptor perpendicular to the Y axis.
|
|
724
|
+
|
|
725
|
+
The profile is drawn in the XZ plane. `options.center` is `[x, z]`.
|
|
726
|
+
|
|
727
|
+
#### `slicePerpendicularToZ(z: number, profile: Sketch, options?: FromSlicesAxisSliceOptions): FromSlicesSlice` — Create a slice descriptor perpendicular to the Z axis.
|
|
728
|
+
|
|
729
|
+
The profile is drawn in the XY plane. `options.center` is `[x, y]`.
|
|
730
|
+
|
|
731
|
+
#### `sliceThrough(center: FromSlicesVec3, normal: FromSlicesVec3, profile: Sketch): FromSlicesSlice` — Create a slice descriptor through a world point with an arbitrary plane normal.
|
|
732
|
+
|
|
733
|
+
The profile origin lands at `center`. Use this when the section plane is not one of the world XY/XZ/YZ planes.
|
|
734
|
+
|
|
735
|
+
#### `sliceOnFrame(frame: FromSlicesFrameInput, profile: Sketch): FromSlicesSlice` — Create a slice descriptor on a full 3D work frame.
|
|
736
|
+
|
|
737
|
+
Sheet frame helpers return the right shape for `frame`. Use `Sheet.frameAt()` for tangent construction planes, or `Sheet.framePerpendicularToU()` / `Sheet.framePerpendicularToV()` for cross-sections normal to a surface path. On the Manifold backend, framed slices are lofted in input order when every slice comes from a frame.
|
|
738
|
+
|
|
739
|
+
**`FromSlicesFrameInput`**
|
|
740
|
+
|
|
741
|
+
| Option | Type | Description |
|
|
742
|
+
|--------|------|-------------|
|
|
743
|
+
| `point?` | `FromSlicesVec3` | World-space frame origin. Sheet frame helpers return this as `point`. |
|
|
744
|
+
| `origin?` | `FromSlicesVec3` | Alias for `point` when using generic CAD frame terminology. |
|
|
745
|
+
| `normal` | `FromSlicesVec3` | World-space frame normal. |
|
|
746
|
+
| `tangentU?` | `FromSlicesVec3` | World-space direction for the profile's local X axis. Sheet frame helpers return this as `tangentU`. |
|
|
747
|
+
| `tangentV?` | `FromSlicesVec3` | Optional world-space direction for the profile's local Y axis. Sheet frame helpers return this as `tangentV`. |
|
|
748
|
+
| `xAxis?` | `FromSlicesVec3` | Alias for `tangentU`. |
|
|
749
|
+
| `yAxis?` | `FromSlicesVec3` | Alias for `tangentV`. |
|
|
750
|
+
|
|
751
|
+
#### `fromSlices(slices: FromSlicesSlice[], options?: FromSlicesOptions): Shape` — Construct a 3D shape from cross-section slices on one or more planes.
|
|
752
|
+
|
|
753
|
+
On the Manifold backend, slices created with `Shape.sliceOnFrame()` are lofted in their input order while preserving each full 3D frame. Other slices with the same normal direction are lofted together. Slices with different normals are combined via smooth radial blending — each silhouette constrains the shape's extent, producing smooth ellipsoidal cross-sections.
|
|
754
|
+
|
|
755
|
+
```js
|
|
756
|
+
// Egg from two orthogonal silhouettes
|
|
757
|
+
const eggProfile = ellipse(15, 25);
|
|
758
|
+
return Shape.fromSlices([
|
|
759
|
+
{ on: 'xz', at: 0, profile: eggProfile },
|
|
760
|
+
{ on: 'yz', at: 0, profile: eggProfile },
|
|
761
|
+
]);
|
|
762
|
+
```
|
|
763
|
+
|
|
764
|
+
```js
|
|
765
|
+
// Vase with cross-section transitions
|
|
766
|
+
return Shape.fromSlices([
|
|
767
|
+
Shape.slicePerpendicularToZ(0, circle2d(20)),
|
|
768
|
+
Shape.slicePerpendicularToZ(40, rect(25, 25)),
|
|
769
|
+
Shape.slicePerpendicularToZ(80, circle2d(8)),
|
|
770
|
+
Shape.slicePerpendicularToY(0, vaseOutline),
|
|
771
|
+
]);
|
|
772
|
+
```
|
|
773
|
+
|
|
774
|
+
**`FromSlicesSlice`**
|
|
775
|
+
|
|
776
|
+
| Option | Type | Description |
|
|
777
|
+
|--------|------|-------------|
|
|
778
|
+
| `on` | `SlicePlane` | Plane normal: axis name or arbitrary unit vector. |
|
|
779
|
+
| `at?` | `number` | Signed offset along the normal from the origin. Omit when `center` defines the plane. |
|
|
780
|
+
| `center?` | `FromSlicesVec3` | World-space point where the 2D profile origin should land on the slice plane. |
|
|
781
|
+
| `profile` | `Sketch` | 2D cross-section profile on that plane. |
|
|
782
|
+
| `frame?` | `FromSlicesFramePlacement` | Full 3D section frame, preserved for ordered lofts through rotating planes. |
|
|
783
|
+
|
|
784
|
+
**`FromSlicesFramePlacement`**
|
|
785
|
+
|
|
786
|
+
| Option | Type | Description |
|
|
787
|
+
|--------|------|-------------|
|
|
788
|
+
| `point` | `FromSlicesVec3` | World-space frame origin. |
|
|
789
|
+
| `normal` | `FromSlicesVec3` | World-space section normal. |
|
|
790
|
+
| `tangentU` | `FromSlicesVec3` | World-space direction for the profile's local X axis. |
|
|
791
|
+
| `tangentV` | `FromSlicesVec3` | World-space direction for the profile's local Y axis. |
|
|
792
|
+
|
|
793
|
+
**`FromSlicesOptions`**
|
|
794
|
+
- `edgeLength?: number` — Marching-grid edge length for level-set meshing (Manifold only).
|
|
795
|
+
- `boundsPadding?: number` — Extra bounding-box padding (Manifold only).
|
|
796
|
+
|
|
707
797
|
**Appearance**
|
|
708
798
|
|
|
709
799
|
#### `color(value: string | undefined): Shape` — Set the color of this shape (hex string, e.g. "#ff0000"). Returns a new Shape with the color applied.
|
|
@@ -741,6 +831,7 @@ box(100, 100, 10).color('#gold').material({ metalness: 0.95, roughness: 0.05 }).
|
|
|
741
831
|
| `specularIntensity?` | `number` | Specular highlight intensity (0–1). |
|
|
742
832
|
| `specularColor?` | `string` | Specular highlight tint. |
|
|
743
833
|
| `reflectivity?` | `number` | Reflection strength for supported renderers (0–1). |
|
|
834
|
+
| `texture?` | `{ image: string; projection: UvProjectionSpec; ...` | Projected bitmap texture set by `Shape.wrapTexture`. `image` is a self-contained `data:` URI; `projection` maps each vertex's final world position to (u,v) in the shader, so the texture survives transforms and boolean cuts. `imageWidth`/`imageHeight` are the intrinsic pixel dimensions. |
|
|
744
835
|
|
|
745
836
|
**Face Topology**
|
|
746
837
|
|
|
@@ -1089,6 +1180,22 @@ Overloads:
|
|
|
1089
1180
|
|
|
1090
1181
|
**Other**
|
|
1091
1182
|
|
|
1183
|
+
#### `wrapTexture(image: ImageHandle, projection: UvProjectionSpec): Shape` — Wrap an imported bitmap image around this shape using a projection.
|
|
1184
|
+
|
|
1185
|
+
The `image` comes from `Import.image('path.png')`; the `projection` is one of the `Wrap.*` helpers — `Wrap.flat({ onto: 'top' })` lays it flat on a face, `Wrap.aroundCylinder({ axis: 'z' })` wraps it like a can label, `Wrap.onSphere()` maps it like a globe, and `Wrap.box()` cube-maps it onto the six sides.
|
|
1186
|
+
|
|
1187
|
+
By default the image **auto-fits** the shape — one copy across the relevant extent, so no `width`/`height`/`size` is needed (pass them only to override). The (u,v) is derived from each vertex's final world position, so the image stays glued to the surface through transforms and boolean cuts with no UV layout to maintain — apply `wrapTexture` *after* positioning the shape. Returns a new Shape; the original is unchanged.
|
|
1188
|
+
|
|
1189
|
+
```js
|
|
1190
|
+
const logo = Import.image('./logo.png');
|
|
1191
|
+
box(80, 80, 10).wrapTexture(logo, Wrap.flat({ onto: 'top' })); // auto-fits the face
|
|
1192
|
+
|
|
1193
|
+
const label = Import.image('./label.jpg');
|
|
1194
|
+
cylinder(60, 20).wrapTexture(label, Wrap.aroundCylinder({ axis: 'z' })); // wraps the side
|
|
1195
|
+
```
|
|
1196
|
+
|
|
1197
|
+
`ImageHandle`: `{ __forgeImage: true, dataUri: string, width: number, height: number, mimeType: string, byteLength: number }`
|
|
1198
|
+
|
|
1092
1199
|
#### `clone(): Shape` — Return a new Shape wrapper for explicit duplication in scripts.
|
|
1093
1200
|
|
|
1094
1201
|
#### `geometryInfo(): GeometryInfo` — Inspect which backend/representation produced this solid.
|
|
@@ -1337,57 +1444,106 @@ const bracket = group(
|
|
|
1337
1444
|
| `depth?` | `number` | Thread groove depth in millimeters. Default: 0.8. |
|
|
1338
1445
|
| `underScale?` | `number` | Relative height of the under-crossing thread. Default: 0.15. |
|
|
1339
1446
|
|
|
1340
|
-
### `
|
|
1447
|
+
### `CurveNetBuilder`
|
|
1341
1448
|
|
|
1342
|
-
|
|
1449
|
+
#### `alongRails(railA: CurveInput, railB: CurveInput): this` — Use two lengthwise boundary curves as guide rails.
|
|
1343
1450
|
|
|
1344
|
-
|
|
1451
|
+
Chain `.sections(...)` to create a bi-rail surface: the rails define the sheet edges while each section curve shapes the cross-span at its station.
|
|
1345
1452
|
|
|
1346
|
-
|
|
1347
|
-
|----------|------|-------------|
|
|
1348
|
-
| `surface` | `BSplineSurface` | — |
|
|
1453
|
+
#### `sections(...curves: CurveInput[]): this` — Add crosswise section curves.
|
|
1349
1454
|
|
|
1350
|
-
|
|
1455
|
+
By itself this skins the sections into a surface. After `.alongRails(...)`, the sections are fitted between the two rails so the surface follows both the boundary guide curves and the section profiles.
|
|
1456
|
+
|
|
1457
|
+
#### `resolution(samples: number): this` — Set the sampling resolution used to build curve-family surface grids.
|
|
1458
|
+
|
|
1459
|
+
This affects `.lengthwise(...)`, `.crosswise(...)`, and `.alongRails(...).sections(...)` surfaces. It does not resample explicit `.cage(grid)` input because the cage already is the authored control net.
|
|
1351
1460
|
|
|
1352
|
-
#### `
|
|
1461
|
+
#### `matchStartU(condition: BoundaryCondition): this` — Enforce a continuity condition on the `u = 0` (left) boundary.
|
|
1353
1462
|
|
|
1354
|
-
|
|
1463
|
+
Pass `{ edge }` to match an adjacent sheet's tangent (G1) or curvature (G2), or `{ tangent }` to impose an explicit cross-boundary direction. See `BoundaryCondition`.
|
|
1355
1464
|
|
|
1356
|
-
|
|
1465
|
+
**`BoundaryCondition`**
|
|
1466
|
+
|
|
1467
|
+
| Option | Type | Description |
|
|
1468
|
+
|--------|------|-------------|
|
|
1469
|
+
| `edge?` | `SheetEdge` | Match the tangent (G1) and curvature (G2) of an existing sheet edge across this boundary. |
|
|
1470
|
+
| `tangent?` | `Vec3` | Or impose an explicit cross-boundary tangent direction in world space (auto-normalized). |
|
|
1471
|
+
| `tangentScale?` | `number` | Scalar magnitude for the imposed `tangent` ramp, in model units. Ignored when `edge` is given. Default: the local cross-boundary control-span length (chord-scaled), so the imposed tangent has the same strength as the surface already carries — no magic number. |
|
|
1472
|
+
| `continuity?` | `0 \| 1 \| 2` | Continuity order to enforce on this side. Default inferred: 1 if a tangent or edge is given, else 0. G2 (curvature) requires an `edge` to copy the neighbor's second difference. |
|
|
1357
1473
|
|
|
1358
1474
|
**`SheetEdge`**
|
|
1359
1475
|
- `fixed: "u" | "v"` — Which parameter is held fixed along this edge.
|
|
1360
1476
|
- `value: 0 | 1` — The fixed value (0 or 1).
|
|
1361
1477
|
- Also: `sheet: Sheet`.
|
|
1362
1478
|
|
|
1363
|
-
|
|
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`
|
|
1479
|
+
#### `matchEndU(condition: BoundaryCondition): this` — Enforce a continuity condition on the `u = 1` (right) boundary. See `matchStartU`.
|
|
1369
1480
|
|
|
1370
|
-
|
|
1481
|
+
#### `matchStartV(condition: BoundaryCondition): this` — Enforce a continuity condition on the `v = 0` (front) boundary. See `matchStartU`.
|
|
1482
|
+
|
|
1483
|
+
#### `matchEndV(condition: BoundaryCondition): this` — Enforce a continuity condition on the `v = 1` (rear) boundary. See `matchStartU`.
|
|
1484
|
+
|
|
1485
|
+
#### `closedU(): this` — Weld the two ends of the U direction into a tangent-continuous periodic loop, so the `u = 0` and `u = 1` boundaries coincide with NO G0 kink (a closed tube/ring in U — e.g. a bowl's around-rim seam). The cage's first and last U rows must already be coincident (the loop must close in position).
|
|
1486
|
+
|
|
1487
|
+
#### `closedV(): this` — Weld the two ends of the V direction into a tangent-continuous periodic loop. See `closedU`.
|
|
1371
1488
|
|
|
1372
1489
|
#### `toSheet(): Sheet` — Build (once) and return the Sheet.
|
|
1373
1490
|
|
|
1374
1491
|
- `lengthwise(...curves: CurveInput[]): this`
|
|
1375
1492
|
- `crosswise(...curves: CurveInput[]): this`
|
|
1376
|
-
- `alongRails(railA: CurveInput, railB: CurveInput): this`
|
|
1377
|
-
- `sections(...curves: CurveInput[]): this`
|
|
1378
1493
|
- `cage(grid: Vec3[][]): this`
|
|
1379
1494
|
- `degree(u: number, v: number): this`
|
|
1380
1495
|
- `get frontEdge(): SheetEdge`
|
|
1381
1496
|
- `get rearEdge(): SheetEdge`
|
|
1382
1497
|
- `get leftEdge(): SheetEdge`
|
|
1383
1498
|
- `get rightEdge(): SheetEdge`
|
|
1499
|
+
- `get frontCurve(): NurbsCurve3D`
|
|
1500
|
+
- `get rearCurve(): NurbsCurve3D`
|
|
1501
|
+
- `get leftCurve(): NurbsCurve3D`
|
|
1502
|
+
- `get rightCurve(): NurbsCurve3D`
|
|
1384
1503
|
- `get surface(): BSplineSurface`
|
|
1385
1504
|
- `pointAt(u: number, v: number): Vec3`
|
|
1386
1505
|
- `normalAt(u: number, v: number): Vec3`
|
|
1506
|
+
- `frameAt(u: number, v: number, options?: SheetFrameOptions): SheetFrame`
|
|
1507
|
+
- `framePerpendicularToU(u: number, v: number, options?: SheetFrameOptions): SheetFrame`
|
|
1508
|
+
- `framePerpendicularToV(u: number, v: number, options?: SheetFrameOptions): SheetFrame`
|
|
1387
1509
|
- `curvatureAt(u: number, v: number): SurfaceCurvature`
|
|
1510
|
+
- `curveAlong(edge: SheetEdge): NurbsCurve3D`
|
|
1511
|
+
- `curveAlongU(v: number): NurbsCurve3D`
|
|
1512
|
+
- `curveAlongV(u: number): NurbsCurve3D`
|
|
1513
|
+
- `pathAlong(edge: SheetEdge, options?: SheetPathAlongOptions): Vec3[]`
|
|
1514
|
+
- `pathAlongBoundary(spans: SheetBoundaryPathSpan[], options?: SheetBoundaryPathOptions): Vec3[]`
|
|
1515
|
+
- `pathAlongU(v: number, options?: SheetPathAlongOptions): Vec3[]`
|
|
1516
|
+
- `pathAlongV(u: number, options?: SheetPathAlongOptions): Vec3[]`
|
|
1388
1517
|
- `thicken(wall: number, options?: { resolution?: number; }): Shape`
|
|
1389
1518
|
- `matchEdge(edge: SheetEdge): MatchEdgeBuilder`
|
|
1390
1519
|
|
|
1520
|
+
**`SheetFrameOptions`**
|
|
1521
|
+
- `normalOffset?: number` — Offset the frame origin along the analytic surface normal. Default 0.
|
|
1522
|
+
|
|
1523
|
+
**`SheetPathAlongOptions`**
|
|
1524
|
+
|
|
1525
|
+
| Option | Type | Description |
|
|
1526
|
+
|--------|------|-------------|
|
|
1527
|
+
| `samples?` | `number` | Samples along the path span. Default 32. |
|
|
1528
|
+
| `start?` | `number` | Normalized start parameter along the path. Default 0. |
|
|
1529
|
+
| `end?` | `number` | Normalized end parameter along the path. Default 1. |
|
|
1530
|
+
| `reverse?` | `boolean` | Return points from end to start after sampling the span. Default false. |
|
|
1531
|
+
| `normalOffset?` | `number` | Offset each path point along the analytic surface normal. Default 0. |
|
|
1532
|
+
|
|
1533
|
+
**`SheetBoundaryPathSpan`**
|
|
1534
|
+
|
|
1535
|
+
| Option | Type | Description |
|
|
1536
|
+
|--------|------|-------------|
|
|
1537
|
+
| `edge` | `SheetEdge` | Boundary edge to sample for this span. |
|
|
1538
|
+
| `start?` | `SheetPathParameter` | Normalized edge parameter or world point projected to the closest edge parameter. Default 0. |
|
|
1539
|
+
| `end?` | `SheetPathParameter` | Normalized edge parameter or world point projected to the closest edge parameter. Default 1. |
|
|
1540
|
+
| `samples?` | `number` | Samples along this edge span. Defaults to options.samplesPerEdge or 32. |
|
|
1541
|
+
|
|
1542
|
+
**`SheetBoundaryPathOptions`**
|
|
1543
|
+
- `samplesPerEdge?: number` — Samples for spans that do not specify their own count. Default 32.
|
|
1544
|
+
- `normalOffset?: number` — Offset each path point along the analytic surface normal. Default 0.
|
|
1545
|
+
- `tolerance?: number` — Maximum allowed gap between adjacent sampled spans. Default 1e-6.
|
|
1546
|
+
|
|
1391
1547
|
### `MatchEdgeBuilder`
|
|
1392
1548
|
|
|
1393
1549
|
- `toG0(neighbor: SheetEdge): Sheet`
|
|
@@ -1494,3 +1650,11 @@ Namespaced file-format import helpers — the single vocabulary for bringing ext
|
|
|
1494
1650
|
const yUpPart = Import.mesh("./part.obj", { sourceFrame: { up: "+Y" } });
|
|
1495
1651
|
```
|
|
1496
1652
|
- `step(fileName: string, options?: StepImportOptions): Shape` — Import a STEP file (.step, .stp) as an exact OCCT-backed Shape. Preserves NURBS curves, B-spline surfaces, and exact topology. Requires running with the OCCT backend. Use `sourceFrame: { up: "+Y" }` to rotate Y-up source files into ForgeCAD's Z-up world.
|
|
1653
|
+
- `image(fileName: string): ImageHandle` — Import a bitmap image (PNG, JPEG, or WebP) as an ImageHandle for projected texturing. Reads the pixel dimensions from the file header and embeds the bytes as a data URI. Pass the result to `Shape.wrapTexture(image, projection)` with a `Wrap.*` projection.
|
|
1654
|
+
|
|
1655
|
+
### `Wrap`
|
|
1656
|
+
|
|
1657
|
+
- `flat(opts: FlatWrapOptions): UvProjectionSpec` — Project the image flat onto an axis-aligned face — `onto` is one of top/bottom/front/back/left/right. Auto-fits the face (no width/height needed).
|
|
1658
|
+
- `aroundCylinder(opts: CylinderWrapOptions): UvProjectionSpec` — Wrap the image around a cylinder like a can label — `axis` is 'x' | 'y' | 'z'. Auto-fits one wrap around and the full height.
|
|
1659
|
+
- `onSphere(opts?: SphereWrapOptions): UvProjectionSpec` — Map the image over a sphere like a globe (longitude/latitude). Auto-centers on the sphere.
|
|
1660
|
+
- `box(opts?: BoxWrapOptions): UvProjectionSpec` — Cube-map the image onto a box — one copy per face. Auto-fits the box (no size needed).
|