forgecad 0.9.14 → 0.9.16

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.
Files changed (239) hide show
  1. package/LICENSE +6 -4
  2. package/README.md +8 -4
  3. package/dist/assets/{AdminPage-eWGs2K6H.js → AdminPage-CXvls4-J.js} +2 -2
  4. package/dist/assets/{BenchmarkPage-CTrLKfpo.js → BenchmarkPage-B27zk8xL.js} +4 -15
  5. package/dist/assets/{BlogPage-5nPesyds.js → BlogPage-CMAVvgQL.js} +2 -2
  6. package/dist/assets/{DocsPage-C4Y3nbYc.js → DocsPage-knf4I4h7.js} +9 -3
  7. package/dist/assets/EditorApp-BHMQlJ-D.js +14686 -0
  8. package/dist/assets/{EditorApp-BAnckbsk.css → EditorApp-BpjZgzk0.css} +846 -0
  9. package/dist/assets/{EmbedViewer-C8fB4n5U.js → EmbedViewer-D7ZGlFjx.js} +3 -3
  10. package/dist/assets/{LandingPageProofDriven-jSz0LaMM.js → LandingPageProofDriven-CnevhTE8.js} +36 -38
  11. package/dist/assets/LegalPage-BPTUmqeg.js +39 -0
  12. package/dist/assets/LegalPage-BRlScr9A.css +91 -0
  13. package/dist/assets/{PricingPage-B83B90zh.js → PricingPage-B0D4goG_.js} +19 -19
  14. package/dist/assets/{PricingPage-BMedqFef.css → PricingPage-BPF6HKyO.css} +25 -0
  15. package/dist/assets/{SettingsPage-DY889pcu.js → SettingsPage-CFF-UgjI.js} +2 -2
  16. package/dist/assets/app-CE3sYcV7.css +3890 -0
  17. package/dist/assets/{app-bEww1ic4.js → app-T0pDcSX4.js} +3382 -1069
  18. package/dist/assets/cli/{render-Cho2uKG_.js → render-C5pcIISc.js} +477 -29
  19. package/dist/assets/{constructionHistoryWorker-HYwzJY4m.js → constructionHistoryWorker-Ba2Hm58b.js} +928 -243
  20. package/dist/assets/{evalWorker-CjQwJSE-.js → evalWorker-vkx310U2.js} +8883 -6040
  21. package/dist/assets/{forgecad_geometry-CH2nvuLA.js → forgecad_geometry-Dgceylq9.js} +43 -1
  22. package/dist/assets/forgecad_geometry_bg-dD4RNQF1.wasm +0 -0
  23. package/dist/assets/{inspectWorker-DeRnMVv1.js → inspectWorker-BuTJDVX6.js} +1179 -273
  24. package/dist/assets/{javascript-70-4uGcz.js → javascript-1kQXfVaz.js} +1 -1
  25. package/dist/assets/{targets-D6PWsv6X.js → jointPose-B_Cgedn9.js} +71 -3
  26. package/dist/assets/landing-proof-driven-DiGqdtWa.js +18 -0
  27. package/dist/assets/{landing-proof-driven-oFYW6mjz.css → landing-proof-driven-ORyigZ6p.css} +13 -7
  28. package/dist/assets/legalContent-ZfFGMmi4.js +251 -0
  29. package/dist/assets/{manifold-rmfAcdwF.js → manifold-BWgsjmAM.js} +1 -1
  30. package/dist/assets/{manifold-uRzgk5O8.js → manifold-D6IFSkhH.js} +2 -2
  31. package/dist/assets/{manifold-CG9Fokx-.js → manifold-rZexZI0G.js} +1 -1
  32. package/dist/assets/{reportWorker-4cW_ZpoS.js → reportWorker-0AGij1Ru.js} +8659 -12771
  33. package/dist/assets/{scalar-sampling-budget-CfDiFvh7.js → scalar-sampling-budget-J5cuzxT1.js} +8050 -6203
  34. package/dist/assets/{scanProxyWorker-Bs2TDgLw.js → scanProxyWorker-Vl4Wxa1y.js} +50 -6
  35. package/dist/assets/{solver-DuJAO8S6.js → solver-BZ9LPTHs.js} +1 -1
  36. package/dist/assets/solver_bg-DAHZJ_rw.wasm +0 -0
  37. package/dist/assets/{vendor-react-Da3A2QmU.js → vendor-react-6j1Kke-Y.js} +6 -5
  38. package/dist/cli/render.html +1 -1
  39. package/dist/docs/index.html +2 -2
  40. package/dist/docs-raw/AI/ai-native-cad.md +50 -0
  41. package/dist/docs-raw/AI/usage.md +5 -12
  42. package/dist/docs-raw/CLI.md +34 -10
  43. package/dist/docs-raw/component-model.md +27 -11
  44. package/dist/docs-raw/generated/assembly.md +374 -187
  45. package/dist/docs-raw/generated/concepts.md +245 -237
  46. package/dist/docs-raw/generated/core.md +283 -6
  47. package/dist/docs-raw/generated/curves.md +274 -361
  48. package/dist/docs-raw/generated/lib.md +9 -19
  49. package/dist/docs-raw/generated/output.md +29 -4
  50. package/dist/docs-raw/generated/runtime-names.md +49 -0
  51. package/dist/docs-raw/generated/sdf.md +31 -0
  52. package/dist/docs-raw/generated/sheet-metal.md +9 -0
  53. package/dist/docs-raw/generated/sketch.md +44 -1
  54. package/dist/docs-raw/generated/viewport.md +11 -3
  55. package/dist/docs-raw/guides/coordinate-system.md +20 -16
  56. package/dist/docs-raw/guides/geometry-conventions.md +2 -2
  57. package/dist/docs-raw/guides/inspection-bundles.md +2 -1
  58. package/dist/docs-raw/guides/joint-design.md +24 -0
  59. package/dist/docs-raw/guides/positioning.md +13 -3
  60. package/dist/docs-raw/legal/privacy.md +63 -0
  61. package/dist/docs-raw/legal/software-license.md +55 -0
  62. package/dist/docs-raw/legal/terms.md +87 -0
  63. package/dist/docs-raw/skills/forgecad-3d-reconstruction.md +1 -1
  64. package/dist/docs-raw/skills/forgecad-blockout-model.md +1 -1
  65. package/dist/docs-raw/skills/forgecad-component-model.md +11 -2
  66. package/dist/docs-raw/skills/forgecad-high-level-spec.md +1 -1
  67. package/dist/docs-raw/skills/forgecad-image-replicator.md +8 -8
  68. package/dist/docs-raw/skills/forgecad-lld.md +1 -1
  69. package/dist/docs-raw/skills/forgecad-make-a-model.md +40 -39
  70. package/dist/docs-raw/skills/forgecad-model-grader.md +2 -2
  71. package/dist/docs-raw/skills/forgecad-prepare-prompt.md +2 -2
  72. package/dist/docs-raw/skills/forgecad-project.md +3 -1
  73. package/dist/docs-raw/skills/forgecad-reconstruction-benchmark.md +1 -1
  74. package/dist/docs-raw/skills/forgecad-render-inspect.md +4 -2
  75. package/dist/docs-raw/skills/forgecad-visual-spec.md +1 -1
  76. package/dist/docs-raw/skills/forgecad.md +4 -3
  77. package/dist/docs-raw/welcome.md +2 -0
  78. package/dist/index.html +40 -12
  79. package/dist/llms.txt +8 -0
  80. package/dist/site.webmanifest +1 -1
  81. package/dist/sitemap.xml +49 -13
  82. package/dist-cli/{check-compiler-U5SOPN7X.js → check-compiler-SYQ2PWOB.js} +1 -2
  83. package/dist-cli/{check-query-propagation-XOKNSSYU.js → check-query-propagation-HIAGV62W.js} +1 -2
  84. package/dist-cli/{chunk-EXWGNL6K.js → chunk-SPZE3DUY.js} +20659 -17930
  85. package/dist-cli/forgecad.js +3568 -1250
  86. package/dist-cli/{forgecad_geometry-GYVNKPIE.js → forgecad_geometry-QOQIIP53.js} +42 -1
  87. package/dist-cli/forgecad_geometry_bg.wasm +0 -0
  88. package/dist-cli/{solver-46FFSK2U.js → solver-OK4HECRH.js} +0 -1
  89. package/dist-cli/solver_bg.wasm +0 -0
  90. package/dist-skill/CONTEXT.md +1192 -725
  91. package/dist-skill/SKILL.md +3 -2
  92. package/dist-skill/docs/API/core/concepts.md +64 -1
  93. package/dist-skill/docs/CLI.md +34 -10
  94. package/dist-skill/docs/generated/assembly.md +339 -213
  95. package/dist-skill/docs/generated/core.md +283 -6
  96. package/dist-skill/docs/generated/curves.md +272 -362
  97. package/dist-skill/docs/generated/lib.md +9 -19
  98. package/dist-skill/docs/generated/output.md +29 -4
  99. package/dist-skill/docs/generated/runtime-names.md +40 -0
  100. package/dist-skill/docs/generated/sdf.md +31 -0
  101. package/dist-skill/docs/generated/sheet-metal.md +9 -0
  102. package/dist-skill/docs/generated/sketch.md +44 -2
  103. package/dist-skill/docs/generated/viewport.md +2 -87
  104. package/dist-skill/docs/guides/coordinate-system.md +20 -16
  105. package/dist-skill/docs/guides/geometry-conventions.md +2 -2
  106. package/dist-skill/docs/guides/inspection-bundles.md +2 -1
  107. package/dist-skill/docs/guides/joint-design.md +24 -0
  108. package/dist-skill/docs/guides/positioning.md +13 -3
  109. package/dist-skill/library/forgecad-component-model/SKILL.md +10 -1
  110. package/dist-skill/library/forgecad-image-replicator/SKILL.md +6 -6
  111. package/dist-skill/library/forgecad-image-replicator/scripts/compare_images.py +166 -0
  112. package/dist-skill/library/forgecad-make-a-model/SKILL.md +39 -38
  113. package/dist-skill/library/forgecad-model-grader/SKILL.md +1 -1
  114. package/dist-skill/library/forgecad-prepare-prompt/SKILL.md +1 -1
  115. package/dist-skill/library/forgecad-project/SKILL.md +2 -0
  116. package/dist-skill/library/forgecad-render-inspect/SKILL.md +3 -1
  117. package/examples/api/assembly-kinematics-foundation.forge.js +65 -0
  118. package/examples/api/assembly-kinematics-four-bar.forge.js +115 -0
  119. package/examples/api/assembly-kinematics-limb.forge.js +116 -0
  120. package/examples/api/connector-frame-rig-chain.forge.js +102 -0
  121. package/examples/api/exact-sheet-shell-assembly.forge.js +0 -2
  122. package/examples/api/exact-surface-studio.forge.js +6 -8
  123. package/examples/api/helix-basics.forge.js +8 -8
  124. package/examples/api/lean-foundations/README.md +12 -0
  125. package/examples/api/lean-foundations/curve-blend-exact.forge.js +22 -0
  126. package/examples/api/lean-foundations/curve-fit-interpolation.forge.js +18 -0
  127. package/examples/api/lean-foundations/curve-helix-canonicalization.forge.js +27 -0
  128. package/examples/api/lean-foundations/curve-route-canonicalization.forge.js +16 -0
  129. package/examples/api/lean-foundations/curve-trim-reverse.forge.js +24 -0
  130. package/examples/api/lean-foundations/exact-curve-arc.forge.js +36 -0
  131. package/examples/api/mixed-edge-finishes-proof.forge.js +8 -11
  132. package/examples/api/route3d-elbow.forge.js +71 -0
  133. package/examples/api/transition-curves.forge.js +44 -15
  134. package/examples/api/variable-sweep-test.forge.js +3 -1
  135. package/examples/api/y-blend-corner-showcase.forge.js +0 -2
  136. package/examples/generative/coral-vase.forge.js +1 -1
  137. package/examples/nurbs-tube.forge.js +1 -1
  138. package/package.json +17 -13
  139. package/dist/assets/EditorApp-lXv53A1m.js +0 -13610
  140. package/dist/assets/app-CsHnaBWt.css +0 -1789
  141. package/dist/assets/forgecad_geometry_bg-C5_E9Oa9.wasm +0 -0
  142. package/dist/assets/solver_bg-CWvv4lnN.wasm +0 -0
  143. package/dist/docs-raw/API/README.md +0 -16
  144. package/dist/docs-raw/API/core/concepts.md +0 -118
  145. package/dist/docs-raw/INDEX.md +0 -138
  146. package/dist/docs-raw/RELEASING.md +0 -87
  147. package/dist/docs-raw/agent-native-api.md +0 -27
  148. package/dist/docs-raw/beta-deployment.md +0 -304
  149. package/dist/docs-raw/beta-operations.md +0 -325
  150. package/dist/docs-raw/blueprint-first.md +0 -145
  151. package/dist/docs-raw/cli-monetization.md +0 -112
  152. package/dist/docs-raw/coding-best-practices.md +0 -120
  153. package/dist/docs-raw/coding.md +0 -340
  154. package/dist/docs-raw/deployment.md +0 -374
  155. package/dist/docs-raw/guides/skill-maintenance.md +0 -161
  156. package/dist/docs-raw/guides/surface-members.md +0 -82
  157. package/dist/docs-raw/harbor-cli.md +0 -854
  158. package/dist/docs-raw/internals/backend-vocabulary.md +0 -35
  159. package/dist/docs-raw/internals/compiler.md +0 -307
  160. package/dist/docs-raw/internals/constraint-solver-quality.md +0 -161
  161. package/dist/docs-raw/internals/constraint-solver.md +0 -176
  162. package/dist/docs-raw/internals/shape-from-slices.md +0 -152
  163. package/dist/docs-raw/internals/sketch-2d-pipeline.md +0 -108
  164. package/dist/docs-raw/platform/admin.md +0 -45
  165. package/dist/docs-raw/platform/architecture.md +0 -82
  166. package/dist/docs-raw/platform/auth.md +0 -139
  167. package/dist/docs-raw/platform/email.md +0 -67
  168. package/dist/docs-raw/platform/google-oauth-setup.md +0 -88
  169. package/dist/docs-raw/platform/observability.md +0 -197
  170. package/dist/docs-raw/platform/projects.md +0 -111
  171. package/dist/docs-raw/platform/sharing.md +0 -90
  172. package/dist/docs-raw/product/README.md +0 -39
  173. package/dist/docs-raw/product/api-as-product-language.md +0 -13
  174. package/dist/docs-raw/product/business-model.md +0 -15
  175. package/dist/docs-raw/product/competitive-positioning.md +0 -17
  176. package/dist/docs-raw/product/creative-manufacturing.md +0 -15
  177. package/dist/docs-raw/product/founder-story.md +0 -11
  178. package/dist/docs-raw/product/manufacturing-workflows.md +0 -15
  179. package/dist/docs-raw/product/onboarding-first-experience.md +0 -256
  180. package/dist/docs-raw/product/product-loop.md +0 -17
  181. package/dist/docs-raw/product/strategic-decisions.md +0 -22
  182. package/dist/docs-raw/product/user-outreach-email-templates.md +0 -161
  183. package/dist/docs-raw/product/user-segments.md +0 -15
  184. package/dist/docs-raw/product/vision.md +0 -26
  185. package/dist/docs-raw/rl-environments.md +0 -350
  186. package/dist/docs-raw/runbook.md +0 -611
  187. package/dist-cli/check-compiler-U5SOPN7X.js.map +0 -1
  188. package/dist-cli/check-query-propagation-XOKNSSYU.js.map +0 -1
  189. package/dist-cli/chunk-EXWGNL6K.js.map +0 -1
  190. package/dist-cli/forgecad.js.map +0 -1
  191. package/dist-cli/forgecad_geometry-GYVNKPIE.js.map +0 -1
  192. package/dist-cli/solver-46FFSK2U.js.map +0 -1
  193. package/dist-skill/SKILL-dev.md +0 -145
  194. package/dist-skill/docs-dev/API/core/concepts.md +0 -118
  195. package/dist-skill/docs-dev/CLI.md +0 -677
  196. package/dist-skill/docs-dev/agent-native-api.md +0 -27
  197. package/dist-skill/docs-dev/blueprint-first.md +0 -145
  198. package/dist-skill/docs-dev/coding-best-practices.md +0 -120
  199. package/dist-skill/docs-dev/coding.md +0 -340
  200. package/dist-skill/docs-dev/component-model.md +0 -164
  201. package/dist-skill/docs-dev/generated/assembly.md +0 -794
  202. package/dist-skill/docs-dev/generated/core.md +0 -2117
  203. package/dist-skill/docs-dev/generated/curves.md +0 -2583
  204. package/dist-skill/docs-dev/generated/lib.md +0 -169
  205. package/dist-skill/docs-dev/generated/output.md +0 -247
  206. package/dist-skill/docs-dev/generated/sdf.md +0 -446
  207. package/dist-skill/docs-dev/generated/sheet-metal.md +0 -504
  208. package/dist-skill/docs-dev/generated/sketch.md +0 -1811
  209. package/dist-skill/docs-dev/generated/viewport.md +0 -585
  210. package/dist-skill/docs-dev/generated/wood.md +0 -108
  211. package/dist-skill/docs-dev/guides/coordinate-system.md +0 -46
  212. package/dist-skill/docs-dev/guides/geometry-conventions.md +0 -52
  213. package/dist-skill/docs-dev/guides/inspection-bundles.md +0 -485
  214. package/dist-skill/docs-dev/guides/joint-design.md +0 -78
  215. package/dist-skill/docs-dev/guides/modeling-recipes.md +0 -78
  216. package/dist-skill/docs-dev/guides/positioning.md +0 -161
  217. package/dist-skill/docs-dev/guides/skill-maintenance.md +0 -161
  218. package/dist-skill/docs-dev/internals/backend-vocabulary.md +0 -35
  219. package/dist-skill/docs-dev/internals/compiler.md +0 -307
  220. package/dist-skill/docs-dev/internals/constraint-solver-quality.md +0 -161
  221. package/dist-skill/docs-dev/internals/constraint-solver.md +0 -176
  222. package/dist-skill/docs-dev/internals/sketch-2d-pipeline.md +0 -108
  223. package/dist-skill/library/forgecad-image-replicator/scripts/compare_images.mjs +0 -289
  224. package/examples/api/bolted-service-cover.forge.js +0 -17
  225. package/examples/api/cable-gland-anchor.forge.js +0 -14
  226. package/examples/api/captured-cartridge-guide.forge.js +0 -14
  227. package/examples/api/captured-linear-slide.forge.js +0 -13
  228. package/examples/api/clevis-pin-joint.forge.js +0 -13
  229. package/examples/api/datum-enclosure.forge.js +0 -16
  230. package/examples/api/hose-barb-port.forge.js +0 -14
  231. package/examples/api/knuckled-hinge-assembly.forge.js +0 -15
  232. package/examples/api/living-hinge-cover.forge.js +0 -14
  233. package/examples/api/pcb-terminal-block.forge.js +0 -22
  234. package/examples/api/pinned-lever-pivot-stack.forge.js +0 -14
  235. package/examples/api/retained-shaft-knob-stack.forge.js +0 -15
  236. package/examples/api/routed-tube-clip.forge.js +0 -15
  237. package/examples/api/seated-bearing-stack.forge.js +0 -30
  238. package/examples/api/snap-latch-cover.forge.js +0 -14
  239. package/examples/api/thumb-screw-clamp.forge.js +0 -15
@@ -1,446 +0,0 @@
1
- ---
2
- skill-group: sdf
3
- skill-order: 100
4
- ---
5
-
6
- # SDF Modeling
7
-
8
- Signed Distance Field modeling for organic forms, smooth booleans, TPMS lattices, and deformations. SDFs are inherently implicit fields, not B-rep/exact geometry; use them with caution when precision or exact export matters. Return raw `SdfShape` values directly for native preview; use `toShape(...)` when materializing SDF trees for CAD/export workflows.
9
-
10
- ## Contents
11
-
12
- - [SDF Materialization](#sdf-materialization) — `toShape`, `combine`
13
- - [SdfShape](#sdfshape)
14
- - [sdf](#sdf)
15
- - [Sculpt](#sculpt)
16
-
17
- ## Functions
18
-
19
- ### SDF Materialization
20
-
21
- #### `toShape()` — Materialize one SDF leaf or all SDF leaves in a renderable tree.
22
-
23
- Raw `SdfShape` values become mesh-backed [`Shape`](/docs/core#shape)s. Plain objects and arrays preserve their renderable children as a [`ShapeGroup`](/docs/core#shapegroup) when more than one leaf is found. Non-renderable metadata is ignored for materialization and remains available to callers through normal [`require()`](/docs/core#require) return values.
24
-
25
- ```ts
26
- toShape(value: unknown, options?: SdfToShapeOptions): ToShapeTreeResult
27
- ```
28
-
29
- **`SdfToShapeOptions`**
30
-
31
- | Option | Type | Description |
32
- |--------|------|-------------|
33
- | `edgeLength?` | `number` | Target mesh edge length. Smaller = finer mesh. Overrides quality-derived resolution. |
34
- | `bounds?` | `{ min: Vec3; max: Vec3; }` | Override auto-computed bounds. Strongly recommended for infinite/repeated fields. |
35
- | `quality?` | `SdfMeshingQuality` | Coarse quality preset. Default: 'preview'. |
36
- | `tolerance?` | `number` | Preferred absolute surface tolerance in millimeters. |
37
- | `minFeatureSize?` | `number` | Smallest feature that should survive meshing, in millimeters. |
38
- | `simplify?` | `boolean \| "safe"` | Simplification control. `false` disables, `true` and `'safe'` use topology-validated simplification. |
39
- | `maxTriangles?` | `number` | Optional post-extraction triangle budget. |
40
- | `maxGridPoints?` | `number` | Optional pre-extraction grid-point budget. Default is browser-safe. |
41
- | `minEdgeLength?` | `number` | Lower clamp for resolved edge length. Default: 0.15mm. |
42
- | `diagnostics?` | `boolean` | Log resolved meshing settings and backend extraction timings. |
43
-
44
- #### `combine()` — Collapse a tree of SDF leaves into one continuous SDF field.
45
-
46
- This intentionally discards per-leaf color/material identity because the result is one scalar field. Use plain object returns for multi-material SDF preview, and use `combine(...)` only when you want one implicit body.
47
-
48
- ```ts
49
- combine(value: unknown, options?: CombineOptions): SdfShape
50
- ```
51
-
52
- `CombineOptions`: `{ op?: "union" | "intersection" }`
53
-
54
- ---
55
-
56
- ## Classes
57
-
58
- ### `SdfShape`
59
-
60
- An immutable SDF expression. Supports SDF-specific operations (smooth booleans, domain warps, etc.), can be returned directly for native preview, and converts to a ForgeCAD Shape via `.toShape()` when materialization is needed.
61
-
62
- #### `colorHex()` — Display color carried by this implicit leaf.
63
-
64
- ```ts
65
- get colorHex(): string | undefined
66
- ```
67
-
68
- #### `materialProps()` — Display material carried by this implicit leaf.
69
-
70
- ```ts
71
- get materialProps(): ShapeMaterialProps | undefined
72
- ```
73
-
74
- #### `explicitBounds()` — Explicit bounds carried by this implicit leaf, if any.
75
-
76
- ```ts
77
- get explicitBounds(): SdfBounds | undefined
78
- ```
79
-
80
- #### `clone()` — Clone this SDF expression and its visual metadata.
81
-
82
- ```ts
83
- clone(): SdfShape
84
- ```
85
-
86
- #### `toShape()` — Mesh this SDF into a ForgeCAD Shape through ForgeCAD's Surface Nets pipeline. Once converted, the result is a regular Shape — booleans, transforms, export all work.
87
-
88
- ```ts
89
- toShape(options?: SdfToShapeOptions): Shape
90
- ```
91
-
92
- #### `color()` — Set the display color for this implicit leaf.
93
-
94
- ```ts
95
- color(value: string | undefined): SdfShape
96
- ```
97
-
98
- #### `material()` — Set PBR display material properties for this implicit leaf.
99
-
100
- ```ts
101
- material(props: ShapeMaterialProps): SdfShape
102
- ```
103
-
104
- #### `bounds()` — Set explicit preview/meshing bounds for this implicit leaf.
105
-
106
- ```ts
107
- bounds(bounds: SdfBounds | [ Vec3, Vec3 ]): SdfShape
108
- ```
109
-
110
- #### `at()` — Sculpt-style alias for translate().
111
-
112
- ```ts
113
- at(x: number, y: number, z: number): SdfShape
114
- ```
115
-
116
- #### `move()` — Sculpt-style alias for translate().
117
-
118
- ```ts
119
- move(x: number, y: number, z: number): SdfShape
120
- ```
121
-
122
- #### `spin()` — Sculpt-style alias for rotateZ().
123
-
124
- ```ts
125
- spin(angleDeg: number): SdfShape
126
- ```
127
-
128
- #### `tilt()` — Sculpt-style tilt around X, Y, Z, or a custom axis.
129
-
130
- ```ts
131
- tilt(angleDeg: number, axis?: "x" | "y" | "z" | Vec3): SdfShape
132
- ```
133
-
134
- #### `round()` — Sculpt-style rounded-box helper. Currently applies directly to primitive SDF boxes.
135
-
136
- ```ts
137
- round(radius: number): SdfShape
138
- ```
139
-
140
- #### `blend()` — Sculpt-style smooth blend with another implicit shape.
141
-
142
- ```ts
143
- blend(other: SdfShape, options?: number | { radius?: number; }): SdfShape
144
- ```
145
-
146
- #### `goop()` — Sculpt-style alias for blend().
147
-
148
- ```ts
149
- goop(other: SdfShape, options?: number | { radius?: number; }): SdfShape
150
- ```
151
-
152
- #### `carve()` — Sculpt-style smooth carve/subtract.
153
-
154
- ```ts
155
- carve(other: SdfShape, options?: number | { radius?: number; }): SdfShape
156
- ```
157
-
158
- #### `keep()` — Sculpt-style smooth intersection/keep operation.
159
-
160
- ```ts
161
- keep(other: SdfShape, options?: number | { radius?: number; }): SdfShape
162
- ```
163
-
164
- #### `polish()` — Apply a Sculpt material preset or direct material props.
165
-
166
- ```ts
167
- polish(input?: SculptPolishInput): SdfShape
168
- ```
169
-
170
- #### [`union()`](/docs/core#union) — SDF union (sharp).
171
-
172
- ```ts
173
- union(...others: SdfShape[]): SdfShape
174
- ```
175
-
176
- #### `subtract()` — SDF difference (sharp) — subtracts others from this.
177
-
178
- ```ts
179
- subtract(...others: SdfShape[]): SdfShape
180
- ```
181
-
182
- #### `intersect()` — SDF intersection (sharp).
183
-
184
- ```ts
185
- intersect(...others: SdfShape[]): SdfShape
186
- ```
187
-
188
- #### `clipBox()` — Clip this SDF to an explicit box-shaped design space.
189
-
190
- ```ts
191
- clipBox(x: number, y: number, z: number): SdfShape
192
- ```
193
-
194
- #### `fillWith()` — Keep only the material where this shape overlaps another SDF pattern.
195
-
196
- ```ts
197
- fillWith(pattern: SdfShape): SdfShape
198
- ```
199
-
200
- #### `fillWithGyroid()` — Keep only the gyroid lattice inside this shape.
201
-
202
- ```ts
203
- fillWithGyroid(options: TpmsOptions): SdfShape
204
- ```
205
-
206
- #### `fillWithSchwarzP()` — Keep only the Schwarz-P lattice inside this shape.
207
-
208
- ```ts
209
- fillWithSchwarzP(options: TpmsOptions): SdfShape
210
- ```
211
-
212
- #### `fillWithDiamond()` — Keep only the diamond TPMS lattice inside this shape.
213
-
214
- ```ts
215
- fillWithDiamond(options: TpmsOptions): SdfShape
216
- ```
217
-
218
- #### `fillWithLidinoid()` — Keep only the lidinoid TPMS lattice inside this shape.
219
-
220
- ```ts
221
- fillWithLidinoid(options: TpmsOptions): SdfShape
222
- ```
223
-
224
- #### `smoothUnion()` — Smooth union — blends shapes together with a smooth radius.
225
-
226
- ```ts
227
- smoothUnion(other: SdfShape, radius: number): SdfShape
228
- ```
229
-
230
- #### `smoothSubtract()` — Smooth difference — smoothly carves other from this.
231
-
232
- ```ts
233
- smoothSubtract(other: SdfShape, radius: number): SdfShape
234
- ```
235
-
236
- #### `smoothIntersect()` — Smooth intersection — smoothly intersects.
237
-
238
- ```ts
239
- smoothIntersect(other: SdfShape, radius: number): SdfShape
240
- ```
241
-
242
- #### `morph()` — Morph between this shape and another. t=0 → this, t=1 → other.
243
-
244
- ```ts
245
- morph(other: SdfShape, t: number): SdfShape
246
- ```
247
-
248
- #### `translate()` — Translate this SDF by the given offsets in millimeters.
249
-
250
- ```ts
251
- translate(x: number, y: number, z: number): SdfShape
252
- ```
253
-
254
- #### `rotate()` — Rotate around an arbitrary axis through the origin.
255
-
256
- ```ts
257
- rotate(axis: [ number, number, number ], angleDeg: number): SdfShape
258
- ```
259
-
260
- #### `rotateX()` — Rotate around the X axis by the given angle in degrees.
261
-
262
- ```ts
263
- rotateX(angleDeg: number): SdfShape
264
- ```
265
-
266
- #### `rotateY()` — Rotate around the Y axis by the given angle in degrees.
267
-
268
- ```ts
269
- rotateY(angleDeg: number): SdfShape
270
- ```
271
-
272
- #### `rotateZ()` — Rotate around the Z axis by the given angle in degrees.
273
-
274
- ```ts
275
- rotateZ(angleDeg: number): SdfShape
276
- ```
277
-
278
- #### `scale()` — Uniformly scale this SDF around the origin.
279
-
280
- ```ts
281
- scale(factor: number): SdfShape
282
- ```
283
-
284
- #### `twist()` — Twist around the Z axis.
285
-
286
- ```ts
287
- twist(degreesPerUnit: number): SdfShape
288
- ```
289
-
290
- #### `bend()` — Bend around the Z axis with given radius.
291
-
292
- ```ts
293
- bend(radius: number): SdfShape
294
- ```
295
-
296
- #### `repeat()` — Repeat in space. Spacing of 0 on an axis means no repetition. Count of 0 = infinite.
297
-
298
- ```ts
299
- repeat(spacing: Vec3, count?: Vec3): SdfShape
300
- ```
301
-
302
- #### `circularArray()` — Arrange this SDF in a circular array around the Z axis.
303
-
304
- The source shape is translated by `offset` in +X before arraying. This uses angular domain folding, so evaluation stays O(1): the source SDF is sampled twice no matter how many copies are requested.
305
-
306
- ```ts
307
- circularArray(count: number, offset?: number): SdfShape
308
- ```
309
-
310
- #### `shell()` — Hollow out, keeping only a shell of given thickness.
311
-
312
- ```ts
313
- shell(thickness: number): SdfShape
314
- ```
315
-
316
- #### `displace()` — Displace the surface by a function of position, or by a pattern SdfShape.
317
-
318
- ```js
319
- // Function displacement
320
- shape.displace((x, y, z) => Math.sin(x) * 0.5)
321
-
322
- // Pattern displacement from a 3D SDF field
323
- shape.displace(sdf.knurl({ pitch: 2, depth: 0.3 }))
324
- ```
325
-
326
- ```ts
327
- displace(fn: ((x: number, y: number, z: number) => number) | SdfShape, constants?: Record<string, number>): SdfShape
328
- ```
329
-
330
- #### `surfaceDisplace()` — Displace the surface using a 2D pattern in surface-local UV coordinates.
331
-
332
- Automatically detects the shape's UV parametrization (sphere, cylinder, torus) from the SDF tree. Falls back to triplanar mapping for arbitrary shapes.
333
-
334
- UV coordinates are in **surface millimeters** — patterns defined with `spacing: 3` always produce 3mm spacing, regardless of shape size.
335
-
336
- Prefer `sdf.pattern2d()` or built-in surface patterns when the relief should stay on the native shader and meshing path. Callback functions are supported for experimentation, but they are opaque to the typed pattern optimizer.
337
-
338
- ```js
339
- // Native typed pattern — auto-detects sphere UV
340
- const p = sdf.pattern2d()
341
- const ribs = p.stripes({ spacing: 3, width: 0.8, depth: 0.35 })
342
- .add(p.sineWave({ direction: [0, 1], wavelength: 14, amplitude: 0.08 }))
343
-
344
- sdf.sphere(27).shell(3)
345
- .surfaceDisplace(ribs)
346
- .toShape()
347
-
348
- // Custom 2D pattern via function
349
- shape.surfaceDisplace((u, v) => -Math.sin(u * 2) * 0.3)
350
- ```
351
-
352
- ```ts
353
- surfaceDisplace(pattern: SurfacePattern | ((u: number, v: number) => number), options?: SurfaceDisplaceOptions): SdfShape
354
- ```
355
-
356
- #### `onion()` — Create concentric onion layers.
357
-
358
- ```ts
359
- onion(layers: number, thickness: number): SdfShape
360
- ```
361
-
362
- ---
363
-
364
- ## Constants
365
-
366
- ### `sdf`
367
-
368
- SDF modeling — signed distance field primitives, smooth booleans, TPMS lattices, domain warps, and surface patterns.
369
-
370
- Return `SdfShape` values directly from a ForgeCAD script for native raymarch preview. Plain objects and arrays of SDF leaves are renderable too, so object keys become named preview parts.
371
-
372
- Call `.toShape()` or `toShape(...)` only when you need a mesh-backed ForgeCAD Shape for export, mesh booleans, or mixed SDF/manifold projects. All shapes live as a lazy expression tree until that materialization boundary.
373
-
374
- SDF is inherently implicit and sampled, not B-rep/exact geometry. Use it with caution when precision, tolerances, or exact export matter.
375
-
376
- ```js
377
- return sdf.smoothUnion(sdf.sphere(10), sdf.box(15, 15, 15), { radius: 3 })
378
- .color('#4488cc');
379
- ```
380
-
381
- ```js
382
- return {
383
- shell: sdf.sphere(20).shell(2).color('#9be7ff'),
384
- core: sdf.gyroid({ cellSize: 6, wallThickness: 0.8 })
385
- .intersect(sdf.sphere(18))
386
- .color('#ffcf5a'),
387
- };
388
- ```
389
-
390
- - `sphere(radius: number): SdfShape` — Create an SDF sphere centered at the origin.
391
- - `box(x: number, y: number, z: number): SdfShape` — Create an SDF box centered at the origin with given full dimensions (not half-extents).
392
- - `cylinder(height: number, radius: number): SdfShape` — Create an SDF cylinder centered at the origin, axis along Z.
393
- - `torus(majorRadius: number, minorRadius: number): SdfShape` — Create an SDF torus centered at the origin, lying in the XY plane.
394
- - `capsule(height: number, radius: number): SdfShape` — Create an SDF capsule centered at the origin, axis along Z.
395
- - `cone(height: number, radius: number): SdfShape` — Create an SDF cone with base at z=0 and tip at z=height.
396
- - `smoothUnion(a: SdfShape, b: SdfShape, options: { radius: number; }): SdfShape` — Smooth union — blends shapes together with a smooth transition radius.
397
- - `smoothDifference(a: SdfShape, b: SdfShape, options: { radius: number; }): SdfShape` — Smooth difference — smoothly subtracts b from a.
398
- - `smoothIntersection(a: SdfShape, b: SdfShape, options: { radius: number; }): SdfShape` — Smooth intersection — smoothly intersects a and b.
399
- - `morph(a: SdfShape, b: SdfShape, t: number): SdfShape` — Morph between two SDF shapes. t=0 → a, t=1 → b.
400
- - `blend(a: SdfShape, b: SdfShape, fn: (x: number, y: number, z: number) => number, options?: BlendOptions): SdfShape` — Spatially blend between two SDF patterns. The blend function receives (x, y, z) and returns 0..1: 0 = fully pattern `a`, 1 = fully pattern `b`.
401
- - `gyroid(options: TpmsOptions): SdfShape` — Gyroid TPMS lattice — the most common lattice for additive manufacturing.
402
- - `schwarzP(options: TpmsOptions): SdfShape` — Schwarz-P TPMS lattice — isotropic pore structure.
403
- - `diamond(options: TpmsOptions): SdfShape` — Diamond TPMS lattice — stiffest TPMS structure.
404
- - `lidinoid(options: TpmsOptions): SdfShape` — Lidinoid TPMS lattice — visually distinct from gyroid, popular in research and art.
405
- - `tpmsBlock(options: TpmsBlockOptions): SdfShape` — TPMS block preset clipped to an explicit design space.
406
- - `withinBox(shape: SdfShape, options: { size: Vec3; }): SdfShape` — Clip an SDF shape to a box-shaped design space.
407
- - `noise(options?: NoiseOptions): SdfShape` — 3D Simplex noise field — produces organic, natural-looking displacements.
408
- - `voronoi(options?: VoronoiOptions): SdfShape` — 3D Voronoi pattern — organic cellular structures like bone, coral, or soap bubbles.
409
- - `honeycomb(options?: HoneycombOptions): SdfShape` — Honeycomb (hexagonal) lattice pattern. Intersect with your shape to apply.
410
- - `waves(options?: WavesOptions): SdfShape` — Sinusoidal wave ridges — parallel ridges along an axis.
411
- - `knurl(options?: KnurlOptions): SdfShape` — Knurl pattern — crossed helical grooves for grips and handles.
412
- - `perforated(options?: PerforatedOptions): SdfShape` — Perforated plate pattern — regular array of cylindrical holes.
413
- - `scales(options?: ScalesOptions): SdfShape` — Fish/dragon scale pattern — overlapping circular scales in hex-packed rows.
414
- - `brick(options?: BrickOptions): SdfShape` — Brick/stone wall pattern — running bond with mortar grooves.
415
- - `weave(options?: WeaveOptions): SdfShape` — Grid lattice pattern — two families of infinite slabs crossing at 90°.
416
- - `basketWeave(options?: BasketWeaveOptions): SurfacePattern` — Basket weave surface pattern — threads with over-under crossings in UV space. Returns a SurfacePattern for use with `.surfaceDisplace()`.
417
- - `pattern2d(): Pattern2DBuilder` — Create typed, composable 2D surface patterns for `.surfaceDisplace()`.
418
- - `twist(shape: SdfShape, degreesPerUnit: number): SdfShape` — Twist an SDF shape around the Z axis.
419
- - `bend(shape: SdfShape, radius: number): SdfShape` — Bend an SDF shape around the Z axis.
420
- - `repeat(shape: SdfShape, spacing: Vec3, count?: Vec3): SdfShape` — Repeat an SDF shape in space.
421
- - `circularArray(shape: SdfShape, count: number, offset?: number): SdfShape` — Arrange an SDF shape in a circular array around the Z axis with O(1) folded-domain evaluation.
422
- - `SurfacePattern: typeof SurfacePattern` — A 2D surface pattern — a heightmap function for use with `.surfaceDisplace()`.
423
- - `fromFunction(fn: SdfFunctionSource, options: SdfFunctionOptions): SdfShape` — Create a custom SDF from one expression; shader-safe expressions raymarch directly.
424
- - `Sculpt: { sphere: (radius: number) => SdfShape; box: (x: number, y: number, z: number, options?: SculptBoxOptions) => SdfShape; cylinder: (height: number, radius: number) => SdfShape; disk: (radius: number, thickness?: number) => SdfShape; circle: (radius: number, thickness?: number) => SdfShape; capsule: (height: number, radius: number) => SdfShape; torus: (majorRadius: number, minorRadius: number) => SdfShape; cone: (height: number, radius: number) => SdfShape; tube: (points: SculptPointList, options?: SculptTubeOptions) => SdfShape; curve: (points: SculptPointList, options?: SculptTubeOptions) => SdfShape; path: (points: SculptPointList, options?: SculptTubeOptions) => SdfShape; blend: (first?: SculptBlendInput | SculptBlendOptions, optionsOrShape?: SculptBlendInput | SculptBlendOptions, ...rest: (SculptBlendInput | SculptBlendOptions)[]) => SdfShape; union: (first?: SculptBlendInput, ...rest: SculptBlendInput[]) => SdfShape; carve: (base: SdfShape, cutters: SculptBlendInput, options?: SculptBlendOptions) => SdfShape; keep: (first?: SculptBlendInput | SculptBlendOptions, optionsOrShape?: SculptBlendInput | SculptBlendOptions, ...rest: (SculptBlendInput | SculptBlendOptions)[]) => SdfShape; polish: (shape: SdfShape, input?: SculptPolishInput) => SdfShape; material: (input?: SculptPolishInput) => ShapeMaterialProps & { color?: string; }; look: (preset?: SculptLookPreset) => SceneOptions; knownMaterials: typeof knownSculptMaterialPresets; }` — Sculpt-like facade: friendly liquid-modeling verbs backed by the same SDF kernel.
425
-
426
- ### `Sculpt`
427
-
428
- - `sphere(radius: number): SdfShape` — Create a liquid SDF sphere centered at the origin.
429
- - `box(x: number, y: number, z: number, options?: SculptBoxOptions): SdfShape` — Create a liquid SDF box; pass `{ radius }` for a rounded box.
430
- - `cylinder(height: number, radius: number): SdfShape` — Create a liquid SDF cylinder centered at the origin, axis along Z.
431
- - `disk(radius: number, thickness?: number): SdfShape` — Create a thin circular disk centered at the origin, axis along Z. Useful as a circular cutter or insert.
432
- - `circle(radius: number, thickness?: number): SdfShape` — Alias for `Sculpt.disk()`.
433
- - `capsule(height: number, radius: number): SdfShape` — Create a liquid SDF capsule centered at the origin, axis along Z.
434
- - `torus(majorRadius: number, minorRadius: number): SdfShape` — Create a liquid SDF torus lying in the XY plane.
435
- - `cone(height: number, radius: number): SdfShape` — Create a liquid SDF cone.
436
- - `tube(points: SculptPointList, options?: SculptTubeOptions): SdfShape` — Create a smooth tube through a list of 3D points.
437
- - `curve(points: SculptPointList, options?: SculptTubeOptions): SdfShape` — Create a smooth variable-thickness sweep through 3D control points.
438
- - `path(points: SculptPointList, options?: SculptTubeOptions): SdfShape` — Alias for `Sculpt.tube()`; points may use [x, y, z, radius] for variable thickness.
439
- - `blend(first?: SculptBlendArg, optionsOrShape?: SculptBlendArg, ...rest: SculptBlendArg[]): SdfShape` — Smoothly blend one or more SDF shapes into a continuous body.
440
- - `union(first?: SculptBlendInput, ...rest: SculptBlendInput[]): SdfShape` — Sharply union one or more SDF shapes.
441
- - `carve(base: SdfShape, cutters: SculptBlendInput, options?: SculptBlendOptions): SdfShape` — Smoothly subtract one or more cutter shapes from a base shape.
442
- - `keep(first?: SculptBlendArg, optionsOrShape?: SculptBlendArg, ...rest: SculptBlendArg[]): SdfShape` — Smoothly intersect one or more SDF shapes.
443
- - `polish(shape: SdfShape, input?: SculptPolishInput): SdfShape` — Apply a Sculpt material preset or direct material properties.
444
- - `material(input?: SculptPolishInput): ShapeMaterialProps & { color?: string; }` — Resolve a Sculpt material preset to ForgeCAD material properties.
445
- - `look(preset?: SculptLookPreset): SceneOptions` — Return a polished scene preset tuned for liquid SDF preview.
446
- - `knownMaterials(): SculptMaterialPreset[]` — List the built-in Sculpt material preset names.