1
0
mirror of https://github.com/nophead/NopSCADlib.git synced 2025-08-07 07:56:30 +02:00

Added simple Gridfinity generator and examples.

This commit is contained in:
Chris Palmer
2025-04-15 13:05:59 +01:00
parent 86df9a34d6
commit bd94182ff1
39 changed files with 184345 additions and 20 deletions

1
.gitignore vendored
View File

@@ -12,3 +12,4 @@ times.txt
*_diff.png
*.echo
cmd_times.txt
*.gco

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View File

View File

@@ -0,0 +1,49 @@
[
{
"name": "main_assembly",
"big": null,
"ngb": false,
"zoomed": 0,
"count": 1,
"assemblies": {},
"vitamins": {},
"printed": {
"lathe_tool_stand.stl": {
"count": 1,
"colour": "[0, 0.572549, 0]",
"camera": "0,0,0,70,0,315,500"
},
"MT2_stand.stl": {
"count": 1,
"colour": "[0, 0.572549, 0]",
"camera": "0,0,0,70,0,315,500"
},
"chuck_stand.stl": {
"count": 1,
"colour": "[0, 0.572549, 0]",
"camera": "0,0,0,70,0,315,500"
},
"chuck_jaw_bin.stl": {
"count": 1,
"colour": "[0, 0.572549, 0]",
"camera": "0,0,0,70,0,315,500"
},
"1x1_bin.stl": {
"count": 1,
"colour": "[0, 0.572549, 0]",
"camera": "0,0,0,70,0,315,500"
},
"123_block_stand.stl": {
"count": 1,
"colour": "[0, 0.572549, 0]",
"camera": "0,0,0,70,0,315,500"
},
"faceplate_stand.stl": {
"count": 1,
"colour": "[0, 0.572549, 0]",
"camera": "0,0,0,70,0,315,500"
}
},
"routed": {}
}
]

View File

@@ -0,0 +1,15 @@
M
a
i
n
Printed:
1| 1 123_block_stand.stl
1| 1 1x1_bin.stl
1| 1 MT2_stand.stl
1| 1 chuck_jaw_bin.stl
1| 1 chuck_stand.stl
1| 1 faceplate_stand.stl
1| 1 lathe_tool_stand.stl
Assemblies:
1 main_assembly

View File

@@ -0,0 +1,9 @@
main_assembly:
Printed:
1 123_block_stand.stl
1 1x1_bin.stl
1 MT2_stand.stl
1 chuck_jaw_bin.stl
1 chuck_stand.stl
1 faceplate_stand.stl
1 lathe_tool_stand.stl

View File

@@ -0,0 +1,64 @@
<a name="TOP"></a>
# Gridfinity
Gridfinity examples
![Main Assembly](assemblies/main_assembled.png)
<span></span>
---
## Table of Contents
1. [Parts list](#Parts_list)
1. [Main Assembly](#main_assembly)
<span></span>
[Top](#TOP)
---
<a name="Parts_list"></a>
## Parts list
| <span style="writing-mode: vertical-rl; text-orientation: mixed;">Main</span> | <span style="writing-mode: vertical-rl; text-orientation: mixed;">TOTALS</span> | |
|---:|---:|:---|
| | | **3D printed parts** |
| &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;123_block_stand.stl |
| &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;1x1_bin.stl |
| &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;MT2_stand.stl |
| &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;chuck_jaw_bin.stl |
| &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;chuck_stand.stl |
| &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;faceplate_stand.stl |
| &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;lathe_tool_stand.stl |
| &nbsp;&nbsp;7&nbsp; | &nbsp;&nbsp;7&nbsp; | &nbsp;&nbsp;Total 3D printed parts count |
<span></span>
[Top](#TOP)
---
<a name="main_assembly"></a>
## Main Assembly
### 3D Printed parts
| 1 x 123_block_stand.stl | 1 x 1x1_bin.stl | 1 x MT2_stand.stl |
|---|---|---|
| ![123_block_stand.stl](stls/123_block_stand.png) | ![1x1_bin.stl](stls/1x1_bin.png) | ![MT2_stand.stl](stls/MT2_stand.png)
| 1 x chuck_jaw_bin.stl | 1 x chuck_stand.stl | 1 x faceplate_stand.stl |
|---|---|---|
| ![chuck_jaw_bin.stl](stls/chuck_jaw_bin.png) | ![chuck_stand.stl](stls/chuck_stand.png) | ![faceplate_stand.stl](stls/faceplate_stand.png)
| 1 x lathe_tool_stand.stl |
|---|
| ![lathe_tool_stand.stl](stls/lathe_tool_stand.png)
### Assembly instructions
![main_assembly](assemblies/main_assembly.png)
Show all the Gridfinity parts
![main_assembled](assemblies/main_assembled.png)
<span></span>
[Top](#TOP)

View File

@@ -0,0 +1,58 @@
include <NopSCADlib/core.scad>
use <NopSCADlib/printed/gridfinity.scad>
use <NopSCADlib/utils/maths.scad>
use <NopSCADlib/utils/chamfer.scad>
tool_size = 8;
box = gridfinity_bin("123_block_stand", 2, 2, 5);
123_block = inch([3, 1, 2]);
102040_block = [20, 10, 40];
blocks = [123_block, 123_block, 102040_block];
box_mm = gridfinity_bin_size_mm(box);
wall = 1.75;
bwall = 1;
clearance = 0.5;
gap = (box_mm.y - sumv([for(b = blocks) b.y])) / (len(blocks) + 1);
module holes() {
let($b = blocks[0])
translate([0, box_mm.y / 2 - gap - $b.y / 2])
children();
let($b = blocks[1])
translate([0, box_mm.y / 2 - gap - blocks[0].y - gap - $b.y / 2])
children();
for(side = [-1, 1])
let($b = blocks[2])
translate([side * (blocks[2].x + 2 * gap) / 2,
box_mm.y / 2 - gap - blocks[0].y - gap - blocks[1].y - gap - blocks[2].y / 2 ])
children();
}
module 123_block_stand_stl()
gridfinity_bin(box) union() {
holes() {
translate_z(gridfinity_base_z() + bwall + $b.z / 2 + eps)
cube([$b.x + clearance, $b.y + clearance, $b.z + 2 * eps], true);
chamfer = 1;
translate_z(box_mm.z)
chamfer_hole(chamfer)
square([$b.x + clearance, $b.y + clearance], true);
}
translate_z(gridfinity_base_z() + bwall)
difference() {
rounded_rectangle([box_mm.x - 2 * wall, box_mm.y - 2 * wall, box_mm.z - gridfinity_base_z() - bwall - wall], gridfinity_corner_r() - wall);
holes()
rounded_rectangle([$b.x + clearance + 2 * wall, $b.y + clearance + 2 * wall, 100], wall, center = true);
}
}

View File

@@ -0,0 +1,9 @@
include <NopSCADlib/core.scad>
use <NopSCADlib/printed/gridfinity.scad>
box = gridfinity_bin("1x1_bin", 1, 1, 5);
module 1x1_bin_stl()
gridfinity_bin(box)
gridfinity_partition(box, 1, 1);

View File

@@ -0,0 +1,80 @@
//
// Stand for MT2 taper lathe tools
//
include <NopSCADlib/core.scad>
use <NopSCADlib/utils/maths.scad>
use <NopSCADlib/utils/chamfer.scad>
use <NopSCADlib/printed/gridfinity.scad>
box = gridfinity_bin("MT2_stand", 4, 2, 8);
box_mm = gridfinity_bin_size_mm(box);
wall = 1.75;
bwall = 1;
diameters1 = [43, 47, 64];
d2 = 20;
clearance = 1;
clearance2 = 4;
MT2_base = 5; // smaller diameters
MT2_D1 = 15; // diameter at the bottom of the taper at base height
MT2_half_angle = 1.4302777777777778;
hole_depth = box_mm.z - gridfinity_base_z() - bwall;
MT2_r1 = MT2_D1 / 2;
MT2_r2 = MT2_r1 + (hole_depth - MT2_base) * tan(MT2_half_angle);
gap = (box_mm.x - sumv(diameters1) - 2 * clearance) / (len(diameters1) - 1);
gap2 = 18;
module MT2_socket() {
clearance = 0.3;
translate_z(-hole_depth) {
poly_cylinder(MT2_r1 + clearance / 2, MT2_base + eps);
translate_z(MT2_base)
hull() {
poly_cylinder(MT2_r1 + clearance / 2, eps);
translate_z(hole_depth - MT2_base)
poly_cylinder(MT2_r2 + clearance / 2, eps);
}
}
chamfer_hole(1)
poly_circle(MT2_r2 + clearance / 2);
}
function pos(i) = [clearance + sumv(slice(diameters1, 0, i)) + i * gap + diameters1[i] / 2 - box_mm.x / 2, box_mm.y / 2 - clearance - diameters1[i] / 2, box_mm.z];
function pos2(i) = [clearance2 + i * gap2 + (i + 0.5) * d2 - box_mm.x / 2, -box_mm.y / 2 + clearance2 + d2 / 2, box_mm.z];
module holes()
for(i = [0 : len(diameters1) - 1]) {
translate(pos(i))
children();
translate(pos2(i))
children();
}
module MT2_stand_stl()
gridfinity_bin(box) union() {
holes()
MT2_socket();
translate_z(gridfinity_base_z() + bwall)
difference() {
rounded_rectangle([box_mm.x - 2 * wall, box_mm.y - 2 * wall, box_mm.z - gridfinity_base_z() - bwall - wall], gridfinity_corner_r() - wall);
holes()
cylinder(r = MT2_r2 + wall, h = 200, center = true);
for(x = [-box_mm.x / 2 : 20 : box_mm.x /2])
translate([x, 0])
cube([squeezed_wall, 200, 200], center = true);
}
}

View File

@@ -0,0 +1,36 @@
include <NopSCADlib/core.scad>
use <NopSCADlib/utils/chamfer.scad>
use <NopSCADlib/printed/gridfinity.scad>
box = gridfinity_bin("chuck_jaw_bin", 1, 1, 5);
box_mm = gridfinity_bin_size_mm(box);
bwall = 1;
length = 37;
width = 34;
z_bot = gridfinity_base_z() + bwall;
depth = box_mm.z - z_bot;
module chuck_jaw_bin_stl()
gridfinity_bin(box)
translate_z(box_mm.z) {
cube([length, width, depth * 2], true);
chamfer = 1;
chamfer_hole(chamfer)
square([length, width], true);
*hull() {
rounded_rectangle([length + 2 * chamfer, width + 2 * chamfer, eps], chamfer);
translate_z(-chamfer + eps / 2)
cube([length, width, eps], true);
}
}

View File

@@ -0,0 +1,52 @@
include <NopSCADlib/core.scad>
use <NopSCADlib/printed/gridfinity.scad>
use <NopSCADlib/utils/chamfer.scad>
box = gridfinity_bin("chuck_stand", 2, 2, 5);
box_mm = gridfinity_bin_size_mm(box);
bwall = 1;
chuck_d = 80;
ring_od = 50;
ring_id = 40;
ring_h = 4;
hole_pitch = (60 + 72.5) / 2;
hole_d = (72.5 - 60) / 2;
hole_depth = 15;
clearance = 0.5;
chamfer = 1;
z_bot = gridfinity_base_z() + bwall;
module chuck_stand_stl()
gridfinity_bin(box) union() {
translate_z(z_bot) {
for(a = [0 : 30 : 330])
rotate(a)
translate([0, hole_pitch / 2]) {
poly_cylinder(hole_d / 2 + clearance / 2, h = 100);
translate_z(hole_depth)
chamfer_hole(chamfer)
poly_circle(hole_d / 2 + clearance / 2);
}
translate_z(hole_depth) {
poly_cylinder(r = chuck_d / 2 + clearance / 2, h = 100);
poly_tube(or = ring_od / 2 + clearance, ir = ring_id / 2 - clearance, h = 2 * ring_h, center = true);
chamfer_hole(chamfer)
poly_circle(ring_od / 2 + clearance);
}
}
translate_z(box_mm.z)
chamfer_hole(chamfer)
poly_circle(r = chuck_d / 2 + clearance / 2);
}

View File

@@ -0,0 +1,56 @@
include <NopSCADlib/core.scad>
use <NopSCADlib/printed/gridfinity.scad>
use <NopSCADlib/utils/maths.scad>
use <NopSCADlib/utils/chamfer.scad>
tool_size = 8;
box = gridfinity_bin("faceplate_stand", 3, 1, 5);
faceplate = [112, 16, 17];
sanding_disc = [69, 6.7, 14.5];
discs = [faceplate, sanding_disc];
box_mm = gridfinity_bin_size_mm(box);
wall = 1.8;
bwall = 1;
clearance = 0.5;
gap = (box_mm.y - sumv([for(b = discs) b.z])) / (len(discs) + 1);
module holes() {
for(i = [0 : len(discs) - 1]) let($d = discs[i])
translate([0, box_mm.y / 2 - gap - (i ? discs[0].z + gap : 0) - $d.z / 2])
children();
}
module faceplate_stand_stl()
gridfinity_bin(box) union() {
holes() {
$fa = 1;
r = $d.x / 2 + clearance / 2;
z = gridfinity_base_z() + bwall + r;
translate_z(z)
rotate([90, 0, 0])
teardrop_plus(r = r, h = $d.y + clearance, center = true);
chamfer = 1;
h = z - box_mm.z + wall;
translate_z(box_mm.z)
chamfer_hole(chamfer)
square([2 * sqrt(sqr(r) - sqr(h)), $d.y + clearance], true);
}
difference() {
translate_z(gridfinity_base_z() + bwall)
rounded_rectangle([box_mm.x - 2 * wall, box_mm.y - 2 * wall, box_mm.z - gridfinity_base_z() - bwall - wall], gridfinity_corner_r() - wall);
holes() {
r = $d.x / 2 + clearance / 2;
translate_z(gridfinity_base_z() + bwall + r)
rotate([90, 0, 0])
teardrop_plus(r = r + wall, h = $d.y + clearance + 2 * wall);
}
}
}

View File

@@ -0,0 +1,45 @@
include <NopSCADlib/core.scad>
use <NopSCADlib/printed/gridfinity.scad>
use <NopSCADlib/utils/chamfer.scad>
tool_size = 8;
rows = 2;
cols = 5;
spacing = 8;
hole = tool_size + 0.2;
tool_pitch = hole + spacing;
box = gridfinity_bin("lathe_tool_stand", 2, 1, 5);
module holes()
for(x = [0 : cols - 1], y = [0 : rows - 1])
translate([x - (cols -1) / 2, y - (rows - 1) / 2] * tool_pitch)
children();
box_mm = gridfinity_bin_size_mm(box);
wall = 1.75;
bwall = 1;
module lathe_tool_stand_stl()
gridfinity_bin(box) union() {
translate_z(box_mm.z)
holes() {
cube([hole, hole, 2 * (box_mm.z - gridfinity_base_z() - bwall)], true);
chamfer = 1;
chamfer_hole(chamfer)
square([hole, hole], true);
}
translate_z(gridfinity_base_z() + bwall)
difference() {
rounded_rectangle([box_mm.x - 2 * wall, box_mm.y - 2 * wall, box_mm.z - gridfinity_base_z() - bwall - wall], gridfinity_corner_r() - wall);
holes()
rounded_rectangle([hole + 2 * wall, hole + 2 * wall, 100], wall, center = true);
}
}

View File

@@ -0,0 +1,42 @@
//
//! Gridfinity examples
//
include <NopSCADlib/core.scad>
use <lathe_tool_stand.scad>
use <MT2_stand.scad>
use <chuck_stand.scad>
use <chuck_jaw_bin.scad>
use <1x1_bin.scad>
use <123_block_stand.scad>
use <faceplate_stand.scad>
//! Show all the Gridfinity parts
module main_assembly()
assembly("main") {
$manifold = true;
lathe_tool_stand_stl();
translate([42, 63])
MT2_stand_stl();
translate([42 * 2, -42 / 2])
chuck_stand_stl();
translate([-21, -42])
chuck_jaw_bin_stl();
translate([21, -42])
1x1_bin_stl();
translate([42 * 4, -42 / 2])
123_block_stand_stl();
translate([42 * 6.5, 0])
faceplate_stand_stl();
}
main_assembly();

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1022 KiB

After

Width:  |  Height:  |  Size: 1.0 MiB

View File

@@ -25,7 +25,7 @@
//! STL files for all the printed parts, DXF files for CNC routed parts in a project and a manual containing assembly
//! instructions and exploded views by scraping markdown embedded in OpenSCAD comments, [see scripts](scripts/readme.md).
//!
//! A simple example project can be found [here](examples/MainsBreakOutBox/readme.md).
//! A simple example project can be found [here](examples/MainsBreakOutBox/readme.md) and more complex examples [here](examples).
//!
//! For more examples of what it can make see the [gallery](gallery/readme.md).
//!
@@ -68,6 +68,7 @@ use <tests/fastons.scad>
use <tests/fuseholder.scad>
use <tests/gear_motors.scad>
use <tests/geared_steppers.scad>
use <tests/gridfinity.scad>
use <tests/hot_ends.scad>
use <tests/IECs.scad>
use <tests/inserts.scad>
@@ -204,7 +205,11 @@ pocket_y = handle_y + 70;
translate([x5 + 65, pocket_y])
pocket_handles();
hinge_y = pocket_y + 100;
gridfinity_y = pocket_y + 100;
translate([950, gridfinity_y])
gridfinity_test();
hinge_y = gridfinity_y + 100;
translate([x5, hinge_y]) {
door_hinges()
door_latches();
@@ -221,7 +226,6 @@ box_y = pbox_y + 150;
translate([950, box_y])
box_test();
inserts_y = 0;
nuts_y = inserts_y + 20;
washers_y = nuts_y + 160;

104
printed/gridfinity.scad Normal file
View File

@@ -0,0 +1,104 @@
//
// NopSCADlib Copyright Chris Palmer 2024
// nop.head@gmail.com
// hydraraptor.blogspot.com
//
// This file is part of NopSCADlib.
//
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
// GNU General Public License as published by the Free Software Foundation, either version 3 of
// the License, or (at your option) any later version.
//
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with NopSCADlib.
// If not, see <https://www.gnu.org/licenses/>.
//
//
//! Generate storage bins compatible with Zack Freedman's Gridfinity design, see <https://www.youtube.com/watch?v=ra_9zU-mnl8&t=37s>
//!
//! Based on <https://gridfinity.xyz/specification>
//!
//! More examples [here](examples/gridfinity).
//
include <../core.scad>
use <../utils/rounded_cylinder.scad>
pitch = 42;
z_step = 7;
width = 41.5;
foot_w = 37.2;
foot_h = 1.8;
lower_chamfer = 0.8;
upper_chamfer = 2.15;
corner_r = 7.5 / 2;
foot_r = 3.2 / 2;
chamfer_r = 1.6 / 2;
function gridfinity_bin(name, grid_x, grid_y, grid_z) = [name, [grid_x, grid_y, grid_z], lower_chamfer]; //! Constructor
function gridfinity_bin_name(type) = type[0]; //! Name for the STL file
function gridfinity_bin_size(type) = type[1]; //! Size in grid units
function gridfinity_base_z() = foot_h + lower_chamfer + upper_chamfer; //! height of base
function gridfinity_corner_r() = corner_r; //! Outside corner radius
function gridfinity_bin_size_mm(type) = //! Overall size of the bin
let(s = gridfinity_bin_size(type))
[(s.x - 1) * pitch + width, (s.y - 1) * pitch + width, s.z * z_step];
module gridfinity_bin(type) { //! Create a gridfinity bin, bits to cut out are passed as a child
size = gridfinity_bin_size(type);
w1 = width - 2 * (lower_chamfer + upper_chamfer);
w2 = width - 2 * upper_chamfer;
stl(gridfinity_bin_name(type)) {
translate([-(size.x - 1) / 2 * pitch, -(size.y - 1) / 2 * pitch])
for(x = [0 : size.x - 1], y = [0 : size.y - 1])
translate([x * pitch, y * pitch]) {
hull() {
rounded_rectangle([w1, w1, eps], chamfer_r);
translate_z(lower_chamfer)
rounded_rectangle([w2, w2, foot_h + eps], foot_r);
}
hull() {
translate_z(lower_chamfer + foot_h)
rounded_rectangle([w2, w2, foot_h + eps], foot_r);
translate_z(lower_chamfer + foot_h + upper_chamfer)
rounded_rectangle([width, width, eps], corner_r);
}
}
difference() {
base_z = gridfinity_base_z();
translate_z(base_z)
rounded_rectangle([(size.x - 1) * pitch + width, (size.y - 1) * pitch + width, size.z * z_step - base_z], corner_r);
if($children)
children(0);
}
}
}
module gridfinity_partition(type, cols = 1, rows = 1, wall = 1.6, iwall = squeezed_wall, bwall = 1, corner_r = 4) { //! Passed as child to hollow out specified partitions
size = gridfinity_bin_size_mm(type);
wx = (size.x - 2 * wall - (cols - 1) * iwall) / cols;
wy = (size.y - 2 * wall - (rows - 1) * iwall) / rows;
h = size.z - gridfinity_base_z() - bwall;
for(x = [0 : cols - 1], y = [0 : rows - 1])
translate([-size.x / 2 + wall + x * (wx + iwall) + wx / 2,
-size.y / 2 + wall + y * (wy + iwall) + wy / 2,
size.z + eps])
vflip()
rounded_top_rectangle([wx, wy, h + eps], corner_r, corner_r);
}

View File

@@ -6,7 +6,7 @@ There are also Python scripts to generate Bills of Materials (BOMs),
STL files for all the printed parts, DXF files for CNC routed parts in a project and a manual containing assembly
instructions and exploded views by scraping markdown embedded in OpenSCAD comments, [see scripts](scripts/readme.md).
A simple example project can be found [here](examples/MainsBreakOutBox/readme.md).
A simple example project can be found [here](examples/MainsBreakOutBox/readme.md) and more complex examples [here](examples).
For more examples of what it can make see the [gallery](gallery/readme.md).
@@ -35,21 +35,21 @@ A list of changes classified as breaking, additions or fixes is maintained in [C
<tr><td> <a href = "#buttons">Buttons</a> </td><td> <a href = "#microswitches">Microswitches</a> </td><td> <a href = "#sealing_strip">Sealing_strip</a> </td><td> <a href = "#fixing_block">Fixing_block</a> </td><td> <a href = "#layout">Layout</a> </td><td></td></tr>
<tr><td> <a href = "#cable_strips">Cable_strips</a> </td><td> <a href = "#microview">Microview</a> </td><td> <a href = "#servo_motors">Servo_motors</a> </td><td> <a href = "#flat_hinge">Flat_hinge</a> </td><td> <a href = "#maths">Maths</a> </td><td></td></tr>
<tr><td> <a href = "#cameras">Cameras</a> </td><td> <a href = "#modules">Modules</a> </td><td> <a href = "#shaft_couplings">Shaft_couplings</a> </td><td> <a href = "#foot">Foot</a> </td><td> <a href = "#offset">Offset</a> </td><td></td></tr>
<tr><td> <a href = "#circlips">Circlips</a> </td><td> <a href = "#nuts">Nuts</a> </td><td> <a href = "#sheets">Sheets</a> </td><td> <a href = "#handle">Handle</a> </td><td> <a href = "#pcb_utils">PCB_utils</a> </td><td></td></tr>
<tr><td> <a href = "#components">Components</a> </td><td> <a href = "#o_ring">O_ring</a> </td><td> <a href = "#spades">Spades</a> </td><td> <a href = "#knob">Knob</a> </td><td> <a href = "#quadrant">Quadrant</a> </td><td></td></tr>
<tr><td> <a href = "#dip">DIP</a> </td><td> <a href = "#opengrab">Opengrab</a> </td><td> <a href = "#spools">Spools</a> </td><td> <a href = "#led_bezel">LED_bezel</a> </td><td> <a href = "#round">Round</a> </td><td></td></tr>
<tr><td> <a href = "#d_connectors">D_connectors</a> </td><td> <a href = "#pcb">PCB</a> </td><td> <a href = "#springs">Springs</a> </td><td> <a href = "#pcb_mount">PCB_mount</a> </td><td> <a href = "#rounded_cylinder">Rounded_cylinder</a> </td><td></td></tr>
<tr><td> <a href = "#displays">Displays</a> </td><td> <a href = "#pcbs">PCBs</a> </td><td> <a href = "#stepper_motors">Stepper_motors</a> </td><td> <a href = "#psu_shroud">PSU_shroud</a> </td><td> <a href = "#rounded_polygon">Rounded_polygon</a> </td><td></td></tr>
<tr><td> <a href = "#extrusion_brackets">Extrusion_brackets</a> </td><td> <a href = "#psus">PSUs</a> </td><td> <a href = "#swiss_clips">Swiss_clips</a> </td><td> <a href = "#pocket_handle">Pocket_handle</a> </td><td> <a href = "#rounded_triangle">Rounded_triangle</a> </td><td></td></tr>
<tr><td> <a href = "#extrusions">Extrusions</a> </td><td> <a href = "#panel_meters">Panel_meters</a> </td><td> <a href = "#terminals">Terminals</a> </td><td> <a href = "#press_fit">Press_fit</a> </td><td> <a href = "#sector">Sector</a> </td><td></td></tr>
<tr><td> <a href = "#fans">Fans</a> </td><td> <a href = "#photo_interrupters">Photo_interrupters</a> </td><td> <a href = "#toggles">Toggles</a> </td><td> <a href = "#printed_box">Printed_box</a> </td><td> <a href = "#splines">Splines</a> </td><td></td></tr>
<tr><td> <a href = "#fastons">Fastons</a> </td><td> <a href = "#pillars">Pillars</a> </td><td> <a href = "#transformers">Transformers</a> </td><td> <a href = "#printed_pulleys">Printed_pulleys</a> </td><td> <a href = "#sweep">Sweep</a> </td><td></td></tr>
<tr><td> <a href = "#fuseholder">Fuseholder</a> </td><td> <a href = "#pillow_blocks">Pillow_blocks</a> </td><td> <a href = "#ttracks">Ttracks</a> </td><td> <a href = "#ribbon_clamp">Ribbon_clamp</a> </td><td> <a href = "#thread">Thread</a> </td><td></td></tr>
<tr><td> <a href = "#gear_motors">Gear_motors</a> </td><td> <a href = "#pin_headers">Pin_headers</a> </td><td> <a href = "#tubings">Tubings</a> </td><td> <a href = "#ssr_shroud">SSR_shroud</a> </td><td> <a href = "#tube">Tube</a> </td><td></td></tr>
<tr><td> <a href = "#geared_steppers">Geared_steppers</a> </td><td> <a href = "#potentiometers">Potentiometers</a> </td><td> <a href = "#variacs">Variacs</a> </td><td> <a href = "#screw_knob">Screw_knob</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#green_terminals">Green_terminals</a> </td><td> <a href = "#pulleys">Pulleys</a> </td><td> <a href = "#veroboard">Veroboard</a> </td><td> <a href = "#socket_box">Socket_box</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#ht_pipes">HT_pipes</a> </td><td></td><td> <a href = "#washers">Washers</a> </td><td> <a href = "#strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#hot_ends">Hot_ends</a> </td><td></td><td> <a href = "#wire">Wire</a> </td><td></td><td></td><td></td></tr>
<tr><td> <a href = "#circlips">Circlips</a> </td><td> <a href = "#nuts">Nuts</a> </td><td> <a href = "#sheets">Sheets</a> </td><td> <a href = "#gridfinity">Gridfinity</a> </td><td> <a href = "#pcb_utils">PCB_utils</a> </td><td></td></tr>
<tr><td> <a href = "#components">Components</a> </td><td> <a href = "#o_ring">O_ring</a> </td><td> <a href = "#spades">Spades</a> </td><td> <a href = "#handle">Handle</a> </td><td> <a href = "#quadrant">Quadrant</a> </td><td></td></tr>
<tr><td> <a href = "#dip">DIP</a> </td><td> <a href = "#opengrab">Opengrab</a> </td><td> <a href = "#spools">Spools</a> </td><td> <a href = "#knob">Knob</a> </td><td> <a href = "#round">Round</a> </td><td></td></tr>
<tr><td> <a href = "#d_connectors">D_connectors</a> </td><td> <a href = "#pcb">PCB</a> </td><td> <a href = "#springs">Springs</a> </td><td> <a href = "#led_bezel">LED_bezel</a> </td><td> <a href = "#rounded_cylinder">Rounded_cylinder</a> </td><td></td></tr>
<tr><td> <a href = "#displays">Displays</a> </td><td> <a href = "#pcbs">PCBs</a> </td><td> <a href = "#stepper_motors">Stepper_motors</a> </td><td> <a href = "#pcb_mount">PCB_mount</a> </td><td> <a href = "#rounded_polygon">Rounded_polygon</a> </td><td></td></tr>
<tr><td> <a href = "#extrusion_brackets">Extrusion_brackets</a> </td><td> <a href = "#psus">PSUs</a> </td><td> <a href = "#swiss_clips">Swiss_clips</a> </td><td> <a href = "#psu_shroud">PSU_shroud</a> </td><td> <a href = "#rounded_triangle">Rounded_triangle</a> </td><td></td></tr>
<tr><td> <a href = "#extrusions">Extrusions</a> </td><td> <a href = "#panel_meters">Panel_meters</a> </td><td> <a href = "#terminals">Terminals</a> </td><td> <a href = "#pocket_handle">Pocket_handle</a> </td><td> <a href = "#sector">Sector</a> </td><td></td></tr>
<tr><td> <a href = "#fans">Fans</a> </td><td> <a href = "#photo_interrupters">Photo_interrupters</a> </td><td> <a href = "#toggles">Toggles</a> </td><td> <a href = "#press_fit">Press_fit</a> </td><td> <a href = "#splines">Splines</a> </td><td></td></tr>
<tr><td> <a href = "#fastons">Fastons</a> </td><td> <a href = "#pillars">Pillars</a> </td><td> <a href = "#transformers">Transformers</a> </td><td> <a href = "#printed_box">Printed_box</a> </td><td> <a href = "#sweep">Sweep</a> </td><td></td></tr>
<tr><td> <a href = "#fuseholder">Fuseholder</a> </td><td> <a href = "#pillow_blocks">Pillow_blocks</a> </td><td> <a href = "#ttracks">Ttracks</a> </td><td> <a href = "#printed_pulleys">Printed_pulleys</a> </td><td> <a href = "#thread">Thread</a> </td><td></td></tr>
<tr><td> <a href = "#gear_motors">Gear_motors</a> </td><td> <a href = "#pin_headers">Pin_headers</a> </td><td> <a href = "#tubings">Tubings</a> </td><td> <a href = "#ribbon_clamp">Ribbon_clamp</a> </td><td> <a href = "#tube">Tube</a> </td><td></td></tr>
<tr><td> <a href = "#geared_steppers">Geared_steppers</a> </td><td> <a href = "#potentiometers">Potentiometers</a> </td><td> <a href = "#variacs">Variacs</a> </td><td> <a href = "#ssr_shroud">SSR_shroud</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#green_terminals">Green_terminals</a> </td><td> <a href = "#pulleys">Pulleys</a> </td><td> <a href = "#veroboard">Veroboard</a> </td><td> <a href = "#screw_knob">Screw_knob</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#ht_pipes">HT_pipes</a> </td><td></td><td> <a href = "#washers">Washers</a> </td><td> <a href = "#socket_box">Socket_box</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#hot_ends">Hot_ends</a> </td><td></td><td> <a href = "#wire">Wire</a> </td><td> <a href = "#strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#hygrometer">Hygrometer</a> </td><td></td><td> <a href = "#zipties">Zipties</a> </td><td></td><td></td><td></td></tr>
</table>
@@ -6282,6 +6282,49 @@ inserts don't grip well in rubber.
| 1 | insert_foot_assembly |
<a href="#top">Top</a>
---
<a name="gridfinity"></a>
## Gridfinity
Generate storage bins compatible with Zack Freedman's Gridfinity design, see <https://www.youtube.com/watch?v=ra_9zU-mnl8&t=37s>
Based on <https://gridfinity.xyz/specification>
More examples [here](examples/gridfinity).
[printed/gridfinity.scad](printed/gridfinity.scad) Implementation.
[tests/gridfinity.scad](tests/gridfinity.scad) Code for this example.
### Properties
| Function | Description |
|:--- |:--- |
| `gridfinity_bin_name(type)` | Name for the STL file |
| `gridfinity_bin_size(type)` | Size in grid units |
### Functions
| Function | Description |
|:--- |:--- |
| `gridfinity_base_z()` | height of base |
| `gridfinity_bin(name, grid_x, grid_y, grid_z)` | Constructor |
| `gridfinity_bin_size_mm(type)` | Overall size of the bin |
| `gridfinity_corner_r()` | Outside corner radius |
### Modules
| Module | Description |
|:--- |:--- |
| `gridfinity_bin(type)` | Create a gridfinity bin, bits to cut out are passed as a child |
| `gridfinity_partition(type, cols = 1, rows = 1, wall = 1.6, iwall = squeezed_wall, bwall = 1, corner_r = 4)` | Passed as child to hollow out specified partitions |
![gridfinity](tests/png/gridfinity.png)
### Printed
| Qty | Filename |
| ---:|:--- |
| 1 | chuck_stand.stl |
<a href="#top">Top</a>
---

View File

@@ -22,7 +22,7 @@ use <../utils/layout.scad>
include <../vitamins/leds.scad>
module leds()
layout(echoit([for(l = LEDs) max(led_diameter(l))]), 5)
layout([for(l = LEDs) max(led_diameter(l))], 5)
led(LEDs[$i], ["green", "blue", "red", "orange"][$i % 4]);
if($preview)

76
tests/gridfinity.scad Normal file
View File

@@ -0,0 +1,76 @@
//
// NopSCADlib Copyright Chris Palmer 2025
// nop.head@gmail.com
// hydraraptor.blogspot.com
//
// This file is part of NopSCADlib.
//
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
// GNU General Public License as published by the Free Software Foundation, either version 3 of
// the License, or (at your option) any later version.
//
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with NopSCADlib.
// If not, see <https://www.gnu.org/licenses/>.
//
include <../core.scad>
include <../printed/gridfinity.scad>
use <NopSCADlib/utils/chamfer.scad>
box = gridfinity_bin("chuck_stand", 2, 2, 5);
box_mm = gridfinity_bin_size_mm(box);
bwall = 1;
chuck_d = 80;
ring_od = 50;
ring_id = 40;
ring_h = 4;
hole_pitch = (60 + 72.5) / 2;
hole_d = (72.5 - 60) / 2;
hole_depth = 15;
clearance = 0.5;
chamfer = 1;
z_bot = gridfinity_base_z() + bwall;
module chuck_stand_stl()
gridfinity_bin(box) union() {
translate_z(z_bot) {
for(a = [0 : 30 : 330])
rotate(a)
translate([0, hole_pitch / 2]) {
poly_cylinder(hole_d / 2 + clearance / 2, h = 100);
translate_z(hole_depth)
chamfer_hole(chamfer)
poly_circle(hole_d / 2 + clearance / 2);
}
translate_z(hole_depth) {
poly_cylinder(r = chuck_d / 2 + clearance / 2, h = 100);
poly_tube(or = ring_od / 2 + clearance, ir = ring_id / 2 - clearance, h = 2 * ring_h, center = true);
chamfer_hole(chamfer)
poly_circle(ring_od / 2 + clearance);
}
}
translate_z(box_mm.z)
chamfer_hole(chamfer)
poly_circle(r = chuck_d / 2 + clearance / 2);
}
module gridfinity_test()
stl_colour(pp1_colour) chuck_stand_stl();
gridfinity_test();

BIN
tests/png/gridfinity.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB