forgecad 0.6.3 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/README.md +3 -12
  2. package/dist/assets/{AdminPage-CeqCUUgu.js → AdminPage-D4bocK4E.js} +250 -151
  3. package/dist/assets/{BlogPage-P_AJP0v9.js → BlogPage-CJEXL_zJ.js} +94 -70
  4. package/dist/assets/{DocsPage-CKRV2iq2.js → DocsPage-D3A_g8V3.js} +329 -163
  5. package/dist/assets/{EditorApp-CnC2k4cW.css → EditorApp-BWYUSpUN.css} +590 -136
  6. package/dist/assets/EditorApp-Cihhqcsq.js +11692 -0
  7. package/dist/assets/{EmbedViewer-DBlzmQ5i.js → EmbedViewer-kWjKaC_t.js} +2 -4
  8. package/dist/assets/LandingPageProofDriven-Bg2IUc3l.css +856 -0
  9. package/dist/assets/LandingPageProofDriven-DXkKlyhI.js +601 -0
  10. package/dist/assets/PricingPage-BsU5vzEx.js +232 -0
  11. package/dist/assets/{SettingsPage-BqCh9JcC.js → SettingsPage-PqvpAKIs.js} +129 -5
  12. package/dist/assets/{evalWorker-Ql-aKwLA.js → evalWorker-C-hzNUMy.js} +8949 -3161
  13. package/dist/assets/{Viewport-CoB46f5R.js → index-Pz321YAt.js} +38382 -7501
  14. package/dist/assets/{index-2hfs_ub0.css → index-ay13WNfa.css} +726 -53
  15. package/dist/assets/{javascript-DCxGoE5Y.js → javascript-DAl8Gmyo.js} +1 -1
  16. package/dist/assets/{manifold-CqNMHHKO.js → manifold-BcbjWLIo.js} +4 -3
  17. package/dist/assets/{manifold-Cce9wRFz.js → manifold-DBckbFgx.js} +1 -1
  18. package/dist/assets/{manifold-D6BeHIOo.js → manifold-O2AAGXyj.js} +1 -1
  19. package/dist/assets/{reportWorker-sFEFonXf.js → reportWorker-Dxr-5A7w.js} +8760 -3559
  20. package/dist/assets/{vendor-react-Dt7-aaJH.js → vendor-react-CG3i_wp0.js} +65 -8
  21. package/dist/docs/index.html +2 -2
  22. package/dist/docs-raw/CLI.md +341 -718
  23. package/dist/docs-raw/generated/assembly.md +699 -112
  24. package/dist/docs-raw/generated/concepts.md +1834 -1346
  25. package/dist/docs-raw/generated/core.md +1012 -1059
  26. package/dist/docs-raw/generated/curves.md +759 -116
  27. package/dist/docs-raw/generated/lib.md +43 -748
  28. package/dist/docs-raw/generated/output.md +139 -245
  29. package/dist/docs-raw/generated/sdf.md +208 -0
  30. package/dist/docs-raw/generated/sheet-metal.md +473 -21
  31. package/dist/docs-raw/generated/sketch.md +1518 -362
  32. package/dist/docs-raw/generated/viewport.md +368 -299
  33. package/dist/docs-raw/generated/wood.md +104 -0
  34. package/dist/index.html +2 -2
  35. package/dist/landing/proof-ams-adapter.png +0 -0
  36. package/dist/landing/proof-bolt-and-nut.png +0 -0
  37. package/dist/landing/proof-fillet-enclosure.png +0 -0
  38. package/dist/landing/proof-glasses.png +0 -0
  39. package/dist/landing/proof-gyroid.png +0 -0
  40. package/dist/sitemap.xml +6 -6
  41. package/dist-cli/forgecad.js +12321 -5700
  42. package/dist-cli/forgecad.js.map +1 -0
  43. package/dist-cli/solver-46FFSK2U.js +363 -0
  44. package/dist-cli/solver-46FFSK2U.js.map +1 -0
  45. package/dist-skill/CONTEXT.md +4890 -6302
  46. package/dist-skill/SKILL-dev.md +22 -66
  47. package/dist-skill/SKILL.md +20 -59
  48. package/dist-skill/docs/API/core/concepts.md +37 -92
  49. package/dist-skill/docs/CLI.md +341 -718
  50. package/dist-skill/docs/generated/assembly.md +699 -112
  51. package/dist-skill/docs/generated/core.md +1012 -1059
  52. package/dist-skill/docs/generated/curves.md +759 -116
  53. package/dist-skill/docs/generated/lib.md +43 -748
  54. package/dist-skill/docs/generated/output.md +139 -245
  55. package/dist-skill/docs/generated/sdf.md +208 -0
  56. package/dist-skill/docs/generated/sheet-metal.md +473 -21
  57. package/dist-skill/docs/generated/sketch.md +1518 -362
  58. package/dist-skill/docs/generated/viewport.md +368 -299
  59. package/dist-skill/docs/generated/wood.md +104 -0
  60. package/dist-skill/docs/guides/coordinate-system.md +11 -17
  61. package/dist-skill/docs/guides/geometry-conventions.md +13 -70
  62. package/dist-skill/docs/guides/joint-design.md +78 -0
  63. package/dist-skill/docs/guides/modeling-recipes.md +22 -195
  64. package/dist-skill/docs/guides/positioning.md +88 -147
  65. package/dist-skill/docs-dev/API/core/concepts.md +78 -0
  66. package/dist-skill/docs-dev/CLI.md +488 -0
  67. package/dist-skill/{docs → docs-dev}/blueprint-first.md +5 -0
  68. package/dist-skill/{docs → docs-dev}/coding-best-practices.md +6 -8
  69. package/dist-skill/{docs → docs-dev}/coding.md +2 -4
  70. package/dist-skill/docs-dev/component-model.md +164 -0
  71. package/dist-skill/docs-dev/generated/assembly.md +779 -0
  72. package/dist-skill/docs-dev/generated/core.md +1676 -0
  73. package/dist-skill/docs-dev/generated/curves.md +855 -0
  74. package/dist-skill/docs-dev/generated/lib.md +55 -0
  75. package/dist-skill/docs-dev/generated/output.md +234 -0
  76. package/dist-skill/docs-dev/generated/sdf.md +208 -0
  77. package/dist-skill/docs-dev/generated/sheet-metal.md +506 -0
  78. package/dist-skill/docs-dev/generated/sketch.md +1753 -0
  79. package/dist-skill/docs-dev/generated/viewport.md +513 -0
  80. package/dist-skill/docs-dev/generated/wood.md +104 -0
  81. package/dist-skill/docs-dev/guides/coordinate-system.md +46 -0
  82. package/dist-skill/docs-dev/guides/geometry-conventions.md +52 -0
  83. package/dist-skill/docs-dev/guides/joint-design.md +78 -0
  84. package/dist-skill/docs-dev/guides/modeling-recipes.md +77 -0
  85. package/dist-skill/docs-dev/guides/positioning.md +151 -0
  86. package/dist-skill/{docs → docs-dev}/guides/skill-maintenance.md +21 -10
  87. package/dist-skill/{docs → docs-dev}/internals/compiler.md +5 -6
  88. package/dist-skill/{docs → docs-dev}/internals/constraint-solver-quality.md +0 -1
  89. package/dist-skill/{docs → docs-dev}/internals/constraint-solver.md +0 -1
  90. package/dist-skill/{docs → docs-dev}/internals/sketch-2d-pipeline.md +2 -3
  91. package/examples/api/attachTo-basics.forge.js +8 -8
  92. package/examples/api/bill-of-materials.forge.js +9 -9
  93. package/examples/api/bolt-pattern.forge.js +5 -5
  94. package/examples/api/boolean-operations.forge.js +5 -5
  95. package/examples/api/bounding-box-visualizer.forge.js +3 -3
  96. package/examples/api/clone-duplicate.forge.js +2 -2
  97. package/examples/api/colors-union-vs-array.forge.js +6 -6
  98. package/examples/api/connector-assembly.forge.js +8 -6
  99. package/examples/api/connector-basics.forge.js +7 -7
  100. package/examples/api/constrained-sketch-mechanical.forge.js +4 -4
  101. package/examples/api/elbow-test.forge.js +3 -3
  102. package/examples/api/extrude-options.forge.js +8 -14
  103. package/examples/api/feature-created-faces.forge.js +6 -10
  104. package/examples/api/fillet-showcase.forge.js +2 -2
  105. package/examples/api/folded-service-panel-cover.forge.js +2 -2
  106. package/examples/api/gears-tier1.forge.js +5 -5
  107. package/examples/api/group-test.forge.js +3 -3
  108. package/examples/api/group-vs-union.forge.js +1 -1
  109. package/examples/api/highlight-debug.forge.js +4 -0
  110. package/examples/api/js-module-pillars.js +1 -1
  111. package/examples/api/js-module-scene.js +2 -2
  112. package/examples/api/mesh-import-slats.forge.js +4 -4
  113. package/examples/api/patterns.forge.js +3 -3
  114. package/examples/api/pointAlong-orientation.forge.js +3 -3
  115. package/examples/api/profile-2020-b-slot6.forge.js +4 -5
  116. package/examples/api/route-perimeter-flange.forge.js +1 -1
  117. package/examples/api/sdf-rover-demo.forge.js +10 -10
  118. package/examples/api/sketch-on-face-demo.forge.js +2 -2
  119. package/examples/api/sketch-regions.forge.js +4 -4
  120. package/examples/api/sketch-rounding-strategies.forge.js +1 -1
  121. package/examples/api/smooth-curve-connections.forge.js +1 -1
  122. package/examples/api/transition-curves.forge.js +4 -4
  123. package/examples/api/variable-sweep-pure-sdf-test.forge.js +162 -0
  124. package/examples/api/variable-sweep-test.forge.js +2 -2
  125. package/examples/api/wood-joinery.forge.js +60 -0
  126. package/examples/compiler-corpus/enclosure-shell-cuts.forge.js +3 -3
  127. package/examples/compiler-corpus/fastener-plate-variants.forge.js +2 -2
  128. package/examples/constraints/01-fully-constrained-rect.forge.js +2 -2
  129. package/examples/constraints/02-underconstrained-triangle.forge.js +1 -1
  130. package/examples/constraints/03-redundant-constraints.forge.js +2 -2
  131. package/examples/constraints/05-parallel-with-linedistance.forge.js +2 -2
  132. package/examples/constraints/06-complex-spectrogram.forge.js +1 -1
  133. package/examples/constraints/07-perpendicular-chain.forge.js +4 -4
  134. package/examples/constraints/08-symmetric-bracket.forge.js +4 -4
  135. package/examples/constraints/09-stress-spiral.forge.js +1 -1
  136. package/examples/constraints/10-stress-honeycomb.forge.js +1 -1
  137. package/examples/constraints/11-surface-grid.forge.js +2 -2
  138. package/examples/constraints/12-surface-nested.forge.js +4 -4
  139. package/examples/constraints/13-surface-complex.forge.js +1 -1
  140. package/examples/exact-arc-housing.forge.js +12 -0
  141. package/examples/experiments/drone-arm.forge.js +53 -0
  142. package/examples/furniture/adjustable-table.forge.js +15 -15
  143. package/examples/furniture/bathroom.forge.js +26 -26
  144. package/examples/furniture/chair.forge.js +13 -13
  145. package/examples/furniture/picture-frame.forge.js +6 -6
  146. package/examples/furniture/shoe-rack-doors.forge.js +8 -8
  147. package/examples/furniture/shoe-rack.forge.js +7 -7
  148. package/examples/furniture/table-lamp.forge.js +8 -8
  149. package/examples/gcode/lissajous-vase.forge.js +4 -4
  150. package/examples/gcode/math-surface.forge.js +3 -3
  151. package/examples/gcode/parametric-vase.forge.js +4 -4
  152. package/examples/gcode/spiral-tower.forge.js +4 -4
  153. package/examples/generative/crystal-growth.forge.js +9 -9
  154. package/examples/generative/frost-spires.forge.js +9 -9
  155. package/examples/generative/golden-spiral-tower.forge.js +11 -11
  156. package/examples/generative/molten-forge.forge.js +6 -6
  157. package/examples/generative/neon-coral.forge.js +7 -7
  158. package/examples/mechanical/3d-printer.forge.js +37 -37
  159. package/examples/mechanical/5-finger-robot-hand.forge.js +19 -19
  160. package/examples/mechanical/airplane-propeller.forge.js +9 -9
  161. package/examples/mechanical/bolt-and-nut.forge.js +10 -10
  162. package/examples/mechanical/door-with-hinges.forge.js +7 -7
  163. package/examples/mechanical/fillet-enclosure.forge.js +15 -11
  164. package/examples/mechanical/headphone-hanger-v2.forge.js +11 -11
  165. package/examples/mechanical/robot_hand.forge.js +24 -24
  166. package/examples/mechanical/robot_hand_2.forge.js +26 -26
  167. package/examples/nurbs-surface.forge.js +8 -0
  168. package/examples/nurbs-tube.forge.js +7 -0
  169. package/examples/products/bottle.forge.js +8 -8
  170. package/examples/products/chess-set.forge.js +25 -25
  171. package/examples/products/classical-piano.forge.js +20 -20
  172. package/examples/products/clock.forge.js +33 -33
  173. package/examples/products/cup.forge.js +5 -5
  174. package/examples/products/iphone.forge.js +20 -20
  175. package/examples/products/laptop.forge.js +24 -24
  176. package/examples/products/laser-cut-box.forge.js +6 -6
  177. package/examples/products/laser-cut-tray.forge.js +6 -6
  178. package/examples/products/liquid-soap-dispenser.forge.js +23 -23
  179. package/examples/products/origami-fish.forge.js +14 -12
  180. package/examples/products/spiderman-cake.forge.js +6 -6
  181. package/examples/shelf/container.forge.js +5 -5
  182. package/examples/shelf/shelf-unit.forge.js +6 -6
  183. package/examples/toolbox/bolted-joint.forge.js +7 -7
  184. package/package.json +9 -4
  185. package/dist/assets/EditorApp-B-vQvgam.js +0 -9888
  186. package/dist/assets/LandingPage-C5n9hDXI.js +0 -322
  187. package/dist/assets/PublishedModelPage-Dt7PCVBj.js +0 -146
  188. package/dist/assets/__vite-browser-external-CURh0WXD.js +0 -8
  189. package/dist/assets/deserializeRunResult-BLAFoiE0.js +0 -19365
  190. package/dist/assets/index-1CYp3zUp.js +0 -1455
  191. package/dist-skill/docs/API/API.md +0 -1666
  192. package/dist-skill/docs/API/README.md +0 -37
  193. package/dist-skill/docs/API/assembly/assembly.md +0 -617
  194. package/dist-skill/docs/API/core/edge-queries.md +0 -130
  195. package/dist-skill/docs/API/core/parameters.md +0 -122
  196. package/dist-skill/docs/API/core/reserved-terms.md +0 -137
  197. package/dist-skill/docs/API/core/sdf.md +0 -326
  198. package/dist-skill/docs/API/core/skill-cli.md +0 -194
  199. package/dist-skill/docs/API/core/skill-guide.md +0 -205
  200. package/dist-skill/docs/API/core/specs.md +0 -186
  201. package/dist-skill/docs/API/core/topology.md +0 -372
  202. package/dist-skill/docs/API/entities.md +0 -268
  203. package/dist-skill/docs/API/output/bom.md +0 -58
  204. package/dist-skill/docs/API/output/brep-export.md +0 -87
  205. package/dist-skill/docs/API/output/dimensions.md +0 -67
  206. package/dist-skill/docs/API/output/export.md +0 -110
  207. package/dist-skill/docs/API/output/gcode.md +0 -195
  208. package/dist-skill/docs/API/runtime/viewport.md +0 -420
  209. package/dist-skill/docs/API/sheet-metal/sheet-metal.md +0 -185
  210. package/dist-skill/docs/API/sketch/anchor.md +0 -37
  211. package/dist-skill/docs/API/sketch/booleans.md +0 -91
  212. package/dist-skill/docs/API/sketch/core.md +0 -73
  213. package/dist-skill/docs/API/sketch/extrude.md +0 -62
  214. package/dist-skill/docs/API/sketch/on-face.md +0 -104
  215. package/dist-skill/docs/API/sketch/operations.md +0 -78
  216. package/dist-skill/docs/API/sketch/path.md +0 -75
  217. package/dist-skill/docs/API/sketch/primitives.md +0 -146
  218. package/dist-skill/docs/API/sketch/regions.md +0 -80
  219. package/dist-skill/docs/API/sketch/text.md +0 -108
  220. package/dist-skill/docs/API/sketch/transforms.md +0 -65
  221. package/dist-skill/docs/API/toolbox/fasteners.md +0 -129
  222. package/dist-skill/docs/INDEX.md +0 -94
  223. package/dist-skill/docs/RELEASING.md +0 -55
  224. package/dist-skill/docs/cli-monetization.md +0 -111
  225. package/dist-skill/docs/deployment.md +0 -281
  226. package/dist-skill/docs/generated/concepts.md +0 -2112
  227. package/dist-skill/docs/internals/shape-from-slices.md +0 -152
  228. package/dist-skill/docs/platform/admin.md +0 -45
  229. package/dist-skill/docs/platform/architecture.md +0 -79
  230. package/dist-skill/docs/platform/auth.md +0 -110
  231. package/dist-skill/docs/platform/email.md +0 -67
  232. package/dist-skill/docs/platform/projects.md +0 -111
  233. package/dist-skill/docs/platform/sharing.md +0 -90
  234. package/dist-skill/docs/runbook.md +0 -345
@@ -5,12 +5,12 @@
5
5
  // Bed Z param represents current print progress (high = start, low = done).
6
6
 
7
7
  // ─── Parameters ───
8
- const bedW = param("Bed Width", 220, { min: 180, max: 300, unit: "mm" });
9
- const bedD = param("Bed Depth", 220, { min: 180, max: 300, unit: "mm" });
10
- const bedThick = param("Bed Thickness", 4, { min: 3, max: 8, unit: "mm" });
11
- const frameMargin = param("Frame Margin", 40, { min: 20, max: 80, unit: "mm" });
12
- const beam = param("Beam Size", 20, { min: 15, max: 30, unit: "mm" });
13
- const frameH = param("Frame Height", 400, { min: 320, max: 520, unit: "mm" });
8
+ const bedW = Param.number("Bed Width", 220, { min: 180, max: 300, unit: "mm" });
9
+ const bedD = Param.number("Bed Depth", 220, { min: 180, max: 300, unit: "mm" });
10
+ const bedThick = Param.number("Bed Thickness", 4, { min: 3, max: 8, unit: "mm" });
11
+ const frameMargin = Param.number("Frame Margin", 40, { min: 20, max: 80, unit: "mm" });
12
+ const beam = Param.number("Beam Size", 20, { min: 15, max: 30, unit: "mm" });
13
+ const frameH = Param.number("Frame Height", 400, { min: 320, max: 520, unit: "mm" });
14
14
 
15
15
  // ─── Derived frame ───
16
16
  const frameW = bedW + 2 * frameMargin;
@@ -27,15 +27,15 @@ const nozzleZ = gantryZ - nozzleToRail;
27
27
  // Bed starts near nozzle tip and lowers during printing.
28
28
  const bedTopMax = nozzleZ - 1;
29
29
  const bedTopMin = beam + bedThick + 80;
30
- const bedZ = param("Bed Z (print progress)", bedTopMax, {
30
+ const bedZ = Param.number("Bed Z (print progress)", bedTopMax, {
31
31
  min: bedTopMin, max: bedTopMax, unit: "mm",
32
32
  });
33
33
 
34
34
  // Gantry XY travel
35
35
  const gantryTravel = innerD / 2 - 30;
36
- const gantryY = param("Gantry Y", 0, { min: -gantryTravel, max: gantryTravel, unit: "mm" });
36
+ const gantryY = Param.number("Gantry Y", 0, { min: -gantryTravel, max: gantryTravel, unit: "mm" });
37
37
  const headTravel = innerW / 2 - 50;
38
- const headX = param("Nozzle X", 0, { min: -headTravel, max: headTravel, unit: "mm" });
38
+ const headX = Param.number("Nozzle X", 0, { min: -headTravel, max: headTravel, unit: "mm" });
39
39
 
40
40
  // ─── Colors ───
41
41
  const C = {
@@ -62,13 +62,13 @@ const hd = frameD / 2 - beam / 2;
62
62
 
63
63
  for (const z of [bz, tz]) {
64
64
  for (const sy of [-1, 1])
65
- fp.push(box(frameW, beam, beam, true).translate(0, sy * hd, z));
65
+ fp.push(box(frameW, beam, beam).translate(0, sy * hd, z));
66
66
  for (const sx of [-1, 1])
67
- fp.push(box(beam, frameD - 2 * beam, beam, true).translate(sx * hw, 0, z));
67
+ fp.push(box(beam, frameD - 2 * beam, beam).translate(sx * hw, 0, z));
68
68
  }
69
69
  for (const sx of [-1, 1])
70
70
  for (const sy of [-1, 1])
71
- fp.push(box(beam, beam, pH, true).translate(sx * hw, sy * hd, pZ));
71
+ fp.push(box(beam, beam, pH).translate(sx * hw, sy * hd, pZ));
72
72
 
73
73
  add("Frame", union(...fp), C.frame);
74
74
 
@@ -93,8 +93,8 @@ add("Lead Screws", union(
93
93
  ), C.lead);
94
94
 
95
95
  add("Z Motors", union(
96
- box(42, 42, 40, true).translate(-zRailX, leadY, beam + 20),
97
- box(42, 42, 40, true).translate(zRailX, leadY, beam + 20),
96
+ box(42, 42, 40).translate(-zRailX, leadY, beam + 20),
97
+ box(42, 42, 40).translate(zRailX, leadY, beam + 20),
98
98
  ), C.motor);
99
99
 
100
100
  // ─── Bed Assembly (moves in Z) ───
@@ -103,8 +103,8 @@ const glassTopZ = bedZ;
103
103
  const bedPlateTopZ = glassTopZ - glassThick;
104
104
  const bedPlateCenterZ = bedPlateTopZ - bedThick / 2;
105
105
 
106
- const bedPlate = box(bedW, bedD, bedThick, true).translate(0, 0, bedPlateCenterZ);
107
- const glass = box(bedW - 6, bedD - 6, glassThick, true)
106
+ const bedPlate = box(bedW, bedD, bedThick).translate(0, 0, bedPlateCenterZ);
107
+ const glass = box(bedW - 6, bedD - 6, glassThick)
108
108
  .translate(0, 0, bedPlateTopZ + glassThick / 2);
109
109
 
110
110
  const carriageThick = 8;
@@ -112,12 +112,12 @@ const springH = 12;
112
112
  const carriageZ = bedPlateCenterZ - bedThick / 2 - springH - carriageThick / 2;
113
113
 
114
114
  // Carriage narrower in Y so it doesn't extend past the Z rail Y position
115
- const bedCarriage = box(bedW + 20, bedD - 40, carriageThick, true)
115
+ const bedCarriage = box(bedW + 20, bedD - 40, carriageThick)
116
116
  .translate(0, 0, carriageZ);
117
117
 
118
118
  add("Z Bearings", union(
119
- box(24, 24, 16, true).translate(-zRailX, zRailY, carriageZ),
120
- box(24, 24, 16, true).translate(zRailX, zRailY, carriageZ),
119
+ box(24, 24, 16).translate(-zRailX, zRailY, carriageZ),
120
+ box(24, 24, 16).translate(zRailX, zRailY, carriageZ),
121
121
  ), C.carriage);
122
122
 
123
123
  add("Lead Nuts", union(
@@ -148,8 +148,8 @@ add("Y Rails", union(
148
148
  ), C.rail);
149
149
 
150
150
  add("Y Carriages", union(
151
- box(28, 32, 18, true).translate(-yRailX, gantryY, gantryZ),
152
- box(28, 32, 18, true).translate(yRailX, gantryY, gantryZ),
151
+ box(28, 32, 18).translate(-yRailX, gantryY, gantryZ),
152
+ box(28, 32, 18).translate(yRailX, gantryY, gantryZ),
153
153
  ), C.carriage);
154
154
 
155
155
  const xRailLen = yRailX * 2 - 30;
@@ -157,24 +157,24 @@ add("X Rail", cylinder(xRailLen, railR).pointAlong([1, 0, 0])
157
157
  .translate(-xRailLen / 2, gantryY, gantryZ), C.rail);
158
158
 
159
159
  // X beam at gantry level — supports the X rail from behind
160
- add("X Beam", box(xRailLen, beam, beam, true)
160
+ add("X Beam", box(xRailLen, beam, beam)
161
161
  .translate(0, gantryY, gantryZ), C.frame);
162
162
 
163
163
  // ─── CoreXY Belts ───
164
164
  const beltZ = gantryZ + 22;
165
165
  add("XY Belts", union(
166
- box(xRailLen, 2, 3, true).translate(0, gantryY + 8, beltZ),
167
- box(xRailLen, 2, 3, true).translate(0, gantryY - 8, beltZ),
168
- box(2, yRailLen, 3, true).translate(-yRailX, 0, beltZ),
169
- box(2, yRailLen, 3, true).translate(yRailX, 0, beltZ),
166
+ box(xRailLen, 2, 3).translate(0, gantryY + 8, beltZ),
167
+ box(xRailLen, 2, 3).translate(0, gantryY - 8, beltZ),
168
+ box(2, yRailLen, 3).translate(-yRailX, 0, beltZ),
169
+ box(2, yRailLen, 3).translate(yRailX, 0, beltZ),
170
170
  ), C.belt);
171
171
 
172
172
  // XY motors inside frame at top-rear
173
173
  const motorSize = 42;
174
174
  const motorY = innerD / 2 - motorSize / 2 - 5;
175
175
  add("XY Motors", union(
176
- box(motorSize, motorSize, motorSize, true).translate(-yRailX, motorY, gantryZ + 30),
177
- box(motorSize, motorSize, motorSize, true).translate(yRailX, motorY, gantryZ + 30),
176
+ box(motorSize, motorSize, motorSize).translate(-yRailX, motorY, gantryZ + 30),
177
+ box(motorSize, motorSize, motorSize).translate(yRailX, motorY, gantryZ + 30),
178
178
  ), C.motor);
179
179
 
180
180
  add("XY Idlers", union(
@@ -189,19 +189,19 @@ const hx = headX;
189
189
  const hy = gantryY;
190
190
 
191
191
  add("Nozzle", cylinder(6, 0.4, 2).translate(hx, hy, nozzleZ), C.nozzle);
192
- add("Heater Block", box(12, 12, 8, true).translate(hx, hy, nozzleZ + 10), C.hotend);
192
+ add("Heater Block", box(12, 12, 8).translate(hx, hy, nozzleZ + 10), C.hotend);
193
193
  add("Heatbreak", cylinder(6, 1.5).translate(hx, hy, nozzleZ + 14), C.lead);
194
194
  add("Heatsink", cylinder(12, 6).translate(hx, hy, nozzleZ + 22), C.hotend);
195
195
 
196
- const headCarriage = box(46, 28, 36, true).translate(hx, hy, gantryZ - 18);
196
+ const headCarriage = box(46, 28, 36).translate(hx, hy, gantryZ - 18);
197
197
  add("Extruder Carriage", headCarriage, C.carriage);
198
198
 
199
- add("Part Fan", box(18, 8, 16, true)
199
+ add("Part Fan", box(18, 8, 16)
200
200
  .onFace(headCarriage, 'front', { v: -5, protrude: 5 }), C.fan);
201
201
 
202
202
  // Extruder motor — compact, sits just above gantry plane
203
203
  const extruderMotorZ = gantryZ + 5;
204
- add("Extruder Motor", box(30, 30, 20, true)
204
+ add("Extruder Motor", box(30, 30, 20)
205
205
  .translate(hx, hy, extruderMotorZ), C.motor);
206
206
 
207
207
  // ─── Spool Holder (behind frame, on top) ───
@@ -225,8 +225,8 @@ add("Spool Hub", cylinder(spoolW, 8).pointAlong([1, 0, 0])
225
225
  .translate(-spoolW / 2, spoolY, spoolZ), C.lead);
226
226
 
227
227
  add("Spool Supports", union(
228
- box(10, 20, 50, true).translate(-spoolW / 2 - 15, frameD / 2 - beam / 2, frameH - 25),
229
- box(10, 20, 50, true).translate(spoolW / 2 + 15, frameD / 2 - beam / 2, frameH - 25),
228
+ box(10, 20, 50).translate(-spoolW / 2 - 15, frameD / 2 - beam / 2, frameH - 25),
229
+ box(10, 20, 50).translate(spoolW / 2 + 15, frameD / 2 - beam / 2, frameH - 25),
230
230
  ), C.frame);
231
231
 
232
232
  // ─── Filament Path ───
@@ -248,13 +248,13 @@ const filFixedPath = lib.pipeRoute(
248
248
  add("Filament Guide Tube", filFixedPath, C.bowden);
249
249
 
250
250
  // ─── Electronics ───
251
- add("PSU", box(100, 60, 40, true)
251
+ add("PSU", box(100, 60, 40)
252
252
  .translate(frameW / 2 - 55, -frameD / 2 + 35, 25), C.electronics);
253
253
 
254
- add("Control Board", box(70, 40, 25, true)
254
+ add("Control Board", box(70, 40, 25)
255
255
  .translate(-frameW / 2 + 40, -frameD / 2 + 25, 18), C.electronics);
256
256
 
257
- add("Display", box(50, 3, 25, true)
257
+ add("Display", box(50, 3, 25)
258
258
  .translate(-frameW / 2 + 40, -frameD / 2 + 1, frameH / 3), C.screen);
259
259
 
260
260
  // ─── Build Volume wireframe ───
@@ -1,10 +1,10 @@
1
1
  // Robot Hand — functional, buildable concept
2
2
  // Z-up, Y depth (front = -Y)
3
3
 
4
- const scale = param("Scale", 1.0, { min: 0.7, max: 1.3, step: 0.05 });
5
- const curl = param("Finger Curl", 40, { min: 0, max: 70, unit: "°" });
6
- const thumbCurl = param("Thumb Curl", 35, { min: 0, max: 70, unit: "°" });
7
- const spread = param("Finger Spread", 8, { min: 0, max: 20, unit: "°" });
4
+ const scale = Param.number("Scale", 1.0, { min: 0.7, max: 1.3, step: 0.05 });
5
+ const curl = Param.number("Finger Curl", 40, { min: 0, max: 70, unit: "°" });
6
+ const thumbCurl = Param.number("Thumb Curl", 35, { min: 0, max: 70, unit: "°" });
7
+ const spread = Param.number("Finger Spread", 8, { min: 0, max: 20, unit: "°" });
8
8
 
9
9
  // --- Dimensions ---
10
10
  const palmW = 90 * scale;
@@ -76,37 +76,37 @@ function makeFinger(opts) {
76
76
  const tipPivot0 = [basePivot[0], basePivot[1] - L1 - L2, basePivot[2]];
77
77
 
78
78
  // Straight segments in world space
79
- let s1 = box(W1, L1, t, true)
79
+ let s1 = box(W1, L1, t)
80
80
  .translate(basePivot[0], basePivot[1] - L1 / 2, basePivot[2])
81
81
  .color(colors.segment);
82
- let s2 = box(W2, L2, t, true)
82
+ let s2 = box(W2, L2, t)
83
83
  .translate(basePivot[0], basePivot[1] - L1 - L2 / 2, basePivot[2])
84
84
  .color(colors.segment);
85
- let s3 = box(W3, L3, t, true)
85
+ let s3 = box(W3, L3, t)
86
86
  .translate(basePivot[0], basePivot[1] - L1 - L2 - L3 / 2, basePivot[2])
87
87
  .color(colors.segment);
88
88
 
89
89
  // Pads (rubber contact)
90
90
  const padT = t * 0.18;
91
- let pad1 = box(W1 * 0.7, L1 * 0.45, padT, true)
91
+ let pad1 = box(W1 * 0.7, L1 * 0.45, padT)
92
92
  .color(colors.pad)
93
93
  .onFace(s1, 'bottom', { v: -L1 * 0.15, protrude: padT / 2 });
94
- let pad2 = box(W2 * 0.65, L2 * 0.45, padT, true)
94
+ let pad2 = box(W2 * 0.65, L2 * 0.45, padT)
95
95
  .color(colors.pad)
96
96
  .onFace(s2, 'bottom', { v: -L2 * 0.15, protrude: padT / 2 });
97
- let pad3 = box(W3 * 0.8, L3 * 0.6, padT, true)
97
+ let pad3 = box(W3 * 0.8, L3 * 0.6, padT)
98
98
  .color(colors.pad)
99
99
  .onFace(s3, 'bottom', { v: -L3 * 0.1, protrude: padT / 2 });
100
100
 
101
101
  // Tendon guides (raised top rails)
102
102
  const rodT = t * 0.12;
103
- let rod1 = box(W1 * 0.2, L1 * 0.9, rodT, true)
103
+ let rod1 = box(W1 * 0.2, L1 * 0.9, rodT)
104
104
  .color(colors.tendon)
105
105
  .onFace(s1, 'top', { v: -L1 * 0.05, protrude: rodT / 2 });
106
- let rod2 = box(W2 * 0.2, L2 * 0.9, rodT, true)
106
+ let rod2 = box(W2 * 0.2, L2 * 0.9, rodT)
107
107
  .color(colors.tendon)
108
108
  .onFace(s2, 'top', { v: -L2 * 0.05, protrude: rodT / 2 });
109
- let rod3 = box(W3 * 0.2, L3 * 0.85, rodT, true)
109
+ let rod3 = box(W3 * 0.2, L3 * 0.85, rodT)
110
110
  .color(colors.tendon)
111
111
  .onFace(s3, 'top', { v: -L3 * 0.05, protrude: rodT / 2 });
112
112
 
@@ -137,7 +137,7 @@ function makeFinger(opts) {
137
137
  let pin3 = pinBase.translate(tipPivot2[0] - pinLen / 2, tipPivot2[1], tipPivot2[2]);
138
138
 
139
139
  // Yoke block at base
140
- let yoke = box(W1 * 1.1, 6 * scale, t * 0.8, true)
140
+ let yoke = box(W1 * 1.1, 6 * scale, t * 0.8)
141
141
  .translate(basePivot[0], basePivot[1] + 3 * scale, basePivot[2])
142
142
  .color(colors.knuckle);
143
143
  yoke = seg1(yoke);
@@ -173,12 +173,12 @@ function makeFinger(opts) {
173
173
  }
174
174
 
175
175
  // --- Palm assembly ---
176
- const palm = box(palmW, palmD, palmH, true).color(colors.palm);
177
- const palmPad = box(palmW * 0.6, 3 * scale, palmH * 0.5, true)
176
+ const palm = box(palmW, palmD, palmH).color(colors.palm);
177
+ const palmPad = box(palmW * 0.6, 3 * scale, palmH * 0.5)
178
178
  .color(colors.palmPad)
179
179
  .onFace(palm, 'front', { v: -palmH * 0.05, protrude: 1 * scale });
180
180
 
181
- const knuckleBar = box(palmW * 0.9, 10 * scale, 6 * scale, true)
181
+ const knuckleBar = box(palmW * 0.9, 10 * scale, 6 * scale)
182
182
  .color(colors.knuckle)
183
183
  .onFace(palm, 'top', { v: -palmD / 2 + 8 * scale, protrude: 3 * scale });
184
184
 
@@ -192,7 +192,7 @@ const wrist = cylinder(wristLen, wristR)
192
192
  const motorW = 40 * scale;
193
193
  const motorD = 28 * scale;
194
194
  const motorH = 20 * scale;
195
- const motor = box(motorW, motorD, motorH, true)
195
+ const motor = box(motorW, motorD, motorH)
196
196
  .color(colors.motor)
197
197
  .attachTo(palm, 'bottom', 'top', [0, palmD / 2 - motorD / 2 - 4 * scale, -2 * scale]);
198
198
 
@@ -261,7 +261,7 @@ const cables = fingerBases.map((end, i) => {
261
261
  // --- Grasp target object ---
262
262
  const graspObject = union(
263
263
  sphere(18 * scale).translate(0, baseY - 45 * scale, baseZ + 6 * scale),
264
- box(32 * scale, 20 * scale, 26 * scale, true).translate(12 * scale, baseY - 65 * scale, baseZ + 2 * scale)
264
+ box(32 * scale, 20 * scale, 26 * scale).translate(12 * scale, baseY - 65 * scale, baseZ + 2 * scale)
265
265
  ).color('#88ccee');
266
266
 
267
267
  // --- Return scene ---
@@ -18,13 +18,13 @@
18
18
  // Camber: 4% at root → 1.5% at tip (Cl margin at low-speed root)
19
19
 
20
20
  // ─── Design Parameters ──────────────────────────────────────────
21
- const diameter = param("Diameter", 1900, { min: 1200, max: 2600, unit: "mm" });
22
- const numBlades = param("Blades", 3, { min: 2, max: 6, integer: true });
23
- const pitchAngle = param("Pitch @75%R", 22, { min: 10, max: 40, unit: "°" });
24
- const maxChord = param("Max Chord", 155, { min: 80, max: 250, unit: "mm" });
25
- const hubDiameter = param("Hub Diameter", 140, { min: 80, max: 220, unit: "mm" });
26
- const meshRes = param("Mesh Resolution", 2.5, { min: 1.0, max: 5.0, step: 0.5, unit: "mm" });
27
- const showSections = boolParam("Show Airfoil Sections", false);
21
+ const diameter = Param.number("Diameter", 1900, { min: 1200, max: 2600, unit: "mm" });
22
+ const numBlades = Param.number("Blades", 3, { min: 2, max: 6, integer: true });
23
+ const pitchAngle = Param.number("Pitch @75%R", 22, { min: 10, max: 40, unit: "°" });
24
+ const maxChord = Param.number("Max Chord", 155, { min: 80, max: 250, unit: "mm" });
25
+ const hubDiameter = Param.number("Hub Diameter", 140, { min: 80, max: 220, unit: "mm" });
26
+ const meshRes = Param.number("Mesh Resolution", 2.5, { min: 1.0, max: 5.0, step: 0.5, unit: "mm" });
27
+ const showSections = Param.bool("Show Airfoil Sections", false);
28
28
 
29
29
  const R = diameter / 2;
30
30
  const rHub = hubDiameter / 2;
@@ -191,7 +191,7 @@ for (let i = 0; i <= NUM_STATIONS; i++) {
191
191
  const bladeRaw = loft(profiles, heights, { edgeLength: meshRes });
192
192
 
193
193
  // Rotate blade from Z-axis (span) to X-axis (radial in propeller disk)
194
- const blade = bladeRaw.rotateAround([0, 0, 0], 0, 90, 0);
194
+ const blade = bladeRaw.rotateY(90);
195
195
 
196
196
  // ─── Spinner / Hub ──────────────────────────────────────────────
197
197
  //
@@ -257,7 +257,7 @@ if (showSections) {
257
257
  pts = rotate2D(pts, 90 + twist);
258
258
 
259
259
  const section = polygon(pts).extrude(2)
260
- .rotate(0, 90, 0)
260
+ .rotateY(90)
261
261
  .translate(r, 0, 0)
262
262
  .color('#ff4422');
263
263
 
@@ -3,16 +3,16 @@
3
3
  // lib.bolt() and lib.nut() use Manifold's native extrude+twist
4
4
  // to sweep a thread tooth profile helically — clean geometry, no SDF grid.
5
5
 
6
- const diameter = param("Diameter", 8, { min: 4, max: 20, unit: "mm" });
7
- const length = param("Length", 30, { min: 10, max: 60, unit: "mm" });
8
- const pitch = param("Pitch", 1.25, { min: 0.5, max: 3, step: 0.25, unit: "mm" });
9
- const headH = param("Head Height", 5, { min: 3, max: 12, unit: "mm" });
10
- const headAF = param("Head AF", 13, { min: 7, max: 30, unit: "mm" });
11
- const nutHeight = param("Nut Height", 6.5, { min: 3, max: 12, unit: "mm" });
12
- const nutAF = param("Nut AF", 13, { min: 7, max: 30, unit: "mm" });
13
- const showNut = param("Show Nut", 1, { min: 0, max: 1, step: 1 });
14
- const nutPos = param("Nut Position", 5, { min: 0, max: 30, unit: "mm" });
15
- const segments = param("Segments", 36, { min: 12, max: 72, step: 4, integer: true });
6
+ const diameter = Param.number("Diameter", 8, { min: 4, max: 20, unit: "mm" });
7
+ const length = Param.number("Length", 30, { min: 10, max: 60, unit: "mm" });
8
+ const pitch = Param.number("Pitch", 1.25, { min: 0.5, max: 3, step: 0.25, unit: "mm" });
9
+ const headH = Param.number("Head Height", 5, { min: 3, max: 12, unit: "mm" });
10
+ const headAF = Param.number("Head AF", 13, { min: 7, max: 30, unit: "mm" });
11
+ const nutHeight = Param.number("Nut Height", 6.5, { min: 3, max: 12, unit: "mm" });
12
+ const nutAF = Param.number("Nut AF", 13, { min: 7, max: 30, unit: "mm" });
13
+ const showNut = Param.number("Show Nut", 1, { min: 0, max: 1, step: 1 });
14
+ const nutPos = Param.number("Nut Position", 5, { min: 0, max: 30, unit: "mm" });
15
+ const segments = Param.number("Segments", 36, { min: 12, max: 72, step: 4, integer: true });
16
16
 
17
17
  const boltShape = lib.bolt(diameter, length, {
18
18
  pitch,
@@ -1,15 +1,15 @@
1
1
  // Door with hinges — the door pivots around the hinge axis using joint().
2
2
  // Drag the "Door Angle" slider to open/close the door.
3
3
 
4
- const doorW = param("Door Width", 80, { min: 40, max: 120, unit: "mm" });
5
- const doorH = param("Door Height", 200, { min: 100, max: 300, unit: "mm" });
6
- const doorT = param("Door Thickness", 4, { min: 2, max: 10, unit: "mm" });
4
+ const doorW = Param.number("Door Width", 80, { min: 40, max: 120, unit: "mm" });
5
+ const doorH = Param.number("Door Height", 200, { min: 100, max: 300, unit: "mm" });
6
+ const doorT = Param.number("Door Thickness", 4, { min: 2, max: 10, unit: "mm" });
7
7
 
8
- const frameW = param("Frame Width", 8, { min: 4, max: 15, unit: "mm" });
9
- const frameD = param("Frame Depth", 6, { min: 3, max: 12, unit: "mm" });
8
+ const frameW = Param.number("Frame Width", 8, { min: 4, max: 15, unit: "mm" });
9
+ const frameD = Param.number("Frame Depth", 6, { min: 3, max: 12, unit: "mm" });
10
10
 
11
- const hingeR = param("Hinge Radius", 3, { min: 1.5, max: 6, unit: "mm" });
12
- const hingeH = param("Hinge Height", 16, { min: 8, max: 30, unit: "mm" });
11
+ const hingeR = Param.number("Hinge Radius", 3, { min: 1.5, max: 6, unit: "mm" });
12
+ const hingeH = Param.number("Hinge Height", 16, { min: 8, max: 30, unit: "mm" });
13
13
 
14
14
  // ── Door frame (stationary U-shape) ──
15
15
  const frame = union(
@@ -1,19 +1,20 @@
1
1
  // Filleted Electronics Enclosure — practical engineering part
2
2
  // Demonstrates: fillet() for professional-looking product design
3
3
 
4
- const width = param("Width", 80, { min: 50, max: 120, unit: "mm" });
5
- const depth = param("Depth", 50, { min: 30, max: 80, unit: "mm" });
6
- const height = param("Height", 25, { min: 15, max: 40, unit: "mm" });
7
- const wall = param("Wall", 2.5, { min: 1.5, max: 4, unit: "mm" });
8
- const outerR = param("Outer Fillet", 4, { min: 1, max: 10, unit: "mm" });
4
+ const width = Param.number("Width", 80, { min: 50, max: 120, unit: "mm" });
5
+ const depth = Param.number("Depth", 50, { min: 30, max: 80, unit: "mm" });
6
+ const height = Param.number("Height", 25, { min: 15, max: 40, unit: "mm" });
7
+ const wall = Param.number("Wall", 2.5, { min: 1.5, max: 4, unit: "mm" });
8
+ const outerR = Param.number("Outer Fillet", 4, { min: 1, max: 10, unit: "mm" });
9
9
 
10
10
  // ── Outer shell with rounded vertical edges ─────────────────────────────────
11
11
  const outer = box(width, depth, height);
12
12
  let enclosure = fillet(outer, outerR, { parallel: [0, 0, 1], convex: true });
13
13
 
14
14
  // ── Hollow interior ─────────────────────────────────────────────────────────
15
- const cavity = box(width - wall * 2, depth - wall * 2, height - wall, true)
16
- .translate(width / 2, depth / 2, wall + (height - wall) / 2 + 0.01);
15
+ // box() is XY-centered, Z starts at 0 cavity just needs a Z shift
16
+ const cavity = box(width - wall * 2, depth - wall * 2, height - wall)
17
+ .translate(0, 0, wall + 0.01);
17
18
  enclosure = difference(enclosure, cavity);
18
19
 
19
20
  // ── Screw bosses ────────────────────────────────────────────────────────────
@@ -27,12 +28,15 @@ function screwBoss(x, y) {
27
28
  return difference(boss, hole);
28
29
  }
29
30
 
31
+ // Positions relative to centered box: -width/2..+width/2
32
+ const hw = width / 2;
33
+ const hd = depth / 2;
30
34
  enclosure = union(
31
35
  enclosure,
32
- screwBoss(inset, inset),
33
- screwBoss(width - inset, inset),
34
- screwBoss(inset, depth - inset),
35
- screwBoss(width - inset, depth - inset),
36
+ screwBoss(-hw + inset, -hd + inset),
37
+ screwBoss( hw - inset, -hd + inset),
38
+ screwBoss(-hw + inset, hd - inset),
39
+ screwBoss( hw - inset, hd - inset),
36
40
  );
37
41
 
38
42
  return enclosure;
@@ -2,15 +2,15 @@
2
2
  // Clamps to the bottom edge of a desk, hook hangs below.
3
3
  // Designed for actual 3D printing / building.
4
4
 
5
- const deskThick = param("Desk Thickness", 25, { min: 15, max: 50, unit: "mm" });
6
- const clampDepth = param("Clamp Depth", 40, { min: 25, max: 70, unit: "mm" });
7
- const width = param("Width", 50, { min: 30, max: 80, unit: "mm" });
8
- const thick = param("Material Thick", 5, { min: 3, max: 10, unit: "mm" });
9
- const hookDrop = param("Hook Drop", 60, { min: 30, max: 100, unit: "mm" });
10
- const hookLen = param("Hook Length", 35, { min: 15, max: 60, unit: "mm" });
11
- const hookCurveR = param("Hook Curve R", 15, { min: 5, max: 30, unit: "mm" });
12
- const padThick = param("Pad Thickness", 2, { min: 1, max: 5, unit: "mm" });
13
- const boltHoleD = param("Bolt Hole", 5, { min: 0, max: 8, unit: "mm" });
5
+ const deskThick = Param.number("Desk Thickness", 25, { min: 15, max: 50, unit: "mm" });
6
+ const clampDepth = Param.number("Clamp Depth", 40, { min: 25, max: 70, unit: "mm" });
7
+ const width = Param.number("Width", 50, { min: 30, max: 80, unit: "mm" });
8
+ const thick = Param.number("Material Thick", 5, { min: 3, max: 10, unit: "mm" });
9
+ const hookDrop = Param.number("Hook Drop", 60, { min: 30, max: 100, unit: "mm" });
10
+ const hookLen = Param.number("Hook Length", 35, { min: 15, max: 60, unit: "mm" });
11
+ const hookCurveR = Param.number("Hook Curve R", 15, { min: 5, max: 30, unit: "mm" });
12
+ const padThick = Param.number("Pad Thickness", 2, { min: 1, max: 5, unit: "mm" });
13
+ const boltHoleD = Param.number("Bolt Hole", 5, { min: 0, max: 8, unit: "mm" });
14
14
 
15
15
  // The clamp is a C-shape that grips the desk edge.
16
16
  // Top jaw sits on top of desk, bottom jaw presses from below.
@@ -48,8 +48,8 @@ const curveProfile = rect(thick, width).translate(hookCurveR, 0);
48
48
  const curvePiece = curveProfile.revolve(90)
49
49
  // revolve produces shape around Y axis; rotate to align:
50
50
  // we need the arc to go from -Z (down) to +Y (forward)
51
- .rotateAround([0, 0, 0], 90, 0, 90) // align width along X
52
- .rotateAround([0, 0, 0], 180, 0, 0) // flip so arc opens downward-to-forward
51
+ .rotateX(90).rotateZ(90) // align width along X
52
+ .rotateX(180) // flip so arc opens downward-to-forward
53
53
  .translate(0, clampDepth * 0.6 + hookCurveR, hookZ);
54
54
 
55
55
  // Straight hook tip extending forward
@@ -5,16 +5,16 @@
5
5
  // 3) Mount included: base, mast, wrist clevis
6
6
  // 4) Iterative construction: build primitives -> segments -> fingers -> full assembly
7
7
 
8
- const grip = param("Grip", 55, { min: 0, max: 100, unit: "%" });
9
- const fingerSpread = param("Finger Spread", 18, { min: 0, max: 35, unit: "°" });
10
- const thumbOpposition = param("Thumb Opposition", 42, { min: 20, max: 70, unit: "°" });
11
- const wristPitch = param("Wrist Pitch", 8, { min: -35, max: 45, unit: "°" });
12
- const explode = param("Explode", 0, { min: 0, max: 26, unit: "mm" });
8
+ const grip = Param.number("Grip", 55, { min: 0, max: 100, unit: "%" });
9
+ const fingerSpread = Param.number("Finger Spread", 18, { min: 0, max: 35, unit: "°" });
10
+ const thumbOpposition = Param.number("Thumb Opposition", 42, { min: 20, max: 70, unit: "°" });
11
+ const wristPitch = Param.number("Wrist Pitch", 8, { min: -35, max: 45, unit: "°" });
12
+ const explode = Param.number("Explode", 0, { min: 0, max: 26, unit: "mm" });
13
13
 
14
- const scale = param("Scale", 1.0, { min: 0.75, max: 1.25, step: 0.01 });
15
- const pinD = param("Pin Diameter", 3.2, { min: 2.0, max: 5.0, step: 0.1, unit: "mm" }) * scale;
16
- const jointClearance = param("Joint Clearance", 0.32, { min: 0.2, max: 0.7, step: 0.02, unit: "mm" }) * scale;
17
- const wall = param("Min Wall", 2.4, { min: 1.6, max: 4.0, step: 0.1, unit: "mm" }) * scale;
14
+ const scale = Param.number("Scale", 1.0, { min: 0.75, max: 1.25, step: 0.01 });
15
+ const pinD = Param.number("Pin Diameter", 3.2, { min: 2.0, max: 5.0, step: 0.1, unit: "mm" }) * scale;
16
+ const jointClearance = Param.number("Joint Clearance", 0.32, { min: 0.2, max: 0.7, step: 0.02, unit: "mm" }) * scale;
17
+ const wall = Param.number("Min Wall", 2.4, { min: 1.6, max: 4.0, step: 0.1, unit: "mm" }) * scale;
18
18
 
19
19
  // Core hand dimensions
20
20
  const palmW = 84 * scale;
@@ -61,9 +61,9 @@ function localToWorld(localPt, basePt, yawDeg) {
61
61
 
62
62
  // Clevis mount with pin bore centered at origin
63
63
  function makeClevis(width, height, depth, gap, lugW, boreR) {
64
- const left = box(lugW, depth, height, true).translate(-(gap * 0.5 + lugW * 0.5), -depth * 0.5, 0);
65
- const right = box(lugW, depth, height, true).translate(gap * 0.5 + lugW * 0.5, -depth * 0.5, 0);
66
- const bridge = box(width, depth * 0.55, height * 0.55, true).translate(0, -depth * 0.78, 0);
64
+ const left = box(lugW, depth, height).translate(-(gap * 0.5 + lugW * 0.5), -depth * 0.5, 0);
65
+ const right = box(lugW, depth, height).translate(gap * 0.5 + lugW * 0.5, -depth * 0.5, 0);
66
+ const bridge = box(width, depth * 0.55, height * 0.55).translate(0, -depth * 0.78, 0);
67
67
  const raw = union(left, right, bridge);
68
68
  const bore = cylinder(width + 2, boreR).pointAlong([1, 0, 0]);
69
69
  return raw.subtract(bore);
@@ -73,7 +73,7 @@ function makeClevis(width, height, depth, gap, lugW, boreR) {
73
73
  function makeHingeEar(width, height, depth, boreR) {
74
74
  const ear = union(
75
75
  cylinder(width * 0.62, height * 0.45).pointAlong([1, 0, 0]).translate(0, 0, 0),
76
- box(width * 0.62, depth * 0.9, height * 0.85, true).translate(0, depth * 0.45, 0)
76
+ box(width * 0.62, depth * 0.9, height * 0.85).translate(0, depth * 0.45, 0)
77
77
  );
78
78
  const bore = cylinder(width + 2, boreR).pointAlong([1, 0, 0]);
79
79
  return ear.subtract(bore);
@@ -88,8 +88,8 @@ function makePhalanxPart(length, width, thick, hasFrontClevis, frontScale = 1.0)
88
88
  const baseEar = makeHingeEar(width, thick, lugDepth, pinR + jointClearance * 0.6)
89
89
  .translate(0, 0, 0);
90
90
 
91
- const topRib = box(width * 0.36, length * 0.72, thick * 0.22, true).translate(0, length * 0.52, thick * 0.28);
92
- const bottomRib = box(width * 0.36, length * 0.72, thick * 0.18, true).translate(0, length * 0.52, -thick * 0.28);
91
+ const topRib = box(width * 0.36, length * 0.72, thick * 0.22).translate(0, length * 0.52, thick * 0.28);
92
+ const bottomRib = box(width * 0.36, length * 0.72, thick * 0.18).translate(0, length * 0.52, -thick * 0.28);
93
93
 
94
94
  let part = union(body, baseEar, topRib, bottomRib);
95
95
 
@@ -157,8 +157,8 @@ function makeFingerAssembly(opts) {
157
157
 
158
158
  const worldBase = localToWorld([0, py, pz], basePivot, yawDeg);
159
159
  const part = localPart
160
- .rotateAround([0, 0, 0], accum, 0, 0)
161
- .rotateAround([0, 0, 0], 0, 0, yawDeg)
160
+ .rotateX(accum)
161
+ .rotateZ(yawDeg)
162
162
  .translate(worldBase[0], worldBase[1], worldBase[2])
163
163
  .translate(0, 0, explode * i * 0.08);
164
164
 
@@ -170,7 +170,7 @@ function makeFingerAssembly(opts) {
170
170
  const pinLen = segW + wall * 2.4;
171
171
  const pin = cylinder(pinLen, pinR * 0.92)
172
172
  .pointAlong([1, 0, 0])
173
- .rotateAround([0, 0, 0], 0, 0, yawDeg)
173
+ .rotateZ(yawDeg)
174
174
  .translate(worldBase[0], worldBase[1], worldBase[2])
175
175
  .translate(0, 0, explode * i * 0.08)
176
176
  .color('#B0B7C3');
@@ -220,7 +220,7 @@ function makeFingerAssembly(opts) {
220
220
 
221
221
  // Build palm with integrated finger clevises and wrist lug
222
222
  function makePalm() {
223
- const palmCore = roundedRect(palmW, palmD, 10 * scale, true).extrude(palmT, { center: true })
223
+ const palmCore = roundedRect(palmW, palmD, 10 * scale).extrude(palmT, { center: true })
224
224
  .translate(0, palmD * 0.5, 0);
225
225
 
226
226
  const palmHoles = union(
@@ -246,11 +246,11 @@ function makePalm() {
246
246
  }
247
247
 
248
248
  const thumbClevis = makeClevis(thumbWidth, segmentThick * 0.86, lugDepth, lugGap, lugWidth, pinR + jointClearance)
249
- .rotateAround([0, 0, 0], 0, 0, -thumbOpposition)
249
+ .rotateZ(-thumbOpposition)
250
250
  .translate(palmW * 0.45, palmD * 0.24, 0);
251
251
 
252
252
  const wristEar = makeHingeEar(palmW * 0.45, segmentThick, lugDepth * 1.05, pinR + jointClearance)
253
- .rotateAround([0, 0, 0], 0, 180, 0)
253
+ .rotateY(180)
254
254
  .translate(0, 0, 0);
255
255
 
256
256
  palm = union(palm, thumbClevis, wristEar);
@@ -267,7 +267,7 @@ function makeMount() {
267
267
  const mastD = 34 * scale;
268
268
  const mastH = 86 * scale;
269
269
 
270
- let base = roundedRect(baseW, baseD, 8 * scale, true).extrude(baseT, { center: true }).translate(0, -36 * scale, -mastH * 0.52);
270
+ let base = roundedRect(baseW, baseD, 8 * scale).extrude(baseT, { center: true }).translate(0, -36 * scale, -mastH * 0.52);
271
271
 
272
272
  const slotSketchA = slot(20 * scale, 7 * scale).translate(-baseW * 0.28, -36 * scale);
273
273
  const slotSketchB = slot(20 * scale, 7 * scale).translate(baseW * 0.28, -36 * scale);
@@ -281,10 +281,10 @@ function makeMount() {
281
281
  );
282
282
  base = base.subtract(slots);
283
283
 
284
- const mast = box(mastW, mastD, mastH, true).translate(0, -8 * scale, -mastH * 0.02);
284
+ const mast = box(mastW, mastD, mastH).translate(0, -8 * scale, -mastH * 0.02);
285
285
  const gussetL = polygon([[0, 0], [26 * scale, 0], [0, 28 * scale]])
286
286
  .extrude(6 * scale, { center: true })
287
- .rotateAround([0, 0, 0], 90, 0, 90)
287
+ .rotateX(90).rotateZ(90)
288
288
  .translate(-mastW * 0.5 - 3 * scale, -18 * scale, -mastH * 0.28);
289
289
  const gussetR = gussetL.mirrorThrough([0, 0, 0], [1, 0, 0]);
290
290