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.
- package/README.md +3 -12
- package/dist/assets/{AdminPage-CeqCUUgu.js → AdminPage-D4bocK4E.js} +250 -151
- package/dist/assets/{BlogPage-P_AJP0v9.js → BlogPage-CJEXL_zJ.js} +94 -70
- package/dist/assets/{DocsPage-CKRV2iq2.js → DocsPage-D3A_g8V3.js} +329 -163
- package/dist/assets/{EditorApp-CnC2k4cW.css → EditorApp-BWYUSpUN.css} +590 -136
- package/dist/assets/EditorApp-Cihhqcsq.js +11692 -0
- package/dist/assets/{EmbedViewer-DBlzmQ5i.js → EmbedViewer-kWjKaC_t.js} +2 -4
- package/dist/assets/LandingPageProofDriven-Bg2IUc3l.css +856 -0
- package/dist/assets/LandingPageProofDriven-DXkKlyhI.js +601 -0
- package/dist/assets/PricingPage-BsU5vzEx.js +232 -0
- package/dist/assets/{SettingsPage-BqCh9JcC.js → SettingsPage-PqvpAKIs.js} +129 -5
- package/dist/assets/{evalWorker-Ql-aKwLA.js → evalWorker-C-hzNUMy.js} +8949 -3161
- package/dist/assets/{Viewport-CoB46f5R.js → index-Pz321YAt.js} +38382 -7501
- package/dist/assets/{index-2hfs_ub0.css → index-ay13WNfa.css} +726 -53
- package/dist/assets/{javascript-DCxGoE5Y.js → javascript-DAl8Gmyo.js} +1 -1
- package/dist/assets/{manifold-CqNMHHKO.js → manifold-BcbjWLIo.js} +4 -3
- package/dist/assets/{manifold-Cce9wRFz.js → manifold-DBckbFgx.js} +1 -1
- package/dist/assets/{manifold-D6BeHIOo.js → manifold-O2AAGXyj.js} +1 -1
- package/dist/assets/{reportWorker-sFEFonXf.js → reportWorker-Dxr-5A7w.js} +8760 -3559
- package/dist/assets/{vendor-react-Dt7-aaJH.js → vendor-react-CG3i_wp0.js} +65 -8
- package/dist/docs/index.html +2 -2
- package/dist/docs-raw/CLI.md +341 -718
- package/dist/docs-raw/generated/assembly.md +699 -112
- package/dist/docs-raw/generated/concepts.md +1834 -1346
- package/dist/docs-raw/generated/core.md +1012 -1059
- package/dist/docs-raw/generated/curves.md +759 -116
- package/dist/docs-raw/generated/lib.md +43 -748
- package/dist/docs-raw/generated/output.md +139 -245
- package/dist/docs-raw/generated/sdf.md +208 -0
- package/dist/docs-raw/generated/sheet-metal.md +473 -21
- package/dist/docs-raw/generated/sketch.md +1518 -362
- package/dist/docs-raw/generated/viewport.md +368 -299
- package/dist/docs-raw/generated/wood.md +104 -0
- 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 +12321 -5700
- package/dist-cli/forgecad.js.map +1 -0
- package/dist-cli/solver-46FFSK2U.js +363 -0
- package/dist-cli/solver-46FFSK2U.js.map +1 -0
- package/dist-skill/CONTEXT.md +4890 -6302
- package/dist-skill/SKILL-dev.md +22 -66
- package/dist-skill/SKILL.md +20 -59
- package/dist-skill/docs/API/core/concepts.md +37 -92
- package/dist-skill/docs/CLI.md +341 -718
- package/dist-skill/docs/generated/assembly.md +699 -112
- package/dist-skill/docs/generated/core.md +1012 -1059
- package/dist-skill/docs/generated/curves.md +759 -116
- package/dist-skill/docs/generated/lib.md +43 -748
- package/dist-skill/docs/generated/output.md +139 -245
- package/dist-skill/docs/generated/sdf.md +208 -0
- package/dist-skill/docs/generated/sheet-metal.md +473 -21
- package/dist-skill/docs/generated/sketch.md +1518 -362
- package/dist-skill/docs/generated/viewport.md +368 -299
- package/dist-skill/docs/generated/wood.md +104 -0
- package/dist-skill/docs/guides/coordinate-system.md +11 -17
- package/dist-skill/docs/guides/geometry-conventions.md +13 -70
- package/dist-skill/docs/guides/joint-design.md +78 -0
- package/dist-skill/docs/guides/modeling-recipes.md +22 -195
- package/dist-skill/docs/guides/positioning.md +88 -147
- package/dist-skill/docs-dev/API/core/concepts.md +78 -0
- package/dist-skill/docs-dev/CLI.md +488 -0
- package/dist-skill/{docs → docs-dev}/blueprint-first.md +5 -0
- package/dist-skill/{docs → docs-dev}/coding-best-practices.md +6 -8
- package/dist-skill/{docs → docs-dev}/coding.md +2 -4
- package/dist-skill/docs-dev/component-model.md +164 -0
- package/dist-skill/docs-dev/generated/assembly.md +779 -0
- package/dist-skill/docs-dev/generated/core.md +1676 -0
- package/dist-skill/docs-dev/generated/curves.md +855 -0
- package/dist-skill/docs-dev/generated/lib.md +55 -0
- package/dist-skill/docs-dev/generated/output.md +234 -0
- package/dist-skill/docs-dev/generated/sdf.md +208 -0
- package/dist-skill/docs-dev/generated/sheet-metal.md +506 -0
- package/dist-skill/docs-dev/generated/sketch.md +1753 -0
- package/dist-skill/docs-dev/generated/viewport.md +513 -0
- package/dist-skill/docs-dev/generated/wood.md +104 -0
- package/dist-skill/docs-dev/guides/coordinate-system.md +46 -0
- package/dist-skill/docs-dev/guides/geometry-conventions.md +52 -0
- package/dist-skill/docs-dev/guides/joint-design.md +78 -0
- package/dist-skill/docs-dev/guides/modeling-recipes.md +77 -0
- package/dist-skill/docs-dev/guides/positioning.md +151 -0
- package/dist-skill/{docs → docs-dev}/guides/skill-maintenance.md +21 -10
- package/dist-skill/{docs → docs-dev}/internals/compiler.md +5 -6
- package/dist-skill/{docs → docs-dev}/internals/constraint-solver-quality.md +0 -1
- package/dist-skill/{docs → docs-dev}/internals/constraint-solver.md +0 -1
- package/dist-skill/{docs → docs-dev}/internals/sketch-2d-pipeline.md +2 -3
- package/examples/api/attachTo-basics.forge.js +8 -8
- 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 +5 -5
- package/examples/api/bounding-box-visualizer.forge.js +3 -3
- package/examples/api/clone-duplicate.forge.js +2 -2
- package/examples/api/colors-union-vs-array.forge.js +6 -6
- package/examples/api/connector-assembly.forge.js +8 -6
- package/examples/api/connector-basics.forge.js +7 -7
- 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 +8 -14
- package/examples/api/feature-created-faces.forge.js +6 -10
- package/examples/api/fillet-showcase.forge.js +2 -2
- package/examples/api/folded-service-panel-cover.forge.js +2 -2
- package/examples/api/gears-tier1.forge.js +5 -5
- package/examples/api/group-test.forge.js +3 -3
- package/examples/api/group-vs-union.forge.js +1 -1
- package/examples/api/highlight-debug.forge.js +4 -0
- package/examples/api/js-module-pillars.js +1 -1
- package/examples/api/js-module-scene.js +2 -2
- package/examples/api/mesh-import-slats.forge.js +4 -4
- package/examples/api/patterns.forge.js +3 -3
- package/examples/api/pointAlong-orientation.forge.js +3 -3
- package/examples/api/profile-2020-b-slot6.forge.js +4 -5
- package/examples/api/route-perimeter-flange.forge.js +1 -1
- package/examples/api/sdf-rover-demo.forge.js +10 -10
- package/examples/api/sketch-on-face-demo.forge.js +2 -2
- package/examples/api/sketch-regions.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 +4 -4
- package/examples/api/variable-sweep-pure-sdf-test.forge.js +162 -0
- package/examples/api/variable-sweep-test.forge.js +2 -2
- package/examples/api/wood-joinery.forge.js +60 -0
- package/examples/compiler-corpus/enclosure-shell-cuts.forge.js +3 -3
- package/examples/compiler-corpus/fastener-plate-variants.forge.js +2 -2
- 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/experiments/drone-arm.forge.js +53 -0
- package/examples/furniture/adjustable-table.forge.js +15 -15
- package/examples/furniture/bathroom.forge.js +26 -26
- package/examples/furniture/chair.forge.js +13 -13
- 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 +9 -9
- package/examples/generative/frost-spires.forge.js +9 -9
- package/examples/generative/golden-spiral-tower.forge.js +11 -11
- 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 +37 -37
- package/examples/mechanical/5-finger-robot-hand.forge.js +19 -19
- package/examples/mechanical/airplane-propeller.forge.js +9 -9
- 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 +15 -11
- package/examples/mechanical/headphone-hanger-v2.forge.js +11 -11
- package/examples/mechanical/robot_hand.forge.js +24 -24
- package/examples/mechanical/robot_hand_2.forge.js +26 -26
- package/examples/nurbs-surface.forge.js +8 -0
- package/examples/nurbs-tube.forge.js +7 -0
- package/examples/products/bottle.forge.js +8 -8
- package/examples/products/chess-set.forge.js +25 -25
- package/examples/products/classical-piano.forge.js +20 -20
- package/examples/products/clock.forge.js +33 -33
- package/examples/products/cup.forge.js +5 -5
- package/examples/products/iphone.forge.js +20 -20
- package/examples/products/laptop.forge.js +24 -24
- 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 +23 -23
- package/examples/products/origami-fish.forge.js +14 -12
- package/examples/products/spiderman-cake.forge.js +6 -6
- package/examples/shelf/container.forge.js +5 -5
- package/examples/shelf/shelf-unit.forge.js +6 -6
- package/examples/toolbox/bolted-joint.forge.js +7 -7
- package/package.json +9 -4
- package/dist/assets/EditorApp-B-vQvgam.js +0 -9888
- package/dist/assets/LandingPage-C5n9hDXI.js +0 -322
- package/dist/assets/PublishedModelPage-Dt7PCVBj.js +0 -146
- package/dist/assets/__vite-browser-external-CURh0WXD.js +0 -8
- package/dist/assets/deserializeRunResult-BLAFoiE0.js +0 -19365
- package/dist/assets/index-1CYp3zUp.js +0 -1455
- package/dist-skill/docs/API/API.md +0 -1666
- package/dist-skill/docs/API/README.md +0 -37
- package/dist-skill/docs/API/assembly/assembly.md +0 -617
- package/dist-skill/docs/API/core/edge-queries.md +0 -130
- package/dist-skill/docs/API/core/parameters.md +0 -122
- package/dist-skill/docs/API/core/reserved-terms.md +0 -137
- package/dist-skill/docs/API/core/sdf.md +0 -326
- package/dist-skill/docs/API/core/skill-cli.md +0 -194
- package/dist-skill/docs/API/core/skill-guide.md +0 -205
- package/dist-skill/docs/API/core/specs.md +0 -186
- package/dist-skill/docs/API/core/topology.md +0 -372
- package/dist-skill/docs/API/entities.md +0 -268
- package/dist-skill/docs/API/output/bom.md +0 -58
- package/dist-skill/docs/API/output/brep-export.md +0 -87
- package/dist-skill/docs/API/output/dimensions.md +0 -67
- package/dist-skill/docs/API/output/export.md +0 -110
- package/dist-skill/docs/API/output/gcode.md +0 -195
- package/dist-skill/docs/API/runtime/viewport.md +0 -420
- package/dist-skill/docs/API/sheet-metal/sheet-metal.md +0 -185
- package/dist-skill/docs/API/sketch/anchor.md +0 -37
- package/dist-skill/docs/API/sketch/booleans.md +0 -91
- package/dist-skill/docs/API/sketch/core.md +0 -73
- package/dist-skill/docs/API/sketch/extrude.md +0 -62
- package/dist-skill/docs/API/sketch/on-face.md +0 -104
- package/dist-skill/docs/API/sketch/operations.md +0 -78
- package/dist-skill/docs/API/sketch/path.md +0 -75
- package/dist-skill/docs/API/sketch/primitives.md +0 -146
- package/dist-skill/docs/API/sketch/regions.md +0 -80
- package/dist-skill/docs/API/sketch/text.md +0 -108
- package/dist-skill/docs/API/sketch/transforms.md +0 -65
- package/dist-skill/docs/API/toolbox/fasteners.md +0 -129
- package/dist-skill/docs/INDEX.md +0 -94
- package/dist-skill/docs/RELEASING.md +0 -55
- package/dist-skill/docs/cli-monetization.md +0 -111
- package/dist-skill/docs/deployment.md +0 -281
- package/dist-skill/docs/generated/concepts.md +0 -2112
- package/dist-skill/docs/internals/shape-from-slices.md +0 -152
- package/dist-skill/docs/platform/admin.md +0 -45
- package/dist-skill/docs/platform/architecture.md +0 -79
- package/dist-skill/docs/platform/auth.md +0 -110
- package/dist-skill/docs/platform/email.md +0 -67
- package/dist-skill/docs/platform/projects.md +0 -111
- package/dist-skill/docs/platform/sharing.md +0 -90
- 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 =
|
|
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 = {
|
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
97
|
-
box(42, 42, 40
|
|
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
|
|
107
|
-
const glass = box(bedW - 6, bedD - 6, glassThick
|
|
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
|
|
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
|
|
120
|
-
box(24, 24, 16
|
|
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
|
|
152
|
-
box(28, 32, 18
|
|
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
|
|
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
|
|
167
|
-
box(xRailLen, 2, 3
|
|
168
|
-
box(2, yRailLen, 3
|
|
169
|
-
box(2, yRailLen, 3
|
|
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
|
|
177
|
-
box(motorSize, motorSize, motorSize
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
229
|
-
box(10, 20, 50
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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;
|
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
177
|
-
const palmPad = box(palmW * 0.6, 3 * scale, palmH * 0.5
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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;
|
|
@@ -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.
|
|
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
|
-
.
|
|
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 =
|
|
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(
|
|
@@ -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 =
|
|
5
|
-
const depth =
|
|
6
|
-
const height =
|
|
7
|
-
const wall =
|
|
8
|
-
const outerR =
|
|
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
|
-
|
|
16
|
-
|
|
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(
|
|
34
|
-
screwBoss(inset,
|
|
35
|
-
screwBoss(
|
|
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 =
|
|
6
|
-
const clampDepth =
|
|
7
|
-
const width =
|
|
8
|
-
const thick =
|
|
9
|
-
const hookDrop =
|
|
10
|
-
const hookLen =
|
|
11
|
-
const hookCurveR =
|
|
12
|
-
const padThick =
|
|
13
|
-
const boltHoleD =
|
|
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
|
-
.
|
|
52
|
-
.
|
|
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 =
|
|
9
|
-
const fingerSpread =
|
|
10
|
-
const thumbOpposition =
|
|
11
|
-
const wristPitch =
|
|
12
|
-
const explode =
|
|
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 =
|
|
15
|
-
const pinD =
|
|
16
|
-
const jointClearance =
|
|
17
|
-
const wall =
|
|
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
|
|
65
|
-
const right = box(lugW, depth, height
|
|
66
|
-
const bridge = box(width, depth * 0.55, height * 0.55
|
|
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
|
|
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
|
|
92
|
-
const bottomRib = box(width * 0.36, length * 0.72, thick * 0.18
|
|
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
|
-
.
|
|
161
|
-
.
|
|
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
|
-
.
|
|
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
|
|
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
|
-
.
|
|
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
|
-
.
|
|
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
|
|
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
|
|
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
|
-
.
|
|
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
|
|