forgecad 0.7.0 → 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.
- package/README.md +1 -1
- package/dist/assets/{AdminPage-DAu1C1ST.js → AdminPage-D4bocK4E.js} +1 -1
- package/dist/assets/{DocsPage-Gc_BCdqC.js → DocsPage-D3A_g8V3.js} +85 -45
- package/dist/assets/{EditorApp-DG1-oUSV.css → EditorApp-BWYUSpUN.css} +133 -51
- package/dist/assets/EditorApp-Cihhqcsq.js +11692 -0
- package/dist/assets/{EmbedViewer-CEO8XbV8.js → EmbedViewer-kWjKaC_t.js} +1 -1
- package/dist/assets/LandingPageProofDriven-Bg2IUc3l.css +856 -0
- package/dist/assets/LandingPageProofDriven-DXkKlyhI.js +601 -0
- package/dist/assets/{PricingPage-BSrxu6d7.js → PricingPage-BsU5vzEx.js} +1 -1
- package/dist/assets/{SettingsPage-FUCSIRq6.js → SettingsPage-PqvpAKIs.js} +1 -1
- package/dist/assets/{evalWorker-KoR0SNKq.js → evalWorker-C-hzNUMy.js} +2218 -286
- package/dist/assets/{index-wTEK39at.js → index-Pz321YAt.js} +7416 -1481
- package/dist/assets/{index-CyVd1D4D.css → index-ay13WNfa.css} +501 -2
- package/dist/assets/{manifold-B1sGWdYk.js → manifold-BcbjWLIo.js} +3 -3
- package/dist/assets/{manifold-D7o0N50J.js → manifold-DBckbFgx.js} +1 -1
- package/dist/assets/{manifold-G5sBaXzi.js → manifold-O2AAGXyj.js} +1 -1
- package/dist/assets/{reportWorker-DYcRHhv9.js → reportWorker-Dxr-5A7w.js} +2003 -259
- package/dist/docs/index.html +2 -2
- package/dist/docs-raw/CLI.md +488 -0
- package/dist/docs-raw/generated/assembly.md +19 -11
- package/dist/docs-raw/generated/concepts.md +1023 -360
- package/dist/docs-raw/generated/core.md +1165 -264
- package/dist/docs-raw/generated/curves.md +168 -1
- package/dist/docs-raw/generated/lib.md +10 -5
- package/dist/docs-raw/generated/output.md +1 -1
- package/dist/docs-raw/generated/sdf.md +208 -0
- package/dist/docs-raw/generated/sketch.md +1281 -329
- package/dist/docs-raw/generated/viewport.md +29 -2
- package/dist/index.html +2 -2
- package/dist/landing/proof-ams-adapter.png +0 -0
- package/dist/landing/proof-bolt-and-nut.png +0 -0
- package/dist/landing/proof-fillet-enclosure.png +0 -0
- package/dist/landing/proof-glasses.png +0 -0
- package/dist/landing/proof-gyroid.png +0 -0
- package/dist/sitemap.xml +6 -6
- package/dist-cli/forgecad.js +3148 -555
- package/dist-cli/forgecad.js.map +1 -1
- package/dist-cli/{solver-FV7TJZGI.js → solver-46FFSK2U.js} +1 -3
- package/dist-cli/{solver-FV7TJZGI.js.map → solver-46FFSK2U.js.map} +1 -1
- package/dist-skill/CONTEXT.md +3700 -1153
- package/dist-skill/SKILL-dev.md +15 -17
- package/dist-skill/SKILL.md +14 -9
- package/dist-skill/docs/API/core/concepts.md +28 -1
- package/dist-skill/docs/CLI.md +488 -0
- package/dist-skill/docs/generated/assembly.md +19 -11
- package/dist-skill/docs/generated/core.md +1165 -264
- package/dist-skill/docs/generated/curves.md +168 -1
- package/dist-skill/docs/generated/lib.md +10 -5
- package/dist-skill/docs/generated/output.md +1 -1
- package/dist-skill/docs/generated/sdf.md +208 -0
- package/dist-skill/docs/generated/sketch.md +1281 -329
- package/dist-skill/docs/generated/viewport.md +29 -2
- package/dist-skill/docs/guides/joint-design.md +78 -0
- package/dist-skill/docs-dev/API/core/concepts.md +28 -1
- package/dist-skill/docs-dev/CLI.md +488 -0
- package/dist-skill/docs-dev/coding.md +1 -1
- package/dist-skill/docs-dev/component-model.md +164 -0
- package/dist-skill/docs-dev/generated/assembly.md +19 -11
- package/dist-skill/docs-dev/generated/core.md +1165 -264
- package/dist-skill/docs-dev/generated/curves.md +168 -1
- package/dist-skill/docs-dev/generated/lib.md +10 -5
- package/dist-skill/docs-dev/generated/output.md +1 -1
- package/dist-skill/docs-dev/generated/sdf.md +208 -0
- package/dist-skill/docs-dev/generated/sketch.md +1281 -329
- package/dist-skill/docs-dev/generated/viewport.md +29 -2
- package/dist-skill/docs-dev/guides/joint-design.md +78 -0
- package/examples/api/attachTo-basics.forge.js +3 -3
- package/examples/api/bill-of-materials.forge.js +9 -9
- package/examples/api/bolt-pattern.forge.js +5 -5
- package/examples/api/boolean-operations.forge.js +2 -2
- package/examples/api/bounding-box-visualizer.forge.js +1 -1
- package/examples/api/clone-duplicate.forge.js +1 -1
- package/examples/api/connector-assembly.forge.js +4 -2
- package/examples/api/connector-basics.forge.js +5 -5
- package/examples/api/constrained-sketch-mechanical.forge.js +4 -4
- package/examples/api/elbow-test.forge.js +3 -3
- package/examples/api/extrude-options.forge.js +4 -4
- package/examples/api/fillet-showcase.forge.js +1 -1
- package/examples/api/gears-tier1.forge.js +5 -5
- package/examples/api/group-test.forge.js +2 -2
- package/examples/api/mesh-import-slats.forge.js +3 -3
- package/examples/api/patterns.forge.js +3 -3
- package/examples/api/pointAlong-orientation.forge.js +2 -2
- package/examples/api/profile-2020-b-slot6.forge.js +4 -4
- package/examples/api/sketch-rounding-strategies.forge.js +1 -1
- package/examples/api/smooth-curve-connections.forge.js +1 -1
- package/examples/api/transition-curves.forge.js +3 -3
- package/examples/constraints/01-fully-constrained-rect.forge.js +2 -2
- package/examples/constraints/02-underconstrained-triangle.forge.js +1 -1
- package/examples/constraints/03-redundant-constraints.forge.js +2 -2
- package/examples/constraints/05-parallel-with-linedistance.forge.js +2 -2
- package/examples/constraints/06-complex-spectrogram.forge.js +1 -1
- package/examples/constraints/07-perpendicular-chain.forge.js +4 -4
- package/examples/constraints/08-symmetric-bracket.forge.js +4 -4
- package/examples/constraints/09-stress-spiral.forge.js +1 -1
- package/examples/constraints/10-stress-honeycomb.forge.js +1 -1
- package/examples/constraints/11-surface-grid.forge.js +2 -2
- package/examples/constraints/12-surface-nested.forge.js +4 -4
- package/examples/constraints/13-surface-complex.forge.js +1 -1
- package/examples/exact-arc-housing.forge.js +12 -0
- package/examples/furniture/adjustable-table.forge.js +13 -13
- package/examples/furniture/bathroom.forge.js +15 -15
- package/examples/furniture/chair.forge.js +12 -12
- package/examples/furniture/picture-frame.forge.js +6 -6
- package/examples/furniture/shoe-rack-doors.forge.js +8 -8
- package/examples/furniture/shoe-rack.forge.js +7 -7
- package/examples/furniture/table-lamp.forge.js +8 -8
- package/examples/gcode/lissajous-vase.forge.js +4 -4
- package/examples/gcode/math-surface.forge.js +3 -3
- package/examples/gcode/parametric-vase.forge.js +4 -4
- package/examples/gcode/spiral-tower.forge.js +4 -4
- package/examples/generative/crystal-growth.forge.js +7 -7
- package/examples/generative/frost-spires.forge.js +6 -6
- package/examples/generative/golden-spiral-tower.forge.js +8 -8
- package/examples/generative/molten-forge.forge.js +6 -6
- package/examples/generative/neon-coral.forge.js +7 -7
- package/examples/mechanical/3d-printer.forge.js +9 -9
- package/examples/mechanical/5-finger-robot-hand.forge.js +4 -4
- package/examples/mechanical/airplane-propeller.forge.js +7 -7
- package/examples/mechanical/bolt-and-nut.forge.js +10 -10
- package/examples/mechanical/door-with-hinges.forge.js +7 -7
- package/examples/mechanical/fillet-enclosure.forge.js +14 -10
- package/examples/mechanical/headphone-hanger-v2.forge.js +9 -9
- package/examples/mechanical/robot_hand.forge.js +10 -10
- package/examples/mechanical/robot_hand_2.forge.js +17 -17
- package/examples/nurbs-surface.forge.js +8 -0
- package/examples/nurbs-tube.forge.js +7 -0
- package/examples/products/bottle.forge.js +7 -7
- package/examples/products/chess-set.forge.js +6 -6
- package/examples/products/classical-piano.forge.js +9 -9
- package/examples/products/clock.forge.js +21 -21
- package/examples/products/cup.forge.js +5 -5
- package/examples/products/iphone.forge.js +12 -12
- package/examples/products/laptop.forge.js +9 -9
- package/examples/products/laser-cut-box.forge.js +6 -6
- package/examples/products/laser-cut-tray.forge.js +6 -6
- package/examples/products/liquid-soap-dispenser.forge.js +5 -5
- package/examples/products/origami-fish.forge.js +6 -6
- package/examples/products/spiderman-cake.forge.js +2 -2
- package/examples/shelf/container.forge.js +5 -5
- package/examples/shelf/shelf-unit.forge.js +6 -6
- package/examples/toolbox/bolted-joint.forge.js +5 -5
- package/package.json +3 -1
- package/dist/assets/EditorApp-D9bJvtf7.js +0 -11338
- package/dist/assets/LandingPage-CdCuEOdC.js +0 -451
- package/dist-cli/chunk-PZ5AY32C.js +0 -10
- package/dist-cli/chunk-PZ5AY32C.js.map +0 -1
- package/dist-skill/docs/CLI/export.md +0 -91
- package/dist-skill/docs/CLI/projects.md +0 -107
- package/dist-skill/docs/CLI/studio_publishing.md +0 -52
- package/dist-skill/docs/CLI/validation.md +0 -66
- package/dist-skill/docs-dev/API/core/sdf-advanced.md +0 -92
- package/dist-skill/docs-dev/API/core/sdf-primitives.md +0 -58
- package/dist-skill/docs-dev/API/core/sdf-workflow.md +0 -42
- package/dist-skill/docs-dev/CLI/export.md +0 -91
- package/dist-skill/docs-dev/CLI/projects.md +0 -107
- package/dist-skill/docs-dev/CLI/studio_publishing.md +0 -52
- package/dist-skill/docs-dev/CLI/validation.md +0 -66
|
@@ -5,19 +5,19 @@
|
|
|
5
5
|
// BUILD NOTES (at bottom of file):
|
|
6
6
|
// Materials, dimensions, and assembly instructions for actually building this.
|
|
7
7
|
|
|
8
|
-
const topW =
|
|
9
|
-
const topD =
|
|
10
|
-
const topThick =
|
|
11
|
-
const minH =
|
|
12
|
-
const maxH =
|
|
13
|
-
const heightPct =
|
|
14
|
-
const outerLeg =
|
|
15
|
-
const innerLeg =
|
|
16
|
-
const legWall =
|
|
17
|
-
const inset =
|
|
18
|
-
const braceW =
|
|
19
|
-
const braceH =
|
|
20
|
-
const crankR =
|
|
8
|
+
const topW = Param.number("Top Width", 120, { min: 80, max: 200, unit: "cm" });
|
|
9
|
+
const topD = Param.number("Top Depth", 60, { min: 40, max: 100, unit: "cm" });
|
|
10
|
+
const topThick = Param.number("Top Thickness", 3, { min: 2, max: 5, unit: "cm" });
|
|
11
|
+
const minH = Param.number("Min Height", 72, { min: 60, max: 80, unit: "cm" });
|
|
12
|
+
const maxH = Param.number("Max Height", 120, { min: 100, max: 140, unit: "cm" });
|
|
13
|
+
const heightPct = Param.number("Height %", 30, { min: 0, max: 100, unit: "%" });
|
|
14
|
+
const outerLeg = Param.number("Outer Leg", 6, { min: 4, max: 10, unit: "cm" });
|
|
15
|
+
const innerLeg = Param.number("Inner Leg", 4, { min: 3, max: 8, unit: "cm" });
|
|
16
|
+
const legWall = Param.number("Leg Wall", 0.3, { min: 0.2, max: 0.5, unit: "cm" });
|
|
17
|
+
const inset = Param.number("Leg Inset", 5, { min: 2, max: 15, unit: "cm" });
|
|
18
|
+
const braceW = Param.number("Brace Width", 3, { min: 2, max: 5, unit: "cm" });
|
|
19
|
+
const braceH = Param.number("Brace Height", 1.5, { min: 1, max: 3, unit: "cm" });
|
|
20
|
+
const crankR = Param.number("Crank Radius", 8, { min: 5, max: 15, unit: "cm" });
|
|
21
21
|
|
|
22
22
|
// Current height based on slider
|
|
23
23
|
const currentH = minH + (maxH - minH) * heightPct / 100;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// Full Bathroom — parametric room with fixtures
|
|
2
2
|
// Bathtub, sink, toilet, mirror, shower glass panel, towel rack
|
|
3
3
|
|
|
4
|
-
const roomW =
|
|
5
|
-
const roomD =
|
|
6
|
-
const roomH =
|
|
7
|
-
const wallT =
|
|
8
|
-
const tileH =
|
|
4
|
+
const roomW = Param.number("Room Width", 2400, { min: 1800, max: 3500, unit: "mm" });
|
|
5
|
+
const roomD = Param.number("Room Depth", 2000, { min: 1500, max: 3000, unit: "mm" });
|
|
6
|
+
const roomH = Param.number("Room Height", 2500, { min: 2200, max: 3000, unit: "mm" });
|
|
7
|
+
const wallT = Param.number("Wall Thickness", 80, { min: 50, max: 150, unit: "mm" });
|
|
8
|
+
const tileH = Param.number("Tile Height", 1200, { min: 800, max: 1800, unit: "mm" });
|
|
9
9
|
|
|
10
10
|
// ─── Room shell (floor + 3 walls, front open) ───
|
|
11
11
|
|
|
@@ -21,10 +21,10 @@ const tileStrip = box(roomW - 2 * wallT, 2, tileH)
|
|
|
21
21
|
|
|
22
22
|
// ─── Bathtub (left-back corner) ───
|
|
23
23
|
|
|
24
|
-
const tubL =
|
|
25
|
-
const tubW =
|
|
26
|
-
const tubH =
|
|
27
|
-
const tubWall =
|
|
24
|
+
const tubL = Param.number("Tub Length", 1500, { min: 1200, max: 1800, unit: "mm" });
|
|
25
|
+
const tubW = Param.number("Tub Width", 700, { min: 550, max: 800, unit: "mm" });
|
|
26
|
+
const tubH = Param.number("Tub Height", 500, { min: 400, max: 600, unit: "mm" });
|
|
27
|
+
const tubWall = Param.number("Tub Wall", 40, { min: 25, max: 60, unit: "mm" });
|
|
28
28
|
|
|
29
29
|
const tubX = wallT + 20;
|
|
30
30
|
const tubY = roomD - wallT - tubW - 20;
|
|
@@ -39,7 +39,7 @@ const bathtub = tubOuter.subtract(tubInner).subtract(tubDrain)
|
|
|
39
39
|
|
|
40
40
|
// ─── Shower (above tub) ───
|
|
41
41
|
|
|
42
|
-
const glassH =
|
|
42
|
+
const glassH = Param.number("Glass Height", 1800, { min: 1500, max: 2200, unit: "mm" });
|
|
43
43
|
const glassT = 8;
|
|
44
44
|
|
|
45
45
|
// Glass panel at tub edge
|
|
@@ -62,8 +62,8 @@ const shower = union(showerArm, showerHead);
|
|
|
62
62
|
|
|
63
63
|
// ─── Toilet (right side, against back wall) ───
|
|
64
64
|
|
|
65
|
-
const toiletW =
|
|
66
|
-
const toiletD =
|
|
65
|
+
const toiletW = Param.number("Toilet Width", 380, { min: 340, max: 420, unit: "mm" });
|
|
66
|
+
const toiletD = Param.number("Toilet Depth", 650, { min: 550, max: 750, unit: "mm" });
|
|
67
67
|
const toiletH = 400;
|
|
68
68
|
|
|
69
69
|
const toiletX = roomW - wallT - toiletW - 150;
|
|
@@ -100,7 +100,7 @@ const toilet = union(bowl, tank, lid, seat);
|
|
|
100
100
|
|
|
101
101
|
// ─── Sink (right wall, facing into room) ───
|
|
102
102
|
|
|
103
|
-
const sinkW =
|
|
103
|
+
const sinkW = Param.number("Sink Width", 550, { min: 400, max: 700, unit: "mm" });
|
|
104
104
|
const sinkD = 420;
|
|
105
105
|
const sinkH = 160;
|
|
106
106
|
const sinkZ = 850;
|
|
@@ -136,8 +136,8 @@ const sink = union(basin, pedestal, faucetStem, faucetSpout, handleL, handleR);
|
|
|
136
136
|
|
|
137
137
|
// ─── Mirror (on right wall, above sink) ───
|
|
138
138
|
|
|
139
|
-
const mirrorW =
|
|
140
|
-
const mirrorH =
|
|
139
|
+
const mirrorW = Param.number("Mirror Width", 600, { min: 400, max: 900, unit: "mm" });
|
|
140
|
+
const mirrorH = Param.number("Mirror Height", 800, { min: 500, max: 1200, unit: "mm" });
|
|
141
141
|
const mirrorT = 5;
|
|
142
142
|
const frameW = 15;
|
|
143
143
|
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
// Four-Legged Chair — parametric dining chair
|
|
2
2
|
|
|
3
|
-
const seatW =
|
|
4
|
-
const seatD =
|
|
5
|
-
const seatT =
|
|
6
|
-
const seatH =
|
|
3
|
+
const seatW = Param.number("Seat Width", 45, { min: 30, max: 60, unit: "mm" });
|
|
4
|
+
const seatD = Param.number("Seat Depth", 42, { min: 30, max: 55, unit: "mm" });
|
|
5
|
+
const seatT = Param.number("Seat Thickness", 3, { min: 2, max: 6, unit: "mm" });
|
|
6
|
+
const seatH = Param.number("Seat Height", 45, { min: 35, max: 55, unit: "mm" });
|
|
7
7
|
|
|
8
|
-
const legW =
|
|
9
|
-
const legInset =
|
|
8
|
+
const legW = Param.number("Leg Width", 4, { min: 2, max: 8, unit: "mm" });
|
|
9
|
+
const legInset = Param.number("Leg Inset", 3, { min: 0, max: 10, unit: "mm" });
|
|
10
10
|
|
|
11
|
-
const backH =
|
|
12
|
-
const backT =
|
|
13
|
-
const backTilt =
|
|
11
|
+
const backH = Param.number("Back Height", 40, { min: 25, max: 60, unit: "mm" });
|
|
12
|
+
const backT = Param.number("Back Thickness", 3, { min: 2, max: 6, unit: "mm" });
|
|
13
|
+
const backTilt = Param.number("Back Tilt", 5, { min: 0, max: 15, unit: "°" });
|
|
14
14
|
|
|
15
|
-
const stretcher =
|
|
16
|
-
const stretcherH =
|
|
17
|
-
const stretcherW =
|
|
15
|
+
const stretcher = Param.number("Stretchers", 1, { min: 0, max: 1, step: 1 });
|
|
16
|
+
const stretcherH = Param.number("Stretcher Height", 12, { min: 5, max: 30, unit: "mm" });
|
|
17
|
+
const stretcherW = Param.number("Stretcher Width", 2, { min: 1, max: 4, unit: "mm" });
|
|
18
18
|
|
|
19
19
|
// --- Seat ---
|
|
20
20
|
const seat = box(seatW, seatD, seatT).translate(0, 0, seatH);
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// Picture Frame — parametric wall frame with optional mat border
|
|
2
2
|
|
|
3
|
-
const frameW =
|
|
4
|
-
const frameH =
|
|
5
|
-
const border =
|
|
6
|
-
const depth =
|
|
7
|
-
const mat =
|
|
8
|
-
const matDepth =
|
|
3
|
+
const frameW = Param.number("Frame Width", 120, { min: 60, max: 250, unit: "mm" });
|
|
4
|
+
const frameH = Param.number("Frame Height", 160, { min: 80, max: 300, unit: "mm" });
|
|
5
|
+
const border = Param.number("Border Width", 12, { min: 5, max: 30, unit: "mm" });
|
|
6
|
+
const depth = Param.number("Frame Depth", 8, { min: 3, max: 20, unit: "mm" });
|
|
7
|
+
const mat = Param.number("Mat Width", 8, { min: 0, max: 20, unit: "mm" });
|
|
8
|
+
const matDepth = Param.number("Mat Depth", 2, { min: 1, max: 5, unit: "mm" });
|
|
9
9
|
|
|
10
10
|
// Outer frame
|
|
11
11
|
const outer = box(frameW, frameH, depth);
|
|
@@ -3,17 +3,17 @@
|
|
|
3
3
|
// 4 doors (2 per shelf level), hinged at the outer edges.
|
|
4
4
|
// Each pair shares one angle slider for synchronized open/close.
|
|
5
5
|
|
|
6
|
-
const width =
|
|
7
|
-
const depth =
|
|
8
|
-
const totalH =
|
|
6
|
+
const width = Param.number("Width", 800, { min: 500, max: 1200, unit: "mm" });
|
|
7
|
+
const depth = Param.number("Depth", 350, { min: 250, max: 500, unit: "mm" });
|
|
8
|
+
const totalH = Param.number("Total Height", 500, { min: 350, max: 650, unit: "mm" });
|
|
9
9
|
|
|
10
|
-
const boardT =
|
|
10
|
+
const boardT = Param.number("Board Thickness", 18, { min: 12, max: 25, unit: "mm" });
|
|
11
11
|
|
|
12
|
-
const seatPad =
|
|
13
|
-
const seatOverhang =
|
|
12
|
+
const seatPad = Param.number("Seat Padding", 30, { min: 15, max: 60, unit: "mm" });
|
|
13
|
+
const seatOverhang = Param.number("Seat Overhang", 10, { min: 0, max: 30, unit: "mm" });
|
|
14
14
|
|
|
15
|
-
const doorT =
|
|
16
|
-
const doorGap =
|
|
15
|
+
const doorT = Param.number("Door Thickness", 8, { min: 4, max: 15, unit: "mm" });
|
|
16
|
+
const doorGap = Param.number("Door Gap", 2, { min: 1, max: 5, unit: "mm" });
|
|
17
17
|
|
|
18
18
|
// Derived
|
|
19
19
|
const innerW = width - 2 * boardT;
|
|
@@ -3,16 +3,16 @@
|
|
|
3
3
|
// Structure: two side panels, bottom board, 2 shelves, top board,
|
|
4
4
|
// back panel for rigidity, and a cushion on top for sitting.
|
|
5
5
|
|
|
6
|
-
const width =
|
|
7
|
-
const depth =
|
|
8
|
-
const totalH =
|
|
6
|
+
const width = Param.number("Width", 800, { min: 500, max: 1200, unit: "mm" });
|
|
7
|
+
const depth = Param.number("Depth", 350, { min: 250, max: 500, unit: "mm" });
|
|
8
|
+
const totalH = Param.number("Total Height", 500, { min: 350, max: 650, unit: "mm" });
|
|
9
9
|
|
|
10
|
-
const boardT =
|
|
10
|
+
const boardT = Param.number("Board Thickness", 18, { min: 12, max: 25, unit: "mm" });
|
|
11
11
|
|
|
12
|
-
const seatPad =
|
|
13
|
-
const seatOverhang =
|
|
12
|
+
const seatPad = Param.number("Seat Padding", 30, { min: 15, max: 60, unit: "mm" });
|
|
13
|
+
const seatOverhang = Param.number("Seat Overhang", 10, { min: 0, max: 30, unit: "mm" });
|
|
14
14
|
|
|
15
|
-
const divider =
|
|
15
|
+
const divider = Param.number("Center Divider", 1, { min: 0, max: 1, step: 1 });
|
|
16
16
|
|
|
17
17
|
// Derived
|
|
18
18
|
const innerW = width - 2 * boardT;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
// Table Lamp — base + stem + shade (multi-file: imports shade profile)
|
|
2
2
|
|
|
3
|
-
const baseR =
|
|
4
|
-
const baseH =
|
|
5
|
-
const stemR =
|
|
6
|
-
const stemH =
|
|
7
|
-
const shadeTopR =
|
|
8
|
-
const shadeBottomR =
|
|
9
|
-
const shadeH =
|
|
10
|
-
const shadeWall =
|
|
3
|
+
const baseR = Param.number("Base Radius", 25, { min: 15, max: 40, unit: "mm" });
|
|
4
|
+
const baseH = Param.number("Base Height", 6, { min: 3, max: 12, unit: "mm" });
|
|
5
|
+
const stemR = Param.number("Stem Radius", 4, { min: 2, max: 8, unit: "mm" });
|
|
6
|
+
const stemH = Param.number("Stem Height", 60, { min: 30, max: 100, unit: "mm" });
|
|
7
|
+
const shadeTopR = Param.number("Shade Top Radius", 15, { min: 8, max: 30, unit: "mm" });
|
|
8
|
+
const shadeBottomR = Param.number("Shade Bottom Radius", 30, { min: 15, max: 50, unit: "mm" });
|
|
9
|
+
const shadeH = Param.number("Shade Height", 35, { min: 20, max: 60, unit: "mm" });
|
|
10
|
+
const shadeWall = Param.number("Shade Wall", 1.5, { min: 0.5, max: 4, unit: "mm" });
|
|
11
11
|
|
|
12
12
|
// --- Base: flat cylinder ---
|
|
13
13
|
const base = cylinder(baseH, baseR);
|
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
* Creates beautiful organic-looking walls with a continuously changing profile.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
const a =
|
|
9
|
-
const b =
|
|
10
|
-
const baseRadius =
|
|
11
|
-
const height =
|
|
8
|
+
const a = Param.number('a', 3, 1, 7); // X frequency
|
|
9
|
+
const b = Param.number('b', 2, 1, 7); // Y frequency
|
|
10
|
+
const baseRadius = Param.number('radius', 25, 10, 50);
|
|
11
|
+
const height = Param.number('height', 100, 30, 200);
|
|
12
12
|
const layerHeight = 0.2;
|
|
13
13
|
|
|
14
14
|
const g = gcode({ nozzle: 0.4, layerHeight, printSpeed: 1800 });
|
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
* The surface function creates an undulating bowl shape.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
const outerRadius =
|
|
11
|
-
const amplitude =
|
|
12
|
-
const waves =
|
|
10
|
+
const outerRadius = Param.number('radius', 40, 15, 60);
|
|
11
|
+
const amplitude = Param.number('amplitude', 8, 1, 20);
|
|
12
|
+
const waves = Param.number('waves', 4, 1, 8);
|
|
13
13
|
const layerHeight = 0.3;
|
|
14
14
|
const lineSpacing = 0.6; // spacing between concentric passes
|
|
15
15
|
|
|
@@ -7,10 +7,10 @@
|
|
|
7
7
|
* Try tweaking: amplitude, frequency, baseRadius, height, layerHeight.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
const amplitude =
|
|
11
|
-
const frequency =
|
|
12
|
-
const baseRadius =
|
|
13
|
-
const height =
|
|
10
|
+
const amplitude = Param.number('amplitude', 8, 1, 20);
|
|
11
|
+
const frequency = Param.number('frequency', 6, 1, 20);
|
|
12
|
+
const baseRadius = Param.number('radius', 25, 10, 60);
|
|
13
|
+
const height = Param.number('height', 80, 20, 200);
|
|
14
14
|
const layerHeight = 0.2;
|
|
15
15
|
const nozzle = 0.4;
|
|
16
16
|
|
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
* Each layer is a hexagon that twists slightly more than the last.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
const sides =
|
|
9
|
-
const radius =
|
|
10
|
-
const height =
|
|
11
|
-
const twistDeg =
|
|
8
|
+
const sides = Param.number('sides', 6, 3, 12);
|
|
9
|
+
const radius = Param.number('radius', 20, 10, 40);
|
|
10
|
+
const height = Param.number('height', 60, 20, 120);
|
|
11
|
+
const twistDeg = Param.number('twist', 90, 0, 360);
|
|
12
12
|
const layerHeight = 0.2;
|
|
13
13
|
|
|
14
14
|
const g = gcode({ nozzle: 0.4, layerHeight, printSpeed: 1800 });
|
|
@@ -36,9 +36,9 @@ scene({
|
|
|
36
36
|
fog: { color: '#0a0612', near: 350, far: 900 },
|
|
37
37
|
|
|
38
38
|
postProcessing: {
|
|
39
|
-
bloom: { intensity:
|
|
39
|
+
bloom: { intensity: Param.number('bloom', 1.2, 0, 3), threshold: 0.6, radius: 0.5 },
|
|
40
40
|
vignette: { darkness: 0.7, offset: 0.3 },
|
|
41
|
-
toneMappingExposure:
|
|
41
|
+
toneMappingExposure: Param.number('exposure', 1.3, 0.5, 3),
|
|
42
42
|
},
|
|
43
43
|
|
|
44
44
|
capture: {
|
|
@@ -50,11 +50,11 @@ scene({
|
|
|
50
50
|
// ---------------------------------------------------------------------------
|
|
51
51
|
// Parameters
|
|
52
52
|
// ---------------------------------------------------------------------------
|
|
53
|
-
const seed =
|
|
54
|
-
const crystalCount =
|
|
55
|
-
const maxHeight =
|
|
56
|
-
const baseRadius =
|
|
57
|
-
const taperFactor =
|
|
53
|
+
const seed = Param.number('seed', 42, 0, 100);
|
|
54
|
+
const crystalCount = Param.number('crystals', 12, 3, 24);
|
|
55
|
+
const maxHeight = Param.number('maxHeight', 120, 40, 200);
|
|
56
|
+
const baseRadius = Param.number('baseRadius', 80, 30, 150);
|
|
57
|
+
const taperFactor = Param.number('taper', 0.3, 0.1, 0.8);
|
|
58
58
|
|
|
59
59
|
// ---------------------------------------------------------------------------
|
|
60
60
|
// PRNG
|
|
@@ -32,10 +32,10 @@ scene({
|
|
|
32
32
|
fog: { color: '#0a1628', near: 200, far: 550 },
|
|
33
33
|
|
|
34
34
|
postProcessing: {
|
|
35
|
-
bloom: { intensity:
|
|
35
|
+
bloom: { intensity: Param.number('bloom', 1.2, 0, 4), threshold: 0.5, radius: 0.6 },
|
|
36
36
|
vignette: { darkness: 0.7, offset: 0.3 },
|
|
37
37
|
grain: { intensity: 0.04 },
|
|
38
|
-
toneMappingExposure:
|
|
38
|
+
toneMappingExposure: Param.number('exposure', 1.4, 0.5, 3),
|
|
39
39
|
},
|
|
40
40
|
|
|
41
41
|
capture: {
|
|
@@ -47,10 +47,10 @@ scene({
|
|
|
47
47
|
// ---------------------------------------------------------------------------
|
|
48
48
|
// Parameters
|
|
49
49
|
// ---------------------------------------------------------------------------
|
|
50
|
-
const seed =
|
|
51
|
-
const spireCount =
|
|
52
|
-
const maxHeight =
|
|
53
|
-
const spread =
|
|
50
|
+
const seed = Param.number('seed', 23, 0, 100);
|
|
51
|
+
const spireCount = Param.number('spires', 14, 4, 30);
|
|
52
|
+
const maxHeight = Param.number('maxHeight', 100, 40, 160);
|
|
53
|
+
const spread = Param.number('spread', 55, 20, 100);
|
|
54
54
|
|
|
55
55
|
// ---------------------------------------------------------------------------
|
|
56
56
|
// PRNG
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* A spiraling tower of boxes arranged in a golden-ratio pattern,
|
|
5
5
|
* like a computational sunflower reaching for the sky.
|
|
6
6
|
*
|
|
7
|
-
* Demonstrates: scene(),
|
|
7
|
+
* Demonstrates: scene(), Param.number() integration, dramatic lighting,
|
|
8
8
|
* bloom post-processing, and fog depth.
|
|
9
9
|
*/
|
|
10
10
|
|
|
@@ -31,9 +31,9 @@ scene({
|
|
|
31
31
|
fog: { color: '#050510', near: 300, far: 800 },
|
|
32
32
|
|
|
33
33
|
postProcessing: {
|
|
34
|
-
bloom: { intensity:
|
|
34
|
+
bloom: { intensity: Param.number('bloom', 0.8, 0, 3), threshold: 0.7, radius: 0.6 },
|
|
35
35
|
vignette: { darkness: 0.6, offset: 0.4 },
|
|
36
|
-
toneMappingExposure:
|
|
36
|
+
toneMappingExposure: Param.number('exposure', 1.4, 0.5, 3),
|
|
37
37
|
},
|
|
38
38
|
|
|
39
39
|
capture: {
|
|
@@ -45,11 +45,11 @@ scene({
|
|
|
45
45
|
// ---------------------------------------------------------------------------
|
|
46
46
|
// Parameters
|
|
47
47
|
// ---------------------------------------------------------------------------
|
|
48
|
-
const count =
|
|
49
|
-
const towerHeight =
|
|
50
|
-
const spiralTightness =
|
|
51
|
-
const maxRadius =
|
|
52
|
-
const elementScale =
|
|
48
|
+
const count = Param.number('elements', 120, 20, 300);
|
|
49
|
+
const towerHeight = Param.number('height', 200, 50, 400);
|
|
50
|
+
const spiralTightness = Param.number('tightness', 2.5, 0.5, 6);
|
|
51
|
+
const maxRadius = Param.number('radius', 60, 20, 120);
|
|
52
|
+
const elementScale = Param.number('scale', 1.0, 0.3, 2.0);
|
|
53
53
|
|
|
54
54
|
// ---------------------------------------------------------------------------
|
|
55
55
|
// Golden Ratio Spiral
|
|
@@ -32,10 +32,10 @@ scene({
|
|
|
32
32
|
fog: { color: '#0a0000', near: 200, far: 500 },
|
|
33
33
|
|
|
34
34
|
postProcessing: {
|
|
35
|
-
bloom: { intensity:
|
|
35
|
+
bloom: { intensity: Param.number('bloom', 2.0, 0, 5), threshold: 0.3, radius: 0.8 },
|
|
36
36
|
vignette: { darkness: 0.9, offset: 0.2 },
|
|
37
37
|
grain: { intensity: 0.06 },
|
|
38
|
-
toneMappingExposure:
|
|
38
|
+
toneMappingExposure: Param.number('exposure', 1.8, 0.5, 4),
|
|
39
39
|
},
|
|
40
40
|
|
|
41
41
|
capture: {
|
|
@@ -48,10 +48,10 @@ scene({
|
|
|
48
48
|
// ---------------------------------------------------------------------------
|
|
49
49
|
// Parameters
|
|
50
50
|
// ---------------------------------------------------------------------------
|
|
51
|
-
const seed =
|
|
52
|
-
const pillarCount =
|
|
53
|
-
const maxHeight =
|
|
54
|
-
const baseRadius =
|
|
51
|
+
const seed = Param.number('seed', 42, 0, 100);
|
|
52
|
+
const pillarCount = Param.number('pillars', 18, 5, 40);
|
|
53
|
+
const maxHeight = Param.number('maxHeight', 90, 30, 150);
|
|
54
|
+
const baseRadius = Param.number('baseRadius', 50, 20, 100);
|
|
55
55
|
|
|
56
56
|
// ---------------------------------------------------------------------------
|
|
57
57
|
// PRNG
|
|
@@ -32,10 +32,10 @@ scene({
|
|
|
32
32
|
fog: { color: '#000814', near: 250, far: 600 },
|
|
33
33
|
|
|
34
34
|
postProcessing: {
|
|
35
|
-
bloom: { intensity:
|
|
35
|
+
bloom: { intensity: Param.number('bloom', 1.5, 0, 4), threshold: 0.5, radius: 0.7 },
|
|
36
36
|
vignette: { darkness: 0.8, offset: 0.25 },
|
|
37
37
|
grain: { intensity: 0.08 },
|
|
38
|
-
toneMappingExposure:
|
|
38
|
+
toneMappingExposure: Param.number('exposure', 1.5, 0.5, 4),
|
|
39
39
|
},
|
|
40
40
|
|
|
41
41
|
capture: {
|
|
@@ -48,11 +48,11 @@ scene({
|
|
|
48
48
|
// ---------------------------------------------------------------------------
|
|
49
49
|
// Parameters
|
|
50
50
|
// ---------------------------------------------------------------------------
|
|
51
|
-
const seed =
|
|
52
|
-
const stalkCount =
|
|
53
|
-
const maxStalkH =
|
|
54
|
-
const clusterSpread =
|
|
55
|
-
const tipScale =
|
|
51
|
+
const seed = Param.number('seed', 7, 0, 100);
|
|
52
|
+
const stalkCount = Param.number('stalks', 25, 5, 60);
|
|
53
|
+
const maxStalkH = Param.number('maxHeight', 80, 30, 150);
|
|
54
|
+
const clusterSpread = Param.number('spread', 60, 20, 120);
|
|
55
|
+
const tipScale = Param.number('tipSize', 1.5, 0.5, 3);
|
|
56
56
|
|
|
57
57
|
// ---------------------------------------------------------------------------
|
|
58
58
|
// PRNG
|
|
@@ -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 =
|
|
9
|
-
const bedD =
|
|
10
|
-
const bedThick =
|
|
11
|
-
const frameMargin =
|
|
12
|
-
const beam =
|
|
13
|
-
const frameH =
|
|
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 =
|
|
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 =
|
|
36
|
+
const gantryY = Param.number("Gantry Y", 0, { min: -gantryTravel, max: gantryTravel, unit: "mm" });
|
|
37
37
|
const headTravel = innerW / 2 - 50;
|
|
38
|
-
const headX =
|
|
38
|
+
const headX = Param.number("Nozzle X", 0, { min: -headTravel, max: headTravel, unit: "mm" });
|
|
39
39
|
|
|
40
40
|
// ─── Colors ───
|
|
41
41
|
const C = {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
// Robot Hand — functional, buildable concept
|
|
2
2
|
// Z-up, Y depth (front = -Y)
|
|
3
3
|
|
|
4
|
-
const scale =
|
|
5
|
-
const curl =
|
|
6
|
-
const thumbCurl =
|
|
7
|
-
const spread =
|
|
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;
|
|
@@ -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 =
|
|
22
|
-
const numBlades =
|
|
23
|
-
const pitchAngle =
|
|
24
|
-
const maxChord =
|
|
25
|
-
const hubDiameter =
|
|
26
|
-
const meshRes =
|
|
27
|
-
const showSections =
|
|
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;
|
|
@@ -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 =
|
|
7
|
-
const length =
|
|
8
|
-
const pitch =
|
|
9
|
-
const headH =
|
|
10
|
-
const headAF =
|
|
11
|
-
const nutHeight =
|
|
12
|
-
const nutAF =
|
|
13
|
-
const showNut =
|
|
14
|
-
const nutPos =
|
|
15
|
-
const segments =
|
|
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 =
|
|
5
|
-
const doorH =
|
|
6
|
-
const doorT =
|
|
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 =
|
|
9
|
-
const frameD =
|
|
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 =
|
|
12
|
-
const hingeH =
|
|
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(
|